Sessions globales (admin)
Vue + révocation cross-users de toutes les sessions actives, filtres pays/provider/inactivité.
Page admin /admin/sessions — diffère du tab "Sessions" dans
/account/settings qui n'affiche que tes propres sessions.
Filtres
- Country (code 2 lettres : FR, US…)
- Provider (
credentials,google,github…) - Inactif depuis N jours
L'API list (GET /api/admin/sessions) renvoie 50 par page (cursor-based)
avec le user de chaque session inclus.
Bulk revoke
Deux modes :
POST /api/admin/sessions/bulk
// Mode 1 — par filtre
{ inactiveDays: 90 }
// Mode 2 — IDs explicites (≤ 500)
{ sessionIds: [...] }Sur succès : delete des UserSession concernées + bump du tokenVersion
sur chaque user affecté → les JWT sont invalidés au refresh suivant.
Self-exclusion
Hard-coded : on n'inclut jamais :
- la session courante de l'admin (
token.sid) - les autres sessions de l'admin courant (
userId !== session.user.id)
Évite le scénario "j'ai cliqué Révoquer Inactifs 30j et je me suis déconnecté tout seul".
UI
Bouton "Révoquer le filtre" → applique le filtre courant en mode bulk. Action par row : "Révoquer" → revoke d'une seule session.
<DataList> pour le rendu (table desktop / cards mobile).
Modèle
Pas de nouveau modèle — réutilise UserSession qui existe déjà :
model UserSession {
id String @id @default(cuid())
userId String
userAgent String?
ip String?
country String?
city String?
provider String @default("credentials")
createdAt DateTime @default(now())
lastActiveAt DateTime @default(now())
}Audit : session.bulk_revoke avec metadata.revoked + users + inactiveDays.