using Raven.Client.Documents; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Extensions; namespace zero.Core.Routing { public class TestPageRouteProvider : ZeroRouteProvider { public static string PAGE_TYPE_PARAM = "pageType"; protected IPageUrlBuilder UrlBuilder { get; set; } public TestPageRouteProvider(IPageUrlBuilder urlBuilder) : base("zero.pages") { UrlBuilder = urlBuilder; } /// public override async Task Create(RoutingContext context, Page model) { if (model is PageFolder) { return null; } IEnumerable parents = await GetParents(context, model); Route route = new(); route.Url = UrlBuilder.GetUrl(model, parents); route.DependsOn(model.Id); route.DependsOn(parents.Select(x => x.Id).ToArray()); route.Param(PAGE_TYPE_PARAM, model.PageTypeAlias); return route; } /// public override async Task Model(RoutingContext context, Route route, Page entity) { PageRoute resolved = new(route); resolved.Page = entity; resolved.Parents = await GetParents(context, entity); resolved.PageType = route.Param(PAGE_TYPE_PARAM); return resolved; } /// public override async IAsyncEnumerable Seed(RoutingContext context) { var stream = await context.Session.Advanced.StreamAsync(context.Session.Query()); while (await stream.MoveNextAsync()) { yield return await Create(context, stream.Current.Document); } } /// /// Get parents for a page /// protected virtual async Task> GetParents(RoutingContext context, Page model) { Pages_ByHierarchy.Result result = await context.Session.Query() .ProjectInto() .Include(x => x.Path.Select(p => p.Id)) .FirstOrDefaultAsync(x => x.Id == model.Id); return (await context.Session.LoadAsync(result.Path.Select(x => x.Id))).Select(x => x.Value).ToList(); } } }