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

125 lines
3.2 KiB
C#
Raw Normal View History

2020-10-23 15:50:59 +02:00
using Microsoft.Extensions.Logging;
using Raven.Client.Documents;
using Raven.Client.Documents.Session;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using zero.Core.Entities;
2021-02-23 15:50:33 +01:00
using zero.Core.Options;
2020-10-23 15:50:59 +02:00
namespace zero.Core.Routing
{
2021-05-04 17:23:52 +02:00
public class PageRouteProvider : AbtractRouteProvider<Page>
2020-10-23 15:50:59 +02:00
{
protected const string REF_KEY = "page";
2020-10-26 13:59:46 +01:00
protected const string PAGE_TYPE_KEY = "pageType";
2020-10-23 15:50:59 +02:00
protected ILogger<PageRouteProvider> Logger { get; set; }
2020-10-26 13:59:46 +01:00
protected IPageUrlBuilder UrlBuilder { get; set; }
2020-10-23 15:50:59 +02:00
2020-10-26 13:59:46 +01:00
2021-02-23 15:50:33 +01:00
public PageRouteProvider(IZeroOptions options, ILogger<PageRouteProvider> logger, IPageUrlBuilder urlBuilder) : base("zero.pages", options)
2020-10-23 15:50:59 +02:00
{
Logger = logger;
2020-10-26 13:59:46 +01:00
UrlBuilder = urlBuilder;
2020-10-23 15:50:59 +02:00
}
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public override string GetRouteId(Page model, object parameters = null) => ID_PREFIX + model.Hash;
2020-10-23 15:50:59 +02:00
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public override async Task<IResolvedRoute> ResolveRoute(IAsyncDocumentSession session, Route route)
2020-10-23 15:50:59 +02:00
{
PageRoute resolved = new PageRoute(route);
List<string> ids = new List<string>();
RouteReference reference = route.References.SingleOrDefault(x => x.Collection == REF_KEY);
if (reference == null)
{
return null;
}
ids.Add(reference.Id);
ids.AddRange(route.Dependencies);
2021-05-04 17:23:52 +02:00
Dictionary<string, Page> pages = await session.LoadAsync<Page>(ids);
2020-10-23 15:50:59 +02:00
2021-05-04 17:23:52 +02:00
if (!pages.TryGetValue(reference.Id, out Page page))
2020-10-23 15:50:59 +02:00
{
return null;
}
resolved.Page = page;
resolved.Parents = pages.Where(x => x.Key != reference.Id).Select(x => x.Value).ToList();
return resolved;
}
2020-10-26 13:59:46 +01:00
/// <inheritdoc />
2021-05-04 17:23:52 +02:00
public override async Task<IList<Route>> GetAllRoutes(IAsyncDocumentSession session)
2020-10-26 13:59:46 +01:00
{
2021-05-04 17:23:52 +02:00
IList<Route> TraversePageChildren(Page parent, IEnumerable<Page> parents, IEnumerable<Page> allPages)
2020-10-26 13:59:46 +01:00
{
2021-05-04 17:23:52 +02:00
List<Route> routes = new List<Route>();
IEnumerable<Page> currentPages = allPages.Where(x => x.ParentId == parent?.Id);
2020-10-26 13:59:46 +01:00
2021-05-04 17:23:52 +02:00
foreach (Page page in currentPages)
2020-10-26 13:59:46 +01:00
{
2021-05-04 17:23:52 +02:00
Route route = BuildRoute(page, parents, allPages);
2020-12-03 15:39:54 +01:00
if (route != null)
{
routes.Add(route);
}
2021-05-04 17:23:52 +02:00
routes.AddRange(TraversePageChildren(page, parents.Union(new List<Page>() { page }), allPages));
2020-10-26 13:59:46 +01:00
}
return routes;
}
2021-05-04 17:23:52 +02:00
IList<Page> pages = await session.Query<Page>().ToListAsync();
return TraversePageChildren(null, new List<Page>() { }, pages);
2020-10-26 13:59:46 +01:00
}
/// <summary>
/// Build route entity from page
/// </summary>
2021-05-04 17:23:52 +02:00
protected virtual Route BuildRoute(Page page, IEnumerable<Page> parents, IEnumerable<Page> allPages)
2020-10-26 13:59:46 +01:00
{
2020-12-03 15:39:54 +01:00
if (page is PageFolder)
{
return null;
}
2021-05-04 17:23:52 +02:00
Route route = new Route()
2020-10-26 13:59:46 +01:00
{
Id = GetRouteId(page),
Url = UrlBuilder.GetUrl(page, parents),
ProviderAlias = Alias
};
route.Params.Add(PAGE_TYPE_KEY, page.PageTypeAlias);
route.References.Add(new RouteReference(page.Id, REF_KEY));
if (parents != null)
{
2021-05-04 17:23:52 +02:00
foreach (Page parent in parents)
2020-10-26 13:59:46 +01:00
{
route.Dependencies.Add(parent.Id);
}
}
return route;
}
2020-10-23 15:50:59 +02:00
}
}