// EN: Reports REST API Controller.
// VI: Controller REST API cho Reports.
using Asp.Versioning;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using OrderService.API.Application.Queries;
namespace OrderService.API.Controllers;
///
/// EN: Reports API Controller for revenue and product analytics.
/// VI: Controller API Reports cho phân tích doanh thu và sản phẩm.
///
[ApiController]
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/reports")]
public class ReportsController : ControllerBase
{
private readonly IMediator _mediator;
private readonly ILogger _logger;
public ReportsController(
IMediator mediator,
ILogger logger)
{
_mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
///
/// EN: Get revenue report grouped by period (daily, weekly, monthly).
/// VI: Lấy báo cáo doanh thu theo kỳ (ngày, tuần, tháng).
///
[HttpGet("revenue")]
[ProducesResponseType(typeof(RevenueReportDto), StatusCodes.Status200OK)]
public async Task> GetRevenueReport(
[FromQuery] Guid shopId,
[FromQuery] string period = "daily",
[FromQuery] DateTime? fromDate = null,
[FromQuery] DateTime? toDate = null,
CancellationToken cancellationToken = default)
{
_logger.LogInformation(
"EN: Getting revenue report for shop {ShopId}, period {Period} / VI: Lấy báo cáo doanh thu cho shop {ShopId}, kỳ {Period}",
shopId, period);
var query = new GetRevenueReportQuery(period, shopId, fromDate, toDate);
var result = await _mediator.Send(query, cancellationToken);
return Ok(result);
}
///
/// EN: Get top selling products.
/// VI: Lấy sản phẩm bán chạy nhất.
///
[HttpGet("top-products")]
[ProducesResponseType(typeof(List), StatusCodes.Status200OK)]
public async Task>> GetTopProducts(
[FromQuery] Guid shopId,
[FromQuery] int limit = 10,
[FromQuery] DateTime? fromDate = null,
[FromQuery] DateTime? toDate = null,
CancellationToken cancellationToken = default)
{
_logger.LogInformation(
"EN: Getting top {Limit} products for shop {ShopId} / VI: Lấy top {Limit} sản phẩm cho shop {ShopId}",
limit, shopId);
var query = new GetTopProductsQuery(shopId, limit, fromDate, toDate);
var result = await _mediator.Send(query, cancellationToken);
return Ok(result);
}
}