using Microsoft.AspNetCore.Mvc; using Raven.Client.Documents.Indexes; namespace zero.Api.Controllers; public abstract class ZeroApiTreeEntityStoreController : ZeroApiEntityStoreController where TModel : ZeroEntity, ISupportsTrees, new() where TStore : ITreeEntityStore { public ZeroApiTreeEntityStoreController(TStore store) : base(store) { } protected async Task> GetChildModels(string parentId, ListQuery query) where T : BasicModel { query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); Paged result = await Store.LoadChildren(parentId, query.Page, query.PageSize, q => q.Filter(query)); return Mapper.Map(result, (src, dest) => { dest.Link = GetAction(src); }); } protected async Task> GetChildModels(string parentId, ListQuery query) where T : BasicModel where TIndex : AbstractCommonApiForIndexes, new() { query.OrderQuery ??= q => q.OrderByDescending(x => x.CreatedDate); Paged result = await Store.LoadChildren(parentId, query.Page, query.PageSize, q => q.Filter(query)); return Mapper.Map(result, (src, dest) => { dest.Link = GetAction(src); }); } protected async Task> SortModels(string[] ids) { return await Store.Sort(ids); } protected async Task> MoveModel(string pageId, string newParentId) where TEdit : DisplayModel { return await PutOperation(async () => await Store.Move(pageId, newParentId)); } protected async Task> CopyModel(string pageId, string newParentId) where TEdit : DisplayModel { return await PutOperation(async () => await Store.Copy(pageId, newParentId)); } protected async Task> CopyModelWithDescendants(string pageId, string newParentId) where TEdit : DisplayModel { return await PutOperation(async () => await Store.CopyWithDescendants(pageId, newParentId)); } protected async Task> DeleteModelWithDescendants(string id) { TModel model = await Store.Load(id); if (model == null) { return NotFound(); } Result result = await Store.DeleteWithDescendants(model); return result.WithoutModel(); } async Task> PutOperation(Func>> action) where TEdit : DisplayModel { Result result = await action(); if (Hints.ResponsePreference == ApiResponsePreference.Minimal) { return result.WithoutModel(); } return Mapper.Map(result); } }