using Asp.Versioning; using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using AdsAnalyticsService.API.Application.Queries; namespace AdsAnalyticsService.API.Controllers; /// /// EN: API Controller for ads analytics metrics. /// VI: API Controller cho metrics phân tích quảng cáo. /// [ApiController] [Authorize] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/ads-analytics")] [Produces("application/json")] public class MetricsController : ControllerBase { private readonly IMediator _mediator; private readonly ILogger _logger; public MetricsController(IMediator mediator, ILogger logger) { _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } /// /// EN: Get campaign metrics for a date range. /// VI: Lấy metrics chiến dịch cho khoảng thời gian. /// /// Campaign ID /// Start date (YYYY-MM-DD) /// End date (YYYY-MM-DD) /// Campaign metrics [HttpGet("campaigns/{id}/metrics")] [ProducesResponseType(typeof(CampaignMetricsDto), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task> GetCampaignMetrics( Guid id, [FromQuery] DateTime? startDate = null, [FromQuery] DateTime? endDate = null) { // EN: Default to last 30 days if not specified // VI: Mặc định 30 ngày gần nhất nếu không chỉ định var start = startDate ?? DateTime.UtcNow.AddDays(-30).Date; var end = endDate ?? DateTime.UtcNow.Date; var query = new GetCampaignMetricsQuery { CampaignId = id, StartDate = start, EndDate = end }; var metrics = await _mediator.Send(query); if (metrics == null) return NotFound(new { message = $"No metrics found for campaign {id}" }); return Ok(metrics); } /// /// EN: Get ad set metrics (placeholder for future implementation). /// VI: Lấy metrics ad set (placeholder cho triển khai sau). /// [HttpGet("adsets/{id}/metrics")] [ProducesResponseType(StatusCodes.Status501NotImplemented)] public IActionResult GetAdSetMetrics(Guid id) { _logger.LogWarning("AdSet metrics not yet implemented"); return StatusCode(StatusCodes.Status501NotImplemented, new { message = "AdSet metrics endpoint not yet implemented" }); } /// /// EN: Get ad metrics (placeholder for future implementation). /// VI: Lấy metrics ad (placeholder cho triển khai sau). /// [HttpGet("ads/{id}/metrics")] [ProducesResponseType(StatusCodes.Status501NotImplemented)] public IActionResult GetAdMetrics(Guid id) { _logger.LogWarning("Ad metrics not yet implemented"); return StatusCode(StatusCodes.Status501NotImplemented, new { message = "Ad metrics endpoint not yet implemented" }); } }