using AutoMapper; using MediatR; using mws.backend.dotnet.application.Common; using mws.backend.dotnet.domain.Projects; namespace mws.backend.dotnet.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.UpdatedBy = command.UserId; project.UpdatedAt = DateTime.UtcNow; await uow.SaveChangesAsync(ct); return mapper.Map(project); } }