diff --git a/server/AyaNova/util/Seeder.cs b/server/AyaNova/util/Seeder.cs index 3d8a30ef..4c91fa78 100644 --- a/server/AyaNova/util/Seeder.cs +++ b/server/AyaNova/util/Seeder.cs @@ -47,13 +47,13 @@ namespace AyaNova.Util try { - LogStatusAsync(JobId, LogJob, log, $"SEEDER: Seeding data level is {slevel.ToString()}, time zone offset is {timeZoneOffset.ToString()}"); + await LogStatusAsync(JobId, LogJob, log, $"SEEDER: Seeding data level is {slevel.ToString()}, time zone offset is {timeZoneOffset.ToString()}"); //Only allow this in a trial database if (!AyaNova.Core.License.ActiveKey.TrialLicense) { var msg = "This database has a registered license key so it can't be seeded"; - LogStatusAsync(JobId, LogJob, log, msg); + await LogStatusAsync(JobId, LogJob, log, msg); throw new System.NotSupportedException(msg); } @@ -61,22 +61,22 @@ namespace AyaNova.Util if (timeZoneOffset > 14 || timeZoneOffset < (-12)) { var msg = $"Time zone offset \"{timeZoneOffset.ToString()}\" is not valid"; - LogStatusAsync(JobId, LogJob, log, msg); + await LogStatusAsync(JobId, LogJob, log, msg); throw new System.NotSupportedException(msg); } apiServerState.SetOpsOnly("Seeding database"); //Erase all the data except for the license, schema and the manager user - DbUtil.EmptyBizDataFromDatabaseForSeedingOrImportingAsync(log); + await DbUtil.EmptyBizDataFromDatabaseForSeedingOrImportingAsync(log); //Set the time zone of the manager account using (var cct = ServiceProviderProvider.DBContext) { - var mgr = cct.UserOptions.FirstAsync(m => m.Id == 1).Result; + var mgr = await cct.UserOptions.FirstAsync(m => m.Id == 1); mgr.TimeZoneOffset = timeZoneOffset; - cct.SaveChanges(); + await cct.SaveChangesAsync(); } @@ -132,13 +132,13 @@ namespace AyaNova.Util //Create and save to db using (var cct = ServiceProviderProvider.DBContext) { - FormCustomBiz.GetBizInternal(cct).CreateAsync(fc).Wait(); + await FormCustomBiz.GetBizInternal(cct).CreateAsync(fc); } } //Seed special test data for integration testing //log.LogInformation("Seeding known users"); - SeedKnownUsersAsync(log, timeZoneOffset); + await SeedKnownUsersAsync(log, timeZoneOffset); //log.LogInformation("Seeding all other data"); switch (slevel) @@ -148,27 +148,26 @@ namespace AyaNova.Util #region GenSmall //This is for a busy but one man shop with a single office person handling stuff back at the shop //PERF - LogStatusAsync(JobId, LogJob, log, $"Seeding SMALL number of user(s)...."); + await LogStatusAsync(JobId, LogJob, log, $"Seeding SMALL number of user(s)...."); var watch = new Stopwatch(); watch.Start(); //Generate owner and lead tech - GenSeedUserAsync(log, 1, AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull | AuthorizationRoles.OpsAdminFull, UserType.Schedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.BizAdminFull | AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull | AuthorizationRoles.OpsAdminFull, UserType.Schedulable, timeZoneOffset); //Generate one office person / secretary - GenSeedUserAsync(log, 1, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull | AuthorizationRoles.AccountingFull, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryFull | AuthorizationRoles.AccountingFull, UserType.NonSchedulable, timeZoneOffset); //PERF watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); //100 widgets watch = new Stopwatch(); - watch.Start(); - //await GenSeedWidgetAsync(log, 100); - GenSeedWidgetAsync(log, 100); + watch.Start(); + await GenSeedWidgetAsync(log, 100); //PERF watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"100 Widgets seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"100 Widgets seeded in {watch.ElapsedMilliseconds} ms"); #endregion gensmall } @@ -179,58 +178,58 @@ namespace AyaNova.Util //This is for a typical AyaNova medium busy shop //has one location, many techs and full staff for each department //PERF - LogStatusAsync(JobId, LogJob, log, $"Seeding MEDIUM number of user(s)...."); + await LogStatusAsync(JobId, LogJob, log, $"Seeding MEDIUM number of user(s)...."); var watch = new Stopwatch(); watch.Start(); //One IT administrator, can change ops but nothing else - GenSeedUserAsync(log, 1, AuthorizationRoles.OpsAdminFull, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.OpsAdminFull, UserType.NonSchedulable, timeZoneOffset); //One business administrator, can view ops issues - GenSeedUserAsync(log, 1, AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); //One owner who doesn't control anything but views stuff - GenSeedUserAsync(log, 1, AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited | AuthorizationRoles.OpsAdminLimited | AuthorizationRoles.SalesLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited | AuthorizationRoles.OpsAdminLimited | AuthorizationRoles.SalesLimited, UserType.NonSchedulable, timeZoneOffset); //20 techs - GenSeedUserAsync(log, 20, AuthorizationRoles.TechFull | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.TechFull | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); //2 subcontractors - GenSeedUserAsync(log, 2, AuthorizationRoles.SubContractorFull, UserType.Subcontractor, timeZoneOffset); + await GenSeedUserAsync(log, 2, AuthorizationRoles.SubContractorFull, UserType.Subcontractor, timeZoneOffset); //3 generic office people people - GenSeedUserAsync(log, 3, AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 3, AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //2 Full sales people - GenSeedUserAsync(log, 2, AuthorizationRoles.SalesFull, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 2, AuthorizationRoles.SalesFull, UserType.NonSchedulable, timeZoneOffset); //1 dispatch manager - GenSeedUserAsync(log, 1, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //1 Inventory manager - GenSeedUserAsync(log, 1, AuthorizationRoles.InventoryFull | AuthorizationRoles.DispatchLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.InventoryFull | AuthorizationRoles.DispatchLimited, UserType.NonSchedulable, timeZoneOffset); //1 accountant / bookkeeper - GenSeedUserAsync(log, 1, AuthorizationRoles.AccountingFull | AuthorizationRoles.BizAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 1, AuthorizationRoles.AccountingFull | AuthorizationRoles.BizAdminLimited, UserType.NonSchedulable, timeZoneOffset); //10 full on customer users - GenSeedUserAsync(log, 10, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); + await GenSeedUserAsync(log, 10, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); //10 limited customer users - GenSeedUserAsync(log, 10, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); + await GenSeedUserAsync(log, 10, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); //PERF watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); //500 widgets - LogStatusAsync(JobId, LogJob, log, $"Seeding 500 Widgets...."); + await LogStatusAsync(JobId, LogJob, log, $"Seeding 500 Widgets...."); watch = new Stopwatch(); watch.Start(); //await GenSeedWidgetAsync(log, 500); - GenSeedWidgetAsync(log, 500); + await GenSeedWidgetAsync(log, 500); //PERF watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"500 Widgets seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"500 Widgets seeded in {watch.ElapsedMilliseconds} ms"); #endregion genmedium } @@ -242,72 +241,72 @@ namespace AyaNova.Util //Each location has a full staff and corporate head office has an overarching staff member in charge of each location //PERF - LogStatusAsync(JobId, LogJob, log, $"Seeding LARGE number of user(s)...."); + await LogStatusAsync(JobId, LogJob, log, $"Seeding LARGE number of user(s)...."); var watch = new Stopwatch(); watch.Start(); //IT administrator, can change ops but nothing else - GenSeedUserAsync(log, 2, AuthorizationRoles.OpsAdminFull, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 2, AuthorizationRoles.OpsAdminFull, UserType.NonSchedulable, timeZoneOffset); //business administrator, can view ops issues - GenSeedUserAsync(log, 2, AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 2, AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); //owner / upper management who doesn't control anything but views stuff - GenSeedUserAsync(log, 5, AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 5, AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); //100 techs - GenSeedUserAsync(log, 100, AuthorizationRoles.TechFull | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); + await GenSeedUserAsync(log, 100, AuthorizationRoles.TechFull | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); //limited techs - GenSeedUserAsync(log, 50, AuthorizationRoles.TechLimited | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); + await GenSeedUserAsync(log, 50, AuthorizationRoles.TechLimited | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); //20 subcontractors - GenSeedUserAsync(log, 20, AuthorizationRoles.SubContractorFull, UserType.Subcontractor, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.SubContractorFull, UserType.Subcontractor, timeZoneOffset); //10 limited subcontractors - GenSeedUserAsync(log, 10, AuthorizationRoles.SubContractorLimited, UserType.Subcontractor, timeZoneOffset); + await GenSeedUserAsync(log, 10, AuthorizationRoles.SubContractorLimited, UserType.Subcontractor, timeZoneOffset); //30 generic office people people - GenSeedUserAsync(log, 30, AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 30, AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //10 Full sales people - GenSeedUserAsync(log, 10, AuthorizationRoles.SalesFull, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 10, AuthorizationRoles.SalesFull, UserType.NonSchedulable, timeZoneOffset); //5 Limited sales people - GenSeedUserAsync(log, 5, AuthorizationRoles.SalesLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 5, AuthorizationRoles.SalesLimited, UserType.NonSchedulable, timeZoneOffset); //5 dispatch manager - GenSeedUserAsync(log, 5, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 5, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //5 Inventory manager - GenSeedUserAsync(log, 5, AuthorizationRoles.InventoryFull | AuthorizationRoles.DispatchLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 5, AuthorizationRoles.InventoryFull | AuthorizationRoles.DispatchLimited, UserType.NonSchedulable, timeZoneOffset); //10 Inventory manager assistants - GenSeedUserAsync(log, 5, AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 5, AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //5 accountant / bookkeeper - GenSeedUserAsync(log, 5, AuthorizationRoles.AccountingFull | AuthorizationRoles.BizAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 5, AuthorizationRoles.AccountingFull | AuthorizationRoles.BizAdminLimited, UserType.NonSchedulable, timeZoneOffset); //100 full on customer users - GenSeedUserAsync(log, 20, AuthorizationRoles.CustomerFull, UserType.Customer, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.CustomerFull, UserType.Customer, timeZoneOffset); //100 limited customer users - GenSeedUserAsync(log, 20, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); //PERF watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); //5000 widgets - LogStatusAsync(JobId, LogJob, log, $"Seeding 5,000 Widgets...."); + await LogStatusAsync(JobId, LogJob, log, $"Seeding 5,000 Widgets...."); watch = new Stopwatch(); watch.Start(); //await GenSeedWidgetAsync(log, 5000); - GenSeedWidgetAsync(log, 5000); + await GenSeedWidgetAsync(log, 5000); //PERF watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"5k Widgets seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"5k Widgets seeded in {watch.ElapsedMilliseconds} ms"); #endregion genlarge } break; @@ -319,82 +318,82 @@ namespace AyaNova.Util //It is acceptable for this seeding to take many hours as it would normally be used rarely //PERF - LogStatusAsync(JobId, LogJob, log, $"Seeding HUGE number of user(s)...."); + await LogStatusAsync(JobId, LogJob, log, $"Seeding HUGE number of user(s)...."); var watch = new Stopwatch(); watch.Start(); //IT administrator, can change ops but nothing else - GenSeedUserAsync(log, 10, AuthorizationRoles.OpsAdminFull, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 10, AuthorizationRoles.OpsAdminFull, UserType.NonSchedulable, timeZoneOffset); //business administrator, can view ops issues - GenSeedUserAsync(log, 10, AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 10, AuthorizationRoles.BizAdminFull | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); //owner / upper management who doesn't control anything but views stuff - GenSeedUserAsync(log, 20, AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.BizAdminLimited | AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited | AuthorizationRoles.OpsAdminLimited, UserType.NonSchedulable, timeZoneOffset); //regular techs - GenSeedUserAsync(log, 500, AuthorizationRoles.TechFull | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); + await GenSeedUserAsync(log, 500, AuthorizationRoles.TechFull | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); //limited techs - GenSeedUserAsync(log, 200, AuthorizationRoles.TechLimited | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); + await GenSeedUserAsync(log, 200, AuthorizationRoles.TechLimited | AuthorizationRoles.DispatchLimited, UserType.Schedulable, timeZoneOffset); //subcontractors - GenSeedUserAsync(log, 80, AuthorizationRoles.SubContractorFull, UserType.Subcontractor, timeZoneOffset); + await GenSeedUserAsync(log, 80, AuthorizationRoles.SubContractorFull, UserType.Subcontractor, timeZoneOffset); //limited subcontractors - GenSeedUserAsync(log, 40, AuthorizationRoles.SubContractorLimited, UserType.Subcontractor, timeZoneOffset); + await GenSeedUserAsync(log, 40, AuthorizationRoles.SubContractorLimited, UserType.Subcontractor, timeZoneOffset); //generic office people people - GenSeedUserAsync(log, 200, AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 200, AuthorizationRoles.DispatchLimited | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //20 Full sales people - GenSeedUserAsync(log, 20, AuthorizationRoles.SalesFull, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.SalesFull, UserType.NonSchedulable, timeZoneOffset); //10 Limited sales people - GenSeedUserAsync(log, 10, AuthorizationRoles.SalesLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 10, AuthorizationRoles.SalesLimited, UserType.NonSchedulable, timeZoneOffset); //dispatch manager - GenSeedUserAsync(log, 20, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.DispatchFull | AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //Inventory manager - GenSeedUserAsync(log, 40, AuthorizationRoles.InventoryFull | AuthorizationRoles.DispatchLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 40, AuthorizationRoles.InventoryFull | AuthorizationRoles.DispatchLimited, UserType.NonSchedulable, timeZoneOffset); //Inventory manager assistants - GenSeedUserAsync(log, 20, AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.InventoryLimited, UserType.NonSchedulable, timeZoneOffset); //accountant / bookkeeper - GenSeedUserAsync(log, 20, AuthorizationRoles.AccountingFull | AuthorizationRoles.BizAdminLimited, UserType.NonSchedulable, timeZoneOffset); + await GenSeedUserAsync(log, 20, AuthorizationRoles.AccountingFull | AuthorizationRoles.BizAdminLimited, UserType.NonSchedulable, timeZoneOffset); //full on customer users - GenSeedUserAsync(log, 200, AuthorizationRoles.CustomerFull, UserType.Customer, timeZoneOffset); + await GenSeedUserAsync(log, 200, AuthorizationRoles.CustomerFull, UserType.Customer, timeZoneOffset); //limited customer users - GenSeedUserAsync(log, 50, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); + await GenSeedUserAsync(log, 50, AuthorizationRoles.CustomerLimited, UserType.Customer, timeZoneOffset); //PERF watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"{SeededUserCount} Users seeded in {watch.ElapsedMilliseconds} ms"); //20000 widgets - LogStatusAsync(JobId, LogJob, log, $"Seeding 20,000 Widgets...."); + await LogStatusAsync(JobId, LogJob, log, $"Seeding 20,000 Widgets...."); watch = new Stopwatch(); watch.Start(); //await GenSeedWidgetAsync(log, 20000); - GenSeedWidgetAsync(log, 20000); + await GenSeedWidgetAsync(log, 20000); watch.Stop(); - LogStatusAsync(JobId, LogJob, log, $"20k Widgets seeded in {watch.ElapsedMilliseconds} ms"); + await LogStatusAsync(JobId, LogJob, log, $"20k Widgets seeded in {watch.ElapsedMilliseconds} ms"); #endregion genhuge } break; } - LogStatusAsync(JobId, LogJob, log, "Seeding completed successfully"); + await LogStatusAsync(JobId, LogJob, log, "Seeding completed successfully"); } catch (Exception ex) { log.LogError(ex, "Seeder:SeedDatabase error during ops"); if (LogJob) - JobsBiz.LogJobAsync(JobId, $"Seeder:SeedDatabase error during ops\r\n{ex.Message}"); + await JobsBiz.LogJobAsync(JobId, $"Seeder:SeedDatabase error during ops\r\n{ex.Message}"); throw ex; } finally