Files
Pilz/Pilz.Net/Api/Server/BaseChildItemHandler.cs
2025-04-30 13:35:26 +02:00

64 lines
2.2 KiB
C#

using Pilz.Data;
using Pilz.Extensions.Reflection;
using Pilz.Net.Extensions;
using System.Diagnostics;
using System.Net;
namespace Pilz.Net.Api.Server;
public abstract class BaseChildItemHandler<TEntity, TParent, TUpdateMsg>(IApiServer server)
: BaseHandler<TEntity, TUpdateMsg>(server)
where TEntity : class, IDataObject
where TParent : class, IDataObject
where TUpdateMsg : ApiMessage
{
public class ChildEntityUpdate(TEntity entity, TParent parent, TUpdateMsg updateMsg, ApiRequestInfo reqest) : EntityUpdate(entity, updateMsg, reqest)
{
public TParent Parent { get; } = parent;
}
protected virtual bool RegisterGetAll => true;
protected virtual bool RegisterPost => true;
public override void Initialize(IApiServer server)
{
base.Initialize(server);
var t = GetType();
if (RegisterGetAll)
server.RegisterHandler(t.GetMethod(nameof(GetAll))!.CreateDelegate(this), new(Route, "GET"), Debugger.IsAttached);
if (RegisterPost)
server.RegisterHandler(t.GetMethod(nameof(Post))!.CreateDelegate(this), new(Route, "POST"), Debugger.IsAttached);
}
public virtual ApiResult GetAll(int parent)
{
IQueryable<TEntity> list;
if (parent != 0 && server.Manager.Find(parent, out TParent? parentEntity))
list = GetChilds(parentEntity).AsQueryable();
else
list = server.Manager.Get<TEntity>();
return list.ToList().Select(ToClient).ToItemsResult();
}
public virtual ApiResult Post(int parent, TUpdateMsg msg, ApiRequestInfo req)
{
if (!server.Manager.Find(parent, out TParent? parentEntity))
return ApiResult.NotFound();
var entity = CreateNewEntity(msg, parentEntity);
if (UpdateEntity(new ChildEntityUpdate(entity, parentEntity, msg, req)) is ApiResult result)
return result;
GetChilds(parentEntity).Add(entity);
server.Manager.Save(parentEntity, true);
return ToClient(entity).ToItemResult(HttpStatusCode.Created);
}
protected virtual TEntity CreateNewEntity(TUpdateMsg msg, TParent parent)
{
return CreateNewEntity(msg);
}
public abstract IList<TEntity> GetChilds(TParent parent);
}