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>; public class SearchMessagesQueryHandler : IBaseQueryHandler> { private readonly IProgramManagerDbContext _context; private readonly IAuthHelper _authHelper; public SearchMessagesQueryHandler(IProgramManagerDbContext context, IAuthHelper authHelper) { _context = context; _authHelper = authHelper; } public async Task>> 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(); 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>.Success(messageDtos); } }