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
}
}