using Raven.Client.Documents; using Raven.Client.Documents.Linq; using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using zero.Core.Api; using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Entities.Messages; using zero.Core.Extensions; using zero.Core.Messages; using zero.Core.Utils; namespace zero.Core.Routing { public class PageUrlProviderTest { public string Alias => "zero.pages"; public const string PAGE_COLLECTION = "page"; public const string PAGE_TYPE = "pageType"; protected IDocumentStore Raven { get; private set; } protected IMessageAggregator Messages { get; private set; } protected IPageUrlResolver PageUrlResolver { get; set; } protected IApplicationContext Context { get; private set; } public PageUrlProviderTest(IDocumentStore raven, IMessageAggregator messages, IPageUrlResolver pageUrlResolver, IApplicationContext context) { Raven = raven; Messages = messages; PageUrlResolver = pageUrlResolver; Context = context; } /// public bool UrlChanged(IPage previous, IPage current) { return previous == null || !previous.Alias.Equals(current.Alias) || !previous.ParentId.Equals(current.ParentId); } /// public Task GetDependencies(IPage model) { // TODO get all pages (and other routes) which have this page as a dependency and update them throw new NotImplementedException(); } /// public async Task CreateRoute(IPage model) { using IAsyncDocumentSession session = Raven.OpenAsyncSession(); Pages_ByHierarchy.Result result = await session.Query() .ProjectInto() .Include(x => x.Path.Select(p => p.Id)) .FirstOrDefaultAsync(x => x.Id == model.Id); IList parents = (await session.LoadAsync(result.Path.Select(x => x.Id))).Select(x => x.Value).ToList(); return new Route() { Id = String.Concat("routes.", IdGenerator.Create()), AppId = model.AppId, Url = GetUrl(model, parents), ProviderAlias = Alias }; } /// /// Create url for page /// protected string GetUrl(IPage page, IEnumerable parents) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append('/'); if (parents != null) { foreach (IPage parent in parents) { stringBuilder.Append(parent.Alias); stringBuilder.Append('/'); } } stringBuilder.Append(page.Alias); return stringBuilder.ToString(); } } }