63 lines
2.3 KiB
C#
63 lines
2.3 KiB
C#
using Management.Data;
|
|
using Management.Security;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using System.Text.Json;
|
|
|
|
namespace Management.Controllers.Admin;
|
|
|
|
/// <summary>
|
|
/// 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
|
|
/// </summary>
|
|
[ApiController]
|
|
[Route("api/admin/sessions")]
|
|
public sealed class AdminSessionsController : AdminControllerBase
|
|
{
|
|
public AdminSessionsController(SqlService sql, ClientContext client, ILogger<AdminSessionsController> log)
|
|
: base(sql, client, log) { }
|
|
|
|
/// <summary>
|
|
/// List sessions with optional filtering.
|
|
/// </summary>
|
|
[HttpPost("list")]
|
|
public Task<IActionResult> List([FromBody] JsonElement body, CancellationToken ct)
|
|
=> CallProc("spAdminSessions", "list", body.ToString(), ct);
|
|
|
|
/// <summary>
|
|
/// Revoke a session.
|
|
/// </summary>
|
|
[HttpPost("{sessionId}/revoke")]
|
|
public Task<IActionResult> Revoke(string sessionId, CancellationToken ct)
|
|
{
|
|
Logger.LogWarning("[Admin] RevokeSession | SessionId={SessionId} | By={User}", sessionId, Client.Email);
|
|
return CallProc("spAdminSessions", "revoke", new { sessionId }, ct);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Revoke all sessions for a user.
|
|
/// </summary>
|
|
[HttpPost("~/api/admin/users/{userId}/revoke-sessions")]
|
|
public Task<IActionResult> RevokeAllForUser(string userId, CancellationToken ct)
|
|
{
|
|
Logger.LogWarning("[Admin] RevokeAllSessions | UserId={UserId} | By={User}", userId, Client.Email);
|
|
return CallProc("spAdminSessions", "revokeAllForUser", new { userId }, ct);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Cleanup expired sessions.
|
|
/// </summary>
|
|
[HttpPost("cleanup")]
|
|
public Task<IActionResult> 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);
|
|
}
|
|
}
|