diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index 42f02e56..056104f6 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -60,7 +60,7 @@ namespace AyaNova.Biz } } - + //////////////////////////////////////////////////////////////////////////////////////////////// //GET @@ -133,15 +133,15 @@ namespace AyaNova.Biz return false; - //DELETE DIRECT CHILD OBJECTS + //DELETE DIRECT CHILD / RELATED OBJECTS //(note: the convention is to allow deletion of children created *in* the same UI area so this will delete contacts, customer notes, but not workorders of this customer for example) - + //Also these are done through their biz objects as there are notification, search and other concerns to be handled { - var ContactIds = await ct.User.AsNoTracking().Where(z => z.CustomerId == id).Select(z => z.Id).ToListAsync(); - if (ContactIds.Count() > 0) + var IDList = await ct.User.AsNoTracking().Where(z => z.CustomerId == id).Select(z => z.Id).ToListAsync(); + if (IDList.Count() > 0) { UserBiz b = new UserBiz(ct, UserId, UserTranslationId, CurrentUserRoles); - foreach (long ItemId in ContactIds) + foreach (long ItemId in IDList) if (!await b.DeleteAsync(ItemId, transaction)) { AddError(ApiErrorCode.CHILD_OBJECT_ERROR, null, $"CustomerContact [{ItemId}]: {b.GetErrorsAsString()}"); @@ -149,12 +149,13 @@ namespace AyaNova.Biz } } } + { - var CustomerNoteIds = await ct.CustomerNote.AsNoTracking().Where(z => z.CustomerId == id).Select(z => z.Id).ToListAsync(); - if (CustomerNoteIds.Count() > 0) + var IDList = await ct.CustomerNote.AsNoTracking().Where(z => z.CustomerId == id).Select(z => z.Id).ToListAsync(); + if (IDList.Count() > 0) { CustomerNoteBiz b = new CustomerNoteBiz(ct, UserId, UserTranslationId, CurrentUserRoles); - foreach (long ItemId in CustomerNoteIds) + foreach (long ItemId in IDList) if (!await b.DeleteAsync(ItemId, transaction)) { AddError(ApiErrorCode.CHILD_OBJECT_ERROR, null, $"CustomerNote [{ItemId}]: {b.GetErrorsAsString()}"); @@ -163,6 +164,20 @@ namespace AyaNova.Biz } } + { + var IDList = await ct.Review.AsNoTracking().Where(x => x.AType == AyaType.Customer && x.ObjectId == id).Select(x => x.Id).ToListAsync(); + if (IDList.Count() > 0) + { + ReviewBiz b = new ReviewBiz(ct, UserId, UserTranslationId, CurrentUserRoles); + foreach (long ItemId in IDList) + if (!await b.DeleteAsync(ItemId, transaction)) + { + AddError(ApiErrorCode.CHILD_OBJECT_ERROR, null, $"Review [{ItemId}]: {b.GetErrorsAsString()}"); + return false; + } + } + } + ct.Customer.Remove(dbObject); await ct.SaveChangesAsync(); @@ -237,7 +252,7 @@ namespace AyaNova.Biz private async Task ValidateAsync(Customer proposedObj, Customer currentObj) { //skip validation if seeding - if(ServerBootConfig.SEEDING) return; + if (ServerBootConfig.SEEDING) return; bool isNew = currentObj == null; @@ -494,7 +509,7 @@ namespace AyaNova.Biz public async Task HandlePotentialNotificationEvent(AyaEvent ayaEvent, ICoreBizObjectModel proposedObj, ICoreBizObjectModel currentObj = null) { ILogger log = AyaNova.Util.ApplicationLogging.CreateLogger(); - if(ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; + if (ServerBootConfig.SEEDING || ServerBootConfig.MIGRATING) return; log.LogDebug($"HandlePotentialNotificationEvent processing: [AyaType:{this.BizType}, AyaEvent:{ayaEvent}]"); bool isNew = currentObj == null; diff --git a/server/AyaNova/biz/ReviewBiz.cs b/server/AyaNova/biz/ReviewBiz.cs index 80bd79dd..0c08107e 100644 --- a/server/AyaNova/biz/ReviewBiz.cs +++ b/server/AyaNova/biz/ReviewBiz.cs @@ -153,33 +153,36 @@ namespace AyaNova.Biz //////////////////////////////////////////////////////////////////////////////////////////////// //DELETE // - internal async Task DeleteAsync(long id) + internal async Task DeleteAsync(long id, Microsoft.EntityFrameworkCore.Storage.IDbContextTransaction parentTransaction = null) { - using (var transaction = await ct.Database.BeginTransactionAsync()) + Microsoft.EntityFrameworkCore.Storage.IDbContextTransaction transaction = null; + if (parentTransaction == null) + transaction = await ct.Database.BeginTransactionAsync(); + var dbObject = await GetAsync(id, false); + if (dbObject == null) { - var dbObject = await GetAsync(id, false); - if (dbObject == null) - { - AddError(ApiErrorCode.NOT_FOUND); - return false; - } - ValidateCanDelete(dbObject); - if (HasErrors) - return false; - if (HasErrors) - return false; - ct.Review.Remove(dbObject); - await ct.SaveChangesAsync(); - - //Log event - await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); - await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType, ct); - await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); - await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); - await transaction.CommitAsync(); - await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); - return true; + AddError(ApiErrorCode.NOT_FOUND); + return false; } + ValidateCanDelete(dbObject); + if (HasErrors) + return false; + if (HasErrors) + return false; + ct.Review.Remove(dbObject); + await ct.SaveChangesAsync(); + + //Log event + await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); + await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType, ct); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await FileUtil.DeleteAttachmentsForObjectAsync(BizType, dbObject.Id, ct); + //all good do the commit if it's ours + if (parentTransaction == null) + await transaction.CommitAsync(); + await HandlePotentialNotificationEvent(AyaEvent.Deleted, dbObject); + return true; + }