using Raven.Client.Documents.Session; using System; using System.Collections.Generic; using System.Threading.Tasks; namespace zero.Core.Routing { public abstract class AbtractRouteProvider : IRouteProvider { public virtual string Alias { get; protected set; } public virtual Type[] AffectedTypes { get; protected set; } public const string ID_PREFIX = "routes."; public const char SLASH = '/'; protected RouteProviderEndpoint DefaultEndpoint { get; set; } public AbtractRouteProvider(string alias) { Alias = alias; AffectedTypes = new Type[1] { typeof(T) }; DefaultEndpoint = new RouteProviderEndpoint() { Controller = "ZeroFrontend", Action = "Index" }; } /// /// Map a route to an MVC endpoint /// public virtual RouteProviderEndpoint MapEndpoint(IResolvedRoute route) { return DefaultEndpoint; } /// public virtual async Task GetRoute(IAsyncDocumentSession session, T model) { return await session.LoadAsync(GetRouteId(model)); } /// public virtual async Task GetRoute(IAsyncDocumentSession session, object model) { if (!(model is T)) { return null; } return await GetRoute(session, (T)model); } /// public virtual Task ResolveRoute(IAsyncDocumentSession session, IRoute route) { DefaultResolvedRoute resolved = new DefaultResolvedRoute() { Route = route }; return Task.FromResult((IResolvedRoute)resolved); } /// public abstract Task> GetAllRoutes(IAsyncDocumentSession session); /// public abstract string GetRouteId(T model); /// public string GetRouteId(object model) { if (!(model is T)) { throw new ArgumentException($"Parameter has to be of type {typeof(T)}", nameof(model)); } return GetRouteId((T)model); } } }