using Management.Data; using Management.Security; using Microsoft.AspNetCore.Mvc; using System.Text.Json; namespace Management.Controllers.Admin; /// /// Admin endpoints for session management. /// Requires Admin role. /// /// ENDPOINTS: /// GET /api/admin/sessions - List sessions /// POST /api/admin/sessions/{id}/revoke - Revoke session /// POST /api/admin/users/{id}/revoke-sessions - Revoke all user sessions /// POST /api/admin/sessions/cleanup - Cleanup expired sessions /// [ApiController] [Route("api/admin/sessions")] public sealed class AdminSessionsController : AdminControllerBase { public AdminSessionsController(SqlService sql, ClientContext client, ILogger log) : base(sql, client, log) { } /// /// List sessions with optional filtering. /// [HttpPost("list")] public Task List([FromBody] JsonElement body, CancellationToken ct) => CallProc("spAdminSessions", "list", body.ToString(), ct); /// /// Revoke a session. /// [HttpPost("{sessionId}/revoke")] public Task Revoke(string sessionId, CancellationToken ct) { Logger.LogWarning("[Admin] RevokeSession | SessionId={SessionId} | By={User}", sessionId, Client.Email); return CallProc("spAdminSessions", "revoke", new { sessionId }, ct); } /// /// Revoke all sessions for a user. /// [HttpPost("~/api/admin/users/{userId}/revoke-sessions")] public Task RevokeAllForUser(string userId, CancellationToken ct) { Logger.LogWarning("[Admin] RevokeAllSessions | UserId={UserId} | By={User}", userId, Client.Email); return CallProc("spAdminSessions", "revokeAllForUser", new { userId }, ct); } /// /// Cleanup expired sessions. /// [HttpPost("cleanup")] public Task Cleanup([FromBody] JsonElement body, CancellationToken ct) { var daysOld = body.TryGetProperty("daysOld", out var d) ? d.GetInt32() : 30; Logger.LogWarning("[Admin] CleanupSessions | DaysOld={DaysOld} | By={User}", daysOld, Client.Email); return CallProc("spAdminSessions", "cleanup", body.ToString(), ct); } }