using Raven.Client.Documents; using Raven.Client.Documents.Linq; namespace zero.Routing; public class PageRouteProvider : ZeroRouteProvider { public static string PAGE_TYPE_PARAM = "pageType"; public static string PAGE_ID_PARAM = "pageId"; public static string PAGE_IS_FOLDER = "pageIsFolder"; protected IPageUrlBuilder UrlBuilder { get; set; } public PageRouteProvider(IPageUrlBuilder urlBuilder) : base(Constants.Pages.PageRouteProviderAlias) { Priority = 10; UrlBuilder = urlBuilder; } /// public override Task IsRouteStale(RoutingContext context, Page previous, Page current) { bool compareUrl = UrlBuilder.GetUrlPart(previous) == UrlBuilder.GetUrlPart(current); bool compareParent = previous.ParentId == current.ParentId; return Task.FromResult(!compareUrl || !compareParent); } /// public override async Task Create(RoutingContext context, Page model) { IEnumerable parents = await GetParents(context, model); Route route = await base.Create(context, model); route.Url = UrlBuilder.GetUrl(model, parents); route.DependsOn(model.Id); route.DependsOn(parents.Select(x => x.Id).ToArray()); route.Param(PAGE_TYPE_PARAM, model.Flavor); route.Param(PAGE_ID_PARAM, model.Id); route.Param(PAGE_IS_FOLDER, model is PageFolder); return route; } /// public override async Task Model(RoutingContext context, RouteResponse response) { Route route = response.Route; if (route.Param(PAGE_IS_FOLDER)) { return null; } Page page = await context.Session.LoadAsync(route.ReferenceId); PageRoute resolved = new(route); resolved.Page = page; resolved.Parents = await GetParents(context, page); 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); } } /// public override async IAsyncEnumerable SeedOnUpdate(RoutingContext context, T model) { if (model is Page) { string id = model.Id; IList children = await context.Session.Query() .Where(x => x.PathIds.In(new[] { id })).ProjectInto().ToListAsync(); foreach (Page child in children) { yield return await Create(context, child); } } } /// /// Get parents for a page /// protected virtual async Task> GetParents(RoutingContext context, Page model) { zero_Pages_ByHierarchy.Result result = await context.Session.Query() .ProjectInto() .Include(x => x.Path.Select(p => p.Id)) .FirstOrDefaultAsync(x => x.Id == model.Id); if (result == null) { return new List(); } return (await context.Session.LoadAsync(result.Path.Select(x => x.Id))).Select(x => x.Value).ToList(); } }