< Summary

Information
Class: OzonRepositories.Data.OzonPushNotificationRepository
Assembly: OzonRepositories
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonRepositories/Data/OzonPushNotificationRepository.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 75
Coverable lines: 75
Total lines: 190
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 22
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
AddAsync()100%210%
GetByIdAsync()100%210%
GetByPostingNumberAsync()100%210%
GetByMessageTypeAsync()0%2040%
GetRecentAsync()100%210%
GetBySellerIdAsync()0%2040%
UpdateAsync()0%620%
GetFilteredAsync()0%156120%
GetDistinctMessageTypesAsync()100%210%

File(s)

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

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Threading;
 4using System.Threading.Tasks;
 5using Microsoft.EntityFrameworkCore;
 6using OzonDomains.Models;
 7using OzonRepositories.Context;
 8
 9namespace OzonRepositories.Data
 10{
 11    /// <summary>
 12    /// Репозиторий для работы с записями о входящих push-уведомлениях Ozon.
 13    /// Наследует <see cref="MainRepository"/> по паттерну, принятому в проекте.
 14    /// </summary>
 15    public class OzonPushNotificationRepository : MainRepository
 16    {
 017        public OzonPushNotificationRepository(ApplicationDbContext context) : base(context)
 18        {
 019        }
 20
 21        /// <summary>
 22        /// Добавляет новую запись о push-уведомлении в базу данных.
 23        /// </summary>
 24        public async Task<int> AddAsync(OzonPushNotification notification, CancellationToken ct = default)
 25        {
 026            await _context.OzonPushNotifications.AddAsync(notification, ct);
 027            return await _context.SaveChangesAsync(ct);
 028        }
 29
 30        /// <summary>
 31        /// Возвращает запись по первичному ключу.
 32        /// </summary>
 33        public async Task<OzonPushNotification?> GetByIdAsync(long id, CancellationToken ct = default)
 34        {
 035            return await _context.OzonPushNotifications
 036                .AsNoTracking()
 037                .FirstOrDefaultAsync(n => n.Id == id, ct);
 038        }
 39
 40        /// <summary>
 41        /// Возвращает все уведомления для конкретного номера отправления,
 42        /// отсортированные по дате получения (сначала новые).
 43        /// </summary>
 44        public async Task<List<OzonPushNotification>> GetByPostingNumberAsync(
 45            string postingNumber,
 46            CancellationToken ct = default)
 47        {
 048            return await _context.OzonPushNotifications
 049                .AsNoTracking()
 050                .Where(n => n.PostingNumber == postingNumber)
 051                .OrderByDescending(n => n.ReceivedAt)
 052                .ToListAsync(ct);
 053        }
 54
 55        /// <summary>
 56        /// Возвращает уведомления заданного типа в указанном временном диапазоне.
 57        /// Если <paramref name="from"/> и <paramref name="to"/> не указаны, возвращает все.
 58        /// </summary>
 59        public async Task<List<OzonPushNotification>> GetByMessageTypeAsync(
 60            string messageType,
 61            DateTime? from = null,
 62            DateTime? to = null,
 63            CancellationToken ct = default)
 64        {
 065            var query = _context.OzonPushNotifications
 066                .AsNoTracking()
 067                .Where(n => n.MessageType == messageType);
 68
 069            if (from.HasValue)
 070                query = query.Where(n => n.ReceivedAt >= from.Value);
 71
 072            if (to.HasValue)
 073                query = query.Where(n => n.ReceivedAt <= to.Value);
 74
 075            return await query
 076                .OrderByDescending(n => n.ReceivedAt)
 077                .ToListAsync(ct);
 078        }
 79
 80        /// <summary>
 81        /// Возвращает последние N уведомлений по дате получения (сначала новые).
 82        /// </summary>
 83        public async Task<List<OzonPushNotification>> GetRecentAsync(
 84            int count = 100,
 85            CancellationToken ct = default)
 86        {
 087            return await _context.OzonPushNotifications
 088                .AsNoTracking()
 089                .OrderByDescending(n => n.ReceivedAt)
 090                .Take(count)
 091                .ToListAsync(ct);
 092        }
 93
 94        /// <summary>
 95        /// Возвращает уведомления по идентификатору продавца в указанном диапазоне дат.
 96        /// </summary>
 97        public async Task<List<OzonPushNotification>> GetBySellerIdAsync(
 98            long sellerId,
 99            DateTime? from = null,
 100            DateTime? to = null,
 101            CancellationToken ct = default)
 102        {
 0103            var query = _context.OzonPushNotifications
 0104                .AsNoTracking()
 0105                .Where(n => n.SellerId == sellerId);
 106
 0107            if (from.HasValue)
 0108                query = query.Where(n => n.ReceivedAt >= from.Value);
 109
 0110            if (to.HasValue)
 0111                query = query.Where(n => n.ReceivedAt <= to.Value);
 112
 0113            return await query
 0114                .OrderByDescending(n => n.ReceivedAt)
 0115                .ToListAsync(ct);
 0116        }
 117
 118        /// <summary>
 119        /// Обновляет запись о push-уведомлении (все поля, кроме Id).
 120        /// Используется фоновым заданием для записи ActionDetails и финального статуса обработки.
 121        /// </summary>
 122        public async Task<int> UpdateAsync(OzonPushNotification notification, CancellationToken ct = default)
 123        {
 0124            var tracked = await _context.OzonPushNotifications
 0125                .FirstOrDefaultAsync(n => n.Id == notification.Id, ct);
 126
 0127            if (tracked == null)
 0128                return 0;
 129
 130            // GetByIdAsync — AsNoTracking; после AddAsync та же запись уже в ChangeTracker.
 0131            _context.Entry(tracked).CurrentValues.SetValues(notification);
 0132            return await _context.SaveChangesAsync(ct);
 0133        }
 134
 135        /// <summary>
 136        /// Возвращает уведомления с комбинированной фильтрацией.
 137        /// Все параметры необязательны — если не указаны, фильтр по ним не применяется.
 138        /// Результат всегда сортируется: сначала новые (ReceivedAt DESC).
 139        /// </summary>
 140        public async Task<List<OzonPushNotification>> GetFilteredAsync(
 141            string? messageType = null,
 142            long? sellerId = null,
 143            string? processingStatus = null,
 144            string? postingNumber = null,
 145            DateTime? from = null,
 146            DateTime? to = null,
 147            int take = 500,
 148            CancellationToken ct = default)
 149        {
 0150            var query = _context.OzonPushNotifications.AsNoTracking();
 151
 0152            if (!string.IsNullOrEmpty(messageType))
 0153                query = query.Where(n => n.MessageType == messageType);
 154
 0155            if (sellerId.HasValue)
 0156                query = query.Where(n => n.SellerId == sellerId.Value);
 157
 0158            if (!string.IsNullOrEmpty(processingStatus))
 0159                query = query.Where(n => n.ProcessingStatus == processingStatus);
 160
 0161            if (!string.IsNullOrEmpty(postingNumber))
 0162                query = query.Where(n => n.PostingNumber != null && n.PostingNumber.Contains(postingNumber));
 163
 0164            if (from.HasValue)
 0165                query = query.Where(n => n.ReceivedAt >= from.Value);
 166
 0167            if (to.HasValue)
 0168                query = query.Where(n => n.ReceivedAt <= to.Value);
 169
 0170            return await query
 0171                .OrderByDescending(n => n.ReceivedAt)
 0172                .Take(take)
 0173                .ToListAsync(ct);
 0174        }
 175
 176        /// <summary>
 177        /// Возвращает все уникальные типы уведомлений, присутствующие в базе. Для построения фильтра.
 178        /// </summary>
 179        public async Task<List<string>> GetDistinctMessageTypesAsync(CancellationToken ct = default)
 180        {
 0181            return await _context.OzonPushNotifications
 0182                .AsNoTracking()
 0183                .Select(n => n.MessageType)
 0184                .Distinct()
 0185                .OrderBy(t => t)
 0186                .ToListAsync(ct);
 0187        }
 188    }
 189}
 190