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.GetPinnedMessages; public record GetPinnedMessagesQuery(Guid TaskId) : IBaseQuery>; public class GetPinnedMessagesQueryHandler : IBaseQueryHandler> { private readonly IProgramManagerDbContext _context; private readonly IAuthHelper _authHelper; public GetPinnedMessagesQueryHandler(IProgramManagerDbContext context, IAuthHelper authHelper) { _context = context; _authHelper = authHelper; } public async Task>> Handle(GetPinnedMessagesQuery request, CancellationToken cancellationToken) { var currentUserId = _authHelper.GetCurrentUserId(); var messages = await _context.TaskChatMessages .Where(m => m.TaskId == request.TaskId && m.IsPinned && !m.IsDeleted) .Include(m => m.ReplyToMessage) .OrderByDescending(m => m.PinnedDate) .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, IsPinned = message.IsPinned, PinnedDate = message.PinnedDate, PinnedByUserId = message.PinnedByUserId, CreationDate = message.CreationDate, IsMine = message.SenderUserId == currentUserId }; if (message.FileId.HasValue) { var file = await _context.UploadedFiles.FirstOrDefaultAsync(f => f.Id == message.FileId.Value, cancellationToken); if (file != null) { dto.File = new MessageFileDto { Id = file.Id, FileName = file.OriginalFileName, FileUrl = file.StorageUrl ?? "", FileSizeBytes = file.FileSizeBytes, FileType = file.FileType.ToString(), ThumbnailUrl = file.ThumbnailUrl }; } } messageDtos.Add(dto); } return OperationResult>.Success(messageDtos); } }