using MediatR; using Microsoft.EntityFrameworkCore; using ColaFlow.Modules.ProjectManagement.Application.Common.Interfaces; using ColaFlow.Modules.ProjectManagement.Domain.Repositories; using ColaFlow.Modules.ProjectManagement.Domain.ValueObjects; using ColaFlow.Modules.ProjectManagement.Domain.Exceptions; using ColaFlow.Modules.ProjectManagement.Domain.Enums; namespace ColaFlow.Modules.ProjectManagement.Application.Commands.DeleteSprint; /// /// Handler for DeleteSprintCommand /// public sealed class DeleteSprintCommandHandler( IApplicationDbContext context, IUnitOfWork unitOfWork) : IRequestHandler { private readonly IApplicationDbContext _context = context ?? throw new ArgumentNullException(nameof(context)); private readonly IUnitOfWork _unitOfWork = unitOfWork ?? throw new ArgumentNullException(nameof(unitOfWork)); public async Task Handle(DeleteSprintCommand request, CancellationToken cancellationToken) { // Get sprint with tracking var sprintId = SprintId.From(request.SprintId); var sprint = await _context.Sprints .FirstOrDefaultAsync(s => s.Id == sprintId, cancellationToken); if (sprint == null) throw new NotFoundException("Sprint", request.SprintId); // Business rule: Cannot delete Active sprints if (sprint.Status.Name == SprintStatus.Active.Name) throw new DomainException("Cannot delete an active sprint. Please complete it first."); // Remove sprint _context.Sprints.Remove(sprint); // Save changes await _unitOfWork.SaveChangesAsync(cancellationToken); return Unit.Value; } }