Este roteiro descreve a demonstracao local oficial do FlowCore para portfolio.
- Stack local em execucao com
docker compose up -d --build. - Banco migrado e seed demo aplicada:
docker compose exec -T backend php artisan migrate --force
docker compose exec -T backend php artisan db:seed --force- Frontend acessivel em
http://localhost:4200. - Backend acessivel em
http://localhost:8000. - Reverb acessivel em
http://localhost:8080.
Todas usam senha password.
| Perfil | |
|---|---|
| Admin | admin@demo.com |
| Aprovador | approver@demo.com |
| Solicitante | requester@demo.com |
-
Acessar
http://localhost:4200/login.- Esperado: tela apresenta FlowCore como demo tecnica e lista contas demo no desktop.
-
Entrar como
admin@demo.com.- Esperado: Dashboard carrega com metricas operacionais.
-
Abrir
Workflows.- Esperado: lista mostra
Aprovacao de CompraePedido de Feriaspublicados.
- Esperado: lista mostra
-
Abrir o builder de
Aprovacao de Compra.- Esperado: canvas exibe steps e transitions do workflow.
-
Sair e entrar como
requester@demo.com.- Esperado: usuario sem permissoes administrativas nao acessa builder.
-
Criar uma nova request de compra com valor acima de
1000.- Esperado: formulario dinamico valida campos obrigatorios e cria instancia.
-
Sair e entrar como
approver@demo.com.- Esperado: Inbox mostra a pendencia acionavel.
-
Aprovar a pendencia.
- Esperado: timeline recebe acao de aprovacao e instancia avanca para o proximo step.
-
Conferir Dashboard.
- Esperado: indicadores refletem requests visiveis ao usuario.
- Identificar uma request aberta com step pendente.
- Manipular
due_atlocalmente ou usar fixture/teste controlado. - Executar:
docker compose exec -T backend php artisan workflow:escalate-overdue- Manter Inbox aberta no navegador.
- Esperado: status muda para escalado sem reload manual.
Parar a demo se ocorrer qualquer item:
- erro 500 no backend;
- erro de console no browser;
- usuario ve dados fora de seu perfil;
- workflow publicado some da lista;
- realtime exige refresh manual no roteiro de SLA;
- seed duplicar usuarios, workflows ou instancias demo.
Este roteiro executa o mesmo fluxo de ponta a ponta contra as URLs publicas de staging, sem depender de docker compose.
URLs:
| Servico | URL |
|---|---|
| Frontend (Netlify) | https://flowcore-luantrindade.netlify.app |
| API (Render) | https://flowcore-api-urkx.onrender.com |
| Reverb (Render) | wss://flowcore-reverb.onrender.com:443 |
O roteiro de escalonamento de SLA (workflow:escalate-overdue) nao se aplica a este ambiente: o Render free tier roda QUEUE_CONNECTION=sync e nao provisiona worker/scheduler dedicado, entao nao ha execucao periódica do comando de escalonamento em staging.
Passos:
-
GET https://flowcore-api-urkx.onrender.com/health.- Esperado:
200com{"status":"ok","service":"flowcore-api"}. - Atencao: o primeiro acesso apos um periodo ocioso pode levar de ~25 s a mais de 1 min por spin-down do plano free do Render; repetir a chamada apos o primeiro sucesso deve responder em menos de 1 s.
- Esperado:
-
GET https://flowcore-luantrindade.netlify.app/config.json.- Esperado:
200comapiBaseUrlapontando parahttps://flowcore-api-urkx.onrender.com/api/v1erealtime.wsHostapontando paraflowcore-reverb.onrender.com(porta443,forceTls: true).
- Esperado:
-
Login como
requester@demo.com(senhapassword):curl -s -X POST https://flowcore-api-urkx.onrender.com/api/v1/auth/login \ -H "Content-Type: application/json" -H "Accept: application/json" \ -d '{"email":"requester@demo.com","password":"password"}'
- Esperado:
200comaccess_token.
- Esperado:
-
Buscar o schema do workflow
Aprovacao de Comprapublicado e criar uma solicitacao de compra com valor acima de1000:curl -s https://flowcore-api-urkx.onrender.com/api/v1/runtime/workflows/<id-de-aprovacao-de-compra> \ -H "Authorization: Bearer <token-do-requester>" -H "Accept: application/json" curl -s -X POST https://flowcore-api-urkx.onrender.com/api/v1/requests \ -H "Authorization: Bearer <token-do-requester>" \ -H "Content-Type: application/json" -H "Accept: application/json" \ -d '{"workflow_definition_id": <id-de-aprovacao-de-compra>, "data": {"amount": 1500, "supplier": "Fornecedor Demo", "cost_center": "Tecnologia"}}'
- O schema do formulario publicado (
GET /api/v1/runtime/workflows/<id>) define exatamente os camposamount(number),supplier(text) ecost_center(select:Tecnologia,OperacoesouFinanceiro), todos obrigatorios. Enviar qualquer campo fora dessa lista retorna422com{"errors":{"data":["O formulario contem campos que nao pertencem a definicao publicada."]}}. - Esperado com o payload correto:
201(o Laravel atribui automaticamente o status201a umJsonResourceretornado por uma rotaPOST) com a instancia criada,status: runninge o primeiro step (manager_approval,assignee_type: dynamic/assignee_ref: requester_manager) pendente e resolvido para o aprovador demo.
- O schema do formulario publicado (
-
Login como
approver@demo.com(senhapassword) e conferirGET /api/v1/inbox.- Esperado:
200com a pendencia da solicitacao criada no passo 4 na lista (o aprovador dinamico do primeiro step e resolvido automaticamente para um usuario com roleapprover).
- Esperado:
-
Aprovar a pendencia pelo endpoint real de decisao:
curl -s -X POST "https://flowcore-api-urkx.onrender.com/api/v1/requests/<workflow_instance_id>/steps/<instance_step_id>/decide" \ -H "Authorization: Bearer <token-do-approver>" \ -H "Content-Type: application/json" -H "Accept: application/json" \ -d '{"decision":"approve"}'
- Esperado:
200com a instancia avancando de step.
- Esperado:
-
Inbox atualizando em realtime sem refresh: um cliente do aprovador se inscreve no canal privado
private-users.{id}.runtimevia Reverb (wss://flowcore-reverb.onrender.com:443), autenticando emPOST https://flowcore-api-urkx.onrender.com/api/broadcasting/authcomAuthorization: Bearer <token-do-approver>.- Esperado: ao repetir o passo 4 (nova solicitacao do requester), o cliente inscrito recebe o evento
runtime.workflow.updated(classeApp\Events\RuntimeWorkflowUpdated) no canal do aprovador, sem reload manual.
- Esperado: ao repetir o passo 4 (nova solicitacao do requester), o cliente inscrito recebe o evento
Parar o roteiro externo se ocorrer qualquer item:
- qualquer resposta
5xx; 401/403inesperado (fora do esperado emGET /api/v1/runtime/workflowssem token);- CORS bloqueado a partir da origem do Netlify;
- evento realtime nao recebido pelo cliente inscrito no canal privado.
Screenshots selecionados vivem em docs/assets/screenshots/:
login-desktop.pngdashboard-desktop.pngworkflows-desktop.png
Essas imagens sao evidencias de portfolio, nao testes automatizados.
Galeria: docs/assets/screenshots/README.md.