Dispatcher.php 4.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. <?php
  2. namespace Routes;
  3. use FrameworkX\App;
  4. use Middlewares\JwtAuthMiddleware;
  5. use Middlewares\RoleMiddleware;
  6. use Libs\Roles;
  7. /**
  8. * Registro central de rotas da API.
  9. *
  10. * Mantém a definição das rotas fora do bootstrap (public/index.php),
  11. * concentrando aqui a tabela de endpoints, a autenticação (JWT) e a
  12. * autorização por papel (RBAC).
  13. *
  14. * Convenção de middlewares por rota (a ordem importa):
  15. * 1) JwtAuthMiddleware -> autentica e popula "user_role" a partir do banco;
  16. * 2) RoleMiddleware -> autoriza conforme os papéis permitidos.
  17. */
  18. final class Dispatcher
  19. {
  20. public static function register(App $app): void
  21. {
  22. $auth = new JwtAuthMiddleware();
  23. // ---- Público (sem autenticação) -------------------------------------
  24. // Login é protegido contra brute-force via RateLimiter no controller.
  25. $app->post('/v1/login', \Controllers\LoginController::class);
  26. $app->post('/v1/webhooks/unipile', \Controllers\UnipileWebhookController::class);
  27. $app->post('/v1/webhooks/unipile/hosted-auth', \Controllers\UnipileHostedAuthWebhookController::class);
  28. // Ingestão de CRM: autenticada por HMAC próprio da empresa (sem JWT).
  29. // O {companyId} resolve a empresa; o segredo valida o corpo.
  30. $app->post('/v1/webhooks/crm/{companyId}', \Controllers\CrmWebhookController::class);
  31. // Provisionamento de empresa + admin: operação de plataforma, protegida
  32. // pelo header X-Provision-Secret (PROVISION_SECRET). Sem JWT porque cria
  33. // o primeiro tenant/usuário, que ainda não tem token.
  34. $app->post('/v1/companies', \Controllers\RegisterCompanyController::class);
  35. $app->get('/v1/integrations/unipile/whatsapp/success', new \Controllers\UnipileRedirectController('success'));
  36. $app->get('/v1/integrations/unipile/whatsapp/failure', new \Controllers\UnipileRedirectController('failure'));
  37. // ---- Somente admin --------------------------------------------------
  38. // Cadastro de usuários: o novo usuário herda o company_id do solicitante.
  39. $app->post('/v1/register', $auth, new RoleMiddleware(Roles::ADMIN), \Controllers\RegisterController::class);
  40. // ---- Autenticado (qualquer papel válido) ----------------------------
  41. self::registerAuthenticated($app, $auth);
  42. }
  43. /**
  44. * Rotas que exigem apenas um usuário autenticado, sem restrição de papel.
  45. * Para restringir uma destas no futuro, basta inserir um RoleMiddleware
  46. * entre $auth e o controller (ex.: new RoleMiddleware(Roles::ADMIN, Roles::MANAGER)).
  47. */
  48. private static function registerAuthenticated(App $app, JwtAuthMiddleware $auth): void
  49. {
  50. // Perfil do usuário autenticado.
  51. $app->get('/v1/me', $auth, \Controllers\MeController::class);
  52. $app->post('/v1/me/change-password', $auth, \Controllers\MeChangePasswordController::class);
  53. // Dashboards e analytics (leitura).
  54. $app->get('/v1/dashboard/overview', $auth, \Controllers\DashboardOverviewController::class);
  55. $app->get('/v1/interactions', $auth, \Controllers\InteractionsController::class);
  56. $app->get('/v1/interactions/details', $auth, \Controllers\InteractionDetailsController::class);
  57. $app->post('/v1/interactions/messages', $auth, new RoleMiddleware(Roles::ADMIN, Roles::MANAGER, Roles::OPERATOR), \Controllers\InteractionSendMessageController::class);
  58. $app->get('/v1/analytics/sentiment/dashboard', $auth, \Controllers\AnalyticsSentimentDashboardController::class);
  59. $app->get('/v1/personas/overview', $auth, \Controllers\PersonasOverviewController::class);
  60. $app->get('/v1/evolution/overview', $auth, \Controllers\EvolutionOverviewController::class);
  61. $app->get('/v1/executive/dashboard', $auth, new RoleMiddleware(Roles::ADMIN), \Controllers\ExecutiveDashboardController::class);
  62. // SLA.
  63. $app->get('/v1/sla/configs', $auth, \Controllers\SlaConfigsController::class);
  64. $app->get('/v1/sla/live-status', $auth, \Controllers\SlaLiveStatusController::class);
  65. $app->post('/v1/sla/configs', $auth, \Controllers\SlaSaveConfigController::class);
  66. // Agentes.
  67. $app->get('/v1/agents', $auth, \Controllers\AgentsController::class);
  68. $app->post('/v1/agents', $auth, \Controllers\AgentSaveController::class);
  69. $app->post('/v1/agents/status', $auth, \Controllers\AgentStatusController::class);
  70. $app->post('/v1/agents/escalation', $auth, \Controllers\AgentEscalationController::class);
  71. $app->get('/v1/integrations/unipile/whatsapp/accounts', $auth, new RoleMiddleware(Roles::ADMIN, Roles::MANAGER, Roles::OPERATOR), \Controllers\UnipileAccountsController::class);
  72. $app->post('/v1/integrations/unipile/whatsapp/hosted-link', $auth, new RoleMiddleware(Roles::ADMIN, Roles::MANAGER, Roles::OPERATOR), \Controllers\UnipileHostedLinkController::class);
  73. }
  74. }