using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using PromotionService.API.Application.Commands; using PromotionService.API.Application.DTOs; using PromotionService.API.Application.Queries; namespace PromotionService.API.Controllers.Admin; /// /// EN: Admin controller for Voucher management. /// VI: Admin controller để quản lý Voucher. /// [ApiController] [Route("api/v1/admin/vouchers")] [Authorize] [Produces("application/json")] public class AdminVouchersController : ControllerBase { private readonly IMediator _mediator; private readonly ILogger _logger; public AdminVouchersController(IMediator mediator, ILogger logger) { _mediator = mediator; _logger = logger; } /// /// EN: Get all vouchers with pagination and filters. /// VI: Lấy tất cả vouchers với phân trang và bộ lọc. /// [HttpGet] [ProducesResponseType(typeof(PaginatedResponse), StatusCodes.Status200OK)] public async Task>> GetAllVouchers( [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20, [FromQuery] Guid? campaignId = null, [FromQuery] Guid? userId = null, [FromQuery] string? status = null, [FromQuery] string? codeSearch = null) { var result = await _mediator.Send(new GetAllVouchersQuery(pageNumber, pageSize, campaignId, userId, status, codeSearch)); return Ok(result); } /// /// EN: Search vouchers by code. /// VI: Tìm kiếm vouchers theo mã. /// [HttpGet("search")] [ProducesResponseType(typeof(IEnumerable), StatusCodes.Status200OK)] public async Task>> SearchVouchers( [FromQuery] string q) { var result = await _mediator.Send(new SearchVouchersQuery(q)); return Ok(result); } /// /// EN: Get vouchers by user. /// VI: Lấy vouchers theo user. /// [HttpGet("by-user/{userId:guid}")] [ProducesResponseType(typeof(PaginatedResponse), StatusCodes.Status200OK)] public async Task>> GetVouchersByUser( Guid userId, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 20) { var result = await _mediator.Send(new GetAllVouchersQuery(pageNumber, pageSize, null, userId, null, null)); return Ok(result); } /// /// EN: Revoke a voucher. /// VI: Thu hồi voucher. /// [HttpPost("{id:guid}/revoke")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task RevokeVoucher(Guid id, [FromBody] RevokeVoucherRequest request) { var result = await _mediator.Send(new RevokeVoucherCommand(id, request.Reason)); return result ? Ok() : NotFound(); } /// /// EN: Extend voucher expiry. /// VI: Gia hạn voucher. /// [HttpPost("{id:guid}/extend")] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task ExtendVoucherExpiry(Guid id, [FromBody] ExtendExpiryRequest request) { var result = await _mediator.Send(new ExtendVoucherExpiryCommand(id, request.AdditionalDays)); return result ? Ok() : NotFound(); } } public record RevokeVoucherRequest(string Reason); public record ExtendExpiryRequest(int AdditionalDays);