From 9591fa172324c5af0bfbd08a6de09ffdc29bbe89 Mon Sep 17 00:00:00 2001 From: sanchezvem Date: Thu, 5 Mar 2026 17:22:36 +0100 Subject: [PATCH] Created endpoints to managed messages --- BeReadyBackend.sln.DotSettings.user | 3 +- .../DTO/Messages/CreateMessageDto.cs | 8 +++++ .../Messages/DeleteMessageEndpoint.cs | 35 +++++++++++++++++++ .../Endpoints/Messages/GetMessagesEndpoint.cs | 25 +++++++++++++ .../Endpoints/Messages/SendMessageEndpoint.cs | 32 +++++++++++++++++ .../MappingProfiles/DtoToEntityMappings.cs | 3 ++ .../MappingProfiles/EntityToDtoMappings.cs | 1 - .../Messages/GetMessageByGroupIdSpec.cs | 13 +++++++ .../Messages/GetMessageByIdSpec.cs | 13 +++++++ 9 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 BeReadyBackend/DTO/Messages/CreateMessageDto.cs create mode 100644 BeReadyBackend/Endpoints/Messages/DeleteMessageEndpoint.cs create mode 100644 BeReadyBackend/Endpoints/Messages/GetMessagesEndpoint.cs create mode 100644 BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs create mode 100644 BeReadyBackend/Specifications/Messages/GetMessageByGroupIdSpec.cs create mode 100644 BeReadyBackend/Specifications/Messages/GetMessageByIdSpec.cs diff --git a/BeReadyBackend.sln.DotSettings.user b/BeReadyBackend.sln.DotSettings.user index da97fdf..a337d19 100644 --- a/BeReadyBackend.sln.DotSettings.user +++ b/BeReadyBackend.sln.DotSettings.user @@ -1,3 +1,4 @@  ForceIncluded - ForceIncluded \ No newline at end of file + ForceIncluded + ForceIncluded \ No newline at end of file diff --git a/BeReadyBackend/DTO/Messages/CreateMessageDto.cs b/BeReadyBackend/DTO/Messages/CreateMessageDto.cs new file mode 100644 index 0000000..db222c1 --- /dev/null +++ b/BeReadyBackend/DTO/Messages/CreateMessageDto.cs @@ -0,0 +1,8 @@ +namespace BeReadyBackend.DTO.Messages; + +public class CreateMessageDto +{ + public int GroupId { get; set; } + public string? Libelle { get; set; } + public DateTime SendDate { get; set; } +} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Messages/DeleteMessageEndpoint.cs b/BeReadyBackend/Endpoints/Messages/DeleteMessageEndpoint.cs new file mode 100644 index 0000000..1b71c6d --- /dev/null +++ b/BeReadyBackend/Endpoints/Messages/DeleteMessageEndpoint.cs @@ -0,0 +1,35 @@ +using BeReadyBackend.Models; +using BeReadyBackend.Repositories; +using BeReadyBackend.Specifications.Messages; +using FastEndpoints; + +namespace BeReadyBackend.Endpoints.Messages; + +public class DeleteMessageRequest +{ + public int Id { get; set; } + public int GroupId { get; set; } +} + +public class DeleteMessageEndpoint(MessagesRepository messagesRepository) : Endpoint +{ + public override void Configure() + { + Delete("/Messages/{@Id}/Groups/{@GroupId}/", x => new { x.Id, x.GroupId }); + } + + public override async Task HandleAsync(DeleteMessageRequest req, CancellationToken ct) + { + Message? message = await messagesRepository.SingleOrDefaultAsync(new GetMessageByIdSpec(req.Id), ct); + + if (message is null) + { + await Send.NotFoundAsync(ct); + return; + } + + await messagesRepository.DeleteAsync(message, ct); + await messagesRepository.SaveChangesAsync(ct); + await Send.OkAsync(ct); + } +} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Messages/GetMessagesEndpoint.cs b/BeReadyBackend/Endpoints/Messages/GetMessagesEndpoint.cs new file mode 100644 index 0000000..51b2a08 --- /dev/null +++ b/BeReadyBackend/Endpoints/Messages/GetMessagesEndpoint.cs @@ -0,0 +1,25 @@ +using BeReadyBackend.DTO.Messages; +using BeReadyBackend.Repositories; +using BeReadyBackend.Specifications.Messages; +using FastEndpoints; + +namespace BeReadyBackend.Endpoints.Messages; + +public class GetMessagesRequest +{ + public int GroupId { get; set; } +} + +public class GetMessagesEndpoint(MessagesRepository messagesRepository) : Endpoint> +{ + public override void Configure() + { + Post("/Messages/Groups/{@GroupId}/", x => new { x.GroupId }); + } + + public override async Task HandleAsync(GetMessagesRequest req, CancellationToken ct) + { + List messages = await messagesRepository.ProjectToListAsync(new GetMessageByGroupIdSpec(req.GroupId), ct); + await Send.OkAsync(messages, ct); + } +} \ No newline at end of file diff --git a/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs b/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs new file mode 100644 index 0000000..c3a5f67 --- /dev/null +++ b/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs @@ -0,0 +1,32 @@ +using BeReadyBackend.DTO.Messages; +using BeReadyBackend.Hubs; +using BeReadyBackend.Models; +using BeReadyBackend.Repositories; +using BeReadyBackend.Services; +using FastEndpoints; +using Microsoft.AspNetCore.SignalR; + +namespace BeReadyBackend.Endpoints.Messages; + +public class SendMessageEndpoint(UserService userService, AutoMapper.IMapper mapper, MessagesRepository messagesRepository, IHubContext hubContext) + : Endpoint +{ + public override void Configure() + { + Post("/Messages/Groups/{@GroupId}/", x => new { x.GroupId }); + } + + public override async Task HandleAsync(CreateMessageDto req, CancellationToken ct) + { + Message message = new(); + mapper.Map(req, message); + message.UserId = userService.GetUserIdFromToken(); + + await messagesRepository.AddAsync(message, ct); + await messagesRepository.SaveChangesAsync(ct); + + await hubContext.Clients.Group($"group-{req.GroupId}").SendAsync("ReceiveMessage", message, cancellationToken: ct); + + await Send.OkAsync(ct); + } +} \ No newline at end of file diff --git a/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs b/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs index 51fcda1..af1bd55 100644 --- a/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs +++ b/BeReadyBackend/MappingProfiles/DtoToEntityMappings.cs @@ -1,6 +1,7 @@ using AutoMapper; using BeReadyBackend.DTO.Achievements; using BeReadyBackend.DTO.Groups; +using BeReadyBackend.DTO.Messages; using BeReadyBackend.DTO.Users; using BeReadyBackend.Models; @@ -18,5 +19,7 @@ public class DtoToEntityMappings : Profile CreateMap() .ForMember(dest => dest.UserGroups, opt => opt.Ignore()); + + CreateMap(); } } \ No newline at end of file diff --git a/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs b/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs index 7af8e5a..8661041 100644 --- a/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs +++ b/BeReadyBackend/MappingProfiles/EntityToDtoMappings.cs @@ -5,7 +5,6 @@ using BeReadyBackend.DTO.Groups; using BeReadyBackend.DTO.Messages; using BeReadyBackend.DTO.Users; using BeReadyBackend.Models; -using NSwag.Generation.Processors; namespace BeReadyBackend.MappingProfiles; diff --git a/BeReadyBackend/Specifications/Messages/GetMessageByGroupIdSpec.cs b/BeReadyBackend/Specifications/Messages/GetMessageByGroupIdSpec.cs new file mode 100644 index 0000000..87fb7d8 --- /dev/null +++ b/BeReadyBackend/Specifications/Messages/GetMessageByGroupIdSpec.cs @@ -0,0 +1,13 @@ +using Ardalis.Specification; +using BeReadyBackend.Models; + +namespace BeReadyBackend.Specifications.Messages; + +public class GetMessageByGroupIdSpec : Specification +{ + public GetMessageByGroupIdSpec(int groupId) + { + Query + .Where(x => x.GroupId == groupId); + } +} \ No newline at end of file diff --git a/BeReadyBackend/Specifications/Messages/GetMessageByIdSpec.cs b/BeReadyBackend/Specifications/Messages/GetMessageByIdSpec.cs new file mode 100644 index 0000000..8bcb288 --- /dev/null +++ b/BeReadyBackend/Specifications/Messages/GetMessageByIdSpec.cs @@ -0,0 +1,13 @@ +using Ardalis.Specification; +using BeReadyBackend.Models; + +namespace BeReadyBackend.Specifications.Messages; + +public class GetMessageByIdSpec : SingleResultSpecification +{ + public GetMessageByIdSpec(int id) + { + Query + .Where(x => x.Id == id); + } +} \ No newline at end of file