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