using Raven.Client.Documents.Session; namespace zero.Routing; public class PageLinkProvider : ILinkProvider { public const string AREA = "zero.pages"; protected IRoutes Routes { get; set; } protected IPageTypeService PageTypeService { get; set; } protected IPagesStore Pages { get; set; } public PageLinkProvider(IRoutes routes, IPageTypeService pageTypeService, IPagesStore pages) { Routes = routes; PageTypeService = pageTypeService; Pages = pages; } /// /// 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) { Page page = await Pages.Load(link.Values.GetValueOrDefault("id")); if (page == null) { return null; } link.IsActive = page.IsActive; link.Url = await Routes.GetUrl(page) + (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; } FlavorConfig pageType = PageTypeService.GetByAlias(page.Flavor); string url = await Routes.GetUrl(page); return new() { Id = page.Id, Icon = pageType?.Icon ?? "fth-folder", Name = page.Name, IsActive = page.IsActive, Text = url }; } }