| | | 1 | | namespace Services.ApiServices.InterpartsEngine; |
| | | 2 | | |
| | | 3 | | /// <summary>Настройки API предложений движка Interparts (секция <c>InterpartsEngine</c> в appsettings).</summary> |
| | | 4 | | public 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> |
| | 39 | 10 | | 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 |
| | 64 | 13 | | public string ApiKey { get; init; } = string.Empty; |
| | | 14 | | |
| | | 15 | | /// <summary>Учётка движка (<c>X-Customer-Login</c>), по тарифу которой считается цена.</summary> |
| | 25 | 16 | | public string CustomerLogin { get; init; } = "demo_ru"; |
| | | 17 | | |
| | | 18 | | /// <summary>Первый поиск по артикулу опрашивает всех поставщиков и идёт до ~2 минут; повтор из кэша — секунда.</sum |
| | 25 | 19 | | public int TimeoutSeconds { get; init; } = 150; |
| | | 20 | | |
| | | 21 | | /// <summary>Каждый поиск без кэша движка опрашивает API поставщиков, поэтому одновременных запросов немного.</summa |
| | 37 | 22 | | public int MaxConcurrency { get; init; } = 3; |
| | | 23 | | |
| | 26 | 24 | | public int BrandsCacheMinutes { get; init; } = 30; |
| | 25 | 25 | | public int EmptyBrandsCacheMinutes { get; init; } = 5; |
| | | 26 | | |
| | | 27 | | /// <summary>Потолок кэша предложений; реальный срок — ближайший <c>expires_at</c> минус <see cref="OfferExpirySafet |
| | 35 | 28 | | public int OffersCacheMaxMinutes { get; init; } = 7; |
| | | 29 | | |
| | | 30 | | /// <summary>Запас до <c>expires_at</c>: пользователю не отдаём <c>offer_id</c>, который истечёт, пока он выбирает.< |
| | 35 | 31 | | public int OfferExpirySafetySeconds { get; init; } = 30; |
| | | 32 | | |
| | 26 | 33 | | public int ErrorCacheSeconds { get; init; } = 20; |
| | | 34 | | |
| | | 35 | | /// <summary>Сколько держать ответ перепроверки: только чтобы повторный опрос UI забрал его, а не запустил новую.</s |
| | 27 | 36 | | public int RecheckCacheSeconds { get; init; } = 30; |
| | | 37 | | |
| | | 38 | | /// <summary> |
| | | 39 | | /// Сколько веб-запрос ждёт движок, прежде чем ответить «ещё идёт» (202): nginx перед приложением рвёт запросы |
| | | 40 | | /// через 60 с, а поиск в это время продолжается и попадает в кэш — следующий опрос UI его заберёт. |
| | | 41 | | /// </summary> |
| | 25 | 42 | | public int WebWaitSeconds { get; init; } = 40; |
| | | 43 | | |
| | 14 | 44 | | public bool IsConfigured => !string.IsNullOrWhiteSpace(BaseUrl) && !string.IsNullOrWhiteSpace(ApiKey); |
| | | 45 | | } |