from __future__ import annotations import json from typing import Any, Protocol from agente_contas_tim.workflows.contracts import WorkflowDef from agente_contas_tim.workflows.exceptions import WorkflowNotFoundError class DbConnection(Protocol): def execute(self, query: str, params: tuple[Any, ...]): ... class DbWorkflowRepository: """Repositório de workflow em banco. Espera schema lógico: workflow_definitions(name, version, status, definition_json) workflow_active(name, version) """ def __init__(self, connection: DbConnection) -> None: self._connection = connection def get_active(self, name: str) -> WorkflowDef: row = self._connection.execute( ( "SELECT d.definition_json " "FROM workflow_active a " "JOIN workflow_definitions d " " ON d.name = a.name AND d.version = a.version " "WHERE a.name = %s" ), (name,), ).fetchone() if row is None: raise WorkflowNotFoundError(f"Workflow {name!r} ativo não encontrado") return WorkflowDef.model_validate(json.loads(row[0])) def get_version(self, name: str, version: int) -> WorkflowDef: row = self._connection.execute( ( "SELECT definition_json " "FROM workflow_definitions " "WHERE name = %s AND version = %s" ), (name, version), ).fetchone() if row is None: raise WorkflowNotFoundError(f"Workflow {name!r} v{version} não encontrado") return WorkflowDef.model_validate(json.loads(row[0]))