< Summary

Information
Class: Services.SearchServices.OrderSearch.OrderSearchFullReindexJob
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/SearchServices/OrderSearch/OrderSearchFullReindexJob.cs
Line coverage
39%
Covered lines: 16
Uncovered lines: 25
Coverable lines: 41
Total lines: 88
Line coverage: 39%
Branch coverage
7%
Covered branches: 1
Total branches: 14
Branch coverage: 7.1%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
ExecuteAsync()8.33%1031214.28%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/SearchServices/OrderSearch/OrderSearchFullReindexJob.cs

#LineLine coverage
 1using Hangfire;
 2using OzonDomains.Models;
 3using OzonRepositories.Context;
 4using Services.SignalRServices;
 5using Services.HangfireService;
 6
 7namespace Services.SearchServices.OrderSearch;
 8
 9/// <summary>
 10/// Ночной safety net: полная переиндексация заказов в Elasticsearch. Ловит удаления заказов
 11/// (Order.UpdatedAt-триггер их не фиксирует) и любые расхождения, пропущенные enqueue- и
 12/// incremental-путями синхронизации.
 13/// </summary>
 14public class OrderSearchFullReindexJob
 15{
 16    public const string JobId = "OrderSearchFullReindexJob";
 17    public const string DefaultCron = "0 3 * * *";
 18    public const string QueueName = HangfireQueueNames.OrderSearch;
 19
 20    private readonly ApplicationDbContext _context;
 21    private readonly IOrderSearchSyncService _syncService;
 22    private readonly IOrderSearchDriftChecker _driftChecker;
 23    private readonly IOrderSearchDiagnosticsStore _diagnostics;
 24    private readonly IOrderSearchIndexOperationLock _indexOperationLock;
 25
 126    public OrderSearchFullReindexJob(
 127        ApplicationDbContext context,
 128        IOrderSearchSyncService syncService,
 129        IOrderSearchDriftChecker driftChecker,
 130        IOrderSearchDiagnosticsStore diagnostics,
 131        IOrderSearchIndexOperationLock indexOperationLock)
 32    {
 133        _context = context;
 134        _syncService = syncService;
 135        _driftChecker = driftChecker;
 136        _diagnostics = diagnostics;
 137        _indexOperationLock = indexOperationLock;
 138    }
 39
 40    [Queue(QueueName)]
 41    public async Task<string> ExecuteAsync()
 42    {
 143        var operationLock = _indexOperationLock.TryAcquire();
 144        if (operationLock == null)
 45        {
 146            return "Полная переиндексация ES пропущена: другая операция с индексом уже выполняется.";
 47        }
 48
 049        using (operationLock)
 50        {
 051            var startedAt = DateTime.UtcNow;
 052            await _syncService.FullReindexAsync();
 53
 054            var state = await _context.OrderSearchSyncStates.FindAsync(1);
 055            var isNew = state == null;
 056            state ??= new OrderSearchSyncState { Id = 1 };
 57
 058            var now = DateTime.UtcNow;
 059            state.LastFullReindexAt = now;
 060            state.LastSyncedAt = now;
 061            state.LastSyncedOrderId = 0;
 62
 063            if (isNew)
 64            {
 065                _context.OrderSearchSyncStates.Add(state);
 66            }
 67
 068            await _context.SaveChangesAsync();
 69
 070            var drift = await _driftChecker.CheckAsync("FullReindex");
 71
 072            var ev = _diagnostics.GetIndexEvents(10)
 073                .FirstOrDefault(e => e.Operation == OrderSearchIndexOperation.FullReindex && e.TimestampUtc >= startedAt
 074            if (ev != null)
 75            {
 076                var chatMsg = $"Полная переиндексация ES: {ev.Count:N0} заказов за {ev.DurationMs / 1000.0:F1} с";
 077                if (drift.IsAlert)
 078                    chatMsg += $" ⚠ расхождение: {drift.Message}";
 079                try { await NotificationService.NotifyAsync("ES Индекс", "#8B5CF6", chatMsg, "fa-rotate"); }
 080                catch { /* не роняем джоб */ }
 81            }
 82
 083            return drift.IsAlert
 084                ? $"OrderSearch full reindex completed at {now:O}. ALERT: {drift.Message}"
 085                : $"OrderSearch full reindex completed at {now:O}. {drift.Message}";
 86        }
 187    }
 88}