Files
mixtape/zero.Core/RecycleBin/RecycleBinApi.cs
T
2021-11-26 12:31:33 +01:00

258 lines
7.9 KiB
C#

//using Raven.Client.Documents;
//using Raven.Client.Documents.Linq;
//using Raven.Client.Documents.Session;
//using System.Collections.Generic;
//using System.Threading.Tasks;
//using zero.Core.Collections;
//using zero.Core.Database.Indexes;
//using zero.Core.Entities;
//using zero.Core.Extensions;
//using zero.Core.Utils;
//namespace zero.Core.Api
//{
// public class RecycleBinApi : BackofficeApi, IRecycleBinApi
// {
// RecycledEntity Blueprint;
// public RecycleBinApi(IStoreContext store, RecycledEntity blueprint) : base(store)
// {
// Blueprint = blueprint;
// }
// /// <inheritdoc />
// public async Task<EntityResult<RecycledEntity>> Add<TEntity>(TEntity model, string group = null, string operationId = null) where TEntity : ZeroEntity
// {
// RecycledEntity entity = Blueprint.Clone();
// entity.Group = group;
// entity.Content = model;
// entity.OriginalId = model.Id;
// entity.OperationId = operationId;
// entity.Name = model.Name;
// return await SaveModel(entity);
// }
// /// <inheritdoc />
// public async Task<EntityResult<IEnumerable<RecycledEntity>>> Add<TEntity>(IEnumerable<TEntity> models, string group = null) where TEntity : ZeroEntity
// {
// IList<RecycledEntity> results = new List<RecycledEntity>();
// string operationId = IdGenerator.Create();
// foreach (TEntity model in models)
// {
// EntityResult<RecycledEntity> result = await Add(model, group, operationId);
// if (!result.IsSuccess)
// {
// return EntityResult<IEnumerable<RecycledEntity>>.Fail(result.Errors);
// }
// results.Add(result.Model);
// }
// return EntityResult<IEnumerable<RecycledEntity>>.Success(results);
// }
// /// <inheritdoc />
// public async Task<RecycledEntity> GetById(string id)
// {
// return await GetById<RecycledEntity>(id);
// }
// /// <inheritdoc />
// public async Task<Paged<RecycledEntity>> GetByQuery(RecycleBinListQuery query)
// {
// query.SearchSelector = x => x.Name;
// return await Session.Query<RecycledEntity, zero_RecycledEntities>()
// .WhereIf(x => x.Group == query.Group, !query.Group.IsNullOrWhiteSpace())
// .WhereIf(x => x.OperationId == query.OperationId, !query.OperationId.IsNullOrWhiteSpace())
// .ToQueriedListAsync(query);
// }
// /// <inheritdoc />
// public async Task<IList<RecycledEntity>> GetByOperation(string operationId)
// {
// return await Session.Query<RecycledEntity, zero_RecycledEntities>()
// .Where(x => x.OperationId == operationId)
// .ToListAsync();
// }
// /// <summary>
// /// Get affected entity count from a specific operation
// /// </summary>
// public async Task<int> GetCountByOperation(string operationId)
// {
// return await Session.Query<RecycledEntity, zero_RecycledEntities>()
// .Where(x => x.OperationId == operationId)
// .CountAsync();
// }
// /// <inheritdoc />
// public async Task<EntityResult<RecycledEntity>> Delete(string id)
// {
// return await DeleteById<RecycledEntity>(id);
// }
// /// <inheritdoc />
// public async Task<EntityResult<RecycledEntity>> DeleteAll()
// {
// // TODO make Purge operations app-aware
// return await Purge<RecycledEntity>();
// }
// /// <inheritdoc />
// public async Task<EntityResult<RecycledEntity>> DeleteByOperation(string operationId)
// {
// return await Purge<RecycledEntity>("where c.OperationId = $id", new Raven.Client.Parameters() { { "id", operationId } });
// }
// /// <inheritdoc />
// public async Task<EntityResult<RecycledEntity>> DeleteByGroup(string group)
// {
// return await Purge<RecycledEntity>("where c.Group = $group", new Raven.Client.Parameters() { { "group", group } });
// }
// }
// public interface IRecycleBinApi
// {
// /// <summary>
// /// Adds an entity to the recycle bin. This operation will not remove this entity from it's own collection!
// /// </summary>
// Task<EntityResult<RecycledEntity>> Add<TEntity>(TEntity model, string group = null, string operationId = null) where TEntity : ZeroEntity;
// /// <summary>
// /// Adds the specified entities to the recycle bin. This operation will not remove entities from their own collection!
// /// </summary>
// Task<EntityResult<IEnumerable<RecycledEntity>>> Add<TEntity>(IEnumerable<TEntity> models, string group = null) where TEntity : ZeroEntity;
// /// <summary>
// /// Get recycled entity by Id
// /// </summary>
// Task<RecycledEntity> GetById(string id);
// /// <summary>
// /// Get all recycled items
// /// </summary>
// Task<Paged<RecycledEntity>> GetByQuery(RecycleBinListQuery query);
// /// <summary>
// /// Get affected entities from a specific operation
// /// </summary>
// Task<IList<RecycledEntity>> GetByOperation(string operationId);
// /// <summary>
// /// Get affected entity count from a specific operation
// /// </summary>
// Task<int> GetCountByOperation(string operationId);
// // <summary>
// /// Deletes a recycled entity by Id
// /// </summary>
// Task<EntityResult<RecycledEntity>> Delete(string id);
// /// <summary>
// /// Purges the recycle bin
// /// </summary>
// Task<EntityResult<RecycledEntity>> DeleteAll();
// /// <summary>
// /// Deletes all recycled items from a specific operation
// /// </summary>
// Task<EntityResult<RecycledEntity>> DeleteByOperation(string operationId);
// /// <summary>
// /// Deletes all recycled items from a specific group
// /// </summary>
// Task<EntityResult<RecycledEntity>> DeleteByGroup(string group);
// }
//}
/*
* RESTORE FOR PAGES
*
*
*
/// <summary>
/// Restores a page from the recycle bin
/// </summary>
Task<EntityResult<string[]>> Restore(string id, bool includeDescendants = false);
/// <inheritdoc />
public async Task<EntityResult<string[]>> Restore(string id, bool includeDescendants = false)
{
EntityResult<string[]> result = new EntityResult<string[]>();
RecycledEntity recycledEntity = await RecycleBinApi.GetById(id);
List<RecycledEntity> entities = new List<RecycledEntity>() { recycledEntity };
if (recycledEntity == null)
{
return EntityResult<string[]>.Fail(); // TODO correct error message
}
// get descendants from the operation
if (includeDescendants && !recycledEntity.OperationId.IsNullOrEmpty())
{
entities = (await RecycleBinApi.GetByOperation(recycledEntity.OperationId)).ToList();
}
// fill ids
string[] ids = entities.Select(x => x.OriginalId).ToArray();
// check if parents are available
string[] parentIds = entities.Select(x => x.Content as Page).Where(x => x != null).Select(x => x.ParentId).ToArray();
parentIds = (await Load(parentIds)).Where(x => x.Value != null).Select(x => x.Value.Id).ToArray();
// validate and restore all items
foreach (RecycledEntity entity in entities)
{
// check if it contains page data
if (entity.Group != RECYCLE_BIN_GROUP || !(entity.Content is Page))
{
//result.AddError("Cannot parse recycled entity as an Page in group \"" + RECYCLE_BIN_GROUP + "\""); // TODO correct error message
continue;
}
// get page
Page page = entity.Content as Page;
page.IsActive = false;
// validate app and parent
if (!page.ParentId.IsNullOrEmpty() && !ids.Contains(page.ParentId) && !parentIds.Contains(page.ParentId))
{
// TODO correct error message
continue;
}
// restore to pages
EntityResult<Page> saveResult = await Create(page);
}
// delete affected entities from recycle bin
if (!recycledEntity.OperationId.IsNullOrEmpty())
{
await RecycleBinApi.DeleteByOperation(recycledEntity.OperationId);
}
// set result
result.Model = ids;
result.IsSuccess = true;
return result;
}
*/