using AutoMapper; using MediatR; using Mws.Application.Common; using Mws.Domain.Projects; namespace Mws.Application.Projects; public record CreateProjectCommand(Guid UserId, CreateProjectRequest Request) : IRequest; public class CreateProjectHandler(IUnitOfWork uow, IMapper mapper) : IRequestHandler { public async Task Handle(CreateProjectCommand command, CancellationToken ct) { var request = command.Request; if (string.IsNullOrWhiteSpace(request.Name)) { throw new BadRequestException("Project name is required"); } var now = DateTime.UtcNow; var project = new Project { Id = Guid.NewGuid(), Name = request.Name.Trim(), Description = request.Description, Status = ProjectStatus.Active, CreatedAt = now, UpdatedAt = now, }; project.Members.Add(new ProjectMember { ProjectId = project.Id, UserId = command.UserId, Role = MemberRole.Owner, }); uow.Projects.Add(project); await uow.SaveChangesAsync(ct); return mapper.Map(project); } }