using ReleaseUpdater.Common; namespace Updater.Core; /// /// Управляет потоком обновлений: извлечение, установка, перезапуск. /// public sealed class UpdaterApp { private readonly ILogger _log; private readonly IExtractor _extractor; private readonly IInstaller _installer; private readonly IProcessManager _proc; public UpdaterApp(ILogger log, IExtractor extractor, IInstaller installer, IProcessManager proc) { _log = log; _extractor = extractor; _installer = installer; _proc = proc; } /// Запускает рабочий процесс обновления. public int Run(Options opts) { var tempExtractDir = Path.Combine(Path.GetTempPath(), $"upd_extract_{Guid.NewGuid():N}"); Directory.CreateDirectory(tempExtractDir); try { _extractor.Extract(opts.ZipPath, tempExtractDir); } catch (Exception ex) { _log.Error($"Extraction failed: {ex.Message}"); Cleanup(tempExtractDir); return ExitCodes.ExtractFailed; } try { _installer.Install(tempExtractDir, opts.InstallPath); } catch (Exception ex) { _log.Error($"Install failed: {ex.Message}"); Cleanup(tempExtractDir); return ExitCodes.InstallFailed; } Cleanup(tempExtractDir); try { _proc.StartApp(opts.InstallPath, opts.AppExe, opts.RestartDelayMs); return ExitCodes.Ok; } catch (Exception ex) { _log.Error($"Restart failed: {ex.Message}"); return ExitCodes.RestartFailed; } } private static void Cleanup(string dir) { try { Directory.Delete(dir, true); } catch { /* ignore */ } } }