1. Route /session/refresh/all Méthode : POSTAuthentification : Requise (via session_id dans headers ou cookies) Headers requis : Authorization: Bearer {session_id} // ou Cookie: session_id={session_id} Réponse attendue : { "status": "success", "message": "Session refreshed", "user": { // Mêmes données que le login "id": 123, "email": "user@example.com", "name": "John Doe", "fk_role": 2, "fk_entite": 1, // ... }, "amicale": { // Données de l'amicale "id": 1, "name": "Amicale Pompiers", // ... }, "operations": [...], "sectors": [...], "passages": [...], "membres": [...], "session_id": "current_session_id", "session_expiry": "2024-01-20T10:00:00Z" } Code PHP suggéré : // routes/session.php Route::post('/session/refresh/all', function(Request $request) { $user = Auth::user(); if (!$user) { return response()->json(['status' => 'error', 'message' => 'Not authenticated'], 401); } // Retourner les mêmes données qu'un login normal return response()->json([ 'status' => 'success', 'user' => $user->toArray(), 'amicale' => $user->amicale, 'operations' => Operation::where('fk_entite', $user->fk_entite)->get(), 'sectors' => Sector::where('fk_entite', $user->fk_entite)->get(), 'passages' => Passage::where('fk_entite', $user->fk_entite)->get(), 'membres' => Membre::where('fk_entite', $user->fk_entite)->get(), 'session_id' => session()->getId(), 'session_expiry' => now()->addDays(7)->toIso8601String() ]); }); 2. Route /session/refresh/partial Méthode : POSTAuthentification : Requise Body requis : { "last_sync": "2024-01-19T10:00:00Z" } Réponse attendue : { "status": "success", "message": "Partial refresh completed", "sectors": [ // Uniquement les secteurs modifiés après last_sync { "id": 45, "name": "Secteur A", "updated_at": "2024-01-19T15:00:00Z", // ... } ], "passages": [ // Uniquement les passages modifiés après last_sync { "id": 789, "fk_sector": 45, "updated_at": "2024-01-19T14:30:00Z", // ... } ], "operations": [...], // Si modifiées "membres": [...] // Si modifiés } Code PHP suggéré : // routes/session.php Route::post('/session/refresh/partial', function(Request $request) { $user = Auth::user(); if (!$user) { return response()->json(['status' => 'error', 'message' => 'Not authenticated'], 401); } $lastSync = Carbon::parse($request->input('last_sync')); // Récupérer uniquement les données modifiées après last_sync $response = [ 'status' => 'success', 'message' => 'Partial refresh completed' ]; // Secteurs modifiés $sectors = Sector::where('fk_entite', $user->fk_entite) ->where('updated_at', '>', $lastSync) ->get(); if ($sectors->count() > 0) { $response['sectors'] = $sectors; } // Passages modifiés $passages = Passage::where('fk_entite', $user->fk_entite) ->where('updated_at', '>', $lastSync) ->get(); if ($passages->count() > 0) { $response['passages'] = $passages; } // Opérations modifiées $operations = Operation::where('fk_entite', $user->fk_entite) ->where('updated_at', '>', $lastSync) ->get(); if ($operations->count() > 0) { $response['operations'] = $operations; } // Membres modifiés $membres = Membre::where('fk_entite', $user->fk_entite) ->where('updated_at', '>', $lastSync) ->get(); if ($membres->count() > 0) { $response['membres'] = $membres; } return response()->json($response); }); Points importants pour l'API : 1. Vérification de session : Les deux routes doivent vérifier que le session_id est valide et non expiré 2. Timestamps : Assurez-vous que toutes vos tables ont des colonnes updated_at qui sont mises à jour automatiquement 3. Gestion des suppressions : Pour le refresh partiel, vous pourriez ajouter un champ pour les éléments supprimés : { "deleted": { "sectors": [12, 34], // IDs des secteurs supprimés "passages": [567, 890] } } 4. Optimisation : Pour éviter de surcharger, limitez le refresh partiel aux dernières 24-48h maximum 5. Gestion d'erreurs : { "status": "error", "message": "Session expired", "code": "SESSION_EXPIRED" } L'app Flutter s'attend à ces formats de réponse et utilisera automatiquement le refresh partiel si la dernière sync date de moins de 24h, sinon elle fera un refresh complet.