From ba07b0389305011a475106a83b22d7c307547e06 Mon Sep 17 00:00:00 2001 From: John Cardinal Date: Sat, 16 May 2020 19:55:43 +0000 Subject: [PATCH] reorg tag stuff --- devdocs/todo.txt | 3 + server/AyaNova/Controllers/TagController.cs | 20 +- .../DataListSqlFilterCriteriaBuilder.cs | 2 +- server/AyaNova/biz/ContractBiz.cs | 12 +- server/AyaNova/biz/CustomerBiz.cs | 12 +- server/AyaNova/biz/HeadOfficeBiz.cs | 12 +- server/AyaNova/biz/LoanUnitBiz.cs | 12 +- server/AyaNova/biz/PMBiz.cs | 10 +- server/AyaNova/biz/PMTemplateBiz.cs | 12 +- server/AyaNova/biz/PartBiz.cs | 12 +- server/AyaNova/biz/ProjectBiz.cs | 12 +- server/AyaNova/biz/PurchaseOrderBiz.cs | 12 +- server/AyaNova/biz/QuoteBiz.cs | 10 +- server/AyaNova/biz/QuoteTemplateBiz.cs | 12 +- server/AyaNova/biz/TagBiz.cs | 214 ++++++++- server/AyaNova/biz/TagUtil.cs | 411 ++++++++---------- server/AyaNova/biz/UnitBiz.cs | 12 +- server/AyaNova/biz/UnitModelBiz.cs | 12 +- server/AyaNova/biz/UserBiz.cs | 10 +- server/AyaNova/biz/VendorBiz.cs | 12 +- server/AyaNova/biz/WidgetBiz.cs | 12 +- server/AyaNova/biz/WorkOrderBiz.cs | 112 ++--- server/AyaNova/biz/WorkorderTemplateBiz.cs | 12 +- 23 files changed, 562 insertions(+), 398 deletions(-) diff --git a/devdocs/todo.txt b/devdocs/todo.txt index 91fb098a..30c08568 100644 --- a/devdocs/todo.txt +++ b/devdocs/todo.txt @@ -31,6 +31,9 @@ todo: API root controller todo: api / server landing page is shitty on a mobile and really just shitty, add a logo or some shit todo: Should server show uptime somewhere? +todo: jobs should have a kill by time so they can't just sit running forever + also is there a way to kill a stuck job via ui possible? + todo: Log configuration into server log at startup? https://rockfish.ayanova.com/default.htm#!/rfcaseEdit/3523 log all config settings into server log on boot todo:aycontext clean up old block of weird definitions diff --git a/server/AyaNova/Controllers/TagController.cs b/server/AyaNova/Controllers/TagController.cs index b13e3d0c..5459f55e 100644 --- a/server/AyaNova/Controllers/TagController.cs +++ b/server/AyaNova/Controllers/TagController.cs @@ -53,7 +53,7 @@ namespace AyaNova.Api.Controllers { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - return Ok(ApiOkResponse.Response(await TagUtil.TagListFilteredAsync(ct, query), true)); + return Ok(ApiOkResponse.Response(await TagBiz.TagListFilteredAsync(ct, query), true)); } /// @@ -66,7 +66,7 @@ namespace AyaNova.Api.Controllers { if (serverState.IsClosed) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); - return Ok(ApiOkResponse.Response(await TagUtil.CloudListFilteredAsync(ct, query), true)); + return Ok(ApiOkResponse.Response(await TagBiz.CloudListFilteredAsync(ct, query), true)); } @@ -94,7 +94,7 @@ namespace AyaNova.Api.Controllers return StatusCode(403, new ApiNotAuthorizedResponse()); if (idList.Count == 0) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "List of ids")); - tag = TagUtil.NormalizeTag(tag); + tag = TagBiz.NormalizeTag(tag); if (string.IsNullOrWhiteSpace(tag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "tag")); @@ -135,7 +135,7 @@ namespace AyaNova.Api.Controllers if (!Authorized.HasModifyRole(HttpContext.Items, ayaType)) return StatusCode(403, new ApiNotAuthorizedResponse()); - tag = TagUtil.NormalizeTag(tag); + tag = TagBiz.NormalizeTag(tag); if (string.IsNullOrWhiteSpace(tag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "tag")); @@ -177,7 +177,7 @@ namespace AyaNova.Api.Controllers return StatusCode(403, new ApiNotAuthorizedResponse()); if (idList.Count == 0) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "List of ids")); - tag = TagUtil.NormalizeTag(tag); + tag = TagBiz.NormalizeTag(tag); if (string.IsNullOrWhiteSpace(tag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "tag")); @@ -219,7 +219,7 @@ namespace AyaNova.Api.Controllers if (!Authorized.HasModifyRole(HttpContext.Items, ayaType)) return StatusCode(403, new ApiNotAuthorizedResponse()); - tag = TagUtil.NormalizeTag(tag); + tag = TagBiz.NormalizeTag(tag); if (string.IsNullOrWhiteSpace(tag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "tag")); @@ -263,10 +263,10 @@ namespace AyaNova.Api.Controllers return StatusCode(403, new ApiNotAuthorizedResponse()); if (idList.Count == 0) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "List of ids")); - fromTag = TagUtil.NormalizeTag(fromTag); + fromTag = TagBiz.NormalizeTag(fromTag); if (string.IsNullOrWhiteSpace(fromTag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "fromTag")); - toTag = TagUtil.NormalizeTag(toTag); + toTag = TagBiz.NormalizeTag(toTag); if (string.IsNullOrWhiteSpace(toTag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "toTag")); var JobName = $"BulkReplace tag \"{fromTag}\" with tag \"{toTag}\" on {ayaType} ({idList.Count} specified)"; @@ -308,11 +308,11 @@ namespace AyaNova.Api.Controllers if (!Authorized.HasModifyRole(HttpContext.Items, ayaType)) return StatusCode(403, new ApiNotAuthorizedResponse()); - fromTag = TagUtil.NormalizeTag(fromTag); + fromTag = TagBiz.NormalizeTag(fromTag); if (string.IsNullOrWhiteSpace(fromTag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "fromTag")); - toTag = TagUtil.NormalizeTag(toTag); + toTag = TagBiz.NormalizeTag(toTag); if (string.IsNullOrWhiteSpace(toTag)) return BadRequest(new ApiErrorResponse(ApiErrorCode.VALIDATION_REQUIRED, "toTag")); diff --git a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs index 54154865..54d7b6e1 100644 --- a/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs +++ b/server/AyaNova/DataList/DataListSqlFilterCriteriaBuilder.cs @@ -553,7 +553,7 @@ code from picklist in case I decide to do it later //sounds like it might fuck up when using other languages so... StringBuilder sbTags = new StringBuilder(); sbTags.Append("@> array["); - List normalizedTags = TagUtil.NormalizeTags(sTags); + List normalizedTags = TagBiz.NormalizeTags(sTags); foreach (string s in normalizedTags) { diff --git a/server/AyaNova/biz/ContractBiz.cs b/server/AyaNova/biz/ContractBiz.cs index 42a3e4e0..ffc31150 100644 --- a/server/AyaNova/biz/ContractBiz.cs +++ b/server/AyaNova/biz/ContractBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Contract.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz Contract SnapshotOfOriginalDBObj = new Contract(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/CustomerBiz.cs b/server/AyaNova/biz/CustomerBiz.cs index c5571b91..7f5dd315 100644 --- a/server/AyaNova/biz/CustomerBiz.cs +++ b/server/AyaNova/biz/CustomerBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Customer.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz Customer SnapshotOfOriginalDBObj = new Customer(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/HeadOfficeBiz.cs b/server/AyaNova/biz/HeadOfficeBiz.cs index 5f712497..c64a13d7 100644 --- a/server/AyaNova/biz/HeadOfficeBiz.cs +++ b/server/AyaNova/biz/HeadOfficeBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.HeadOffice.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz HeadOffice SnapshotOfOriginalDBObj = new HeadOffice(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/LoanUnitBiz.cs b/server/AyaNova/biz/LoanUnitBiz.cs index 44daa5d8..02be7a06 100644 --- a/server/AyaNova/biz/LoanUnitBiz.cs +++ b/server/AyaNova/biz/LoanUnitBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.LoanUnit.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz LoanUnit SnapshotOfOriginalDBObj = new LoanUnit(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/PMBiz.cs b/server/AyaNova/biz/PMBiz.cs index 64040b27..b3979c0a 100644 --- a/server/AyaNova/biz/PMBiz.cs +++ b/server/AyaNova/biz/PMBiz.cs @@ -93,7 +93,7 @@ namespace AyaNova.Biz //Handle child and associated items: await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, o.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(o, true); - // await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, o.Tags, null); + // await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, o.Tags, null); return o; //} @@ -134,7 +134,7 @@ namespace AyaNova.Biz // //Handle child and associated items: // await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, outObj.Id, BizType, AyaEvent.Created), ct); // await SearchIndexAsync(outObj, true); - // await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); + // await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); // return outObj; } @@ -160,7 +160,7 @@ namespace AyaNova.Biz dbObj.Serial = putObj.Serial; } - dbObj.Tags = TagUtil.NormalizeTags(dbObj.Tags); + dbObj.Tags = TagBiz.NormalizeTags(dbObj.Tags); dbObj.CustomFields = JsonUtil.CompactJson(dbObj.CustomFields); //Set "original" value of concurrency token to input token @@ -175,7 +175,7 @@ namespace AyaNova.Biz //Log event and save context await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObj.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObj, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); return true; } @@ -221,7 +221,7 @@ namespace AyaNova.Biz // //Log event // await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObj.Id, dbObj.Serial.ToString(), ct); // await Search.ProcessDeletedObjectKeywordsAsync(dbObj.Id, BizType); - // await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); + // await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); // return true; } diff --git a/server/AyaNova/biz/PMTemplateBiz.cs b/server/AyaNova/biz/PMTemplateBiz.cs index 7f836187..2aa6d4d7 100644 --- a/server/AyaNova/biz/PMTemplateBiz.cs +++ b/server/AyaNova/biz/PMTemplateBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.PMTemplate.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz PMTemplate SnapshotOfOriginalDBObj = new PMTemplate(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/PartBiz.cs b/server/AyaNova/biz/PartBiz.cs index 2c0f18ac..bcaa3d30 100644 --- a/server/AyaNova/biz/PartBiz.cs +++ b/server/AyaNova/biz/PartBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Part.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz Part SnapshotOfOriginalDBObj = new Part(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/ProjectBiz.cs b/server/AyaNova/biz/ProjectBiz.cs index 12878b9c..a9c1fa00 100644 --- a/server/AyaNova/biz/ProjectBiz.cs +++ b/server/AyaNova/biz/ProjectBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Project.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz Project SnapshotOfOriginalDBObj = new Project(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/PurchaseOrderBiz.cs b/server/AyaNova/biz/PurchaseOrderBiz.cs index 0f0461b0..bbb46556 100644 --- a/server/AyaNova/biz/PurchaseOrderBiz.cs +++ b/server/AyaNova/biz/PurchaseOrderBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.PurchaseOrder.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz PurchaseOrder SnapshotOfOriginalDBObj = new PurchaseOrder(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/QuoteBiz.cs b/server/AyaNova/biz/QuoteBiz.cs index 659fef4f..495f4a84 100644 --- a/server/AyaNova/biz/QuoteBiz.cs +++ b/server/AyaNova/biz/QuoteBiz.cs @@ -92,7 +92,7 @@ namespace AyaNova.Biz //Handle child and associated items: await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, o.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(o, true); - // await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, o.Tags, null); + // await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, o.Tags, null); return o; //} @@ -134,7 +134,7 @@ namespace AyaNova.Biz // //Handle child and associated items: // await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, outObj.Id, BizType, AyaEvent.Created), ct); // await SearchIndexAsync(outObj, true); - // await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); + // await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); // return outObj; } @@ -160,7 +160,7 @@ namespace AyaNova.Biz dbObj.Serial = putObj.Serial; } - dbObj.Tags = TagUtil.NormalizeTags(dbObj.Tags); + dbObj.Tags = TagBiz.NormalizeTags(dbObj.Tags); dbObj.CustomFields = JsonUtil.CompactJson(dbObj.CustomFields); //Set "original" value of concurrency token to input token @@ -175,7 +175,7 @@ namespace AyaNova.Biz //Log event and save context await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObj.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObj, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); return true; } @@ -222,7 +222,7 @@ namespace AyaNova.Biz // //Log event // await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObj.Id, dbObj.Serial.ToString(), ct); // await Search.ProcessDeletedObjectKeywordsAsync(dbObj.Id, BizType); - // await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); + // await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); // return true; } diff --git a/server/AyaNova/biz/QuoteTemplateBiz.cs b/server/AyaNova/biz/QuoteTemplateBiz.cs index 0089e6c1..b7a412c8 100644 --- a/server/AyaNova/biz/QuoteTemplateBiz.cs +++ b/server/AyaNova/biz/QuoteTemplateBiz.cs @@ -70,7 +70,7 @@ namespace AyaNova.Biz //do stuff with QuoteTemplate QuoteTemplate outObj = inObj; - outObj.Tags = TagUtil.NormalizeTags(outObj.Tags); + outObj.Tags = TagBiz.NormalizeTags(outObj.Tags); outObj.CustomFields = JsonUtil.CompactJson(outObj.CustomFields); //Save to db await ct.QuoteTemplate.AddAsync(outObj); @@ -78,7 +78,7 @@ namespace AyaNova.Biz //Handle child and associated items: await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, outObj.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(outObj, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); return outObj; } @@ -119,7 +119,7 @@ namespace AyaNova.Biz //Handle child and associated items: await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, outObj.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(outObj, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); return outObj; } @@ -139,7 +139,7 @@ namespace AyaNova.Biz //Replace the db object with the PUT object CopyObject.Copy(inObj, dbObj, "Id"); - dbObj.Tags = TagUtil.NormalizeTags(dbObj.Tags); + dbObj.Tags = TagBiz.NormalizeTags(dbObj.Tags); dbObj.CustomFields = JsonUtil.CompactJson(dbObj.CustomFields); //Set "original" value of concurrency token to input token @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event and save context await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObj.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObj, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); return true; } @@ -197,7 +197,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObj.Id, dbObj.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObj.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); return true; } diff --git a/server/AyaNova/biz/TagBiz.cs b/server/AyaNova/biz/TagBiz.cs index 4c09eed7..dca58520 100644 --- a/server/AyaNova/biz/TagBiz.cs +++ b/server/AyaNova/biz/TagBiz.cs @@ -1,13 +1,16 @@ using System.Threading.Tasks; using Microsoft.EntityFrameworkCore; -using EnumsNET; using AyaNova.Util; using AyaNova.Api.ControllerHelpers; using AyaNova.Models; +using System.Collections.Generic; +using System; +using System.Linq; + namespace AyaNova.Biz { - //This class exists to process bulk tag job operations only + internal class TagBiz : BizObject, IJobObject { internal TagBiz(AyContext dbcontext, long currentUserId, long userTranslationId, AuthorizationRoles UserRoles) @@ -28,6 +31,213 @@ namespace AyaNova.Biz } + #region Utilities + ///////////////////////////////////// + //UTILITIES + // + + //clean up tags from client submission + //remove dupes, substitute dashes for spaces, lowercase and shorten if exceed 255 chars + //and sorts before returning to ensure consistent ordering + public static List NormalizeTags(List inTags) + { + if (inTags == null || inTags.Count == 0) return inTags; + + List outTags = new List(); + foreach (var tag in inTags) + outTags.Add(NormalizeTag(tag)); + outTags.Sort(); + return outTags.Distinct().ToList(); + } + + + public static string NormalizeTag(string inObj) + { + if (string.IsNullOrWhiteSpace(inObj)) return null; + //Must be lowercase per rules + //This may be naive when we get international cust omers but for now supporting utf-8 and it appears it's safe to do this with unicode + inObj = inObj.ToLowerInvariant(); + //No spaces in tags, replace with dashes + inObj = inObj.Replace(" ", "-"); + //Remove multiple dash sequences + inObj = System.Text.RegularExpressions.Regex.Replace(inObj, "-+", "-"); + //Ensure doesn't start or end with a dash + inObj = inObj.Trim('-'); + //No longer than 255 characters + inObj = StringUtil.MaxLength(inObj, 255); + return inObj; + } + + + + public static async Task ProcessDeleteTagsInRepositoryAsync(AyContext ct, List deleteTags) + { + if (deleteTags.Count == 0) return; + foreach (string s in deleteTags) + { + bool bDone = false; + //Keep on trying until there is success + //this allows for concurrency issues + //I considered a circuit breaker / timeout here, but theoretically it should not be an issue + //at some point it should not be a concurrency issue anymore + //And this is not critical functionality requiring a transaction and locking + do + { + //START: Get tag word and concurrency token and count + var ExistingTag = await ct.Tag.FirstOrDefaultAsync(x => x.Name == s); + //if not present, then nothing to do + if (ExistingTag != null) + { + //No longer needed? + if (ExistingTag.RefCount == 1) + { + ct.Remove(ExistingTag); + + } + else + { + //Decrement the refcount + ExistingTag.RefCount -= 1; + } + + try + { + await ct.SaveChangesAsync(); + bDone = true; + } + catch (Exception ex) when (ex is DbUpdateConcurrencyException)//allow for possible other types + { + //allow others to flow past + // string sss = ex.ToString(); + } + } + } while (bDone == false); + } + } + + public static async Task ProcessUpdateTagsInRepositoryAsync(AyContext ct, List newTags, List originalTags = null) + { + //just in case no new tags are present which could mean a user removed all tags from a record so this + //needs to proceed with the code below even if newTags is null as long as originalTags isn't also null + if (newTags == null) newTags = new List(); + if (originalTags == null) originalTags = new List(); + + if (newTags.Count == 0 && originalTags.Count == 0) return; + + List deleteTags = new List(); + List addTags = new List(); + + if (originalTags != null) + { + //Update + //This logic to only come up with CHANGES, if the item is in both lists then it will disappear and not need to be dealt with as it's refcount is unchanged in this operation + //testing will validate it + deleteTags = originalTags.Except(newTags).ToList(); + addTags = newTags.Except(originalTags).ToList(); + } + else + { + //Add + addTags = newTags; + } + + + //ADD / INCREMENT TAGS + foreach (string s in addTags) + { + bool bDone = false; + //Keep on trying until there is success + //this allows for concurrency issues + //I considered a circuit breaker / timeout here, but theoretically it should not be an issue + //at some point it should not be a concurrency issue anymore + do + { + //START: Get tag word and concurrency token and count + var ExistingTag = await ct.Tag.FirstOrDefaultAsync(x => x.Name == s); + //if not present, then add it with a count of 0 + if (ExistingTag == null) + { + await ct.Tag.AddAsync(new Tag() { Name = s, RefCount = 1 }); + } + else + { + //Update the refcount + ExistingTag.RefCount += 1; + } + try + { + await ct.SaveChangesAsync(); + bDone = true; + } + catch (Exception ex) when (ex is DbUpdateConcurrencyException)//this allows for other types + { + //allow others to flow past + //string sss = ex.ToString(); + } + } while (bDone == false); + } + + //DELETE TAGS + await ProcessDeleteTagsInRepositoryAsync(ct, deleteTags); + } + + + + //Pick list for driving pick list route + //going with contains for now as I think it's more useful in the long run and still captures startswith intent by user + public static async Task> TagListFilteredAsync(AyContext ct, string q) + { + //This path is intended for internal use and accepts that there may not be a filter specified + //however the client will always require a filter to display a tag list for choosing from + if (string.IsNullOrWhiteSpace(q)) + { + return await ct.Tag.OrderBy(x => x.Name) + .Select(x => x.Name) + .AsNoTracking() + .ToListAsync(); + } + else + { + q = NormalizeTag(q); + return await ct.Tag + .Where(x => x.Name.Contains(q)) + .OrderBy(x => x.Name) + .Select(x => x.Name) + .Take(25) + .AsNoTracking() + .ToListAsync(); + } + } + + //Cloud list + public static async Task> CloudListFilteredAsync(AyContext ct, string q) + { + //This path is intended for internal use and accepts that there may not be a filter specified + //however the client will always require a filter to display a tag list for choosing from + if (string.IsNullOrWhiteSpace(q)) + { + return await ct.Tag.OrderByDescending(x => x.RefCount).Select(x => new TagCloudItem() { Name = x.Name, RefCount = x.RefCount }).AsNoTracking().ToListAsync(); + } + else + { + q = NormalizeTag(q); + //TODO: Use the EF CORE TAKE method to restrict the results to a maximum limit + //however need to ensure it doesn't balk when the limit is higher than the number of results (probably not but test that) + return await ct.Tag + .Where(x => x.Name.Contains(q)) + .OrderByDescending(x => x.RefCount) + .Select(x => new TagCloudItem() { Name = x.Name, RefCount = x.RefCount }) + .AsNoTracking() + .ToListAsync(); + } + } + public class TagCloudItem + { + public long RefCount { get; set; } + public string Name { get; set; } + } + #endregion utilities + //////////////////////////////////////////////////////////////////////////////////////////////// //JOB / OPERATIONS diff --git a/server/AyaNova/biz/TagUtil.cs b/server/AyaNova/biz/TagUtil.cs index 9cc6174c..0c9deb88 100644 --- a/server/AyaNova/biz/TagUtil.cs +++ b/server/AyaNova/biz/TagUtil.cs @@ -10,257 +10,208 @@ namespace AyaNova.Biz { public static class TagUtil { - //clean up tags from client submission - //remove dupes, substitute dashes for spaces, lowercase and shorten if exceed 255 chars - //and sorts before returning to ensure consistent ordering - public static List NormalizeTags(List inTags) - { - if (inTags == null || inTags.Count == 0) return inTags; + // //clean up tags from client submission + // //remove dupes, substitute dashes for spaces, lowercase and shorten if exceed 255 chars + // //and sorts before returning to ensure consistent ordering + // public static List NormalizeTags(List inTags) + // { + // if (inTags == null || inTags.Count == 0) return inTags; - List outTags = new List(); - foreach (var tag in inTags) - outTags.Add(NormalizeTag(tag)); - outTags.Sort(); - return outTags.Distinct().ToList(); - } + // List outTags = new List(); + // foreach (var tag in inTags) + // outTags.Add(NormalizeTag(tag)); + // outTags.Sort(); + // return outTags.Distinct().ToList(); + // } - public static string NormalizeTag(string inObj) - { - if(string.IsNullOrWhiteSpace(inObj)) return null; - //Must be lowercase per rules - //This may be naive when we get international cust omers but for now supporting utf-8 and it appears it's safe to do this with unicode - inObj = inObj.ToLowerInvariant(); - //No spaces in tags, replace with dashes - inObj = inObj.Replace(" ", "-"); - //Remove multiple dash sequences - inObj = System.Text.RegularExpressions.Regex.Replace(inObj, "-+", "-"); - //Ensure doesn't start or end with a dash - inObj = inObj.Trim('-'); - //No longer than 255 characters - inObj = StringUtil.MaxLength(inObj, 255); - return inObj; - } + // public static string NormalizeTag(string inObj) + // { + // if(string.IsNullOrWhiteSpace(inObj)) return null; + // //Must be lowercase per rules + // //This may be naive when we get international cust omers but for now supporting utf-8 and it appears it's safe to do this with unicode + // inObj = inObj.ToLowerInvariant(); + // //No spaces in tags, replace with dashes + // inObj = inObj.Replace(" ", "-"); + // //Remove multiple dash sequences + // inObj = System.Text.RegularExpressions.Regex.Replace(inObj, "-+", "-"); + // //Ensure doesn't start or end with a dash + // inObj = inObj.Trim('-'); + // //No longer than 255 characters + // inObj = StringUtil.MaxLength(inObj, 255); + // return inObj; + // } - public static async Task ProcessDeleteTagsInRepositoryAsync(AyContext ct, List deleteTags) - { - if (deleteTags.Count == 0) return; - foreach (string s in deleteTags) - { - bool bDone = false; - //Keep on trying until there is success - //this allows for concurrency issues - //I considered a circuit breaker / timeout here, but theoretically it should not be an issue - //at some point it should not be a concurrency issue anymore - //And this is not critical functionality requiring a transaction and locking - do - { - //START: Get tag word and concurrency token and count - var ExistingTag = await ct.Tag.FirstOrDefaultAsync(x => x.Name == s); - //if not present, then nothing to do - if (ExistingTag != null) - { - //No longer needed? - if (ExistingTag.RefCount == 1) - { - ct.Remove(ExistingTag); + // public static async Task ProcessDeleteTagsInRepositoryAsync(AyContext ct, List deleteTags) + // { + // if (deleteTags.Count == 0) return; + // foreach (string s in deleteTags) + // { + // bool bDone = false; + // //Keep on trying until there is success + // //this allows for concurrency issues + // //I considered a circuit breaker / timeout here, but theoretically it should not be an issue + // //at some point it should not be a concurrency issue anymore + // //And this is not critical functionality requiring a transaction and locking + // do + // { + // //START: Get tag word and concurrency token and count + // var ExistingTag = await ct.Tag.FirstOrDefaultAsync(x => x.Name == s); + // //if not present, then nothing to do + // if (ExistingTag != null) + // { + // //No longer needed? + // if (ExistingTag.RefCount == 1) + // { + // ct.Remove(ExistingTag); - } - else - { - //Decrement the refcount - ExistingTag.RefCount -= 1; - } + // } + // else + // { + // //Decrement the refcount + // ExistingTag.RefCount -= 1; + // } - try - { - await ct.SaveChangesAsync(); - bDone = true; - } - catch (Exception ex) when (ex is DbUpdateConcurrencyException)//allow for possible other types - { - //allow others to flow past - // string sss = ex.ToString(); - } - } - } while (bDone == false); - } - } + // try + // { + // await ct.SaveChangesAsync(); + // bDone = true; + // } + // catch (Exception ex) when (ex is DbUpdateConcurrencyException)//allow for possible other types + // { + // //allow others to flow past + // // string sss = ex.ToString(); + // } + // } + // } while (bDone == false); + // } + // } - public static async Task ProcessUpdateTagsInRepositoryAsync(AyContext ct, List newTags, List originalTags = null) - { - //just in case no new tags are present which could mean a user removed all tags from a record so this - //needs to proceed with the code below even if newTags is null as long as originalTags isn't also null - if (newTags == null) newTags = new List(); - if (originalTags == null) originalTags = new List(); + // public static async Task ProcessUpdateTagsInRepositoryAsync(AyContext ct, List newTags, List originalTags = null) + // { + // //just in case no new tags are present which could mean a user removed all tags from a record so this + // //needs to proceed with the code below even if newTags is null as long as originalTags isn't also null + // if (newTags == null) newTags = new List(); + // if (originalTags == null) originalTags = new List(); - if (newTags.Count == 0 && originalTags.Count == 0) return; + // if (newTags.Count == 0 && originalTags.Count == 0) return; - List deleteTags = new List(); - List addTags = new List(); + // List deleteTags = new List(); + // List addTags = new List(); - if (originalTags != null) - { - //Update - //This logic to only come up with CHANGES, if the item is in both lists then it will disappear and not need to be dealt with as it's refcount is unchanged in this operation - //testing will validate it - deleteTags = originalTags.Except(newTags).ToList(); - addTags = newTags.Except(originalTags).ToList(); - } - else - { - //Add - addTags = newTags; - } + // if (originalTags != null) + // { + // //Update + // //This logic to only come up with CHANGES, if the item is in both lists then it will disappear and not need to be dealt with as it's refcount is unchanged in this operation + // //testing will validate it + // deleteTags = originalTags.Except(newTags).ToList(); + // addTags = newTags.Except(originalTags).ToList(); + // } + // else + // { + // //Add + // addTags = newTags; + // } - //ADD / INCREMENT TAGS - foreach (string s in addTags) - { - bool bDone = false; - //Keep on trying until there is success - //this allows for concurrency issues - //I considered a circuit breaker / timeout here, but theoretically it should not be an issue - //at some point it should not be a concurrency issue anymore - do - { - //START: Get tag word and concurrency token and count - var ExistingTag = await ct.Tag.FirstOrDefaultAsync(x => x.Name == s); - //if not present, then add it with a count of 0 - if (ExistingTag == null) - { - await ct.Tag.AddAsync(new Tag() { Name = s, RefCount = 1 }); - } - else - { - //Update the refcount - ExistingTag.RefCount += 1; - } - try - { - await ct.SaveChangesAsync(); - bDone = true; - } - catch (Exception ex) when (ex is DbUpdateConcurrencyException)//this allows for other types - { - //allow others to flow past - //string sss = ex.ToString(); - } - } while (bDone == false); - } + // //ADD / INCREMENT TAGS + // foreach (string s in addTags) + // { + // bool bDone = false; + // //Keep on trying until there is success + // //this allows for concurrency issues + // //I considered a circuit breaker / timeout here, but theoretically it should not be an issue + // //at some point it should not be a concurrency issue anymore + // do + // { + // //START: Get tag word and concurrency token and count + // var ExistingTag = await ct.Tag.FirstOrDefaultAsync(x => x.Name == s); + // //if not present, then add it with a count of 0 + // if (ExistingTag == null) + // { + // await ct.Tag.AddAsync(new Tag() { Name = s, RefCount = 1 }); + // } + // else + // { + // //Update the refcount + // ExistingTag.RefCount += 1; + // } + // try + // { + // await ct.SaveChangesAsync(); + // bDone = true; + // } + // catch (Exception ex) when (ex is DbUpdateConcurrencyException)//this allows for other types + // { + // //allow others to flow past + // //string sss = ex.ToString(); + // } + // } while (bDone == false); + // } - //DELETE TAGS - await ProcessDeleteTagsInRepositoryAsync(ct, deleteTags); - } + // //DELETE TAGS + // await ProcessDeleteTagsInRepositoryAsync(ct, deleteTags); + // } - //Pick list for driving pick list route - //going with contains for now as I think it's more useful in the long run and still captures startswith intent by user - public static async Task> TagListFilteredAsync(AyContext ct, string q) - { - //This path is intended for internal use and accepts that there may not be a filter specified - //however the client will always require a filter to display a tag list for choosing from - if (string.IsNullOrWhiteSpace(q)) - { - return await ct.Tag.OrderBy(x => x.Name) - .Select(x => x.Name) - .AsNoTracking() - .ToListAsync(); - } - else - { - q = NormalizeTag(q); - return await ct.Tag - .Where(x => x.Name.Contains(q)) - .OrderBy(x => x.Name) - .Select(x => x.Name) - .Take(25) - .AsNoTracking() - .ToListAsync(); - } - } + // //Pick list for driving pick list route + // //going with contains for now as I think it's more useful in the long run and still captures startswith intent by user + // public static async Task> TagListFilteredAsync(AyContext ct, string q) + // { + // //This path is intended for internal use and accepts that there may not be a filter specified + // //however the client will always require a filter to display a tag list for choosing from + // if (string.IsNullOrWhiteSpace(q)) + // { + // return await ct.Tag.OrderBy(x => x.Name) + // .Select(x => x.Name) + // .AsNoTracking() + // .ToListAsync(); + // } + // else + // { + // q = NormalizeTag(q); + // return await ct.Tag + // .Where(x => x.Name.Contains(q)) + // .OrderBy(x => x.Name) + // .Select(x => x.Name) + // .Take(25) + // .AsNoTracking() + // .ToListAsync(); + // } + // } - //Cloud list - public static async Task> CloudListFilteredAsync(AyContext ct, string q) - { - //This path is intended for internal use and accepts that there may not be a filter specified - //however the client will always require a filter to display a tag list for choosing from - if (string.IsNullOrWhiteSpace(q)) - { - return await ct.Tag.OrderByDescending(x => x.RefCount).Select(x => new TagCloudItem() { Name = x.Name, RefCount = x.RefCount }).AsNoTracking().ToListAsync(); - } - else - { - q = NormalizeTag(q); - //TODO: Use the EF CORE TAKE method to restrict the results to a maximum limit - //however need to ensure it doesn't balk when the limit is higher than the number of results (probably not but test that) - return await ct.Tag - .Where(x => x.Name.Contains(q)) - .OrderByDescending(x => x.RefCount) - .Select(x => new TagCloudItem() { Name = x.Name, RefCount = x.RefCount }) - .AsNoTracking() - .ToListAsync(); - } - } - public class TagCloudItem - { - public long RefCount { get; set; } - public string Name { get; set; } - } + // //Cloud list + // public static async Task> CloudListFilteredAsync(AyContext ct, string q) + // { + // //This path is intended for internal use and accepts that there may not be a filter specified + // //however the client will always require a filter to display a tag list for choosing from + // if (string.IsNullOrWhiteSpace(q)) + // { + // return await ct.Tag.OrderByDescending(x => x.RefCount).Select(x => new TagCloudItem() { Name = x.Name, RefCount = x.RefCount }).AsNoTracking().ToListAsync(); + // } + // else + // { + // q = NormalizeTag(q); + // //TODO: Use the EF CORE TAKE method to restrict the results to a maximum limit + // //however need to ensure it doesn't balk when the limit is higher than the number of results (probably not but test that) + // return await ct.Tag + // .Where(x => x.Name.Contains(q)) + // .OrderByDescending(x => x.RefCount) + // .Select(x => new TagCloudItem() { Name = x.Name, RefCount = x.RefCount }) + // .AsNoTracking() + // .ToListAsync(); + // } + // } + // public class TagCloudItem + // { + // public long RefCount { get; set; } + // public string Name { get; set; } + // } - ///////////////////////////////// - //BULK OPS JOBS - // - - public static async Task BulkAdd(AyaType ayaType, string tag, List idList, AyContext ct) - { - //SUBMIT AS JOB - - //todo iterate the object in question, open and update and save each one through it's biz object interface so rules etc are all maintained - //not sure if should update locked or read only objects, probably not I guess as it should only do whatever was done in interface - await Task.CompletedTask; - throw new System.NotImplementedException("NOT IMPLEMENTED YET"); - } - - public static async Task BulkAddAny(AyaType ayaType, string tag, AyContext ct) - { - await Task.CompletedTask; - throw new System.NotImplementedException("NOT IMPLEMENTED YET"); - } - - - public static async Task BulkRemove(AyaType ayaType, string tag, List idList, AyContext ct) - { - //todo iterate the object in question, open and update and save each one through it's biz object interface so rules etc are all maintained - //not sure if should update locked or read only objects, probably not I guess as it should only do whatever was done in interface - await Task.CompletedTask; - throw new System.NotImplementedException("NOT IMPLEMENTED YET"); - } - - public static async Task BulkRemoveAny(AyaType ayaType, string tag, AyContext ct) - { - await Task.CompletedTask; - throw new System.NotImplementedException("NOT IMPLEMENTED YET"); - } - - - public static async Task BulkReplace(AyaType ayaType, string fromTag, string toTag, List idList, AyContext ct) - { - //todo iterate the object in question, open and update and save each one through it's biz object interface so rules etc are all maintained - //not sure if should update locked or read only objects, probably not I guess as it should only do whatever was done in interface - await Task.CompletedTask; - throw new System.NotImplementedException("NOT IMPLEMENTED YET"); - } - - public static async Task BulkReplaceAny(AyaType ayaType, string fromTag, string toTag, AyContext ct) - { - await Task.CompletedTask; - throw new System.NotImplementedException("NOT IMPLEMENTED YET"); - } }//eoc diff --git a/server/AyaNova/biz/UnitBiz.cs b/server/AyaNova/biz/UnitBiz.cs index 01464a39..c47d0926 100644 --- a/server/AyaNova/biz/UnitBiz.cs +++ b/server/AyaNova/biz/UnitBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Unit.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz Unit SnapshotOfOriginalDBObj = new Unit(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/UnitModelBiz.cs b/server/AyaNova/biz/UnitModelBiz.cs index 4cccbd8c..37d63409 100644 --- a/server/AyaNova/biz/UnitModelBiz.cs +++ b/server/AyaNova/biz/UnitModelBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.UnitModel.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz UnitModel SnapshotOfOriginalDBObj = new UnitModel(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/UserBiz.cs b/server/AyaNova/biz/UserBiz.cs index e7874c38..49d2d9eb 100644 --- a/server/AyaNova/biz/UserBiz.cs +++ b/server/AyaNova/biz/UserBiz.cs @@ -67,7 +67,7 @@ namespace AyaNova.Biz inObj.Password = Hasher.hash(inObj.Salt, inObj.Password); - inObj.Tags = TagUtil.NormalizeTags(inObj.Tags); + inObj.Tags = TagBiz.NormalizeTags(inObj.Tags); inObj.CustomFields = JsonUtil.CompactJson(inObj.CustomFields); //Seeder sets user options in advance so no need to create them here in that case @@ -99,7 +99,7 @@ namespace AyaNova.Biz await SearchIndexAsync(inObj, true); //TAGS - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, inObj.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, inObj.Tags, null); dtUser retUser = new dtUser(); CopyObject.Copy(inObj, retUser); @@ -146,7 +146,7 @@ namespace AyaNova.Biz //Update the db object with the PUT object values CopyObject.Copy(inObj, dbObj, "Id, Salt, CurrentAuthToken, DlKey, DlKeyExpire"); - dbObj.Tags = TagUtil.NormalizeTags(dbObj.Tags); + dbObj.Tags = TagBiz.NormalizeTags(dbObj.Tags); dbObj.CustomFields = JsonUtil.CompactJson(dbObj.CustomFields); //NOTE: It's valid to call this without intending to change login or password (null values) @@ -189,7 +189,7 @@ namespace AyaNova.Biz await SearchIndexAsync(dbObj, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); return true; } @@ -252,7 +252,7 @@ namespace AyaNova.Biz await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObj.Id, dbObj.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObj.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); return true; } diff --git a/server/AyaNova/biz/VendorBiz.cs b/server/AyaNova/biz/VendorBiz.cs index c99ab705..fed31b6d 100644 --- a/server/AyaNova/biz/VendorBiz.cs +++ b/server/AyaNova/biz/VendorBiz.cs @@ -42,13 +42,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Vendor.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -81,7 +81,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -110,7 +110,7 @@ namespace AyaNova.Biz Vendor SnapshotOfOriginalDBObj = new Vendor(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -129,7 +129,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/WidgetBiz.cs b/server/AyaNova/biz/WidgetBiz.cs index 919b69d3..f6c7b0eb 100644 --- a/server/AyaNova/biz/WidgetBiz.cs +++ b/server/AyaNova/biz/WidgetBiz.cs @@ -43,13 +43,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.Widget.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -82,7 +82,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -111,7 +111,7 @@ namespace AyaNova.Biz Widget SnapshotOfOriginalDBObj = new Widget(); CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(putObject, dbObject, "Id");//can update serial - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; await ValidateAsync(dbObject, SnapshotOfOriginalDBObj); @@ -130,7 +130,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -155,7 +155,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit await transaction.CommitAsync(); } diff --git a/server/AyaNova/biz/WorkOrderBiz.cs b/server/AyaNova/biz/WorkOrderBiz.cs index a9f650ca..af48599b 100644 --- a/server/AyaNova/biz/WorkOrderBiz.cs +++ b/server/AyaNova/biz/WorkOrderBiz.cs @@ -61,13 +61,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrder.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await WorkOrderSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -91,7 +91,7 @@ namespace AyaNova.Biz await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct); await WorkOrderSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } @@ -157,7 +157,7 @@ namespace AyaNova.Biz dbObject.Serial = dtPutObject.Serial; } - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -179,7 +179,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await WorkOrderSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -210,7 +210,7 @@ namespace AyaNova.Biz await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObject.Id, dbObject.Serial.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); #if (DEBUG) @@ -403,13 +403,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItem.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItem, AyaEvent.Created), ct); await ItemSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -463,7 +463,7 @@ namespace AyaNova.Biz //Replace the db object with the PUT object CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -485,7 +485,7 @@ namespace AyaNova.Biz } 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); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -550,7 +550,7 @@ namespace AyaNova.Biz //Log event 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); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); //all good do the commit if it's ours if (parentTransaction == null) @@ -668,13 +668,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemExpense.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemExpense, AyaEvent.Created), ct); await ExpenseSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -714,7 +714,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -734,7 +734,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemExpense, AyaEvent.Modified), ct); await ExpenseSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -753,7 +753,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemExpense, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemExpense); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -857,13 +857,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemLabor.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemLabor, AyaEvent.Created), ct); await LaborSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -903,7 +903,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -923,7 +923,7 @@ namespace AyaNova.Biz } 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); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -942,7 +942,7 @@ namespace AyaNova.Biz //Log event 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); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -1045,13 +1045,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemLoan.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemLoan, AyaEvent.Created), ct); await LoanSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -1091,7 +1091,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -1111,7 +1111,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemLoan, AyaEvent.Modified), ct); await LoanSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -1130,7 +1130,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemLoan, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemLoan); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -1234,13 +1234,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemPart.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemPart, AyaEvent.Created), ct); await PartSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -1280,7 +1280,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -1300,7 +1300,7 @@ namespace AyaNova.Biz } 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); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -1319,7 +1319,7 @@ namespace AyaNova.Biz //Log event 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); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -1420,13 +1420,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemPartRequest.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemPartRequest, AyaEvent.Created), ct); await PartRequestSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -1466,7 +1466,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -1486,7 +1486,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemPartRequest, AyaEvent.Modified), ct); await PartRequestSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -1505,7 +1505,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemPartRequest, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemPartRequest); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -1609,13 +1609,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemScheduledUser.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemScheduledUser, AyaEvent.Created), ct); await ScheduledUserSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -1655,7 +1655,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -1675,7 +1675,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemScheduledUser, AyaEvent.Modified), ct); await ScheduledUserSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -1694,7 +1694,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemScheduledUser, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemScheduledUser); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -1798,13 +1798,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemTask.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemTask, AyaEvent.Created), ct); await TaskSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -1844,7 +1844,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -1864,7 +1864,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemTask, AyaEvent.Modified), ct); await TaskSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -1883,7 +1883,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemTask, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemTask); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -1987,13 +1987,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemTravel.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemTravel, AyaEvent.Created), ct); await TravelSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -2033,7 +2033,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -2053,7 +2053,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemTravel, AyaEvent.Modified), ct); await TravelSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -2072,7 +2072,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemTravel, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemTravel); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } @@ -2176,13 +2176,13 @@ namespace AyaNova.Biz return null; else { - newObject.Tags = TagUtil.NormalizeTags(newObject.Tags); + newObject.Tags = TagBiz.NormalizeTags(newObject.Tags); newObject.CustomFields = JsonUtil.CompactJson(newObject.CustomFields); await ct.WorkOrderItemUnit.AddAsync(newObject); await ct.SaveChangesAsync(); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, AyaType.WorkOrderItemUnit, AyaEvent.Created), ct); await UnitSearchIndexAsync(newObject, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null); return newObject; } } @@ -2222,7 +2222,7 @@ namespace AyaNova.Biz CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); CopyObject.Copy(dtPutObject, dbObject, "Id"); - dbObject.Tags = TagUtil.NormalizeTags(dbObject.Tags); + dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields); ct.Entry(dbObject).OriginalValues["Concurrency"] = dtPutObject.Concurrency; @@ -2242,7 +2242,7 @@ namespace AyaNova.Biz } await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, AyaType.WorkOrderItemUnit, AyaEvent.Modified), ct); await UnitSearchIndexAsync(dbObject, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); return dbObject; } @@ -2261,7 +2261,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, AyaType.WorkOrderItemUnit, dbObject.Id, "woitem:" + dbObject.WorkOrderItemId.ToString(), ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObject.Id, AyaType.WorkOrderItemUnit); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObject.Tags); return true; } diff --git a/server/AyaNova/biz/WorkorderTemplateBiz.cs b/server/AyaNova/biz/WorkorderTemplateBiz.cs index 2ffc8688..53392c7f 100644 --- a/server/AyaNova/biz/WorkorderTemplateBiz.cs +++ b/server/AyaNova/biz/WorkorderTemplateBiz.cs @@ -70,7 +70,7 @@ namespace AyaNova.Biz //do stuff with WorkOrderTemplate WorkOrderTemplate outObj = inObj; - outObj.Tags = TagUtil.NormalizeTags(outObj.Tags); + outObj.Tags = TagBiz.NormalizeTags(outObj.Tags); outObj.CustomFields = JsonUtil.CompactJson(outObj.CustomFields); //Save to db await ct.WorkOrderTemplate.AddAsync(outObj); @@ -78,7 +78,7 @@ namespace AyaNova.Biz //Handle child and associated items: await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, outObj.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(outObj, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); return outObj; } @@ -119,7 +119,7 @@ namespace AyaNova.Biz //Handle child and associated items: await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, outObj.Id, BizType, AyaEvent.Created), ct); await SearchIndexAsync(outObj, true); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, outObj.Tags, null); return outObj; } @@ -139,7 +139,7 @@ namespace AyaNova.Biz //Replace the db object with the PUT object CopyObject.Copy(inObj, dbObj, "Id"); - dbObj.Tags = TagUtil.NormalizeTags(dbObj.Tags); + dbObj.Tags = TagBiz.NormalizeTags(dbObj.Tags); dbObj.CustomFields = JsonUtil.CompactJson(dbObj.CustomFields); //Set "original" value of concurrency token to input token @@ -154,7 +154,7 @@ namespace AyaNova.Biz //Log event and save context await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObj.Id, BizType, AyaEvent.Modified), ct); await SearchIndexAsync(dbObj, false); - await TagUtil.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); + await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObj.Tags, SnapshotOfOriginalDBObj.Tags); return true; } @@ -198,7 +198,7 @@ namespace AyaNova.Biz //Log event await EventLogProcessor.DeleteObjectLogAsync(UserId, BizType, dbObj.Id, dbObj.Name, ct); await Search.ProcessDeletedObjectKeywordsAsync(dbObj.Id, BizType); - await TagUtil.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); + await TagBiz.ProcessDeleteTagsInRepositoryAsync(ct, dbObj.Tags); return true; }