Este documento resume a arquitetura tecnica atual do FlowCore para avaliacao de portfolio e continuidade de desenvolvimento.
FlowCore e organizado como monorepo:
backend/: Laravel API, dominio, scheduler, broadcast, seeders e testes.frontend/: Angular SPA com features lazy, UI kit local e testes.docker/: imagens locais para backend e frontend.docs/: documentacao publica do projeto.brain/: memoria operacional para agentes IA.
O fluxo e dado, nao codigo.
A aplicacao guarda a definicao do workflow no banco e a engine executa essa definicao em runtime. O que permanece fixo em codigo e o ciclo de vida seguro de instancia e step:
WorkflowInstance:running,approved,rejected,cancelled,completed.InstanceStep:pending,in_progress,approved,rejected,skipped,escalated,completed.
Essa separacao permite criar novos fluxos sem deploy, preservando invariantes de dominio em codigo testado.
HTTP Controllers
-> Form Requests
-> Policies / Permissions
-> Domain Services
-> Eloquent Models
-> API Resources
Principais services:
WorkflowEngine: inicia requests, processa decisoes, avanca grafo, reatribui e comenta.ConditionEvaluator: avalia expressoes em sandbox usando somenteworkflow_instances.data.AssigneeResolver: resolve assignees por usuario, role ou regra dinamica.WorkflowEscalationService: escalona steps vencidos de forma idempotente.RuntimeEventDispatcher: calcula destinatarios e dispara eventos realtime.
Definition e configuracao versionada:
workflow_definitionsworkflow_stepsstep_approversworkflow_transitionsform_fields
Runtime e execucao auditavel:
workflow_instancesinstance_stepsinstance_step_decisionsworkflow_actions
Uma instancia guarda definition_version, preservando o contrato usado no momento da abertura.
Drafts podem ser incompletos. Publicacao exige:
- um unico step inicial;
- steps alcancaveis a partir do start;
- caminho para terminal;
- ausencia de ciclos invalidos;
- transicoes sem referencias orfas;
- condicoes com sintaxe valida.
Definicoes publicadas nao recebem update direto. Evolucao acontece via endpoint de draft.
Decisoes usam transacao e lockForUpdate no InstanceStep. Depois do lock, a engine revalida:
- status aberto;
- autorizacao;
- duplicidade de decisao;
- threshold de
any,allouquorum.
Isso impede contadores duplicados e fechamento concorrente do mesmo step.
Runtime events usam Laravel Reverb com protocolo Pusher.
Fluxo:
WorkflowEngine / WorkflowEscalationService
-> RuntimeEventDispatcher
-> RuntimeWorkflowUpdated
-> Reverb private channel users.{id}.runtime
-> Angular RuntimeRealtimeService
-> refresh de Inbox / Dashboard / Request Detail
O endpoint /api/broadcasting/auth autentica o canal privado com Sanctum Bearer token e retorna JSON no formato esperado pelo Echo/Pusher.
O backend usa REVERB_BROADCAST_HOST para publicar dentro do Docker (reverb), enquanto o navegador usa localhost:8080.
No frontend, API e Reverb sao configurados por /config.json carregado antes do bootstrap Angular. Em localhost ha fallback local; fora de localhost, falha de config bloqueia o bootstrap para evitar chamadas acidentais para endpoints locais.
routes/console.php agenda:
workflow:escalate-overdue -> everyMinute -> withoutOverlapping
O comando busca steps pending ou in_progress com due_at <= now(), faz lock pessimista e registra uma unica action escalated.
Angular usa:
- standalone components;
- rotas lazy por feature;
- Signals para auth/loading/local state;
- RxJS para chamadas API e realtime;
- guards por autenticacao e permissao;
- interceptors para Bearer token, loading e erro JSON;
- UI kit local para consistencia visual.
Features principais:
auth: login e estado de sessao.workflows: lista, builder visual e form builder.runtime: abertura de requests.requests: lista e detalhe.inbox: pendencias acionaveis.dashboard: metricas operacionais.
DatabaseSeeder cria usuarios deterministicos e chama DemoWorkflowSeeder.
O seed demo e idempotente:
- usa emails fixos para usuarios;
- sincroniza roles;
- atualiza workflows por
slug + version; - recria transicoes/approvers dos workflows demo;
- remove apenas instancias runtime marcadas com
payload.seeded=true; - recria 10 instancias demo.
Isso permite restaurar uma vitrine local sem duplicar dados.
- Autenticacao por Sanctum Bearer token.
- RBAC com Spatie Permission.
- Policies em definitions, instances e decisions.
- Erros API em JSON padronizado.
- Condicoes em sandbox, sem
eval. - Visibilidade runtime aplicada no backend.
- Realtime privado por usuario.
- Token frontend fica apenas em memoria; refresh da SPA exige novo login.
- Realtime faz refresh por tela em vez de aplicar patches client-side, reduzindo risco de estado divergente.
- Seed demo reseta apenas dados marcados como seedados; dados manuais podem coexistir.
- Apenas screenshots selecionados sao versionados para evidencia de portfolio; capturas exploratorias continuam fora do Git.
- Templates de Render/Aiven sao documentais e nao devem ser aplicados sem Gate PO.