Files
Deal/src/core/Deal.Modules.Cards/Application/Sources/SourceContentResolver.cs
T
Rustam Khalimov 3327bf48b0 Добавить загрузку исходника карточки по провайдерам
Введены ISourceContentProvider и SourceContentResolver, эндпоинт GET /api/cards/{id}/source отдаёт содержимое источника (провайдер по kind либо сохранённое в карточке).
2026-09-11 15:01:22 +03:00

43 lines
2.0 KiB
C#

namespace Deal.Modules.Cards.Application.Sources;
/// <summary>
/// Выбирает провайдера содержимого по виду источника.
/// </summary>
public sealed class SourceContentResolver
{
private readonly Dictionary<string, ISourceContentProvider> _providers;
/// <summary>
/// Создаёт реестр провайдеров содержимого.
/// </summary>
/// <param name="providers">Зарегистрированные провайдеры; последний по виду перекрывает предыдущих.</param>
public SourceContentResolver(IEnumerable<ISourceContentProvider> providers)
{
_providers = new Dictionary<string, ISourceContentProvider>(StringComparer.OrdinalIgnoreCase);
foreach (ISourceContentProvider provider in providers)
{
_providers[provider.Kind] = provider;
}
}
/// <summary>
/// Есть ли провайдер для вида источника.
/// </summary>
/// <param name="source">Ссылка на источник.</param>
/// <returns>true — содержимое можно загрузить лениво.</returns>
public bool CanResolve(SourceRef source) => _providers.ContainsKey(source.Kind);
/// <summary>
/// Загружает содержимое записи источника.
/// </summary>
/// <param name="source">Ссылка на источник.</param>
/// <param name="ct">Токен отмены.</param>
/// <returns>Содержимое записи либо null — провайдера нет/источник не отдал данные.</returns>
public Task<SourceContent?> ResolveAsync(SourceRef source, CancellationToken ct)
{
return _providers.TryGetValue(source.Kind, out ISourceContentProvider? provider)
? provider.LoadAsync(source, ct)
: Task.FromResult<SourceContent?>(null);
}
}