using Asp.Versioning; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using AdsAnalyticsService.API.Application.DTOs; using AdsAnalyticsService.Infrastructure; namespace AdsAnalyticsService.API.Controllers.Admin; /// /// EN: Admin API Controller for reports management. /// VI: Admin API Controller quản lý báo cáo. /// [ApiController] [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/admin/ads-analytics/reports")] [Produces("application/json")] public class AdminReportsController : ControllerBase { private readonly AdsAnalyticsServiceContext _context; private readonly ILogger _logger; public AdminReportsController( AdsAnalyticsServiceContext context, ILogger logger) { _context = context ?? throw new ArgumentNullException(nameof(context)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } /// /// EN: Get all reports across all advertisers. /// VI: Lấy tất cả báo cáo từ tất cả advertisers. /// [HttpGet] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] public async Task>> GetAllReports( [FromQuery] int skip = 0, [FromQuery] int take = 50) { var reports = await _context.Reports .OrderByDescending(r => r.CreatedAt) .Skip(skip) .Take(take) .Select(r => new ReportListDto( r.Id, r.Name, r.ReportType.ToString(), r.StartDate, r.EndDate, r.Status.ToString(), r.CreatedAt)) .ToListAsync(); _logger.LogInformation("Admin retrieved {Count} reports", reports.Count); return Ok(reports); } /// /// EN: Delete a report (admin only). /// VI: Xóa báo cáo (chỉ admin). /// [HttpDelete("{id}")] [ProducesResponseType(StatusCodes.Status204NoContent)] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task DeleteReport(Guid id) { var report = await _context.Reports.FindAsync(id); if (report == null) return NotFound(new { message = $"Report {id} not found" }); _context.Reports.Remove(report); await _context.SaveChangesAsync(); _logger.LogInformation("Admin deleted report {ReportId}", id); return NoContent(); } }