using System; using System.IO; using Microsoft.Extensions.Configuration; namespace Sozsoft.Platform.Data.Seeds; /// /// Runtime'da duzenlenebilen seed dosyalarinin (SqlData / PostgresData / WizardData) klasorunu cozer. /// /// Kod ile birlikte versiyonlanan sabit seed'ler (ornegin TenantDataSeeder'in okudugu /// TenantData.json) buraya dahil degildir; onlar kendi projelerinin ciktisinda kalir. /// /// /// Klasor bilincli olarak hicbir projenin icinde degildir: depoda configs/seeds altinda durur ve /// konteynere bind mount ile baglanir. Boylece bir seed dosyasi degistiginde ne api ne de migrator /// imaji yeniden derlenir; deploy sirasindaki git pull yeterlidir. Ayni klasor File Manager /// uzerinden de duzenlenebildigi icin yapilan degisiklik dogrudan host diskinde kalici olur. /// /// /// Cozum sirasi: /// 1) App:SeedsPath ayari (konteynerde mount noktasi), /// 2) calisma dizininden yukari dogru configs/seeds aramasi (local gelistirme), /// 3) calisma dizininin altindaki Seeds klasoru (son care). /// /// public static class SeedPathResolver { public const string ConfigurationKey = "App:SeedsPath"; /// SQL Server saglayicisinin script klasoru. public const string SqlDataFolder = "SqlData"; /// PostgreSQL saglayicisinin script klasoru. public const string PostgresDataFolder = "PostgresData"; /// Host veritabani kapsamindaki scriptler. public const string HostDataFolder = "HostData"; /// Tenant veritabani kapsamindaki scriptler. public const string TenantDataFolder = "TenantData"; /// Yalnizca olusturulan/guncellenen nesne scriptleri. public const string ObjectDataFolder = "ObjectData"; /// Olusturulan, ayrica tum migration'lar bittikten sonra calistirilan scriptler. public const string ExecuteDataFolder = "ExecuteData"; /// Wizard'in urettigi konfigurasyon dosyalari. public const string WizardDataFolder = "WizardData"; private const string RepositorySeedsFolder = "seeds"; private const string RepositoryConfigsFolder = "configs"; private const string FallbackFolderName = "Seeds"; /// Seed kok klasorunun tam yolunu dondurur. Klasorun var olmasi garanti edilmez. public static string GetRootPath(IConfiguration? configuration) { var configuredPath = configuration?[ConfigurationKey]; if (!string.IsNullOrWhiteSpace(configuredPath)) { return Path.GetFullPath(configuredPath); } var repositoryPath = FindRepositorySeedsPath(); if (repositoryPath != null) { return repositoryPath; } return Path.Combine(Directory.GetCurrentDirectory(), FallbackFolderName); } /// Seed kok klasorunun altindaki bir alt yolu dondurur. public static string GetPath(IConfiguration? configuration, params string[] subPaths) { var path = GetRootPath(configuration); foreach (var subPath in subPaths) { path = Path.Combine(path, subPath); } return path; } /// Calisma dizininden yukari dogru cikarak depodaki configs/seeds klasorunu arar. private static string? FindRepositorySeedsPath() { var dir = new DirectoryInfo(Directory.GetCurrentDirectory()); while (dir != null) { var candidate = Path.Combine(dir.FullName, RepositoryConfigsFolder, RepositorySeedsFolder); if (Directory.Exists(candidate)) { return candidate; } dir = dir.Parent; } return null; } }