using AutoMapper; using MediatR; using Mws.Application.Common; using Mws.Domain.Projects; namespace Mws.Application.Projects; public record UpdateProjectCommand(Guid UserId, Guid ProjectId, UpdateProjectRequest Request) : IRequest; public class UpdateProjectHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler { public async Task Handle(UpdateProjectCommand command, CancellationToken ct) { var project = await ProjectAccess.GetForUserOrThrowAsync(uow, command.UserId, command.ProjectId, ct); if (MemberRole.Owner != await uow.Projects.GetMemberRoleAsync(command.ProjectId, command.UserId, ct)) { throw new ForbiddenException("Only the project owner can update the project"); } var request = command.Request; if (string.IsNullOrWhiteSpace(request.Name)) { throw new BadRequestException("Project name is required"); } project.Name = request.Name.Trim(); project.Description = request.Description; project.Status = request.Status; project.UpdatedAt = DateTime.UtcNow; await uow.SaveChangesAsync(ct); return mapper.Map(project); } }