feat: Version 3.3.4 - Nouvelle architecture pages, optimisations widgets Flutter et API
- 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>
This commit is contained in:
166
api/docs/nouvelles-routes-session-refresh.txt
Normal file
166
api/docs/nouvelles-routes-session-refresh.txt
Normal file
@@ -0,0 +1,166 @@
|
||||
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.
|
||||
Reference in New Issue
Block a user