Добавить загрузку исходника карточки по провайдерам
Введены ISourceContentProvider и SourceContentResolver, эндпоинт GET /api/cards/{id}/source отдаёт содержимое источника (провайдер по kind либо сохранённое в карточке).
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user