Dispatcher.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  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. $app->get('/v1/integrations/unipile/whatsapp/success', new \Controllers\UnipileRedirectController('success'));
  29. $app->get('/v1/integrations/unipile/whatsapp/failure', new \Controllers\UnipileRedirectController('failure'));
  30. // ---- Somente admin --------------------------------------------------
  31. // Cadastro de usuários: o novo usuário herda o company_id do solicitante.
  32. $app->post('/v1/register', $auth, new RoleMiddleware(Roles::ADMIN), \Controllers\RegisterController::class);
  33. // ---- Autenticado (qualquer papel válido) ----------------------------
  34. self::registerAuthenticated($app, $auth);
  35. }
  36. /**
  37. * Rotas que exigem apenas um usuário autenticado, sem restrição de papel.
  38. * Para restringir uma destas no futuro, basta inserir um RoleMiddleware
  39. * entre $auth e o controller (ex.: new RoleMiddleware(Roles::ADMIN, Roles::MANAGER)).
  40. */
  41. private static function registerAuthenticated(App $app, JwtAuthMiddleware $auth): void
  42. {
  43. // Perfil do usuário autenticado.
  44. $app->get('/v1/me', $auth, \Controllers\MeController::class);
  45. $app->post('/v1/me/change-password', $auth, \Controllers\MeChangePasswordController::class);
  46. // Dashboards e analytics (leitura).
  47. $app->get('/v1/dashboard/overview', $auth, \Controllers\DashboardOverviewController::class);
  48. $app->get('/v1/interactions', $auth, \Controllers\InteractionsController::class);
  49. $app->get('/v1/interactions/details', $auth, \Controllers\InteractionDetailsController::class);
  50. $app->post('/v1/interactions/messages', $auth, new RoleMiddleware(Roles::ADMIN, Roles::MANAGER, Roles::OPERATOR), \Controllers\InteractionSendMessageController::class);
  51. $app->get('/v1/analytics/sentiment/dashboard', $auth, \Controllers\AnalyticsSentimentDashboardController::class);
  52. $app->get('/v1/personas/overview', $auth, \Controllers\PersonasOverviewController::class);
  53. $app->get('/v1/evolution/overview', $auth, \Controllers\EvolutionOverviewController::class);
  54. $app->get('/v1/executive/dashboard', $auth, \Controllers\ExecutiveDashboardController::class);
  55. // SLA.
  56. $app->get('/v1/sla/configs', $auth, \Controllers\SlaConfigsController::class);
  57. $app->get('/v1/sla/live-status', $auth, \Controllers\SlaLiveStatusController::class);
  58. $app->post('/v1/sla/configs', $auth, \Controllers\SlaSaveConfigController::class);
  59. // Agentes.
  60. $app->get('/v1/agents', $auth, \Controllers\AgentsController::class);
  61. $app->post('/v1/agents', $auth, \Controllers\AgentSaveController::class);
  62. $app->post('/v1/agents/status', $auth, \Controllers\AgentStatusController::class);
  63. $app->post('/v1/agents/escalation', $auth, \Controllers\AgentEscalationController::class);
  64. $app->get('/v1/integrations/unipile/whatsapp/accounts', $auth, new RoleMiddleware(Roles::ADMIN, Roles::MANAGER, Roles::OPERATOR), \Controllers\UnipileAccountsController::class);
  65. $app->post('/v1/integrations/unipile/whatsapp/hosted-link', $auth, new RoleMiddleware(Roles::ADMIN, Roles::MANAGER, Roles::OPERATOR), \Controllers\UnipileHostedLinkController::class);
  66. }
  67. }