62 lines
2.7 KiB
C#
62 lines
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using MediatR;
|
|
using Knot.Shared.Kernel;
|
|
using Knot.Modules.Chats.Application.DTOs;
|
|
using Knot.Modules.Chats.Domain;
|
|
|
|
namespace Knot.Modules.Chats.Application.Messages.SearchMessages;
|
|
|
|
public record SearchMessagesQuery(Guid UserId, string Query, Guid? ChatId) : IQuery<List<SearchMessageDto>>;
|
|
|
|
internal sealed class SearchMessagesQueryHandler : IQueryHandler<SearchMessagesQuery, List<SearchMessageDto>>
|
|
{
|
|
private readonly IMessageRepository _messageRepository;
|
|
private readonly IUserDisplayNameProvider _userProvider;
|
|
|
|
public SearchMessagesQueryHandler(IMessageRepository messageRepository, IUserDisplayNameProvider userProvider)
|
|
{
|
|
_messageRepository = messageRepository;
|
|
_userProvider = userProvider;
|
|
}
|
|
|
|
public async Task<Result<List<SearchMessageDto>>> Handle(SearchMessagesQuery request, CancellationToken cancellationToken)
|
|
{
|
|
var messages = await _messageRepository.SearchMessagesAsync(request.Query, request.ChatId, request.UserId, cancellationToken);
|
|
messages = messages.Where(message => !message.IsDeletedForUser(request.UserId)).ToList();
|
|
|
|
var userIds = messages.Select(message => message.SenderId).ToList();
|
|
userIds.AddRange(messages.Where(message => message.ForwardedFromId.HasValue).Select(message => message.ForwardedFromId!.Value));
|
|
|
|
var senders = await _userProvider.GetUsersInfoAsync(userIds.Distinct(), cancellationToken);
|
|
|
|
var result = messages.Select(message => new SearchMessageDto(
|
|
message.Id,
|
|
message.ChatId,
|
|
message.SenderId,
|
|
message.Content,
|
|
message.Type,
|
|
message.ReplyToId,
|
|
message.Quote,
|
|
message.IsEdited,
|
|
message.IsDeleted,
|
|
message.CreatedAt,
|
|
message.ForwardedFromId,
|
|
null,
|
|
message.StoryId,
|
|
message.StoryMediaUrl,
|
|
message.StoryMediaType,
|
|
message.Media.Select(media => new MediaDto(media.Id, media.Type, media.Url, media.Filename, media.Size)).ToList(),
|
|
senders.TryGetValue(message.SenderId, out var senderUser) ? new MessageSenderDto(senderUser.Id, senderUser.Username, senderUser.DisplayName, senderUser.Avatar) : new MessageSenderDto(message.SenderId, "unknown", "Unknown", null),
|
|
message.Reactions.Select(reaction => new SimpleReactionDto(reaction.UserId, reaction.Emoji)).ToList(),
|
|
message.ReadBy.Select(readReceipt => new ReadByDto(readReceipt.UserId)).ToList()
|
|
)).ToList();
|
|
|
|
return Result.Success(result);
|
|
}
|
|
}
|
|
|