diff --git a/backend/src/ThreeTee.Api/Controllers/ProjectUserController.cs b/backend/src/ThreeTee.Api/Controllers/ProjectUserController.cs index 7f06cca..a57ec71 100644 --- a/backend/src/ThreeTee.Api/Controllers/ProjectUserController.cs +++ b/backend/src/ThreeTee.Api/Controllers/ProjectUserController.cs @@ -1,7 +1,10 @@ using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using Microsoft.CodeAnalysis; +using ThreeTee.Application.Cqrs.ProjectUsers.Commands.CreateProjectUser; +using ThreeTee.Application.Cqrs.ProjectUsers.Commands.DeleteProjectUser; +using ThreeTee.Application.Cqrs.ProjectUsers.Commands.UpdateProjectUser; using ThreeTee.Application.Cqrs.ProjectUsers.Queries; -using ThreeTee.Application.Interfaces; using ThreeTee.Application.Models.ProjectUser; // For more information on enabling Web API for empty projects, visit https://go.microsoft.com/fwlink/?LinkID=397860 @@ -13,12 +16,6 @@ namespace ThreeTee.Api.Controllers [Authorize] public class ProjectUserController : ApiControllerBase { - private readonly IProjectUserService _projectUserService; - - public ProjectUserController(IProjectUserService projectUserService) - { - _projectUserService = projectUserService; - } // GET: api/ [HttpGet] [Produces(typeof(List))] @@ -28,37 +25,39 @@ public async Task Get([FromQuery] GetProjectUsersWithPaginationQuery qu return TypedResults.Ok(items); } - [HttpGet("{id}")] + //GET PROJECT USER LIST api/ + [HttpPost("{UserId}")] [Produces(typeof(List))] - public async Task Get(Guid id) + public async Task Get(GetProjectUsersWithUserIdPaginationQuery query) { - var items = await _projectUserService.GetByProjectId(id); + var items = await Mediator.Send(query); return TypedResults.Ok(items); } // POST api/ [HttpPost] - public async Task Post([FromBody] ProjectUserUpsertRequest value) + public async Task Post([FromBody] CreateProjectUserCommand query) { - - var ret = await _projectUserService.InsertAsync(value); - if (ret == null) return TypedResults.BadRequest(); - return TypedResults.Created(ret.ProjectId.ToString()); + var items = await Mediator.Send(query); + if (items != Guid.Empty) + { return TypedResults.Created(items.ToString()); } + return TypedResults.BadRequest(); } + // PUT api/ [HttpPut] - public async Task Put(ProjectUserUpsertRequest request) + public async Task Put(UpdateProjectUserCommand query) { - var item = await _projectUserService.UpdateAsync(request); + var item = await Mediator.Send(query); return TypedResults.Ok(item); } - [HttpDelete("{id}")] - public async Task Delete(Guid id) + // DELETE api/ + [HttpDelete("{UserId}")] + public async Task Delete(DeleteProjectUserCommand query) { - await _projectUserService.DeleteAsync(id); + var item = await Mediator.Send(query); return TypedResults.NoContent(); } - } } diff --git a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/CreateProjectUser/CreateProjectUserCommand.cs b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/CreateProjectUser/CreateProjectUserCommand.cs index d07494a..4aee58d 100644 --- a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/CreateProjectUser/CreateProjectUserCommand.cs +++ b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/CreateProjectUser/CreateProjectUserCommand.cs @@ -1,3 +1,4 @@ +using Mapster; using MediatR; using ThreeTee.Core.Entities; @@ -20,11 +21,12 @@ public CreateProjectUserCommandHandler(IEntitiesContext context) public async Task Handle(CreateProjectUserCommand request, CancellationToken cancellationToken) { - var entity = new ProjectUser - { - ProjectId = request.ProjectId, - UserId = request.UserId, - }; + var entity = request.Adapt(); + //var entitys = new ProjectUser + //{ + // ProjectId = request.ProjectId, + // UserId = entity.UserId, + //}; // entity.AddDomainEvent(new ProjectUserCreatedEvent(entity)); diff --git a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/DeleteProjectUser/DeleteProjectUserCommand.cs b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/DeleteProjectUser/DeleteProjectUserCommand.cs new file mode 100644 index 0000000..f9ac4c7 --- /dev/null +++ b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/DeleteProjectUser/DeleteProjectUserCommand.cs @@ -0,0 +1,31 @@ +using MediatR; + +namespace ThreeTee.Application.Cqrs.ProjectUsers.Commands.DeleteProjectUser; + +public record DeleteProjectUserCommand : IRequest +{ + public Guid UserId { get; set; } + public Guid ProjectId { get; set; } +} + +public class DeleteProjectUserCommandHandler : IRequestHandler +{ + private readonly IEntitiesContext _context; + public DeleteProjectUserCommandHandler(IEntitiesContext context) + { + _context = context; + } + public async Task Handle(DeleteProjectUserCommand request, CancellationToken cancellationToken) + { + var projectUser = _context.ProjectUsers.Where(e => e.UserId == request.UserId) + .FirstOrDefault(e => e.ProjectId == request.ProjectId); + + if (projectUser is null) + return false; + + _context.ProjectUsers.Remove(projectUser); + await _context.SaveChangesAsync(cancellationToken); + return true; + } +} + diff --git a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/DeleteProjectUser/DeleteProjectUserCommandValidator.cs b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/DeleteProjectUser/DeleteProjectUserCommandValidator.cs new file mode 100644 index 0000000..a48c77b --- /dev/null +++ b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/DeleteProjectUser/DeleteProjectUserCommandValidator.cs @@ -0,0 +1,15 @@ +using FluentValidation; + +namespace ThreeTee.Application.Cqrs.ProjectUsers.Commands.DeleteProjectUser; + +public class DeleteProjectUserCommandValidator:AbstractValidator +{ + public DeleteProjectUserCommandValidator() + { + RuleFor(e=>e.UserId) + .NotEmpty(); + RuleFor(e => e.ProjectId) + .NotEmpty(); + } +} + diff --git a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/UpdateProjectUser/UpdateProjectUserCommand.cs b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/UpdateProjectUser/UpdateProjectUserCommand.cs new file mode 100644 index 0000000..9223318 --- /dev/null +++ b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/UpdateProjectUser/UpdateProjectUserCommand.cs @@ -0,0 +1,40 @@ +using FluentValidation; +using Mapster; +using MediatR; +using ThreeTee.Core.Entities; + +namespace ThreeTee.Application.Cqrs.ProjectUsers.Commands.UpdateProjectUser; + +public record UpdateProjectUserCommand : IRequest +{ + public Guid UserId { get; set; } + public Guid ProjectId { get; set; } + public Guid OldProjectId { get; set; } +} + +public class UpdateProjectUserCommandHandler : IRequestHandler +{ + private readonly IEntitiesContext _context; + public UpdateProjectUserCommandHandler(IEntitiesContext context) + { + _context = context; + } + public async Task Handle(UpdateProjectUserCommand request, CancellationToken cancellationToken) + { + //Check user for project present. If not create new one. + + var projectUser = _context.ProjectUsers.Where(e => e.UserId == request.UserId) + .FirstOrDefault(e => e.ProjectId == request.ProjectId); + if (projectUser == null) + { + var entity = request.Adapt(); + + _context.ProjectUsers.Add(entity); + await _context.SaveChangesAsync(cancellationToken); + + return entity; + } + return projectUser; + } +} + diff --git a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/UpdateProjectUser/UpdateProjectUserCommandValidator.cs b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/UpdateProjectUser/UpdateProjectUserCommandValidator.cs new file mode 100644 index 0000000..2198be3 --- /dev/null +++ b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Commands/UpdateProjectUser/UpdateProjectUserCommandValidator.cs @@ -0,0 +1,19 @@ +using FluentValidation; + +namespace ThreeTee.Application.Cqrs.ProjectUsers.Commands.UpdateProjectUser; + +public class UpdateProjectUserCommandValidator:AbstractValidator +{ + public UpdateProjectUserCommandValidator() + { + RuleFor(v => v.UserId) + .NotEmpty(); + RuleFor(v => v.ProjectId) + .NotEmpty(); + RuleFor(v => v.OldProjectId) + .NotEmpty(); + RuleFor(e => e.ProjectId) + .NotEqual(v => v.OldProjectId); + } +} + diff --git a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Queries/GetProjectUsersWithPagination.cs b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Queries/GetProjectUsersWithPagination.cs index f50e318..11c914f 100644 --- a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Queries/GetProjectUsersWithPagination.cs +++ b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Queries/GetProjectUsersWithPagination.cs @@ -13,12 +13,12 @@ public record GetProjectUsersWithPaginationQuery : IRequest> +public class GetProjectUsersWithPaginationQueryHandler : IRequestHandler> { private readonly IEntitiesContext _context; private readonly IMapper _mapper; - public GetTodoItemsWithPaginationQueryHandler(IEntitiesContext context, IMapper mapper) + public GetProjectUsersWithPaginationQueryHandler(IEntitiesContext context, IMapper mapper) { _context = context; _mapper = mapper; diff --git a/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Queries/GetProjectUsersWithUserIdPagination.cs b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Queries/GetProjectUsersWithUserIdPagination.cs new file mode 100644 index 0000000..a77448d --- /dev/null +++ b/backend/src/ThreeTee.Application/Cqrs/ProjectUsers/Queries/GetProjectUsersWithUserIdPagination.cs @@ -0,0 +1,36 @@ +using Mapster; +using MapsterMapper; +using MediatR; +using ThreeTee.Application.Mappings; +using ThreeTee.Application.Models; +using ThreeTee.Application.Models.ProjectUser; + +namespace ThreeTee.Application.Cqrs.ProjectUsers.Queries; + +public record GetProjectUsersWithUserIdPaginationQuery : IRequest> +{ + public int PageNumber { get; init; } = 1; + public int PageSize { get; init; } = 10; + public Guid UserId { get; set; } +} + +public class GetProjectUsersWithUserIdPaginationQueryHandler : IRequestHandler> +{ + private readonly IEntitiesContext _context; + private readonly IMapper _mapper; + + public GetProjectUsersWithUserIdPaginationQueryHandler(IEntitiesContext context, IMapper mapper) + { + _context = context; + _mapper = mapper; + } + + public async Task> Handle(GetProjectUsersWithUserIdPaginationQuery request, CancellationToken cancellationToken) + { + return await _context.ProjectUsers + .Where(e=>e.UserId==request.UserId) + // .OrderBy(pu=>pu.LastTouchedBy) + .ProjectToType() + .PaginatedListAsync(request.PageNumber, request.PageSize); + } +} \ No newline at end of file