using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Hosting; namespace JobTrackerApi.Services { public sealed class AppPaths { public string DataRoot { get; } public string AttachmentsRoot { get; } public string CvArtifactsRoot { get; } public string CvExportsRoot { get; } public string CvBenchmarksRoot { get; } public AppPaths(IConfiguration cfg, IHostEnvironment env) { var dataRoot = (cfg["Data:Root"] ?? "").Trim(); if (string.IsNullOrWhiteSpace(dataRoot)) dataRoot = env.ContentRootPath; if (!Path.IsPathRooted(dataRoot)) dataRoot = Path.Combine(env.ContentRootPath, dataRoot); Directory.CreateDirectory(dataRoot); DataRoot = dataRoot; var attachmentsRoot = (cfg["Data:AttachmentsRoot"] ?? "").Trim(); if (string.IsNullOrWhiteSpace(attachmentsRoot)) attachmentsRoot = Path.Combine(DataRoot, "Attachments"); if (!Path.IsPathRooted(attachmentsRoot)) attachmentsRoot = Path.Combine(env.ContentRootPath, attachmentsRoot); Directory.CreateDirectory(attachmentsRoot); AttachmentsRoot = attachmentsRoot; var cvArtifactsRoot = (cfg["Data:CvArtifactsRoot"] ?? "").Trim(); if (string.IsNullOrWhiteSpace(cvArtifactsRoot)) cvArtifactsRoot = Path.Combine(DataRoot, "CvArtifacts"); if (!Path.IsPathRooted(cvArtifactsRoot)) cvArtifactsRoot = Path.Combine(env.ContentRootPath, cvArtifactsRoot); Directory.CreateDirectory(cvArtifactsRoot); CvArtifactsRoot = cvArtifactsRoot; var cvExportsRoot = (cfg["Data:CvExportsRoot"] ?? "").Trim(); if (string.IsNullOrWhiteSpace(cvExportsRoot)) cvExportsRoot = Path.Combine(DataRoot, "CvExports"); if (!Path.IsPathRooted(cvExportsRoot)) cvExportsRoot = Path.Combine(env.ContentRootPath, cvExportsRoot); Directory.CreateDirectory(cvExportsRoot); CvExportsRoot = cvExportsRoot; var cvBenchmarksRoot = (cfg["Data:CvBenchmarksRoot"] ?? "").Trim(); if (string.IsNullOrWhiteSpace(cvBenchmarksRoot)) cvBenchmarksRoot = Path.Combine(DataRoot, "CvBenchmarks"); if (!Path.IsPathRooted(cvBenchmarksRoot)) cvBenchmarksRoot = Path.Combine(env.ContentRootPath, cvBenchmarksRoot); Directory.CreateDirectory(cvBenchmarksRoot); CvBenchmarksRoot = cvBenchmarksRoot; } public string GetDbPath(string fileName = "jobtracker.db") => Path.Combine(DataRoot, fileName); public string GetExportsRoot(string? configuredFolder) { var folder = (configuredFolder ?? "").Trim(); if (string.IsNullOrWhiteSpace(folder)) return Path.Combine(DataRoot, "exports"); return Path.IsPathRooted(folder) ? folder : Path.Combine(DataRoot, folder); } } }