Files
mixtape/zero.Core/Routing/Links.cs
T

93 lines
2.2 KiB
C#
Raw Normal View History

2021-02-10 14:53:56 +01:00
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
namespace zero.Core.Routing
{
public class Links : ILinks
{
protected IZeroStore Store { get; set; }
protected ILogger<Links> Logger { get; set; }
protected IEnumerable<ILinkProvider> Providers { get; set; }
public Links(IZeroStore store, ILogger<Links> logger, IEnumerable<ILinkProvider> providers)
{
Store = store;
Logger = logger;
Providers = providers;
}
2021-04-14 16:16:42 +02:00
/// <inheritdoc />
public T GetProvider<T>() where T : class, ILinkProvider
{
Type type = typeof(T);
return Providers.FirstOrDefault(x => x.GetType().IsAssignableFrom(type)) as T;
}
2021-02-10 14:53:56 +01:00
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public async Task<string> GetUrl(Link link)
2021-02-10 14:53:56 +01:00
{
ILinkProvider provider = Providers.LastOrDefault(x => x.CanProcess(link));
if (provider == null)
{
Logger.LogWarning("Could not find provider for link with area {area}", link.Area);
return null;
}
return await provider.Resolve(link);
}
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public async Task<Dictionary<Link, string>> GetUrls(params Link[] links)
2021-02-10 14:53:56 +01:00
{
2021-05-04 17:23:52 +02:00
Dictionary<Link, string> result = new();
2021-02-10 14:53:56 +01:00
2021-05-04 17:23:52 +02:00
foreach (Link link in links)
2021-02-10 14:53:56 +01:00
{
result.Add(link, await GetUrl(link));
}
return result;
}
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public ILinkProvider GetProvider(Link link)
2021-02-10 14:53:56 +01:00
{
return Providers.LastOrDefault(x => x.CanProcess(link));
}
}
public interface ILinks
{
/// <summary>
/// Get URL from a link object by finding a provider which can resolve the link
/// </summary>
2021-05-04 17:23:52 +02:00
Task<string> GetUrl(Link link);
2021-02-10 14:53:56 +01:00
/// <summary>
/// Get URLs from link objects by finding matching providers
/// </summary>
2021-05-04 17:23:52 +02:00
Task<Dictionary<Link, string>> GetUrls(params Link[] links);
2021-02-10 14:53:56 +01:00
/// <summary>
/// Get the provider for a specific link
/// </summary>
2021-05-04 17:23:52 +02:00
ILinkProvider GetProvider(Link link);
2021-04-14 16:16:42 +02:00
/// <summary>
/// Find a provider by a specific type
/// </summary>
T GetProvider<T>() where T : class, ILinkProvider;
2021-02-10 14:53:56 +01:00
}
}