< Summary

Information
Class: Services.OzonWebhookServices.Monitoring.OzonWebhookAvailabilityStore
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/OzonWebhookServices/Monitoring/OzonWebhookAvailabilityStore.cs
Line coverage
52%
Covered lines: 9
Uncovered lines: 8
Coverable lines: 17
Total lines: 57
Line coverage: 52.9%
Branch coverage
50%
Covered branches: 4
Total branches: 8
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor()100%11100%
get_Current()100%210%
Set(...)100%210%
GetOrStartRefresh(...)0%2040%
TryMarkAlerted(...)100%44100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/OzonWebhookServices/Monitoring/OzonWebhookAvailabilityStore.cs

#LineLine coverage
 1using System;
 2using System.Threading.Tasks;
 3
 4namespace Services.OzonWebhookServices.Monitoring
 5{
 6    /// <summary>
 7    /// Последний снимок доступности пуш-адресов Ozon в памяти процесса (singleton).
 8    /// Баннер админа читает его без обращения к Ozon; обновляет джоб <see cref="OzonWebhookAvailabilityJob"/>.
 9    /// </summary>
 10    public sealed class OzonWebhookAvailabilityStore
 11    {
 312        private readonly object _gate = new();
 313        private OzonWebhookAvailabilitySnapshot _snapshot = OzonWebhookAvailabilitySnapshot.Empty;
 14        private string? _alertedSignature;
 15        private Task<OzonWebhookAvailabilitySnapshot>? _inFlight;
 16
 17        public OzonWebhookAvailabilitySnapshot Current
 18        {
 019            get { lock (_gate) return _snapshot; }
 20        }
 21
 22        public void Set(OzonWebhookAvailabilitySnapshot snapshot)
 23        {
 024            lock (_gate) _snapshot = snapshot;
 025        }
 26
 27        /// <summary>
 28        /// Единый общий запрос к Ozon: пока он идёт, остальные вызовы получают тот же <see cref="Task"/>
 29        /// (несколько вкладок/пользователей одновременно не множат запросы к API).
 30        /// </summary>
 31        public Task<OzonWebhookAvailabilitySnapshot> GetOrStartRefresh(Func<Task<OzonWebhookAvailabilitySnapshot>> start
 32        {
 033            lock (_gate)
 34            {
 035                if (_inFlight is { IsCompleted: false })
 036                    return _inFlight;
 037                return _inFlight = start();
 38            }
 039        }
 40
 41        /// <summary>
 42        /// true, если набор проблем изменился с прошлого оповещения (в т.ч. пропал — тогда подпись пустая).
 43        /// Запоминает подпись, поэтому повторный вызов с тем же набором вернёт false.
 44        /// </summary>
 45        public bool TryMarkAlerted(string signature, out bool wasProblem)
 46        {
 847            lock (_gate)
 48            {
 849                wasProblem = !string.IsNullOrEmpty(_alertedSignature);
 850                if (string.Equals(_alertedSignature ?? string.Empty, signature, StringComparison.Ordinal))
 451                    return false;
 452                _alertedSignature = signature;
 453                return true;
 54            }
 855        }
 56    }
 57}