using Microsoft.AspNetCore.Mvc; using Raven.Client.Documents.Linq; using System; using System.Collections.Generic; using System.Threading.Tasks; using zero.Core.Collections; using zero.Core.Entities; using zero.Core.Extensions; using zero.Web.Models; namespace zero.Web.Controllers { public abstract class BackofficeCollectionController : BackofficeController where TEntity : IZeroEntity where TCollection : ICollectionBase { protected TCollection Collection { get; private set; } protected Func, IRavenQueryable> DefaultQuery { get; set; } protected Action PreviewTransform { get; set; } public BackofficeCollectionController(TCollection collection) { Collection = collection; } public override void OnScopeChanged(string scope) { Collection.ApplyScope(scope); } public virtual async Task> GetById([FromQuery] string id) => Edit(await Collection.GetById(id)); public virtual async Task> GetByIds([FromQuery] string[] ids) => await Collection.GetByIds(ids); public virtual EditModel GetEmpty([FromServices] TEntity blueprint) => Edit(blueprint); public virtual async Task> GetByQuery([FromQuery] ListBackofficeQuery query) { query.SearchSelector = model => model.Name; IRavenQueryable ravenQuery = Collection.Query; if (DefaultQuery != null) { ravenQuery = DefaultQuery(ravenQuery); } return await ravenQuery.ToQueriedListAsync(query); } public virtual async Task> GetForPicker() => await SelectList(Collection.Stream()); public virtual async Task> GetPreviews([FromQuery] List ids) => Previews(await Collection.GetByIds(ids.ToArray()), PreviewTransform); [HttpPost] public virtual async Task> Save([FromBody] TEntity model) => await Collection.Save(model); [HttpDelete] public virtual async Task> Delete([FromQuery] string id) => await Collection.DeleteById(id); } }