using LANCommander.SDK; using LANCommander.SDK.Helpers; using LANCommander.SDK.Migrations; using Semver; namespace LANCommander.Server.Migrations; /// /// Base class for migrations that move a single path from old config location to new location. /// public abstract class MovePathMigration(ILogger logger) : FileSystemMigration(logger) { /// /// The name of the path/folder to move. /// protected abstract string PathName { get; } /// /// Gets the old configuration directory. /// protected string GetOldConfigDirectory() { var baseDirectory = Directory.GetCurrentDirectory(); if (DirectoryHelper.IsDirectoryWritable(baseDirectory)) return baseDirectory; return AppPaths.GetAppDataPath(); } public override async Task ExecuteAsync() { var oldConfigDirectory = GetOldConfigDirectory(); try { var source = Path.Combine(oldConfigDirectory, PathName); var destination = AppPaths.GetConfigPath(PathName); if (source == destination) return; Logger.LogInformation("Moving old config directory/file \"{Path}\"", PathName); if (Directory.Exists(source)) DirectoryHelper.MoveContents(source, destination); else if (File.Exists(source)) { var destinationDirectory = Path.GetDirectoryName(destination); if (destinationDirectory != null && !Directory.Exists(destinationDirectory)) Directory.CreateDirectory(destinationDirectory); File.Move(source, destination); } else Logger.LogInformation("Skipping old directory/file \"{Path}\" because it doesn't exist.", PathName); } catch (Exception ex) { Logger.LogError(ex, "Error while moving old config directory/file \"{Path}\"", PathName); } } public override async Task ShouldExecuteAsync() { var oldConfigDirectory = GetOldConfigDirectory(); var source = Path.Combine(oldConfigDirectory, PathName); var destination = AppPaths.GetConfigPath(PathName); // Only execute if source exists and is different from destination if (source == destination) return false; return Directory.Exists(source) || File.Exists(source); } } /// /// Migration for moving Backups folder from old config location to new location. /// public class MoveBackupsMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Backups"; } /// /// Migration for moving Media folder from old config location to new location. /// public class MoveMediaMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Media"; } /// /// Migration for moving Saves folder from old config location to new location. /// public class MoveSavesMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Saves"; } /// /// Migration for moving Snippets folder from old config location to new location. /// public class MoveSnippetsMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Snippets"; } /// /// Migration for moving Upload folder from old config location to new location. /// public class MoveUploadMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Upload"; } /// /// Migration for moving Uploads folder from old config location to new location. /// public class MoveUploadsMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Uploads"; } /// /// Migration for moving Servers folder from old config location to new location. /// public class MoveServersMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Servers"; } /// /// Migration for moving Updates folder from old config location to new location. /// public class MoveUpdatesMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Updates"; } /// /// Migration for moving Launcher folder from old config location to new location. /// public class MoveLauncherMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Launcher"; } /// /// Migration for moving Logs folder from old config location to new location. /// public class MoveLogsMigration(ILogger logger) : MovePathMigration(logger) { public override SemVersion Version => new(2, 0, 0); protected override string PathName => "Logs"; }