lazy-get parent on PUT
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user