using System.Security.Claims; using HelpDesk.Data.Repositories; using HelpDesk.Models.DTOs; using HelpDesk.Models.Entities; using HelpDesk.Models.Enums; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace HelpDesk.API.Controllers; [ApiController] [Route("api/[controller]")] [Authorize(Policy = "Agent")] public class DashboardController : ControllerBase { private readonly ITicketRepository _ticketRepository; private readonly IUserRepository _userRepository; public DashboardController(ITicketRepository ticketRepository, IUserRepository userRepository) { _ticketRepository = ticketRepository; _userRepository = userRepository; } [HttpGet("stats")] public async Task> GetStats() { var agents = await _userRepository.GetByRoleAsync(UserRole.Agent); var agentWorkloads = new List(); foreach (var agent in agents) { var activeTickets = await _ticketRepository.GetCountAsync( assigneeId: agent.Id, status: TicketStatus.Open); var inProgressTickets = await _ticketRepository.GetCountAsync( assigneeId: agent.Id, status: TicketStatus.InProgress); agentWorkloads.Add(new AgentWorkloadDto { UserId = agent.Id, UserName = $"{agent.FirstName} {agent.LastName}", ActiveTickets = activeTickets + inProgressTickets, ResolvedThisWeek = 0 }); } return Ok(new DashboardStatsDto { TotalTickets = await _ticketRepository.GetTotalCountAsync(), OpenTickets = await _ticketRepository.GetCountByStatusAsync(TicketStatus.Open), InProgressTickets = await _ticketRepository.GetCountByStatusAsync(TicketStatus.InProgress), PendingTickets = await _ticketRepository.GetCountByStatusAsync(TicketStatus.Pending), ResolvedTickets = await _ticketRepository.GetCountByStatusAsync(TicketStatus.Resolved), ClosedTickets = await _ticketRepository.GetCountByStatusAsync(TicketStatus.Closed), CriticalTickets = await _ticketRepository.GetCountByPriorityAsync(TicketPriority.Critical), HighTickets = await _ticketRepository.GetCountByPriorityAsync(TicketPriority.High), MediumTickets = await _ticketRepository.GetCountByPriorityAsync(TicketPriority.Medium), LowTickets = await _ticketRepository.GetCountByPriorityAsync(TicketPriority.Low), AverageResponseTimeMinutes = await _ticketRepository.GetAverageResponseTimeAsync(), AverageResolutionTimeMinutes = await _ticketRepository.GetAverageResolutionTimeAsync(), AgentWorkloads = agentWorkloads }); } }