// Authentication
use App\Controllers\AuthController;
use App\Core\RolePermissions;
use App\Middlewares\AuthMiddleware;
use App\Middlewares\PermissionMiddleware;
$router->add('POST', '/api/login', [AuthController::class, 'login']);
$router->add('POST', '/api/logout', [AuthController::class, 'logout']);
$router->add('GET', '/api/me', [AuthController::class, 'me']);
$router->add('GET', '/api/me/permissions', [AuthController::class, 'permissions'], [AuthMiddleware::class]);
$router->add('GET', '/api/me/context', [AuthController::class, 'context'], [AuthMiddleware::class]);
$router->add('POST', '/api/auth/switch-company', [AuthController::class, 'switchCompany'], [AuthMiddleware::class]);
$router->add('GET', '/api/auth/my-companies', [AuthController::class, 'myCompanies'], [AuthMiddleware::class]);
$router->add('GET', '/api/departments', function() {
$companyId = \App\Core\Auth::getCompanyId();
if (!$companyId) {
http_response_code(401);
echo json_encode(['status' => 'error', 'message' => 'Não autenticado']);
return;
}
$repo = new \App\Repositories\DepartmentRepository();
$depts = $repo->findByCompanyId($companyId);
header('Content-Type: application/json');
echo json_encode(['status' => 'success', 'data' => $depts]);
}, [AuthMiddleware::class]);
// --- PROTECTED ROUTES ---
// Meta WhatsApp Webhook endpoints (Public for Meta)
$router->add('GET', '/api/webhooks/whatsapp', [WhatsAppWebhookController::class, 'verify']);
$router->add('POST', '/api/webhooks/whatsapp', [WhatsAppWebhookController::class, 'handle']);
// Meta Embedded Signup
use App\Controllers\MetaAuthController;
$router->add('POST', '/api/meta/embedded-signup', [MetaAuthController::class, 'saveEmbeddedSignup'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_COMPANY_MANAGE],
]);
// User Management
$router->add('GET', '/api/users', [UserController::class, 'index'], [AuthMiddleware::class]);
$router->add('POST', '/api/users', [UserController::class, 'store'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/users/{id}', [UserController::class, 'destroy'], [AuthMiddleware::class]);
// Ticket System
$router->add('GET', '/api/tickets', [TicketController::class, 'index'], [AuthMiddleware::class]);
$router->add('GET', '/api/tickets/{id}', [TicketController::class, 'show'], [AuthMiddleware::class]);
$router->add('GET', '/api/tickets/{id}/messages', [TicketController::class, 'messages'], [AuthMiddleware::class]);
$router->add('POST', '/api/tickets/{id}/reply', [TicketController::class, 'reply'], [AuthMiddleware::class]);
$router->add('POST', '/api/tickets/{id}/resolve', [TicketController::class, 'resolve'], [AuthMiddleware::class]);
$router->add('PUT', '/api/tickets/{id}/status', [TicketController::class, 'changeStatus'], [AuthMiddleware::class]);
$router->add('POST', '/api/tickets/{id}/transfer', [TicketController::class, 'transfer'], [AuthMiddleware::class]);
$router->add('POST', '/api/tickets/{id}/note', [TicketController::class, 'addNote'], [AuthMiddleware::class]);
// Dashboard Metrics
use App\Controllers\DashboardController;
$router->add('GET', '/api/dashboard/metrics', [DashboardController::class, 'metrics'], [AuthMiddleware::class]);
// Companies (Tenants)
use App\Controllers\CompanyController;
use App\Middlewares\MasterMiddleware;
$router->add('GET', '/api/my-company', [CompanyController::class, 'showMyCompany'], [AuthMiddleware::class]);
$router->add('PUT', '/api/my-company', [CompanyController::class, 'updateMyCompany'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_COMPANY_MANAGE],
]);
$router->add('GET', '/api/companies', [CompanyController::class, 'index'], [AuthMiddleware::class, MasterMiddleware::class]);
$router->add('POST', '/api/companies', [CompanyController::class, 'store'], [AuthMiddleware::class, MasterMiddleware::class]);
$router->add('PUT', '/api/companies/{id}', [CompanyController::class, 'update'], [AuthMiddleware::class, MasterMiddleware::class]);
$router->add('PUT', '/api/companies/{id}/status', [CompanyController::class, 'changeStatus'], [AuthMiddleware::class, MasterMiddleware::class]);
// Plans (Packages)
use App\Controllers\PlanController;
$router->add('GET', '/api/plans', [PlanController::class, 'index'], [AuthMiddleware::class, MasterMiddleware::class]);
$router->add('POST', '/api/plans', [PlanController::class, 'store'], [AuthMiddleware::class, MasterMiddleware::class]);
$router->add('DELETE', '/api/plans/{id}', [PlanController::class, 'destroy'], [AuthMiddleware::class, MasterMiddleware::class]);
// Email Templates
use App\Controllers\EmailTemplateController;
$router->add('GET', '/api/email-templates', [EmailTemplateController::class, 'index'], [AuthMiddleware::class]);
$router->add('POST', '/api/email-templates', [EmailTemplateController::class, 'store'], [AuthMiddleware::class]);
$router->add('PUT', '/api/email-templates/{id}', [EmailTemplateController::class, 'update'], [AuthMiddleware::class]);
// Campaigns (Broadcasting)
use App\Controllers\CampaignController;
$router->add('GET', '/api/campaigns', [CampaignController::class, 'index'], [AuthMiddleware::class]);
$router->add('POST', '/api/campaigns', [CampaignController::class, 'store'], [AuthMiddleware::class]);
$router->add('PUT', '/api/campaigns/{id}', [CampaignController::class, 'update'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/campaigns/{id}', [CampaignController::class, 'destroy'], [AuthMiddleware::class]);
$router->add('POST', '/api/campaigns/{id}/start', [CampaignController::class, 'start'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_CAMPAIGNS_SEND],
]);
$router->add('POST', '/api/campaigns/{id}/pause', [CampaignController::class, 'pause'], [AuthMiddleware::class]);
// AI Agent
use App\Controllers\AiAgentController;
$router->add('GET', '/api/ai-agent', [AiAgentController::class, 'show'], [AuthMiddleware::class]);
$router->add('POST', '/api/ai-agent', [AiAgentController::class, 'store'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_AI_MANAGE],
]);
$router->add('PUT', '/api/ai-agent/{id}', [AiAgentController::class, 'update'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_AI_MANAGE],
]);
$router->add('DELETE', '/api/ai-agent/{id}', [AiAgentController::class, 'destroy'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_AI_MANAGE],
]);
// Media Uploads
use App\Controllers\MediaController;
$router->add('POST', '/api/upload', [MediaController::class, 'upload'], [AuthMiddleware::class]);
$router->add('GET', '/api/media', [MediaController::class, 'index'], [AuthMiddleware::class]);
// WhatsApp Web.js (QR Code)
use App\Controllers\WaWebJsController;
$router->add('GET', '/api/wa-webjs/status', [WaWebJsController::class, 'status'], [AuthMiddleware::class]);
$router->add('POST', '/api/wa-webjs/start', [WaWebJsController::class, 'start'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_WA_WEBJS_ADMIN],
]);
$router->add('POST', '/api/wa-webjs/logout', [WaWebJsController::class, 'logout'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_WA_WEBJS_ADMIN],
]);
$router->add('POST', '/api/wa-webjs/sync', [WaWebJsController::class, 'syncChats'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_WA_WEBJS_ADMIN],
]);
$router->add('POST', '/api/wa-webjs/webhook', [WhatsAppWebhookController::class, 'handle']);
// WhatsApp Templates (Meta Business API)
use App\Controllers\WhatsAppTemplateController;
$router->add('GET', '/api/whatsapp/templates', [WhatsAppTemplateController::class, 'index'], [AuthMiddleware::class]);
// ==========================================
// EMAIL MARKETING MODULE
// ==========================================
// SMTP Accounts (Multiple)
use App\Controllers\SmtpAccountController;
$router->add('GET', '/api/emails/accounts', [SmtpAccountController::class, 'index'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/accounts', [SmtpAccountController::class, 'store'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_EMAIL_SMTP],
]);
$router->add('POST', '/api/emails/accounts/bulk', [SmtpAccountController::class, 'bulkStore'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_EMAIL_SMTP],
]);
$router->add('POST', '/api/emails/accounts/test', [SmtpAccountController::class, 'test'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_EMAIL_SMTP],
]);
$router->add('DELETE', '/api/emails/accounts/{id}', [SmtpAccountController::class, 'destroy'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_EMAIL_SMTP],
]);
// SMTP Settings (Legacy/Single)
use App\Controllers\SmtpSettingsController;
$router->add('GET', '/api/emails/smtp', [SmtpSettingsController::class, 'show'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/smtp', [SmtpSettingsController::class, 'save'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_EMAIL_SMTP],
]);
// Leads
use App\Controllers\LeadController;
$router->add('GET', '/api/leads', [LeadController::class, 'index'], [AuthMiddleware::class]);
$router->add('POST', '/api/leads', [LeadController::class, 'store'], [AuthMiddleware::class]);
$router->add('PUT', '/api/leads/{id}', [LeadController::class, 'update'], [AuthMiddleware::class]);
$router->add('POST', '/api/leads/{id}', [LeadController::class, 'update'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/leads/{id}', [LeadController::class, 'destroy'], [AuthMiddleware::class]);
$router->add('GET', '/api/emails/leads', [LeadController::class, 'index'], [AuthMiddleware::class]);
$router->add('GET', '/api/emails/leads/lists', [LeadController::class, 'getLists'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/leads', [LeadController::class, 'store'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/leads/import-csv', [LeadController::class, 'importCsv'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/emails/leads/all', [LeadController::class, 'clearAll'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/leads/clear-list', [LeadController::class, 'clearList'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/emails/leads/{id}', [LeadController::class, 'destroy'], [AuthMiddleware::class]);
// Email Campaigns
use App\Controllers\EmailCampaignController;
$router->add('GET', '/api/emails/campaigns', [EmailCampaignController::class, 'index'], [AuthMiddleware::class]);
$router->add('GET', '/api/emails/campaigns/{id}', [EmailCampaignController::class, 'show'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/campaigns', [EmailCampaignController::class, 'store'], [AuthMiddleware::class]);
$router->add('PUT', '/api/emails/campaigns/{id}', [EmailCampaignController::class, 'update'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/campaigns/{id}/activate', [EmailCampaignController::class, 'activate'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/campaigns/{id}/pause', [EmailCampaignController::class, 'pause'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/campaigns/{id}/send_next', [EmailCampaignController::class, 'sendNext'], [AuthMiddleware::class]);
$router->add('GET', '/api/emails/campaigns/{id}/stats', [EmailCampaignController::class, 'stats'], [AuthMiddleware::class]);
$router->add('GET', '/api/emails/campaigns/{id}/history', [EmailCampaignController::class, 'history'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/campaigns/{id}/retry_failed', [EmailCampaignController::class, 'retryFailed'], [AuthMiddleware::class]);
$router->add('POST', '/api/emails/campaigns/{id}/restart', [EmailCampaignController::class, 'restart'], [AuthMiddleware::class]);
$router->add('GET', '/api/admin/emails/campaigns', [EmailCampaignController::class, 'adminIndex'], [AuthMiddleware::class, MasterMiddleware::class]);
$router->add('GET', '/api/admin/whatsapp/campaigns', function () {
try {
$repo = new \App\Repositories\CampaignRepository();
$campaigns = $repo->findAllAdmin();
foreach ($campaigns as &$c) {
$c['stats'] = $repo->getCampaignStats((int) $c['id']);
$c['text_variations'] = json_decode($c['text_variations'], true) ?: [];
$c['media_variations'] = json_decode($c['media_variations'] ?? '[]', true) ?: [];
}
unset($c);
header('Content-Type: application/json');
echo json_encode(['status' => 'success', 'data' => $campaigns]);
} catch (\Exception $e) {
http_response_code(500);
header('Content-Type: application/json');
echo json_encode(['status' => 'error', 'message' => $e->getMessage()]);
}
}, [AuthMiddleware::class, MasterMiddleware::class]);
// ==========================================
// CRM AGENDA MODULE
// ==========================================
use App\Controllers\CrmAppointmentController;
$router->add('GET', '/api/crm/appointments', [CrmAppointmentController::class, 'list'], [AuthMiddleware::class]);
$router->add('POST', '/api/crm/appointments', [CrmAppointmentController::class, 'create'], [AuthMiddleware::class]);
$router->add('PUT', '/api/crm/appointments/{id}', [CrmAppointmentController::class, 'update'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/crm/appointments/{id}', [CrmAppointmentController::class, 'delete'], [AuthMiddleware::class]);
$router->add('PUT', '/api/crm/appointments/{id}/status', [CrmAppointmentController::class, 'updateStatus'], [AuthMiddleware::class]);
$router->add('GET', '/api/crm/appointments/today', [CrmAppointmentController::class, 'todaysTasks'], [AuthMiddleware::class]);
$router->add('GET', '/api/crm/appointments/history', [CrmAppointmentController::class, 'getHistory'], [AuthMiddleware::class]);
// ==========================================
// PROJECT MANAGEMENT MODULE
// ==========================================
use App\Controllers\ProjectController;
$router->add('GET', '/api/gp/data', [ProjectController::class, 'load'], [AuthMiddleware::class]);
$router->add('POST', '/api/gp/sync', [ProjectController::class, 'sync'], [AuthMiddleware::class]);
$router->add('POST', '/api/gp/clear-example-data', [ProjectController::class, 'clearExampleData'], [AuthMiddleware::class]);
// ==========================================
// CUSTOMER EVALUATION / DIAGNOSTIC 360 MODULE
// ==========================================
use App\Controllers\EvaluationController;
use App\Controllers\EvaluationFormController;
$router->add('POST', '/api/public/evaluations', [EvaluationController::class, 'receivePublic']);
$router->add('OPTIONS', '/api/public/evaluations', [EvaluationController::class, 'receivePublic']);
$router->add('GET', '/api/public/forms/{slug}', [EvaluationFormController::class, 'publicConfig']);
$router->add('POST', '/api/public/forms/{slug}/submit',[EvaluationFormController::class, 'publicSubmit']);
$router->add('OPTIONS', '/api/public/forms/{slug}/submit',[EvaluationFormController::class, 'publicSubmit']);
$router->add('GET', '/api/evaluations', [EvaluationController::class, 'index'], [AuthMiddleware::class]);
$router->add('GET', '/api/evaluations/stats', [EvaluationController::class, 'stats'], [AuthMiddleware::class]);
$router->add('GET', '/api/evaluations/{id}', [EvaluationController::class, 'show'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/evaluations/{id}', [EvaluationController::class, 'destroy'], [AuthMiddleware::class]);
$router->add('GET', '/api/evaluation-forms', [EvaluationFormController::class, 'index'], [AuthMiddleware::class]);
$router->add('GET', '/api/evaluation-forms/defaults', [EvaluationFormController::class, 'defaults'], [AuthMiddleware::class]);
$router->add('POST', '/api/evaluation-forms', [EvaluationFormController::class, 'store'], [AuthMiddleware::class]);
$router->add('GET', '/api/evaluation-forms/{id}', [EvaluationFormController::class, 'show'], [AuthMiddleware::class]);
$router->add('PUT', '/api/evaluation-forms/{id}', [EvaluationFormController::class, 'update'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/evaluation-forms/{id}', [EvaluationFormController::class, 'destroy'], [AuthMiddleware::class]);
$router->add('POST', '/api/evaluation-forms/{id}/duplicate', [EvaluationFormController::class, 'duplicate'], [AuthMiddleware::class]);
$router->add('GET', '/api/evaluation-forms/{id}/stats', [EvaluationFormController::class, 'stats'], [AuthMiddleware::class]);
// ==========================================
// PRODUCTS & SERVICES CATALOG MODULE
// ==========================================
use App\Controllers\ProductServiceController;
$router->add('GET', '/api/products-services', [ProductServiceController::class, 'index'], [AuthMiddleware::class]);
$router->add('GET', '/api/products-services/stats', [ProductServiceController::class, 'stats'], [AuthMiddleware::class]);
$router->add('POST', '/api/products-services/bulk', [ProductServiceController::class, 'bulkStore'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_CATALOG_MANAGE],
]);
$router->add('GET', '/api/products-services/{id}', [ProductServiceController::class, 'show'], [AuthMiddleware::class]);
$router->add('POST', '/api/products-services', [ProductServiceController::class, 'store'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_CATALOG_MANAGE],
]);
$router->add('PUT', '/api/products-services/{id}', [ProductServiceController::class, 'update'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_CATALOG_MANAGE],
]);
$router->add('DELETE', '/api/products-services/{id}', [ProductServiceController::class, 'destroy'], [
AuthMiddleware::class,
[PermissionMiddleware::class, RolePermissions::PERM_CATALOG_MANAGE],
]);
// ==========================================
// QUOTATIONS / ORÇAMENTOS MODULE
// ==========================================
use App\Controllers\QuotationController;
$router->add('GET', '/api/quotations', [QuotationController::class, 'index'], [AuthMiddleware::class]);
$router->add('GET', '/api/quotations/stats', [QuotationController::class, 'stats'], [AuthMiddleware::class]);
$router->add('GET', '/api/quotations/{id}', [QuotationController::class, 'show'], [AuthMiddleware::class]);
$router->add('POST', '/api/quotations', [QuotationController::class, 'store'], [AuthMiddleware::class]);
$router->add('PUT', '/api/quotations/{id}', [QuotationController::class, 'update'], [AuthMiddleware::class]);
$router->add('DELETE', '/api/quotations/{id}', [QuotationController::class, 'destroy'], [AuthMiddleware::class]);
Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/src/Routes/api.php:1) in /var/www/html/src/Core/Router.php on line 58
404 Not Found