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.Threading.Tasks; using zero.Core.Collections; using zero.Core.Database.Indexes; using zero.Core.Entities; using zero.Core.Extensions; namespace zero.Core.Api { public class SpacesApi : BackofficeApi, ISpacesApi { protected IPermissionsApi PermissionsApi { get; private set; } public SpacesApi(ICollectionContext store, IPermissionsApi permissionsApi) : base(store) { PermissionsApi = permissionsApi; } /// public Space GetByAlias(string alias) { return GetAll().FirstOrDefault(x => x.Alias.Equals(alias, StringComparison.InvariantCultureIgnoreCase)); } /// public Space GetBy() where T : SpaceContent { Type type = typeof(T); return GetAll().FirstOrDefault(x => x.Type == type); } /// public IReadOnlyCollection GetAll() { return Context.Options.Spaces.GetAllItems(); } /// public async Task GetItem(string alias, string id = null) { Space space = GetByAlias(alias); return await Session.Query() .Where(x => x.SpaceAlias == space.Alias) .WhereIf(x => x.Id == id, !id.IsNullOrEmpty()) .FirstOrDefaultAsync(); } /// public async Task GetItem(string id = null) where T : SpaceContent { Space space = GetBy(); return await Session.Query() .Where(x => x.SpaceAlias == space.Alias) .WhereIf(x => x.Id == id, !id.IsNullOrEmpty()) .FirstOrDefaultAsync(); } /// public async Task> GetItems(params string[] ids) where T : SpaceContent { Space space = GetBy(); ids = ids.Distinct().ToArray(); Dictionary models = await Session.LoadAsync(ids); Dictionary result = new Dictionary(); foreach (string id in ids) { models.TryGetValue(id, out T model); result.Add(id, model); } return result; } /// public async Task> GetListByQuery(string alias, ListQuery query) { query.SearchSelector = item => item.Name; return await Session.Query() .Where(x => x.SpaceAlias == alias) .ToQueriedListAsync(query); } /// public async Task> GetListByQuery(string alias, ListQuery query) where T : SpaceContent { query.SearchSelector = item => item.Name; return await Session.Query() .Where(x => x.SpaceAlias == alias) .ToQueriedListAsync(query); } /// public async Task> GetListByQuery(ListQuery query) where T : SpaceContent { Space space = GetBy(); query.SearchSelector = item => item.Name; return await Session.Query() .Where(x => x.SpaceAlias == space.Alias) .ToQueriedListAsync(query); } /// public async Task> Save(SpaceContent model) { return await SaveModel(model, null); } /// public async Task> Delete(string id) { return await DeleteById(id); } } public interface ISpacesApi { /// /// Returns a space by the defined alias /// Space GetByAlias(string alias); /// /// Returns a space by a defined generic /// Space GetBy() where T : SpaceContent; /// /// Get all spaces /// IReadOnlyCollection GetAll(); /// /// Get editor item for a space /// Task GetItem(string alias, string id = null); /// /// Get editor item for a space /// Task GetItem(string id = null) where T : SpaceContent; /// /// Get editor items for a space /// Task> GetItems(params string[] ids) where T : SpaceContent; /// /// Get all list items for a space (with query) /// Task> GetListByQuery(string alias, ListQuery query); /// /// Get all list items for a space (with query) /// Task> GetListByQuery(string alias, ListQuery query) where T : SpaceContent; /// /// Get all list items for a space (with query) /// Task> GetListByQuery(ListQuery query) where T : SpaceContent; /// /// Saves a content item in a space /// Task> Save(SpaceContent model); /// /// Deletes a space content item /// Task> Delete(string id); } }