using FoodsharingSiegen.Contracts.Model; using FoodsharingSiegen.Server.Data; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration.Json; namespace FoodsharingSiegen.Server { public static class Extensions { #region Public Method AddDatabaseContext /// /// Configures the application's data access layer by setting up and registering a database context using SQLite. /// Ensures the database file is stored within the application's base directory under a "data" folder. /// /// An instance of used to configure the application's services and resources. public static void AddDatabaseContext(this WebApplicationBuilder builder) { var dataDirectory = Path.Combine(AppContext.BaseDirectory, "data"); if (!Directory.Exists(dataDirectory)) Directory.CreateDirectory(dataDirectory); var dbPath = Path.Combine(dataDirectory, "app.db"); var connectionString = $"Data Source={dbPath}"; builder.Services.AddDbContextFactory(options => options.UseSqlite(connectionString)); } #endregion /// /// Ensures that all pending database migrations are applied at runtime. /// This method checks for pending migrations in the database context and applies them, /// allowing the application to remain compatible with the latest schema changes. /// /// An instance of used to access application services and lifecycle methods. public static void ApplyMigrations(this WebApplication app) { using var scope = app.Services.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); // Check and apply pending migrations var pendingMigrations = dbContext.Database.GetPendingMigrations(); if (pendingMigrations.Any()) { Console.WriteLine("Applying pending migrations..."); dbContext.Database.Migrate(); Console.WriteLine("Migrations applied successfully."); } else { Console.WriteLine("No pending migrations found."); } } #region Public Method LoadAppSettings /// /// Loads application settings from JSON configuration files located in a designated "config" directory. /// Clears existing JSON configuration files and ensures settings from the specified files are applied. /// /// An instance of used to configure and load application settings. public static void LoadAppSettings(this WebApplicationBuilder builder) { // Clear loaded json files foreach (var configurationSource in builder.Configuration.Sources.Where(x => x is JsonConfigurationSource).ToList()) builder.Configuration.Sources.Remove(configurationSource); // Define the directory where your appsettings files reside var configDir = Path.Combine(builder.Environment.ContentRootPath, "config"); // Check if the directory exists if (Directory.Exists(configDir)) { // Get all JSON files that start with "appsettings" in the directory and its subdirectories var configFiles = Directory.EnumerateFiles(configDir, "appsettings*.json", SearchOption.AllDirectories); // Add each file to the configuration foreach (var file in configFiles) builder.Configuration.AddJsonFile(file, true, true); } builder.Services.Configure(builder.Configuration.GetSection("Settings")); } #endregion } }