This commit is contained in:
2021-01-15 00:55:09 +00:00
parent c6879571aa
commit 39e85513f2
3 changed files with 40 additions and 86 deletions

View File

@@ -65,13 +65,13 @@ namespace AyaNova.Biz
// //
internal async Task<LoanUnit> DuplicateAsync(long id) internal async Task<LoanUnit> DuplicateAsync(long id)
{ {
LoanUnit dbObject = await GetAsync(id, false); var dbObject = await GetAsync(id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND, "id"); AddError(ApiErrorCode.NOT_FOUND, "id");
return null; return null;
} }
LoanUnit newObject = new LoanUnit(); var newObject = new LoanUnit();
CopyObject.Copy(dbObject, newObject, "Wiki"); CopyObject.Copy(dbObject, newObject, "Wiki");
string newUniqueName = string.Empty; string newUniqueName = string.Empty;
bool NotUnique = true; bool NotUnique = true;
@@ -98,7 +98,7 @@ namespace AyaNova.Biz
// //
internal async Task<LoanUnit> GetAsync(long id, bool logTheGetEvent = true) internal async Task<LoanUnit> GetAsync(long id, bool logTheGetEvent = true)
{ {
var ret = await ct.LoanUnit.SingleOrDefaultAsync(z => z.Id == id); var ret = await ct.LoanUnit.AsNoTracking().SingleOrDefaultAsync(z => z.Id == id);
if (logTheGetEvent && ret != null) if (logTheGetEvent && ret != null)
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct);
return ret; return ret;
@@ -109,20 +109,18 @@ namespace AyaNova.Biz
// //
internal async Task<LoanUnit> PutAsync(LoanUnit putObject) internal async Task<LoanUnit> PutAsync(LoanUnit putObject)
{ {
LoanUnit dbObject = await ct.LoanUnit.SingleOrDefaultAsync(z => z.Id == putObject.Id); var dbObject = await GetAsync(putObject.Id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND, "id"); AddError(ApiErrorCode.NOT_FOUND, "id");
return null; return null;
} }
LoanUnit SnapshotOfOriginalDBObj = new LoanUnit();
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); putObject.Tags = TagBiz.NormalizeTags(putObject.Tags);
CopyObject.Copy(putObject, dbObject, "Id"); putObject.CustomFields = JsonUtil.CompactJson(putObject.CustomFields);
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); await ValidateAsync(putObject, dbObject);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency;
await ValidateAsync(dbObject, SnapshotOfOriginalDBObj);
if (HasErrors) return null; if (HasErrors) return null;
ct.Replace(dbObject, putObject);
try try
{ {
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
@@ -136,9 +134,9 @@ namespace AyaNova.Biz
return null; return null;
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct);
await SearchIndexAsync(dbObject, false); await SearchIndexAsync(putObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, putObject, dbObject);
return dbObject; return dbObject;
} }
@@ -151,7 +149,7 @@ namespace AyaNova.Biz
{ {
try try
{ {
LoanUnit dbObject = await ct.LoanUnit.SingleOrDefaultAsync(z => z.Id == id); LoanUnit dbObject = await GetAsync(id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND); AddError(ApiErrorCode.NOT_FOUND);
@@ -197,7 +195,7 @@ namespace AyaNova.Biz
public async Task<Search.SearchIndexProcessObjectParameters> GetSearchResultSummary(long id) public async Task<Search.SearchIndexProcessObjectParameters> GetSearchResultSummary(long id)
{ {
var obj = await ct.LoanUnit.SingleOrDefaultAsync(z => z.Id == id); var obj = await GetAsync(id, false);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
DigestSearchText(obj, SearchParams); DigestSearchText(obj, SearchParams);
return SearchParams; return SearchParams;
@@ -280,7 +278,7 @@ namespace AyaNova.Biz
var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE);
idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray();
//query for this batch, comes back in db natural order unfortunately //query for this batch, comes back in db natural order unfortunately
var batchResults = await ct.LoanUnit.Where(z => batch.Contains(z.Id)).ToArrayAsync(); var batchResults = await ct.LoanUnit.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync();
//order the results back into original //order the results back into original
var orderedList = from id in batch join z in batchResults on id equals z.Id select z; var orderedList = from id in batch join z in batchResults on id equals z.Id select z;
foreach (LoanUnit w in orderedList) foreach (LoanUnit w in orderedList)
@@ -369,7 +367,7 @@ namespace AyaNova.Biz
if (jobData.ContainsKey("idList")) if (jobData.ContainsKey("idList"))
idList = ((JArray)jobData["idList"]).ToObject<List<long>>(); idList = ((JArray)jobData["idList"]).ToObject<List<long>>();
else else
idList = await ct.LoanUnit.Select(z => z.Id).ToListAsync(); idList = await ct.LoanUnit.AsNoTracking().Select(z => z.Id).ToListAsync();
bool SaveIt = false; bool SaveIt = false;
foreach (long id in idList) foreach (long id in idList)
{ {

View File

@@ -62,46 +62,12 @@ namespace AyaNova.Biz
} }
// ////////////////////////////////////////////////////////////////////////////////////////////////
// //DUPLICATE
// //
// internal async Task<Memo> DuplicateAsync(long id)
// {
// Memo dbObject = await GetAsync(id, false);
// if (dbObject == null)
// {
// AddError(ApiErrorCode.NOT_FOUND, "id");
// return null;
// }
// Memo newObject = new Memo();
// CopyObject.Copy(dbObject, newObject, "Wiki");
// string newUniqueName = string.Empty;
// bool NotUnique = true;
// long l = 1;
// do
// {
// newUniqueName = Util.StringUtil.UniqueNameBuilder(dbObject.Name, l++, 255);
// NotUnique = await ct.Memo.AnyAsync(m => m.Name == newUniqueName);
// } while (NotUnique);
// newObject.Name = newUniqueName;
// newObject.Id = 0;
// newObject.Concurrency = 0;
// await ct.Memo.AddAsync(newObject);
// await ct.SaveChangesAsync();
// await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, newObject.Id, BizType, AyaEvent.Created), ct);
// await SearchIndexAsync(newObject, true);
// await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, newObject.Tags, null);
// await NotifyEventProcessor.HandlePotentialNotificationEvent(AyaEvent.Created, newObject);
// return newObject;
// }
//////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////
//GET //GET
// //
internal async Task<Memo> GetAsync(long id, bool logTheGetEvent = true) internal async Task<Memo> GetAsync(long id, bool logTheGetEvent = true)
{ {
var ret = await ct.Memo.SingleOrDefaultAsync(m => m.Id == id && m.ToId == UserId);//## SECURITY, if need general purpose then make new method var ret = await ct.Memo.AsNoTracking().SingleOrDefaultAsync(m => m.Id == id && m.ToId == UserId);//## SECURITY, if need general purpose then make new method
if (logTheGetEvent && ret != null) if (logTheGetEvent && ret != null)
{ {
//Hijack this method to also flag as read //Hijack this method to also flag as read
@@ -125,20 +91,18 @@ namespace AyaNova.Biz
// //
internal async Task<Memo> PutAsync(Memo putObject) internal async Task<Memo> PutAsync(Memo putObject)
{ {
Memo dbObject = await ct.Memo.SingleOrDefaultAsync(m => m.Id == putObject.Id); var dbObject = await GetAsync(putObject.Id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND, "id"); AddError(ApiErrorCode.NOT_FOUND, "id");
return null; return null;
} }
Memo SnapshotOfOriginalDBObj = new Memo();
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); putObject.Tags = TagBiz.NormalizeTags(putObject.Tags);
CopyObject.Copy(putObject, dbObject, "Id"); putObject.CustomFields = JsonUtil.CompactJson(putObject.CustomFields);
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags);
dbObject.CustomFields = JsonUtil.CompactJson(dbObject.CustomFields);
ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency; ct.Replace(dbObject, putObject);
await ValidateAsync(dbObject);
if (HasErrors) return null;
try try
{ {
await ct.SaveChangesAsync(); await ct.SaveChangesAsync();
@@ -152,9 +116,9 @@ namespace AyaNova.Biz
return null; return null;
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct);
await SearchIndexAsync(dbObject, false); await SearchIndexAsync(putObject, false);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags);
await HandlePotentialNotificationEvent(AyaEvent.Modified, dbObject, SnapshotOfOriginalDBObj); await HandlePotentialNotificationEvent(AyaEvent.Modified, putObject, dbObject);
return dbObject; return dbObject;
} }
@@ -167,7 +131,7 @@ namespace AyaNova.Biz
{ {
try try
{ {
Memo dbObject = await ct.Memo.SingleOrDefaultAsync(m => m.Id == id); var dbObject = await GetAsync(id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND); AddError(ApiErrorCode.NOT_FOUND);
@@ -213,7 +177,7 @@ namespace AyaNova.Biz
public async Task<Search.SearchIndexProcessObjectParameters> GetSearchResultSummary(long id) public async Task<Search.SearchIndexProcessObjectParameters> GetSearchResultSummary(long id)
{ {
var obj = await ct.Memo.SingleOrDefaultAsync(z => z.Id == id); var obj = await GetAsync(id, false);
var SearchParams = new Search.SearchIndexProcessObjectParameters(); var SearchParams = new Search.SearchIndexProcessObjectParameters();
DigestSearchText(obj, SearchParams); DigestSearchText(obj, SearchParams);
return SearchParams; return SearchParams;
@@ -308,7 +272,7 @@ namespace AyaNova.Biz
var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE); var batch = idList.Take(IReportAbleObject.REPORT_DATA_BATCH_SIZE);
idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray(); idList = idList.Skip(IReportAbleObject.REPORT_DATA_BATCH_SIZE).ToArray();
//query for this batch, comes back in db natural order unfortunately //query for this batch, comes back in db natural order unfortunately
var batchResults = await ct.Memo.Where(z => batch.Contains(z.Id)).ToArrayAsync(); var batchResults = await ct.Memo.AsNoTracking().Where(z => batch.Contains(z.Id)).ToArrayAsync();
//order the results back into original //order the results back into original
var orderedList = from id in batch join z in batchResults on id equals z.Id select z; var orderedList = from id in batch join z in batchResults on id equals z.Id select z;
foreach (Memo w in orderedList) foreach (Memo w in orderedList)
@@ -397,7 +361,7 @@ namespace AyaNova.Biz
if (jobData.ContainsKey("idList")) if (jobData.ContainsKey("idList"))
idList = ((JArray)jobData["idList"]).ToObject<List<long>>(); idList = ((JArray)jobData["idList"]).ToObject<List<long>>();
else else
idList = await ct.Memo.Select(z => z.Id).ToListAsync(); idList = await ct.Memo.AsNoTracking().Select(z => z.Id).ToListAsync();
bool SaveIt = false; bool SaveIt = false;
foreach (long id in idList) foreach (long id in idList)
{ {

View File

@@ -1,13 +1,8 @@
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using System.Linq;
using EnumsNET;
using AyaNova.Util; using AyaNova.Util;
using AyaNova.Api.ControllerHelpers; using AyaNova.Api.ControllerHelpers;
using AyaNova.Models; using AyaNova.Models;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
namespace AyaNova.Biz namespace AyaNova.Biz
{ {
@@ -63,7 +58,7 @@ namespace AyaNova.Biz
internal async Task<NotifySubscription> DuplicateAsync(long id) internal async Task<NotifySubscription> DuplicateAsync(long id)
{ {
NotifySubscription dbObject = await GetAsync(id, false); var dbObject = await GetAsync(id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND, "id"); AddError(ApiErrorCode.NOT_FOUND, "id");
@@ -87,7 +82,7 @@ namespace AyaNova.Biz
// //
internal async Task<NotifySubscription> GetAsync(long id, bool logTheGetEvent = true) internal async Task<NotifySubscription> GetAsync(long id, bool logTheGetEvent = true)
{ {
var ret = await ct.NotifySubscription.SingleOrDefaultAsync(z => z.Id == id && z.UserId == UserId); var ret = await ct.NotifySubscription.AsNoTracking().SingleOrDefaultAsync(z => z.Id == id && z.UserId == UserId);
if (logTheGetEvent && ret != null) if (logTheGetEvent && ret != null)
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, id, BizType, AyaEvent.Retrieved), ct);
return ret; return ret;
@@ -100,19 +95,16 @@ namespace AyaNova.Biz
{ {
//TODO: Must remove all prior events and replace them //TODO: Must remove all prior events and replace them
NotifySubscription dbObject = await ct.NotifySubscription.SingleOrDefaultAsync(z => z.Id == putObject.Id); var dbObject = await GetAsync(putObject.Id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND, "id"); AddError(ApiErrorCode.NOT_FOUND, "id");
return null; return null;
} }
NotifySubscription SnapshotOfOriginalDBObj = new NotifySubscription(); putObject.Tags = TagBiz.NormalizeTags(putObject.Tags);
CopyObject.Copy(dbObject, SnapshotOfOriginalDBObj); await ValidateAsync(putObject);
CopyObject.Copy(putObject, dbObject, "Id");//can update serial if (HasErrors) return null;
dbObject.Tags = TagBiz.NormalizeTags(dbObject.Tags); ct.Replace(dbObject, putObject);
ct.Entry(dbObject).OriginalValues["Concurrency"] = putObject.Concurrency;
await ValidateAsync(dbObject);
if (HasErrors) return null; if (HasErrors) return null;
try try
{ {
@@ -127,7 +119,7 @@ namespace AyaNova.Biz
return null; return null;
} }
await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct); await EventLogProcessor.LogEventToDatabaseAsync(new Event(UserId, dbObject.Id, BizType, AyaEvent.Modified), ct);
await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, dbObject.Tags, SnapshotOfOriginalDBObj.Tags); await TagBiz.ProcessUpdateTagsInRepositoryAsync(ct, putObject.Tags, dbObject.Tags);
return dbObject; return dbObject;
} }
@@ -141,7 +133,7 @@ namespace AyaNova.Biz
{ {
try try
{ {
NotifySubscription dbObject = await ct.NotifySubscription.SingleOrDefaultAsync(z => z.Id == id); var dbObject = await GetAsync(id, false);
if (dbObject == null) if (dbObject == null)
{ {
AddError(ApiErrorCode.NOT_FOUND); AddError(ApiErrorCode.NOT_FOUND);