using Microsoft.AspNetCore.Mvc; using Raven.Client.Documents.Indexes; 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 : ZeroEntity where TCollection : ICollectionBase { protected TCollection Collection { get; private set; } [Obsolete] protected Func, IRavenQueryable> DefaultQuery { get; set; } protected Action PreviewTransform { get; set; } protected Action PickerTransform { 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, [FromQuery] string changeVector = null) => Edit(changeVector.IsNullOrEmpty() ? await Collection.GetById(id) : await Collection.GetRevision(changeVector)); 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) { return await Collection.GetByQuery(query); } public virtual async Task> GetRevisions([FromQuery] string id, [FromQuery] ListBackofficeQuery query) { return await Collection.GetRevisions(id, query.Page, query.PageSize); } public virtual async Task> GetForPicker() => await SelectList(Collection.Stream(), PickerTransform); 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); } }