diff --git a/server/AyaNova/biz/BizObjectFactory.cs b/server/AyaNova/biz/BizObjectFactory.cs
index 50b2cb92..57642512 100644
--- a/server/AyaNova/biz/BizObjectFactory.cs
+++ b/server/AyaNova/biz/BizObjectFactory.cs
@@ -22,78 +22,80 @@ namespace AyaNova.Biz
//Used by SEARCH and objects with JOBS
internal static BizObject GetBizObject(AyaType ayaType, long userId = 1, AuthorizationRoles roles = AuthorizationRoles.All)
{
- var dbcontext = ServiceProviderProvider.DBContext;
- switch (ayaType)
+ using (AyContext ct = ServiceProviderProvider.DBContext)
{
- //CoreBizObject add here
- case AyaType.ServerJob:
- return new JobOperationsBiz(dbcontext, userId, roles);
- case AyaType.TrialSeeder:
- return new TrialBiz(dbcontext, userId, roles);
- case AyaType.Translation:
- return new TranslationBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.DataListView:
- return new DataListViewBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.FormCustom:
- return new FormCustomBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Widget:
- return new WidgetBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ switch (ayaType)
+ {
+ //CoreBizObject add here
+ case AyaType.ServerJob:
+ return new JobOperationsBiz(ct, userId, roles);
+ case AyaType.TrialSeeder:
+ return new TrialBiz(ct, userId, roles);
+ case AyaType.Translation:
+ return new TranslationBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.DataListView:
+ return new DataListViewBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.FormCustom:
+ return new FormCustomBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Widget:
+ return new WidgetBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Customer:
- return new CustomerBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.User:
- return new UserBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Customer:
+ return new CustomerBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.User:
+ return new UserBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Contract:
- return new ContractBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.HeadOffice:
- return new HeadOfficeBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.LoanUnit:
- return new LoanUnitBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Part:
- return new PartBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.PM:
- return new PMBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Contract:
+ return new ContractBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.HeadOffice:
+ return new HeadOfficeBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.LoanUnit:
+ return new LoanUnitBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Part:
+ return new PartBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.PM:
+ return new PMBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.PMTemplate:
- return new PMTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.PMTemplate:
+ return new PMTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Project:
- return new ProjectBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.PurchaseOrder:
- return new PurchaseOrderBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Quote:
- return new QuoteBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Project:
+ return new ProjectBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.PurchaseOrder:
+ return new PurchaseOrderBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Quote:
+ return new QuoteBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.QuoteTemplate:
- return new QuoteTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.QuoteTemplate:
+ return new QuoteTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Unit:
- return new UnitBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.UnitModel:
- return new UnitModelBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- case AyaType.Vendor:
- return new VendorBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- //--- WorkOrder
- case AyaType.WorkOrder:
- case AyaType.WorkOrderItem:
- case AyaType.WorkOrderItemExpense:
- case AyaType.WorkOrderItemLabor:
- case AyaType.WorkOrderItemLoan:
- case AyaType.WorkOrderItemPart:
- case AyaType.WorkOrderItemPartRequest:
- case AyaType.WorkOrderItemScheduledUser:
- case AyaType.WorkOrderItemTask:
- case AyaType.WorkOrderItemTravel:
- case AyaType.WorkOrderItemUnit:
- return new WorkOrderBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- //---
- case AyaType.WorkOrderTemplate:
- return new WorkOrderTemplateBiz(dbcontext, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Unit:
+ return new UnitBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.UnitModel:
+ return new UnitModelBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ case AyaType.Vendor:
+ return new VendorBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ //--- WorkOrder
+ case AyaType.WorkOrder:
+ case AyaType.WorkOrderItem:
+ case AyaType.WorkOrderItemExpense:
+ case AyaType.WorkOrderItemLabor:
+ case AyaType.WorkOrderItemLoan:
+ case AyaType.WorkOrderItemPart:
+ case AyaType.WorkOrderItemPartRequest:
+ case AyaType.WorkOrderItemScheduledUser:
+ case AyaType.WorkOrderItemTask:
+ case AyaType.WorkOrderItemTravel:
+ case AyaType.WorkOrderItemUnit:
+ return new WorkOrderBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
+ //---
+ case AyaType.WorkOrderTemplate:
+ return new WorkOrderTemplateBiz(ct, userId, ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID, roles);
- default:
- throw new System.NotSupportedException($"AyaNova.BLL.BizObjectFactory::GetBizObject type {ayaType.ToString()} is not supported");
+ default:
+ throw new System.NotSupportedException($"AyaNova.BLL.BizObjectFactory::GetBizObject type {ayaType.ToString()} is not supported");
+ }
}
}
diff --git a/server/AyaNova/biz/JobsBiz.cs b/server/AyaNova/biz/JobsBiz.cs
index ed68162a..081e45c7 100644
--- a/server/AyaNova/biz/JobsBiz.cs
+++ b/server/AyaNova/biz/JobsBiz.cs
@@ -19,23 +19,6 @@ namespace AyaNova.Biz
#region JOB OPS
- ///
- /// Get a non tracked list of jobs for an object
- ///
- ///
- ///
- ///
- internal static async Task> GetJobsForObjectAsync(AyaTypeId ayObj)
- {
- var ct = ServiceProviderProvider.DBContext;
- return await ct.OpsJob
- .AsNoTracking()
- .Where(z => z.ObjectId == ayObj.ObjectId && z.ObjectType == ayObj.ObjectType)
- .OrderBy(z => z.Created)
- .ToListAsync();
- }
-
-
///
/// Get a non tracked list of jobs that are ready to process and exclusive only
@@ -63,122 +46,39 @@ namespace AyaNova.Biz
///
private static async Task> GetReadyJobsAsync(bool exclusiveOnly)
{
- var ct = ServiceProviderProvider.DBContext;
- var ret = await ct.OpsJob
- .AsNoTracking()
- .Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping)
- .OrderBy(z => z.Created)
- .ToListAsync();
-
- return ret;
+ using (AyContext ct = ServiceProviderProvider.DBContext)
+ {
+ var ret = await ct.OpsJob
+ .AsNoTracking()
+ .Where(z => z.StartAfter < System.DateTime.UtcNow && z.Exclusive == exclusiveOnly && z.JobStatus == JobStatus.Sleeping)
+ .OrderBy(z => z.Created)
+ .ToListAsync();
+ return ret;
+ }
}
- ///
- /// Get a non tracked list of all jobs that are not completed
- /// could be running or sleeping
- ///
- ///
- internal static async Task> GetAllSleepingOrRunningJobsAsync()
- {
- var ct = ServiceProviderProvider.DBContext;
- var ret = await ct.OpsJob
- .AsNoTracking()
- .Where(z => z.JobStatus == JobStatus.Sleeping || z.JobStatus == JobStatus.Running)
- .OrderBy(z => z.Created)
- .ToListAsync();
-
- return ret;
- }
-
-
- ///
- /// Get a non tracked list of all jobs for a JobType
- ///
- ///
- internal static async Task> GetAllJobsForJobTypeAsync(JobType jobType)
- {
- var ct = ServiceProviderProvider.DBContext;
- var ret = await ct.OpsJob
- .AsNoTracking()
- .Where(z => z.JobType == jobType)
- .OrderBy(z => z.Created)
- .ToListAsync();
-
- return ret;
- }
-
-
- ///
- /// Get a non tracked list of all jobs that are status running but have no last activity for XX HOURS
- ///
- ///
- internal static async Task> GetPotentiallyDeadRunningJobsAsync()
- {
- var ct = ServiceProviderProvider.DBContext;
- var ret = await ct.OpsJob
- .AsNoTracking()
- .Where(z => z.JobStatus == JobStatus.Sleeping || z.JobStatus == JobStatus.Running)
- .OrderBy(z => z.Created)
- .ToListAsync();
-
- return ret;
- }
-
-
- ///
- /// Get a count of all jobs for a JobStatus
- ///
- ///
- internal static async Task GetCountForJobStatusAsync(JobStatus jobStatus)
- {
- var ct = ServiceProviderProvider.DBContext;
- var ret = await ct.OpsJob
- .Where(z => z.JobStatus == jobStatus)
- .LongCountAsync();
- return ret;
- }
-
-
-
///
/// Add a new job to the database
///
///
-
- ///
- internal static async Task AddJobAsync(OpsJob newJob)
+ internal static async Task AddJobAsync(OpsJob newJob)
{
- var ct = ServiceProviderProvider.DBContext;
- await ct.OpsJob.AddAsync(newJob);
- await ct.SaveChangesAsync();
- return newJob;
- }
-
- ///
- /// Remove any jobs or logs for the object in question
- ///
- ///
- internal static async Task DeleteJobsForObjectAsync(AyaTypeId ayObj)
- {
- //Get a list of all jobid's for the object passed in
- List jobsForObject = await GetJobsForObjectAsync(ayObj);
- if (jobsForObject.Count == 0)
- return;
- foreach (OpsJob jobToBeDeleted in jobsForObject)
+ using (AyContext ct = ServiceProviderProvider.DBContext)
{
- await RemoveJobAndLogsAsync(jobToBeDeleted.GId);
+ await ct.OpsJob.AddAsync(newJob);
+ await ct.SaveChangesAsync();
}
}
///
- /// REmove the job and it's logs
+ /// Remove the job and it's logs
///
///
internal static async Task RemoveJobAndLogsAsync(Guid jobIdToBeDeleted)
{
- var ct = ServiceProviderProvider.DBContext;
+ using (AyContext ct = ServiceProviderProvider.DBContext)
using (var transaction = await ct.Database.BeginTransactionAsync())
{
try
@@ -205,18 +105,18 @@ namespace AyaNova.Biz
///
/// (NOTE: Guid.empty indicates internal job)
///
- ///
- internal static async Task LogJobAsync(Guid jobId, string statusText)
+ internal static async Task LogJobAsync(Guid jobId, string statusText)
{
- var ct = ServiceProviderProvider.DBContext;
- if (string.IsNullOrWhiteSpace(statusText))
- statusText = "No status provided";
- OpsJobLog newObj = new OpsJobLog();
- newObj.JobId = jobId;
- newObj.StatusText = statusText;
- await ct.OpsJobLog.AddAsync(newObj);
- await ct.SaveChangesAsync();
- return newObj;
+ using (AyContext ct = ServiceProviderProvider.DBContext)
+ {
+ if (string.IsNullOrWhiteSpace(statusText))
+ statusText = "No status provided";
+ OpsJobLog newObj = new OpsJobLog();
+ newObj.JobId = jobId;
+ newObj.StatusText = statusText;
+ await ct.OpsJobLog.AddAsync(newObj);
+ await ct.SaveChangesAsync();
+ }
}
@@ -225,14 +125,15 @@ namespace AyaNova.Biz
///
///
///
- internal static async Task UpdateJobStatusAsync(Guid jobId, JobStatus newStatus)
+ internal static async Task UpdateJobStatusAsync(Guid jobId, JobStatus newStatus)
{
- var ct = ServiceProviderProvider.DBContext;
- var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId);
- if (oFromDb == null) return null;
- oFromDb.JobStatus = newStatus;
- await ct.SaveChangesAsync();
- return oFromDb;
+ using (AyContext ct = ServiceProviderProvider.DBContext)
+ {
+ var oFromDb = await ct.OpsJob.SingleOrDefaultAsync(z => z.GId == jobId);
+ if (oFromDb == null) return;
+ oFromDb.JobStatus = newStatus;
+ await ct.SaveChangesAsync();
+ }
}
#endregion Job ops
@@ -295,8 +196,8 @@ namespace AyaNova.Biz
//backup
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing backup");
await CoreJobBackup.DoWorkAsync();//sb exclusive
- //System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter");
-
+ //System.Diagnostics.Debug.WriteLine($"JobsBiz processing metrics snapshotter");
+
//Capture metrics
CoreJobMetricsSnapshot.DoJob();
@@ -312,7 +213,7 @@ namespace AyaNova.Biz
try
{
//System.Diagnostics.Debug.WriteLine($"JobsBiz processing NON-exclusive biz job {j.Name}");
- TaskUtil.Forget(Task.Run(() => ProcessJobAsync(j)));
+ TaskUtil.Forget(Task.Run(() => ProcessJobAsync(j)));
}
catch (Exception ex)
{
@@ -323,14 +224,14 @@ namespace AyaNova.Biz
}
}
-
+
//Capture metrics
CoreJobMetricsSnapshot.DoJob();
//TODO: NOTIFICATIONS
- }
+ }
catch (Exception ex)
{
log.LogError(ex, "JobsBiz::ProcessJobsAsync unexpected error during processing");
diff --git a/server/AyaNova/biz/PrimeData.cs b/server/AyaNova/biz/PrimeData.cs
index 0c4f58d7..288d096f 100644
--- a/server/AyaNova/biz/PrimeData.cs
+++ b/server/AyaNova/biz/PrimeData.cs
@@ -28,7 +28,7 @@ namespace AyaNova.Biz
u.Password = Hasher.hash(u.Salt, "l3tm3in");
u.Roles = AuthorizationRoles.All;//AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull;
-
+
u.UserType = UserType.Administrator;
u.UserOptions = new UserOptions();
u.UserOptions.TranslationId = ServerBootConfig.AYANOVA_DEFAULT_TRANSLATION_ID;//Ensure primeTranslations is called first
@@ -59,38 +59,43 @@ namespace AyaNova.Biz
await ImportTranslation(ResourceFolderPath, "fr");
await ImportTranslation(ResourceFolderPath, "de");
- //Ensure Translations are present, not missing any keys and that there is a server default translation that exists
- TranslationBiz lb = TranslationBiz.GetBiz(ServiceProviderProvider.DBContext);
- await lb.ValidateTranslationsAsync();
+ //Ensure Translations are present, not missing any keys and that there is a server default translation that exists
+ using (AyContext ct = ServiceProviderProvider.DBContext)
+ {
+ TranslationBiz lb = TranslationBiz.GetBiz(ct);
+ await lb.ValidateTranslationsAsync();
+ }
}
private static async Task ImportTranslation(string resourceFolderPath, string translationCode)
{
- AyContext ct = ServiceProviderProvider.DBContext;
- var TranslationPath = Path.Combine(resourceFolderPath, $"{translationCode}.json");
- if (!File.Exists(TranslationPath))
+ using (AyContext ct = ServiceProviderProvider.DBContext)
{
- throw new System.Exception($"E1013: stock translation file \"{translationCode}\" not found where expected: \"{TranslationPath}\", installation damaged?");
+ var TranslationPath = Path.Combine(resourceFolderPath, $"{translationCode}.json");
+ if (!File.Exists(TranslationPath))
+ {
+ throw new System.Exception($"E1013: stock translation file \"{translationCode}\" not found where expected: \"{TranslationPath}\", installation damaged?");
+ }
+
+ JObject o = JObject.Parse(await File.ReadAllTextAsync(TranslationPath));
+
+ Translation l = new Translation();
+ l.Name = translationCode;
+
+ l.Stock = true;
+ l.CjkIndex = false;
+
+ foreach (JToken t in o.Children())
+ {
+ var key = t.Path;
+ var display = t.First.Value();
+ l.TranslationItems.Add(new TranslationItem() { Key = key, Display = display });
+ }
+
+ await ct.Translation.AddAsync(l);
+ await ct.SaveChangesAsync();
}
-
- JObject o = JObject.Parse(await File.ReadAllTextAsync(TranslationPath));
-
- Translation l = new Translation();
- l.Name = translationCode;
-
- l.Stock = true;
- l.CjkIndex = false;
-
- foreach (JToken t in o.Children())
- {
- var key = t.Path;
- var display = t.First.Value();
- l.TranslationItems.Add(new TranslationItem() { Key = key, Display = display });
- }
-
- await ct.Translation.AddAsync(l);
- await ct.SaveChangesAsync();
}