< Summary

Information
Class: OzonRepositories.Data.OzonChatOrderRepository
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/OzonChatOrderRepository.cs
Line coverage
10%
Covered lines: 15
Uncovered lines: 132
Coverable lines: 147
Total lines: 276
Line coverage: 10.2%
Branch coverage
8%
Covered branches: 2
Total branches: 24
Branch coverage: 8.3%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/OzonChatOrderRepository.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using OzonDomains.Models;
 3using OzonRepositories.Context;
 4
 5namespace OzonRepositories.Data
 6{
 7    public class OzonChatOrderRepository : MainRepository, IRepository<OzonChatOrder>
 8    {
 19        public OzonChatOrderRepository(ApplicationDbContext orderContext) : base(orderContext)
 10        {
 111        }
 12
 13        public async Task<int> Add(OzonChatOrder value)
 14        {
 015            await _context.OzonChatOrders.AddAsync(value);
 016            return await _context.SaveChangesAsync();
 017        }
 18
 19        public async Task<int> Delete(OzonChatOrder value)
 20        {
 021            _context.OzonChatOrders.Remove(value);
 022            return await _context.SaveChangesAsync();
 023        }
 24
 25        public async Task<List<OzonChatOrder>> Get()
 26        {
 027            return await _context.OzonChatOrders
 028                .Include(x => x.Order)
 029                .Include(x => x.Client)
 030                .Where(x => x.IsActive)
 031                .OrderByDescending(x => x.UpdatedAt)
 032                .ToListAsync();
 033        }
 34
 35        public async Task<OzonChatOrder?> GetAsync(int id)
 36        {
 037            return await _context.OzonChatOrders
 038                .Include(x => x.Order)
 039                .Include(x => x.Client)
 040                .FirstOrDefaultAsync(x => x.Id == id);
 041        }
 42
 43        public async Task<OzonChatOrder?> GetAsync(OzonChatOrder value)
 44        {
 045            return await _context.OzonChatOrders
 046                .Include(x => x.Order)
 047                .Include(x => x.Client)
 048                .FirstOrDefaultAsync(x => x.ChatId == value.ChatId && x.OrderId == value.OrderId);
 049        }
 50
 51        public async Task<int> Update(OzonChatOrder value)
 52        {
 053            value.UpdatedAt = DateTime.UtcNow;
 054            _context.OzonChatOrders.Update(value);
 055            return await _context.SaveChangesAsync();
 056        }
 57
 58        /// <summary>
 59        /// Получить запись по ChatId и OrderId
 60        /// </summary>
 61        public async Task<OzonChatOrder?> GetByChatAndOrderAsync(string chatId, int orderId)
 62        {
 063            return await _context.OzonChatOrders
 064                .Include(x => x.Order)
 065                .Include(x => x.Client)
 066                .FirstOrDefaultAsync(x => x.ChatId == chatId && x.OrderId == orderId);
 067        }
 68
 69        /// <summary>
 70        /// Получить все чаты для конкретного заказа
 71        /// </summary>
 72        public async Task<List<OzonChatOrder>> GetByOrderIdAsync(int orderId)
 73        {
 074            return await _context.OzonChatOrders
 075                .Include(x => x.Order)
 076                .Include(x => x.Client)
 077                .Where(x => x.OrderId == orderId && x.IsActive)
 078                .OrderByDescending(x => x.LastMessageDate)
 079                .ToListAsync();
 080        }
 81
 82        /// <summary>
 83        /// Получить все заказы для конкретного чата
 84        /// </summary>
 85        public async Task<List<OzonChatOrder>> GetByChatIdAsync(string chatId)
 86        {
 087            return await _context.OzonChatOrders
 088                .Include(x => x.Order)
 089                .Include(x => x.Client)
 090                .Where(x => x.ChatId == chatId && x.IsActive)
 091                .ToListAsync();
 092        }
 93
 94        /// <summary>
 95        /// Получить все чаты клиента с непрочитанными сообщениями
 96        /// </summary>
 97        public async Task<List<OzonChatOrder>> GetUnreadByClientIdAsync(int clientId)
 98        {
 099            return await _context.OzonChatOrders
 0100                .Include(x => x.Order)
 0101                .Include(x => x.Client)
 0102                .Where(x => x.ClientId == clientId && x.UnreadMessagesCount > 0 && x.IsActive)
 0103                .OrderByDescending(x => x.LastMessageDate)
 0104                .ToListAsync();
 0105        }
 106
 107        /// <summary>
 108        /// Получить общее количество непрочитанных сообщений по клиенту
 109        /// </summary>
 110        public async Task<int> GetTotalUnreadCountByClientIdAsync(int clientId)
 111        {
 0112            return await _context.OzonChatOrders
 0113                .Where(x => x.ClientId == clientId && x.IsActive)
 0114                .SumAsync(x => x.UnreadMessagesCount);
 0115        }
 116
 117        /// <summary>
 118        /// Получить все чаты с непрочитанными сообщениями
 119        /// </summary>
 120        public async Task<List<OzonChatOrder>> GetAllUnreadAsync()
 121        {
 0122            return await _context.OzonChatOrders
 0123                .Include(x => x.Order)
 0124                .Include(x => x.Client)
 0125                .Where(x => x.UnreadMessagesCount > 0 && x.IsActive)
 0126                .OrderByDescending(x => x.LastMessageDate)
 0127                .ToListAsync();
 0128        }
 129
 130        /// <summary>
 131        /// Обновить количество непрочитанных сообщений
 132        /// </summary>
 133        public async Task<int> UpdateUnreadCountAsync(string chatId, int orderId, int unreadCount)
 134        {
 0135            var chatOrder = await GetByChatAndOrderAsync(chatId, orderId);
 0136            if (chatOrder == null) return 0;
 137
 0138            chatOrder.UnreadMessagesCount = unreadCount;
 0139            chatOrder.UpdatedAt = DateTime.UtcNow;
 140
 0141            return await _context.SaveChangesAsync();
 0142        }
 143
 144        /// <summary>
 145        /// Обновить информацию о последнем сообщении
 146        /// </summary>
 147        public async Task<int> UpdateLastMessageAsync(string chatId, int orderId, DateTime messageDate,
 148            string messageText, bool fromCustomer)
 149        {
 0150            var chatOrder = await GetByChatAndOrderAsync(chatId, orderId);
 0151            if (chatOrder == null) return 0;
 152
 0153            chatOrder.LastMessageDate = messageDate;
 0154            chatOrder.LastMessageText = messageText?.Length > 500
 0155                ? messageText.Substring(0, 500) + "..."
 0156                : messageText;
 0157            chatOrder.LastMessageFromCustomer = fromCustomer;
 0158            chatOrder.UpdatedAt = DateTime.UtcNow;
 159
 0160            return await _context.SaveChangesAsync();
 0161        }
 162
 163        /// <summary>
 164        /// Получить все чаты для списка заказов (оптимизированно для страницы)
 165        /// </summary>
 166        public async Task<Dictionary<int, (bool HasChat, int UnreadCount, string? ChatId)>> GetChatInfoByOrderIdsAsync(L
 167        {
 0168            if (orderIds == null || !orderIds.Any())
 0169                return new Dictionary<int, (bool, int, string?)>();
 170
 0171            var chatOrders = await _context.OzonChatOrders
 0172                .AsNoTracking()
 0173                .Where(x => orderIds.Contains(x.OrderId) && x.IsActive)
 0174                .GroupBy(x => x.OrderId)
 0175                .Select(g => new
 0176                {
 0177                    OrderId = g.Key,
 0178                    UnreadCount = g.Sum(x => x.UnreadMessagesCount),
 0179                    ChatId = g.OrderByDescending(x => x.LastMessageDate).FirstOrDefault()!.ChatId
 0180                })
 0181                .ToListAsync();
 182
 0183            return chatOrders.ToDictionary(
 0184                x => x.OrderId,
 0185                x => (HasChat: true, UnreadCount: x.UnreadCount, ChatId: (string?)x.ChatId)
 0186            );
 0187        }
 188
 189        /// <summary>
 190        /// Получить чат по номеру отправления
 191        /// </summary>
 192        public async Task<OzonChatOrder?> GetByPostingNumberAsync(string postingNumber)
 193        {
 0194            return await _context.OzonChatOrders
 0195                .Include(x => x.Order)
 0196                .Include(x => x.Client)
 0197                .FirstOrDefaultAsync(x => x.PostingNumber == postingNumber && x.IsActive);
 0198        }
 199
 200        /// <summary>
 201        /// Мягкое удаление (деактивация)
 202        /// </summary>
 203        public async Task<int> SoftDeleteAsync(long id)
 204        {
 0205            var chatOrder = await _context.OzonChatOrders.FindAsync(id);
 0206            if (chatOrder == null) return 0;
 207
 0208            chatOrder.IsActive = false;
 0209            chatOrder.UpdatedAt = DateTime.UtcNow;
 210
 0211            return await _context.SaveChangesAsync();
 0212        }
 213
 214        /// <summary>
 215        /// Поиск чатов по номеру отправления (PostingNumber)
 216        /// </summary>
 217        public async Task<List<OzonChatOrder>> SearchByPostingNumberAsync(string query, int clientId = 0, int limit = 50
 218        {
 0219            var q = _context.OzonChatOrders
 0220                .AsNoTracking()
 0221                .Include(x => x.Client)
 0222                .Where(x => x.IsActive && x.PostingNumber != null &&
 0223                            EF.Functions.Like(x.PostingNumber, $"%{query}%"));
 224
 0225            if (clientId > 0)
 0226                q = q.Where(x => x.ClientId == clientId);
 227
 0228            return await q
 0229                .OrderByDescending(x => x.LastMessageDate)
 0230                .Take(limit)
 0231                .ToListAsync();
 0232        }
 233
 234        /// <summary>
 235        /// Получить записи чатов по списку ChatId
 236        /// </summary>
 237        public async Task<List<OzonChatOrder>> GetByChatIdsAsync(List<string> chatIds, int clientId = 0)
 238        {
 0239            if (chatIds == null || !chatIds.Any())
 0240                return new List<OzonChatOrder>();
 241
 0242            var q = _context.OzonChatOrders
 0243                .AsNoTracking()
 0244                .Include(x => x.Client)
 0245                .Where(x => x.IsActive && chatIds.Contains(x.ChatId));
 246
 0247            if (clientId > 0)
 0248                q = q.Where(x => x.ClientId == clientId);
 249
 0250            return await q
 0251                .OrderByDescending(x => x.LastMessageDate)
 0252                .ToListAsync();
 0253        }
 254
 255        /// <summary>
 256        /// Получить уникальные номера отправлений для подсказок
 257        /// </summary>
 258        public async Task<List<string>> GetDistinctPostingNumbersAsync(string query, int clientId = 0, int limit = 20)
 259        {
 1260            var q = _context.OzonChatOrders
 1261                .AsNoTracking()
 1262                .Where(x => x.IsActive && x.PostingNumber != null &&
 1263                            EF.Functions.Like(x.PostingNumber, $"%{query}%"));
 264
 1265            if (clientId > 0)
 1266                q = q.Where(x => x.ClientId == clientId);
 267
 1268            return await q
 1269                .Select(x => x.PostingNumber!)
 1270                .Distinct()
 1271                .OrderBy(x => x)
 1272                .Take(limit)
 1273                .ToListAsync();
 1274        }
 275    }
 276}