lazy-get parent on PUT

This commit is contained in:
2025-05-14 14:27:18 +02:00
parent f16bbf51c6
commit e673483ef5

View File

@@ -12,9 +12,11 @@ public abstract class BaseChildItemHandler<TEntity, TParent, TUpdateMsg>(IApiSer
where TParent : class, IDataObject where TParent : class, IDataObject
where TUpdateMsg : ApiMessage where TUpdateMsg : ApiMessage
{ {
public class ChildEntityUpdate(TEntity entity, TParent parent, TUpdateMsg message, ApiRequestInfo reqest) : EntityUpdate(entity, message, reqest) public class ChildEntityUpdate(TEntity entity, Func<TParent?> getParent, TUpdateMsg message, ApiRequestInfo reqest) : EntityUpdate(entity, message, reqest)
{ {
public TParent Parent { get; } = parent; private readonly Func<TParent?> getParent = getParent;
private TParent? parent;
public TParent? Parent => parent ??= getParent();
} }
protected virtual bool RegisterGetAll => true; protected virtual bool RegisterGetAll => true;
@@ -51,7 +53,7 @@ public abstract class BaseChildItemHandler<TEntity, TParent, TUpdateMsg>(IApiSer
if (!server.Manager.Find(parent, out TParent? parentEntity)) if (!server.Manager.Find(parent, out TParent? parentEntity))
return ApiResult.NotFound(); return ApiResult.NotFound();
var entity = CreateNewEntity(msg, parentEntity); var entity = CreateNewEntity(msg, parentEntity);
var update = new ChildEntityUpdate(entity, parentEntity, msg, req); var update = new ChildEntityUpdate(entity, () => parentEntity, msg, req);
if (UpdateEntity(update) is ApiResult result) if (UpdateEntity(update) is ApiResult result)
return result; return result;
GetChilds(parentEntity).Add(entity); GetChilds(parentEntity).Add(entity);
@@ -62,11 +64,9 @@ public abstract class BaseChildItemHandler<TEntity, TParent, TUpdateMsg>(IApiSer
public override ApiResult Put(int id, TUpdateMsg msg, ApiRequestInfo req) public override ApiResult Put(int id, TUpdateMsg msg, ApiRequestInfo req)
{ {
if (server.Manager.Get<TParent>().FirstOrDefault(n => GetChilds(n).Any(n => n.Id == id)) is not TParent parentEntity)
return ApiResult.NotFound();
if (!server.Manager.Find(id, out TEntity? entity)) if (!server.Manager.Find(id, out TEntity? entity))
return ApiResult.NotFound(); return ApiResult.NotFound();
var update = new ChildEntityUpdate(entity, parentEntity, msg, req); var update = new ChildEntityUpdate(entity, () => server.Manager.Get<TParent>().AsEnumerable().FirstOrDefault(n => GetChilds(n).Any(n => n.Id == id)), msg, req);
if (UpdateEntity(update) is ApiResult result) if (UpdateEntity(update) is ApiResult result)
return result; return result;
if (OnSave(update) is ApiResult result2) if (OnSave(update) is ApiResult result2)
@@ -81,7 +81,7 @@ public abstract class BaseChildItemHandler<TEntity, TParent, TUpdateMsg>(IApiSer
protected override ApiResult? OnSave(EntityUpdate update) protected override ApiResult? OnSave(EntityUpdate update)
{ {
if (update.Entity.Id == 0 && update is ChildEntityUpdate updateEx) if (update.Entity.Id == 0 && update is ChildEntityUpdate updateEx && updateEx.Parent != null)
{ {
server.Manager.Save(updateEx.Parent, true); server.Manager.Save(updateEx.Parent, true);
return null; return null;