feat: Thêm các controller và query quản trị cho Storage Service, cải tiến quản lý cấp độ thành viên với các bài kiểm tra mới, và cập nhật các controller cùng chính sách ủy quyền

This commit is contained in:
Ho Ngoc Hai
2026-01-15 19:23:31 +07:00
parent 0358ca255a
commit 85bd4d6f58
37 changed files with 2204 additions and 92 deletions

View File

@@ -0,0 +1,68 @@
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 });
}
}