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
}));
}
}