using BomLocalService.Models; namespace BomLocalService.Utilities; public static class FilePathHelper { /// /// Gets the cache directory path from configuration (default from appsettings.json, can be overridden via CACHEDIRECTORY environment variable) /// public static string GetCacheDirectory(IConfiguration configuration) { return configuration.GetValue("CacheDirectory") ?? throw new InvalidOperationException("CacheDirectory configuration is required. Set it in appsettings.json or via CACHEDIRECTORY environment variable."); } /// /// Gets the metadata file path for a given screenshot path (legacy method for backward compatibility) /// [Obsolete("Use GetMetadataFilePath(string cacheFolderPath) for folder-based storage")] public static string GetMetadataFilePathFromScreenshot(string screenshotPath) { return Path.ChangeExtension(screenshotPath, ".json"); } /// /// Gets the cache file pattern for a location key (e.g., "Pomona_QLD_*.png") /// public static string GetCacheFilePattern(string locationKey) { var safeLocationKey = LocationHelper.SanitizeFileName(locationKey); return $"{safeLocationKey}_*.png"; } /// /// Gets the cache file pattern for suburb and state /// public static string GetCacheFilePattern(string suburb, string state) { var locationKey = LocationHelper.GetLocationKey(suburb, state); return GetCacheFilePattern(locationKey); } /// /// Gets the cache folder path for a location and timestamp. /// Format: "{CacheDirectory}/{LocationKey}_{Timestamp}" /// Example: "/app/cache/Pomona_QLD_20251207_000906" /// public static string GetCacheFolderPath(string cacheDirectory, string suburb, string state, string timestamp) { var locationKey = LocationHelper.GetLocationKey(suburb, state); var safeLocationKey = LocationHelper.SanitizeFileName(locationKey); return Path.Combine(cacheDirectory, $"{safeLocationKey}_{timestamp}"); } /// /// Gets the data type subfolder path within a cache folder. /// Format: "{CacheFolderPath}/{DataType}" /// Example: "/app/cache/Pomona_QLD_20251207_000906/radar" /// public static string GetDataTypeFolderPath(string cacheFolderPath, CachedDataType dataType) { var dataTypeFolder = dataType.ToString().ToLowerInvariant(); return Path.Combine(cacheFolderPath, dataTypeFolder); } /// /// Gets the frame file path within a data type subfolder. /// Format: "{CacheFolderPath}/{DataType}/frame_{FrameIndex}.png" /// public static string GetFrameFilePath(string cacheFolderPath, CachedDataType dataType, int frameIndex) { var dataTypeFolder = GetDataTypeFolderPath(cacheFolderPath, dataType); return Path.Combine(dataTypeFolder, $"frame_{frameIndex}.png"); } /// /// Gets the frame file path within a cache folder (legacy - defaults to radar). /// Format: "{CacheFolderPath}/radar/frame_{FrameIndex}.png" /// [Obsolete("Use GetFrameFilePath with dataType parameter")] public static string GetFrameFilePath(string cacheFolderPath, int frameIndex) { return GetFrameFilePath(cacheFolderPath, CachedDataType.Radar, frameIndex); } /// /// Gets the metadata file path within a cache folder. /// Format: "{CacheFolderPath}/metadata.json" /// public static string GetMetadataFilePath(string cacheFolderPath) { return Path.Combine(cacheFolderPath, "metadata.json"); } /// /// Gets the cache folder pattern for finding existing folders. /// Format: "{LocationKey}_*" /// public static string GetCacheFolderPattern(string suburb, string state) { var locationKey = LocationHelper.GetLocationKey(suburb, state); var safeLocationKey = LocationHelper.SanitizeFileName(locationKey); return $"{safeLocationKey}_*"; } /// /// Gets the lock file path for a cache folder. /// This file indicates the folder is currently being written to. /// Format: "{CacheFolderPath}/.writing" /// public static string GetCacheLockFilePath(string cacheFolderPath) { return Path.Combine(cacheFolderPath, ".writing"); } /// /// Gets the frames metadata file path within a data type subfolder. /// Format: "{CacheFolderPath}/{DataType}/frames.json" /// public static string GetFramesMetadataFilePath(string cacheFolderPath, CachedDataType dataType) { var dataTypeFolder = GetDataTypeFolderPath(cacheFolderPath, dataType); return Path.Combine(dataTypeFolder, "frames.json"); } /// /// Gets the frames metadata file path within a cache folder (legacy - defaults to radar). /// Format: "{CacheFolderPath}/radar/frames.json" /// [Obsolete("Use GetFramesMetadataFilePath with dataType parameter")] public static string GetFramesMetadataFilePath(string cacheFolderPath) { return GetFramesMetadataFilePath(cacheFolderPath, CachedDataType.Radar); } }