namespace HyperBooru.Services; public interface IConfigService { public string DataPath { get; } public string DbPath { get; } public string MediaBasePath { get; } public string GetPath(Media media); public string GetPath(Media media, int width, int height); } 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 DbPath => Path.Join(DataPath, $"{AppName}.db"); public string MediaBasePath => Path.Join(DataPath, "media"); public string ThumbnailBasePath => Path.Join(DataPath, "thumb"); public ConfigService(IConfiguration config) { this.config = config; InitDirectoryStructure(); } public string GetPath(Media media) { var fileInfo = new FileInfo(Path.Join( MediaBasePath, media.Guid.ToString().Substring(0, 2), media.Guid.ToString().Substring(2, 2), media.Guid.ToString())); Directory.CreateDirectory(fileInfo.Directory.FullName); return fileInfo.FullName; } public string GetPath(Media media, int width, int height) { var fileInfo = new FileInfo(Path.Join( ThumbnailBasePath, media.Guid.ToString().Substring(0, 2), media.Guid.ToString().Substring(2, 2), $"{media.Guid.ToString()}-{width}-{height}")); Directory.CreateDirectory(fileInfo.Directory.FullName); return fileInfo.FullName; } private void InitDirectoryStructure() { Directory.CreateDirectory(DataPath); Directory.CreateDirectory(MediaBasePath); } }