using Microsoft.EntityFrameworkCore; using vendorApproverBackend.Entities; using vendorApproverBackend.Services; using vendorApproverBackend.SeedObjectDto; namespace vendorApproverBackend.Data.Seed; public static class DbInitializer { public static async Task InitializeDbAsync(this IApplicationBuilder app) { using (var scope = app.ApplicationServices.CreateScope()) { var services = scope.ServiceProvider; var logger = services.GetRequiredService>(); try { var context = services.GetRequiredService(); logger.LogInformation("--> Applying database migrations..."); await context.Database.MigrateAsync(); var userService = services.GetRequiredService(); var appCategoryService = services.GetRequiredService(); await SeedAdminUserAsync(userService, logger); await SeedSecondAdminUserAsync(userService, logger); await SeedManagerUserAsync(userService, logger); await SeedPerformanceManagerUserAsync(userService, logger); await SeedAzureUserAsync(userService, logger); await SeedFinancialUserAsync(userService, logger); await SeedApplicationCategoriesAsync(appCategoryService, context, logger); } catch (Exception ex) { logger.LogError(ex, "An error occurred during database initialization."); } } } private static async Task SeedApplicationCategoriesAsync( ApplicationCategoryService service, DataContext context, ILogger logger) { logger.LogInformation("--> Starting ApplicationCategory seeding..."); var seedData = SeedData.GetApplicationCategories(); int categoriesAdded = 0; foreach (var categoryDto in seedData) { var existingAppCategory = await service.ExistsByNameAsync(categoryDto.name); if (existingAppCategory == null) { logger.LogInformation($"Adding new ApplicationCategory: {categoryDto.name}"); var newAppCategory = new ApplicationCategory { Name = categoryDto.name, NameAr = categoryDto.nameAr, Categories = categoryDto.categories.Select(c => new Category { Label = c.label, LabelAr = c.labelAr }).ToList() }; context.ApplicationCategories.Add(newAppCategory); categoriesAdded += newAppCategory.Categories.Count; } else { logger.LogInformation($"ApplicationCategory '{categoryDto.name}' exists. Checking sub-categories..."); foreach (var category in categoryDto.categories) { if (!service.CategoryExistsByLabel(existingAppCategory, category.label)) { logger.LogInformation($" - Adding Category: {category.label}"); var newCategory = new Category { Label = category.label, LabelAr = category.labelAr, ApplicationCategoryId = existingAppCategory.Id }; context.Categories.Add(newCategory); categoriesAdded++; } } } } if (categoriesAdded > 0) { await context.SaveChangesAsync(); logger.LogInformation($"--> Successfully added {categoriesAdded} new categories during initialization."); } else { logger.LogInformation("--> No new ApplicationCategories or Categories needed to be added."); } } private static async Task SeedAdminUserAsync(UserService userService, ILogger logger) { const string adminUsername = "OETCADMINSO12345"; if (!await userService.DoesUsernameExistAsync(adminUsername)) { logger.LogInformation("--> Seeding admin user..."); var adminUser = new User { Username = adminUsername, Email = "admin@oetc.com", Password = "aze", Name = "admin oetc", PhoneNumber = "93831879", Active = true, Deleted = false, Status = false }; await userService.SaveAdminAsync(adminUser); logger.LogInformation("--> Admin user created successfully."); } else { logger.LogInformation("--> Admin user already exists. Seeding skipped."); } } private static async Task SeedSecondAdminUserAsync(UserService userService, ILogger logger) { const string adminUsername = "OETCADMIN2"; if (!await userService.DoesUsernameExistAsync(adminUsername)) { logger.LogInformation("--> Seeding admin user..."); var adminUser = new User { Username = adminUsername, Email = "makiya.alajmi@omangrid.nama.om", Password = "aze", Name = "Makiya Alajmi", PhoneNumber = "91111111", Active = true, Deleted = false, Status = false }; await userService.SaveAdminAsync(adminUser); logger.LogInformation("--> Admin user created successfully."); } else { logger.LogInformation("--> Admin user already exists. Seeding skipped."); } } private static async Task SeedManagerUserAsync(UserService userService, ILogger logger) { const string managerUsername = "OETCMANAGERSO12345"; if (!await userService.DoesUsernameExistAsync(managerUsername)) { logger.LogInformation("--> Seeding admin user..."); var adminUser = new User { Username = managerUsername, Email = "manager@oetc.com", Password = "aze", Name = "manager oetc", PhoneNumber = "999985258", Active = true, Deleted = false, Status = false }; await userService.SaveManagerAsync(adminUser); logger.LogInformation("--> Manager user created successfully."); } else { logger.LogInformation("--> Manager user already exists. Seeding skipped."); } } private static async Task SeedPerformanceManagerUserAsync(UserService userService, ILogger logger) { const string managerUsername = "OETCPERFORMANCEMANAGERSO12345"; if (!await userService.DoesUsernameExistAsync(managerUsername)) { logger.LogInformation("--> Seeding admin user..."); var adminUser = new User { Username = managerUsername, Email = "performance-manager@oetc.com", Password = "aze", Name = "performance manager oetc", PhoneNumber = "990001010", Active = true, Deleted = false, Status = false }; await userService.SavePerformanceManagerAsync(adminUser); logger.LogInformation("--> Performance Manager user created successfully."); } else { logger.LogInformation("--> Performance Manager user already exists. Seeding skipped."); } } private static async Task SeedAzureUserAsync(UserService userService, ILogger logger) { const string managerUsername = "OETCAZUREUSERO12345"; if (!await userService.DoesUsernameExistAsync(managerUsername)) { logger.LogInformation("--> Seeding admin user..."); var adminUser = new User { Username = managerUsername, Email = "azure@oetc.com", Password = "aze", Name = "azure user oetc", PhoneNumber = "9632587144", Active = true, Deleted = false, Status = false }; await userService.SaveAzureUserAsync(adminUser); logger.LogInformation("--> Azure user created successfully."); } else { logger.LogInformation("--> Azure user already exists. Seeding skipped."); } } private static async Task SeedFinancialUserAsync(UserService userService, ILogger logger) { const string financialUsername = "FINANCIALO1234"; const string financelUsername = "FINANCEO1234"; // This check will now succeed because the tables exist. if (!await userService.DoesUsernameExistAsync(financialUsername)) { logger.LogInformation("--> Seeding Fiancial user..."); var adminUser = new User { Username = financialUsername, Email = "financial@oetc.com", Password = "aze", Name = "financial oetc", PhoneNumber = "999991111", Active = true, Deleted = false, Status = false }; await userService.SaveFinancialAsync(adminUser); logger.LogInformation("--> Financial user created successfully."); } if (!await userService.DoesUsernameExistAsync(financelUsername)) { logger.LogInformation("--> Seeding Fiancial user..."); var adminUser = new User { Username = financelUsername, Email = "finance@oetc.com", Password = "aze", Name = "finance oetc", PhoneNumber = "999922222", Active = true, Deleted = false, Status = false }; await userService.SaveFinancialAsync(adminUser); logger.LogInformation("--> Financial user created successfully."); } } }