using GozareshgirProgramManager.Domain.TaskChatAgg.Entities; using GozareshgirProgramManager.Domain.TaskChatAgg.Repositories; using GozareshgirProgramManager.Infrastructure.Persistence.Context; using Microsoft.EntityFrameworkCore; namespace GozareshgirProgramManager.Infrastructure.Persistence.Repositories.TaskChat; public class TaskChatMessageRepository : ITaskChatMessageRepository { private readonly ProgramManagerDbContext _context; public TaskChatMessageRepository(ProgramManagerDbContext context) { _context = context; } public async Task GetByIdAsync(Guid messageId) { return await _context.TaskChatMessages .Include(x => x.ReplyToMessage) .FirstOrDefaultAsync(x => x.Id == messageId); } public async Task> GetTaskMessagesAsync(Guid taskId, int pageNumber, int pageSize) { return await _context.TaskChatMessages .Where(x => x.TaskId == taskId) .Include(x => x.ReplyToMessage) .OrderBy(x => x.CreationDate) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToListAsync(); } public async Task GetTaskMessageCountAsync(Guid taskId) { return await _context.TaskChatMessages .CountAsync(x => x.TaskId == taskId); } public async Task> GetPinnedMessagesAsync(Guid taskId) { return await _context.TaskChatMessages .Where(x => x.TaskId == taskId && x.IsPinned) .Include(x => x.ReplyToMessage) .OrderByDescending(x => x.PinnedDate) .ToListAsync(); } public async Task GetLastMessageAsync(Guid taskId) { return await _context.TaskChatMessages .Where(x => x.TaskId == taskId) .OrderByDescending(x => x.CreationDate) .FirstOrDefaultAsync(); } public async Task> SearchMessagesAsync(Guid taskId, string searchText, int pageNumber, int pageSize) { return await _context.TaskChatMessages .Where(x => x.TaskId == taskId && x.TextContent != null && x.TextContent.Contains(searchText)) .Include(x => x.ReplyToMessage) .OrderByDescending(x => x.CreationDate) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToListAsync(); } public async Task> GetUserMessagesAsync(Guid taskId, long userId, int pageNumber, int pageSize) { return await _context.TaskChatMessages .Where(x => x.TaskId == taskId && x.SenderUserId == userId) .Include(x => x.ReplyToMessage) .OrderByDescending(x => x.CreationDate) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToListAsync(); } public async Task> GetMediaMessagesAsync(Guid taskId, int pageNumber, int pageSize) { return await _context.TaskChatMessages .Where(x => x.TaskId == taskId && x.FileId != null) .Include(x => x.ReplyToMessage) .OrderByDescending(x => x.CreationDate) .Skip((pageNumber - 1) * pageSize) .Take(pageSize) .ToListAsync(); } public async Task AddAsync(TaskChatMessage message) { await _context.TaskChatMessages.AddAsync(message); return message; } public Task UpdateAsync(TaskChatMessage message) { _context.TaskChatMessages.Update(message); return Task.CompletedTask; } public Task DeleteAsync(TaskChatMessage message) { _context.TaskChatMessages.Remove(message); return Task.CompletedTask; } public async Task SaveChangesAsync() { return await _context.SaveChangesAsync(); } public async Task ExistsAsync(Guid messageId) { return await _context.TaskChatMessages .AnyAsync(x => x.Id == messageId); } }