using Asp.Versioning; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using OpenIddict.Validation.AspNetCore; using Swashbuckle.AspNetCore.Annotations; using IamService.API.Application.Common; using IamService.API.Application.Queries.Users; namespace IamService.API.Controllers; /// /// EN: Users management controller. /// VI: Controller quản lý users. /// [ApiController] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/users")] [Authorize(AuthenticationSchemes = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme)] [SwaggerTag("User management endpoints - requires authentication")] public class UsersController : ControllerBase { private readonly IMediator _mediator; private readonly ILogger _logger; public UsersController( IMediator mediator, ILogger logger) { _mediator = mediator; _logger = logger; } /// /// EN: Get all users with pagination. /// VI: Lấy tất cả users với phân trang. /// /// Page number (1-based) /// Number of items per page /// Cancellation token /// Paginated list of users [HttpGet] [SwaggerOperation( Summary = "Get all users", Description = "Retrieves a paginated list of all users. Requires authentication.", OperationId = "GetUsers")] [SwaggerResponse(StatusCodes.Status200OK, "Successfully retrieved users", typeof(ApiResponse>))] [SwaggerResponse(StatusCodes.Status401Unauthorized, "Authentication required")] [ProducesResponseType(typeof(ApiResponse>), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task GetUsers( [FromQuery, SwaggerParameter("Page number (1-based)", Required = false)] int pageNumber = 1, [FromQuery, SwaggerParameter("Number of items per page", Required = false)] int pageSize = 10, CancellationToken cancellationToken = default) { var query = new GetUsersQuery(pageNumber, pageSize); var result = await _mediator.Send(query, cancellationToken); return Ok(new ApiResponse> { Success = true, Data = result.Users.Select(u => new UserDto { Id = u.Id, Email = u.Email ?? string.Empty, FirstName = u.FirstName, LastName = u.LastName, FullName = u.FullName, Status = u.Status, CreatedAt = u.CreatedAt, LastLoginAt = u.LastLoginAt }), Pagination = new PaginationInfo { PageNumber = result.PageNumber, PageSize = result.PageSize, TotalCount = result.TotalCount } }); } /// /// EN: Get current user info. /// VI: Lấy thông tin user hiện tại. /// /// Current user information [HttpGet("me")] [SwaggerOperation( Summary = "Get current user", Description = "Retrieves information about the currently authenticated user.", OperationId = "GetCurrentUser")] [SwaggerResponse(StatusCodes.Status200OK, "Successfully retrieved current user", typeof(ApiResponse))] [SwaggerResponse(StatusCodes.Status401Unauthorized, "Authentication required")] [ProducesResponseType(typeof(ApiResponse), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public IActionResult GetCurrentUser() { var userId = User.FindFirst("sub")?.Value; var email = User.FindFirst("email")?.Value; var name = User.FindFirst("name")?.Value; var roles = User.FindAll("role").Select(c => c.Value); return Ok(ApiResponse.Ok(new CurrentUserDto { Id = userId ?? string.Empty, Email = email, Name = name, Roles = roles })); } }