Files
mixtape/zero.Core/Routing/Page/PageLinkProvider.cs
T

87 lines
1.9 KiB
C#
Raw Normal View History

2021-01-29 17:01:32 +01:00
using Raven.Client.Documents.Session;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
2021-02-10 14:53:56 +01:00
using zero.Core.Extensions;
using zero.Core.Options;
2021-01-29 17:01:32 +01:00
namespace zero.Core.Routing
{
public class PageLinkProvider : ILinkProvider
{
2021-04-14 16:16:42 +02:00
public const string AREA = "zero.pages";
2021-01-29 17:01:32 +01:00
protected IRoutes Routes { get; set; }
2021-04-21 16:02:07 +02:00
protected IZeroOptions Options { get; set; }
2021-01-29 17:01:32 +01:00
2021-02-10 14:53:56 +01:00
public PageLinkProvider(IRoutes routes, IZeroOptions options)
2021-01-29 17:01:32 +01:00
{
Routes = routes;
2021-02-10 14:53:56 +01:00
Options = options;
2021-01-29 17:01:32 +01:00
}
2021-04-14 16:16:42 +02:00
/// <summary>
/// Creates a new link object from a page
/// </summary>
2021-05-04 17:23:52 +02:00
public Link Create(Page page, LinkTarget target = LinkTarget.Default, string title = null)
2021-04-14 16:16:42 +02:00
{
return new Link()
{
Area = AREA,
Target = target,
Title = title,
Values = new()
{
{ "id", page.Id }
}
};
}
2021-01-29 17:01:32 +01:00
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public bool CanProcess(Link link) => link.Area == AREA;
2021-02-10 14:53:56 +01:00
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public async Task<string> Resolve(Link link)
2021-01-29 17:01:32 +01:00
{
2021-05-04 17:23:52 +02:00
link.Url = await Routes.GetUrl<Page>(link.Values.GetValueOrDefault<string>("id")) + (link.UrlSuffix ?? string.Empty);
2021-04-14 16:16:42 +02:00
return link.Url;
2021-02-10 14:53:56 +01:00
}
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public async Task<PreviewModel> Preview(IAsyncDocumentSession session, Link link)
2021-02-10 14:53:56 +01:00
{
string id = link.Values.GetValueOrDefault<string>("id");
if (id.IsNullOrEmpty())
2021-01-29 17:01:32 +01:00
{
return null;
}
2021-05-04 17:23:52 +02:00
Page page = await session.LoadAsync<Page>(id);
2021-01-29 17:01:32 +01:00
2021-02-10 14:53:56 +01:00
if (page == null)
{
return null;
}
2021-01-29 17:01:32 +01:00
2021-02-10 14:53:56 +01:00
PageType pageType = Options.Pages.GetAllItems().FirstOrDefault(x => x.Alias == page.PageTypeAlias);
2021-05-04 17:23:52 +02:00
string url = await Routes.GetUrl<Page>(page);
2021-02-10 14:53:56 +01:00
return new()
{
Id = page.Id,
Icon = pageType?.Icon ?? "fth-folder",
Name = page.Name,
Text = url
};
2021-01-29 17:01:32 +01:00
}
}
}