Files
pos-system/services/storage-service-net/src/StorageService.API/Controllers/Admin/AdminStatisticsController.cs

69 lines
2.4 KiB
C#

using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using StorageService.API.Application.Queries.Admin;
using Swashbuckle.AspNetCore.Annotations;
using Asp.Versioning;
namespace StorageService.API.Controllers.Admin;
/// <summary>
/// EN: Admin controller for storage statistics.
/// VI: Controller admin cho thống kê storage.
/// </summary>
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/admin/statistics")]
[Authorize(Roles = "Admin,SuperAdmin")]
[SwaggerTag("Admin Statistics - Dashboard statistics for storage")]
public class AdminStatisticsController : ControllerBase
{
private readonly IMediator _mediator;
public AdminStatisticsController(IMediator mediator)
{
_mediator = mediator;
}
/// <summary>
/// EN: Get storage statistics.
/// VI: Lấy thống kê storage.
/// </summary>
[HttpGet]
[SwaggerOperation(Summary = "Get statistics", Description = "Get aggregated storage statistics for dashboard")]
[SwaggerResponse(200, "Statistics retrieved successfully")]
[SwaggerResponse(403, "Forbidden - Admin role required")]
public async Task<ActionResult<ApiResponse<StorageStatisticsDto>>> GetStatistics(
CancellationToken cancellationToken = default)
{
var query = new GetStorageStatisticsQuery();
var result = await _mediator.Send(query, cancellationToken);
return Ok(new ApiResponse<StorageStatisticsDto> { Success = true, Data = result });
}
/// <summary>
/// EN: Get users near storage limit.
/// VI: Lấy users gần hết quota.
/// </summary>
[HttpGet("users-near-limit")]
[SwaggerOperation(Summary = "Get users near limit", Description = "Get users with usage >= 80%")]
[SwaggerResponse(200, "Users retrieved successfully")]
public async Task<ActionResult<ApiResponse<AllUsersQuotaResult>>> GetUsersNearLimit(
[FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 20,
CancellationToken cancellationToken = default)
{
var query = new GetAllUsersQuotaQuery(
pageNumber, pageSize,
null, // quotaTier
80, // minUsagePercentage = 80%
"usedStorageBytes",
true // descending - highest usage first
);
var result = await _mediator.Send(query, cancellationToken);
return Ok(new ApiResponse<AllUsersQuotaResult> { Success = true, Data = result });
}
}