Convert ProjectMembers module to MediatR commands/queries
Replaces IProjectMemberService/ProjectMemberService, completing the Projects module conversion. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
using MediatR;
|
||||
using Mws.Application.Common;
|
||||
using Mws.Domain.Projects;
|
||||
|
||||
namespace Mws.Application.Projects;
|
||||
|
||||
public record AddProjectMemberCommand(Guid UserId, Guid ProjectId, AddMemberRequest Request) : IRequest<ProjectMemberDto>;
|
||||
|
||||
public class AddProjectMemberHandler(IUnitOfWork uow) : IRequestHandler<AddProjectMemberCommand, ProjectMemberDto>
|
||||
{
|
||||
public async Task<ProjectMemberDto> Handle(AddProjectMemberCommand command, CancellationToken ct)
|
||||
{
|
||||
if (await uow.Projects.GetMemberRoleAsync(command.ProjectId, command.UserId, ct) != MemberRole.Owner)
|
||||
{
|
||||
throw new ForbiddenException("Only the project owner can add members");
|
||||
}
|
||||
|
||||
var request = command.Request;
|
||||
var user = await uow.Users.GetByIdAsync(request.UserId, ct)
|
||||
?? throw new NotFoundException("User not found");
|
||||
|
||||
var already = await uow.Projects.IsMemberAsync(command.ProjectId, request.UserId, ct);
|
||||
if (already)
|
||||
{
|
||||
throw new BadRequestException("User is already a member of this project");
|
||||
}
|
||||
|
||||
var role = request.Role is MemberRole.Owner or MemberRole.Member ? request.Role : MemberRole.Member;
|
||||
var member = new ProjectMember
|
||||
{
|
||||
ProjectId = command.ProjectId,
|
||||
UserId = request.UserId,
|
||||
Role = role,
|
||||
};
|
||||
|
||||
uow.Projects.AddMember(member);
|
||||
uow.Projects.AddMemberPermission(new ProjectMemberPermission
|
||||
{
|
||||
ProjectId = command.ProjectId,
|
||||
UserId = request.UserId,
|
||||
Screen = ProjectPermissionScreens.Documents,
|
||||
CanView = true,
|
||||
CanCreate = role == MemberRole.Owner,
|
||||
CanEdit = role == MemberRole.Owner,
|
||||
CanDelete = role == MemberRole.Owner,
|
||||
});
|
||||
await uow.SaveChangesAsync(ct);
|
||||
|
||||
return new ProjectMemberDto
|
||||
{
|
||||
UserId = user.Id,
|
||||
Username = user.Username,
|
||||
DisplayName = user.DisplayName,
|
||||
Role = member.Role,
|
||||
CanViewDocuments = true,
|
||||
CanCreateDocuments = role == MemberRole.Owner,
|
||||
CanEditDocuments = role == MemberRole.Owner,
|
||||
CanDeleteDocuments = role == MemberRole.Owner,
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user