< Summary

Information
Class: Services.ApiServices.InterpartsEngine.InterpartsEngineConfig
Assembly: Services
File(s): /home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/InterpartsEngine/InterpartsEngineConfig.cs
Line coverage
100%
Covered lines: 13
Uncovered lines: 0
Coverable lines: 13
Total lines: 45
Line coverage: 100%
Branch coverage
50%
Covered branches: 1
Total branches: 2
Branch coverage: 50%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_BaseUrl()100%11100%
get_ApiKey()100%11100%
get_CustomerLogin()100%11100%
get_TimeoutSeconds()100%11100%
get_MaxConcurrency()100%11100%
get_BrandsCacheMinutes()100%11100%
get_EmptyBrandsCacheMinutes()100%11100%
get_OffersCacheMaxMinutes()100%11100%
get_OfferExpirySafetySeconds()100%11100%
get_ErrorCacheSeconds()100%11100%
get_RecheckCacheSeconds()100%11100%
get_WebWaitSeconds()100%11100%
get_IsConfigured()50%22100%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/AppRepository/ApiServices/InterpartsEngine/InterpartsEngineConfig.cs

#LineLine coverage
 1namespace Services.ApiServices.InterpartsEngine;
 2
 3/// <summary>Настройки API предложений движка Interparts (секция <c>InterpartsEngine</c> в appsettings).</summary>
 4public sealed class InterpartsEngineConfig
 5{
 6    public const string SectionName = "InterpartsEngine";
 7    public const string HttpClientName = "InterpartsEngineApi";
 8
 9    /// <summary>Адрес API вместе с <c>/api/v1</c>.</summary>
 3910    public string BaseUrl { get; init; } = "https://imac-yy.tail961e3c.ts.net:8443/api/v1";
 11
 12    /// <summary>Ключ проекта (<c>X-Api-Key</c>). На проде задаётся в /home/volna/Studio2/engine.env, не в git.</summary
 6413    public string ApiKey { get; init; } = string.Empty;
 14
 15    /// <summary>Учётка движка (<c>X-Customer-Login</c>), по тарифу которой считается цена.</summary>
 2516    public string CustomerLogin { get; init; } = "demo_ru";
 17
 18    /// <summary>Первый поиск по артикулу опрашивает всех поставщиков и идёт до ~2 минут; повтор из кэша — секунда.</sum
 2519    public int TimeoutSeconds { get; init; } = 150;
 20
 21    /// <summary>Каждый поиск без кэша движка опрашивает API поставщиков, поэтому одновременных запросов немного.</summa
 3722    public int MaxConcurrency { get; init; } = 3;
 23
 2624    public int BrandsCacheMinutes { get; init; } = 30;
 2525    public int EmptyBrandsCacheMinutes { get; init; } = 5;
 26
 27    /// <summary>Потолок кэша предложений; реальный срок — ближайший <c>expires_at</c> минус <see cref="OfferExpirySafet
 3528    public int OffersCacheMaxMinutes { get; init; } = 7;
 29
 30    /// <summary>Запас до <c>expires_at</c>: пользователю не отдаём <c>offer_id</c>, который истечёт, пока он выбирает.<
 3531    public int OfferExpirySafetySeconds { get; init; } = 30;
 32
 2633    public int ErrorCacheSeconds { get; init; } = 20;
 34
 35    /// <summary>Сколько держать ответ перепроверки: только чтобы повторный опрос UI забрал его, а не запустил новую.</s
 2736    public int RecheckCacheSeconds { get; init; } = 30;
 37
 38    /// <summary>
 39    /// Сколько веб-запрос ждёт движок, прежде чем ответить «ещё идёт» (202): nginx перед приложением рвёт запросы
 40    /// через 60 с, а поиск в это время продолжается и попадает в кэш — следующий опрос UI его заберёт.
 41    /// </summary>
 2542    public int WebWaitSeconds { get; init; } = 40;
 43
 1444    public bool IsConfigured => !string.IsNullOrWhiteSpace(BaseUrl) && !string.IsNullOrWhiteSpace(ApiKey);
 45}