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);
}
}