group(function () { Route::post('/register', [AuthController::class, 'register']); Route::post('/login', [AuthController::class, 'login']); Route::middleware('auth:sanctum')->group(function () { Route::get('/me', [AuthController::class, 'me']); // Alias to support clients calling /api/auth/user Route::get('/user', [AuthController::class, 'me']); Route::post('/logout', [AuthController::class, 'logout']); Route::post('/logout-all', [AuthController::class, 'logoutAll']); }); }); // Protected API routes Route::middleware('auth:sanctum')->group(function () { // Client management // IMPORTANT: Specific routes must come before apiResource Route::get('/clients/searchBy', [ClientController::class, 'searchBy']); Route::apiResource('clients', ClientController::class); Route::apiResource('client-groups', ClientGroupController::class); Route::apiResource('client-locations', ClientLocationController::class); Route::get('clients/{clientId}/locations', [ClientLocationController::class, 'getLocationsByClient']); // Contact management Route::apiResource('contacts', ContactController::class); Route::get('clients/{clientId}/contacts', [ContactController::class, 'getContactsByClient']); Route::apiResource('client-categories', ClientCategoryController::class); // Fournisseur management Route::get('/fournisseurs/searchBy', [FournisseurController::class, 'searchBy']); Route::apiResource('fournisseurs', FournisseurController::class); Route::get('fournisseurs/{fournisseurId}/contacts', [ContactController::class, 'getContactsByFournisseur']); // Product management Route::get('/products/searchBy', [ProductController::class, 'searchBy']); Route::get('/products/low-stock', [ProductController::class, 'lowStock']); Route::get('/products/by-category', [ProductController::class, 'byCategory']); Route::get('/products/statistics', [ProductController::class, 'statistics']); Route::apiResource('products', ProductController::class); Route::patch('/products/{id}/stock', [ProductController::class, 'updateStock']); // Product Category management Route::get('/product-categories/search', [ProductCategoryController::class, 'search']); Route::get('/product-categories/active', [ProductCategoryController::class, 'active']); Route::get('/product-categories/roots', [ProductCategoryController::class, 'roots']); Route::get('/product-categories/hierarchical', [ProductCategoryController::class, 'hierarchical']); Route::get('/product-categories/statistics', [ProductCategoryController::class, 'statistics']); Route::apiResource('product-categories', ProductCategoryController::class); Route::patch('/product-categories/{id}/toggle-active', [ProductCategoryController::class, 'toggleActive']); // Employee management Route::get('/employees/searchBy', [EmployeeController::class, 'searchBy']); Route::get('/employees/thanatopractitioners', [EmployeeController::class, 'getThanatopractitioners']); Route::apiResource('employees', EmployeeController::class); // Thanatopractitioner management Route::get('/thanatopractitioners/search', [ThanatopractitionerController::class, 'searchByEmployeeName']); Route::apiResource('thanatopractitioners', ThanatopractitionerController::class); Route::get('employees/{employeeId}/thanatopractitioners', [ThanatopractitionerController::class, 'getByEmployee']); Route::get('/thanatopractitioners/{id}/documents', [PractitionerDocumentController::class, 'getByThanatopractitioner']); // Practitioner Document management Route::get('/practitioner-documents/searchBy', [PractitionerDocumentController::class, 'searchBy']); Route::get('/practitioner-documents/expiring', [PractitionerDocumentController::class, 'getExpiringDocuments']); Route::apiResource('practitioner-documents', PractitionerDocumentController::class); Route::patch('/practitioner-documents/{id}/verify', [PractitionerDocumentController::class, 'verifyDocument']); // Deceased Routes Route::prefix('deceased')->group(function () { Route::get('/searchBy', [DeceasedController::class, 'searchBy']); Route::get('/', [DeceasedController::class, 'index']); Route::post('/', [DeceasedController::class, 'store']); Route::get('/{deceased}', [DeceasedController::class, 'show']); Route::put('/{deceased}', [DeceasedController::class, 'update']); Route::delete('/{deceased}', [DeceasedController::class, 'destroy']); }); // Deceased Document Routes Route::prefix('deceased-documents')->group(function () { Route::get('/by-deceased/{deceasedId}', [DeceasedDocumentController::class, 'byDeceased']); Route::get('/by-doc-type', [DeceasedDocumentController::class, 'byDocType']); Route::get('/by-file/{fileId}', [DeceasedDocumentController::class, 'byFile']); Route::get('/search', [DeceasedDocumentController::class, 'search']); Route::get('/', [DeceasedDocumentController::class, 'index']); Route::post('/', [DeceasedDocumentController::class, 'store']); Route::get('/{id}', [DeceasedDocumentController::class, 'show']); Route::put('/{id}', [DeceasedDocumentController::class, 'update']); Route::delete('/{id}', [DeceasedDocumentController::class, 'destroy']); }); // Intervention Routes Route::prefix('interventions')->group(function () { Route::get('/by-month', [InterventionController::class, 'byMonth']); Route::get('/', [InterventionController::class, 'index']); Route::post('/', [InterventionController::class, 'store']); Route::post('/with-all-data', [InterventionController::class, 'createInterventionalldata']); Route::get('/{intervention}', [InterventionController::class, 'show']); Route::put('/{intervention}', [InterventionController::class, 'update']); Route::delete('/{intervention}', [InterventionController::class, 'destroy']); Route::patch('/{intervention}/status', [InterventionController::class, 'changeStatus']); Route::patch('/{intervention}/assign', [InterventionController::class, 'createAssignment']); Route::patch('/{intervention}/{practitionerId}/unassignPractitioner', [InterventionController::class, 'unassignPractitioner']); Route::get('/{intervention}/debug', [InterventionController::class, 'debugPractitioners']); }); // File management Route::prefix('files')->group(function () { Route::get('/', [FileController::class, 'index']); Route::post('/', [FileController::class, 'store']); Route::get('/by-category/{category}', [FileController::class, 'byCategory']); Route::get('/by-client/{clientId}', [FileController::class, 'byClient']); Route::get('/organized', [FileController::class, 'organized']); Route::get('/statistics', [FileController::class, 'stats']); Route::get('/{id}', [FileController::class, 'show']); Route::put('/{id}', [FileController::class, 'update']); Route::delete('/{id}', [FileController::class, 'destroy']); Route::get('/{id}/download', [FileController::class, 'download']); }); // File Attachment management Route::prefix('file-attachments')->group(function () { Route::post('/', [FileAttachmentController::class, 'attach']); Route::put('/{attachmentId}', [FileAttachmentController::class, 'update']); Route::delete('/{attachmentId}', [FileAttachmentController::class, 'detach']); Route::post('/detach-multiple', [FileAttachmentController::class, 'detachMultiple']); Route::post('/reorder', [FileAttachmentController::class, 'reorder']); Route::get('/attached-files', [FileAttachmentController::class, 'getAttachedFiles']); Route::get('/intervention/{interventionId}/files', [FileAttachmentController::class, 'getInterventionFiles']); Route::get('/client/{clientId}/files', [FileAttachmentController::class, 'getClientFiles']); Route::get('/deceased/{deceasedId}/files', [FileAttachmentController::class, 'getDeceasedFiles']); }); });