Files
first_contas/legacy_reference/workflows/repositories/db_repo.py
2026-06-16 20:54:49 -03:00

52 lines
1.7 KiB
Python

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]))