Добавить загрузку исходника карточки по провайдерам

Введены ISourceContentProvider и SourceContentResolver, эндпоинт GET /api/cards/{id}/source отдаёт содержимое источника (провайдер по kind либо сохранённое в карточке).
This commit is contained in:
Rustam Khalimov
2026-09-11 15:01:22 +03:00
parent ebc761d40e
commit 3327bf48b0
10 changed files with 190 additions and 7 deletions
@@ -0,0 +1,42 @@
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);
}
}