namespace HyperBooru.Services; public interface IConfigService { public string DataPath { get; } public string DbConnectionString { get; } public string MediaBasePath { get; } public string ThumbnailBasePath { get; } public bool EnableOcr { get; } } public class ConfigService : IConfigService { private IConfiguration config; private const string AppName = "HyperBooru"; public string DataPath { get { #if DEBUG return "Data"; #else string? path = config["DataPath"]; if(path is not null) return path; switch(Environment.OSVersion.Platform) { case PlatformID.Win32NT: return Path.Join( Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), AppName); case PlatformID.Unix: return $"/var/lib/{AppName.ToLower()}"; default: throw new NotImplementedException( $"Unknown Operating System: {Environment.OSVersion.Platform}"); } #endif } } public string DbConnectionString => config.GetConnectionString("DefaultConnection") ?? throw new HBException("Unable to get default connection string"); public string MediaBasePath => Path.Join(DataPath, "media"); public string ThumbnailBasePath => Path.Join(DataPath, "thumb"); public bool EnableOcr => bool.TryParse(config["DisableOcr"], out bool x) ? !x : true; public ConfigService(IConfiguration config) { this.config = config; InitDirectoryStructure(); } private void InitDirectoryStructure() { Directory.CreateDirectory(DataPath); Directory.CreateDirectory(MediaBasePath); } }