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