Files
BeReadyBackend/BeReadyBackend/Endpoints/Messages/SendMessageEndpoint.cs
T

46 lines
1.6 KiB
C#

using BeReadyBackend.DTO.Messages;
using BeReadyBackend.Hubs;
using BeReadyBackend.Models;
using BeReadyBackend.Repositories;
using BeReadyBackend.Services;
using BeReadyBackend.Specifications.Groups;
using BeReadyBackend.Specifications.Messages;
using FastEndpoints;
using Microsoft.AspNetCore.SignalR;
using Group = System.Text.RegularExpressions.Group;
namespace BeReadyBackend.Endpoints.Messages;
public class SendMessageEndpoint(
UserService userService,
GroupsRepository groupsRepository,
AutoMapper.IMapper mapper,
MessagesRepository messagesRepository,
IHubContext<GroupHub> hubContext)
: Endpoint<CreateMessageDto>
{
public override void Configure()
{
Post("/Messages/Groups/{@GroupId}/", x => new { x.GroupId });
}
public override async Task HandleAsync(CreateMessageDto req, CancellationToken ct)
{
Models.Group? group = await groupsRepository.SingleOrDefaultAsync(new GetGroupByIdSpec(req.GroupId), ct);
if (group is null)
{
await Send.NotFoundAsync(ct);
return;
}
Message message = new();
mapper.Map(req, message);
message.SendDate = DateTime.Now;
message.UserId = userService.GetUserIdFromToken();
await messagesRepository.AddAsync(message, ct);
GetMessageDto messageDto = await messagesRepository.ProjectToSingleAsync<GetMessageDto>(new GetMessageByIdSpec(message.Id), ct);
await hubContext.Clients.Group($"group-{req.GroupId}").SendAsync("ReceiveMessage", messageDto, cancellationToken: ct);
await Send.NoContentAsync(ct);
}
}