73 lines
2.8 KiB
C#
73 lines
2.8 KiB
C#
using GozareshgirProgramManager.Application._Common.Interfaces;
|
|
using GozareshgirProgramManager.Application._Common.Models;
|
|
using GozareshgirProgramManager.Application.Modules.TaskChat.DTOs;
|
|
using MediatR;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace GozareshgirProgramManager.Application.Modules.TaskChat.Queries.SearchMessages;
|
|
|
|
public record SearchMessagesQuery(
|
|
Guid TaskId,
|
|
string SearchText,
|
|
int Page = 1,
|
|
int PageSize = 20
|
|
) : IBaseQuery<List<MessageDto>>;
|
|
|
|
public class SearchMessagesQueryHandler : IBaseQueryHandler<SearchMessagesQuery, List<MessageDto>>
|
|
{
|
|
private readonly IProgramManagerDbContext _context;
|
|
private readonly IAuthHelper _authHelper;
|
|
|
|
public SearchMessagesQueryHandler(IProgramManagerDbContext context, IAuthHelper authHelper)
|
|
{
|
|
_context = context;
|
|
_authHelper = authHelper;
|
|
}
|
|
|
|
public async Task<OperationResult<List<MessageDto>>> Handle(SearchMessagesQuery request, CancellationToken cancellationToken)
|
|
{
|
|
var currentUserId = _authHelper.GetCurrentUserId();
|
|
var skip = (request.Page - 1) * request.PageSize;
|
|
|
|
var messages = await _context.TaskChatMessages
|
|
.Where(m => m.TaskId == request.TaskId &&
|
|
m.TextContent != null &&
|
|
m.TextContent.Contains(request.SearchText) &&
|
|
!m.IsDeleted)
|
|
.Include(m => m.ReplyToMessage)
|
|
.OrderByDescending(m => m.CreationDate)
|
|
.Skip(skip)
|
|
.Take(request.PageSize)
|
|
.ToListAsync(cancellationToken);
|
|
|
|
// ✅ گرفتن تمامی کاربران برای نمایش نام کامل فرستنده
|
|
var senderUserIds = messages.Select(m => m.SenderUserId).Distinct().ToList();
|
|
var users = await _context.Users
|
|
.Where(u => senderUserIds.Contains(u.Id))
|
|
.ToDictionaryAsync(u => u.Id, u => u.FullName, cancellationToken);
|
|
|
|
var messageDtos = new List<MessageDto>();
|
|
foreach (var message in messages)
|
|
{
|
|
// ✅ نام فرستنده را از User واقعی بگیر
|
|
var senderName = users.GetValueOrDefault(message.SenderUserId, "کاربر ناشناس");
|
|
|
|
var dto = new MessageDto
|
|
{
|
|
Id = message.Id,
|
|
TaskId = message.TaskId,
|
|
SenderUserId = message.SenderUserId,
|
|
SenderName = senderName,
|
|
MessageType = message.MessageType.ToString(),
|
|
TextContent = message.TextContent,
|
|
CreationDate = message.CreationDate,
|
|
IsMine = message.SenderUserId == currentUserId
|
|
};
|
|
|
|
messageDtos.Add(dto);
|
|
}
|
|
|
|
return OperationResult<List<MessageDto>>.Success(messageDtos);
|
|
}
|
|
}
|