mirror of
https://github.com/hoshikawa2/first_contas.git
synced 2026-07-09 18:24:20 +00:00
52 lines
1.7 KiB
Python
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]))
|