- Mise à jour VERSION vers 3.3.4 - Optimisations et révisions architecture API (deploy-api.sh, scripts de migration) - Ajout documentation Stripe Tap to Pay complète - Migration vers polices Inter Variable pour Flutter - Optimisations build Android et nettoyage fichiers temporaires - Amélioration système de déploiement avec gestion backups - Ajout scripts CRON et migrations base de données 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
167 lines
4.9 KiB
Plaintext
167 lines
4.9 KiB
Plaintext
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.
|