Files
pos-system/services/promotion-service-net/src/PromotionService.API/Controllers/Admin/AdminVouchersController.cs
Ho Ngoc Hai 629fed8a55 commit
2026-03-05 01:39:40 +07:00

104 lines
3.7 KiB
C#

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;
/// <summary>
/// EN: Admin controller for Voucher management.
/// VI: Admin controller để quản lý Voucher.
/// </summary>
[ApiController]
[Route("api/v1/admin/vouchers")]
[Authorize]
[Produces("application/json")]
public class AdminVouchersController : ControllerBase
{
private readonly IMediator _mediator;
private readonly ILogger<AdminVouchersController> _logger;
public AdminVouchersController(IMediator mediator, ILogger<AdminVouchersController> logger)
{
_mediator = mediator;
_logger = logger;
}
/// <summary>
/// EN: Get all vouchers with pagination and filters.
/// VI: Lấy tất cả vouchers với phân trang và bộ lọc.
/// </summary>
[HttpGet]
[ProducesResponseType(typeof(PaginatedResponse<AdminVoucherListDto>), StatusCodes.Status200OK)]
public async Task<ActionResult<PaginatedResponse<AdminVoucherListDto>>> 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);
}
/// <summary>
/// EN: Search vouchers by code.
/// VI: Tìm kiếm vouchers theo mã.
/// </summary>
[HttpGet("search")]
[ProducesResponseType(typeof(IEnumerable<AdminVoucherListDto>), StatusCodes.Status200OK)]
public async Task<ActionResult<IEnumerable<AdminVoucherListDto>>> SearchVouchers(
[FromQuery] string q)
{
var result = await _mediator.Send(new SearchVouchersQuery(q));
return Ok(result);
}
/// <summary>
/// EN: Get vouchers by user.
/// VI: Lấy vouchers theo user.
/// </summary>
[HttpGet("by-user/{userId:guid}")]
[ProducesResponseType(typeof(PaginatedResponse<AdminVoucherListDto>), StatusCodes.Status200OK)]
public async Task<ActionResult<PaginatedResponse<AdminVoucherListDto>>> 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);
}
/// <summary>
/// EN: Revoke a voucher.
/// VI: Thu hồi voucher.
/// </summary>
[HttpPost("{id:guid}/revoke")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> RevokeVoucher(Guid id, [FromBody] RevokeVoucherRequest request)
{
var result = await _mediator.Send(new RevokeVoucherCommand(id, request.Reason));
return result ? Ok() : NotFound();
}
/// <summary>
/// EN: Extend voucher expiry.
/// VI: Gia hạn voucher.
/// </summary>
[HttpPost("{id:guid}/extend")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status404NotFound)]
public async Task<IActionResult> 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);