From fb09ac0e323e22106b9f325fd029f67d1bb43401 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Sat, 9 May 2020 20:13:31 +0000 Subject: [PATCH] --- server/AyaNova/biz/WorkOrderBiz.cs | 93 +++++++++++++++++++----------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index b23829ca..5b8b3d1f 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -168,7 +168,51 @@ namespace AyaNova.Biz return dbObject; } + //////////////////////////////////////////////////////////////////////////////////////////////// + //DELETE + // + internal async Task DeleteAsync(long id) + { + WorkOrder dbObject = await ct.WorkOrder.SingleOrDefaultAsync(m => m.Id == id); + ValidateCanDelete(dbObject); + if (HasErrors) + return false; + //collect the child id's to delete + var ItemIds = await ct.WorkOrderItem.Where(m => m.WorkOrderId == id).Select(m => m.Id).ToListAsync(); + + + using (var transaction = await ct.Database.BeginTransactionAsync()) + { + try + { + //Delete children + foreach (long l in ItemIds) + { + if (!await ItemDeleteAsync(id, transaction)) return false; + } + + + ct.WorkOrder.Remove(dbObject); + await ct.SaveChangesAsync(); + + //Log event + await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Serial.ToString(), ct); + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); + await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + + //all good do the commit + await transaction.CommitAsync(); + } + catch + { + //Just re-throw for now, let exception handler deal, but in future may want to deal with this more here + throw; + + } + return true; + } + } private async Task SearchIndexAsync(WorkOrder obj, bool isNew) { @@ -191,29 +235,7 @@ namespace AyaNova.Biz return SearchParams; } - //////////////////////////////////////////////////////////////////////////////////////////////// - //DELETE - // - internal async Task DeleteAsync(long workorderId) - { - //NOPE: will need to traverse the workorder object and delete bit by bit - //Unless implement cascade delete, hmmm....is there a downside to that, this is the only route to delete it so - //if they are allowed and it validates to delete then why not? (would be much faster letting db handle it and not traversing) - WorkOrder dbObject = await GetEntireWorkOrderAsync(workorderId); - ValidateCanDelete(dbObject); - if (HasErrors) - return false; - - ct.WorkOrder.Remove(dbObject); - await ct.SaveChangesAsync(); - - //Log event - await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Serial.ToString(), ct); - await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); - return true; - } //////////////////////////////////////////////////////////////////////////////////////////////// @@ -368,7 +390,7 @@ namespace AyaNova.Biz new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT); return null; } - await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItem, AyaEvent.Modified), ct); await ItemSearchIndexAsync(dbObject, false); await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; @@ -377,7 +399,7 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //DELETE // - internal async Task ItemDeleteAsync(long id) + internal async Task ItemDeleteAsync(long id, Microsoft.EntityFrameworkCore.Storage.IDbContextTransaction parentTransaction = null) { WorkOrderItem dbObject = await ct.WorkOrderItem.SingleOrDefaultAsync(m => m.Id == id); ItemValidateCanDelete(dbObject); @@ -389,7 +411,7 @@ namespace AyaNova.Biz var PartIds = await ct.WorkOrderItemPart.Where(m => m.WorkOrderItemId == id).Select(m => m.Id).ToListAsync(); - using (var transaction = await ct.Database.BeginTransactionAsync()) + using (var transaction = parentTransaction ?? await ct.Database.BeginTransactionAsync()) { try { @@ -407,12 +429,13 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); //Log event - await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, "wo:" + dbObject.WorkOrderId.ToString(), ct); - await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); + await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItem, dbObject.Id, "wo:" + dbObject.WorkOrderId.ToString(), ct); + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItem); await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); - //all good do the commit - await transaction.CommitAsync(); + //all good do the commit if it's ours + if (parentTransaction == null) + await transaction.CommitAsync(); } catch { @@ -583,7 +606,7 @@ namespace AyaNova.Biz new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT); return null; } - await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemLabor, AyaEvent.Modified), ct); await LaborSearchIndexAsync(dbObject, false); await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; @@ -602,8 +625,8 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); //Log event - await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); - await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); + await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemLabor, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemLabor); await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -768,7 +791,7 @@ namespace AyaNova.Biz new ApiErrorResponse(ApiErrorCode.CONCURRENCY_CONFLICT); return null; } - await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); + await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemPart, AyaEvent.Modified), ct); await PartSearchIndexAsync(dbObject, false); await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; @@ -787,8 +810,8 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); //Log event - await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); - await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); + await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemPart, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemPart); await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; }