using LANCommander.SDK.Enums; using LANCommander.SDK.Models.Manifest; using LANCommander.Server.ImportExport.Exceptions; using LANCommander.Server.ImportExport.Models; using LANCommander.Server.Services; using LANCommander.Server.Services.Mappers; namespace LANCommander.Server.ImportExport.Exporters; public class SaveExporter( ManifestMapper manifestMapper, GameSaveService gameSaveService) : BaseExporter { public override async Task GetExportInfoAsync(Data.Models.GameSave record) { var savePath = await gameSaveService.GetSavePathAsync(record.Id); var info = new ExportItemInfo { Id = record.Id, Type = ImportExportRecordType.Save, Name = $"{record.User} - {record.CreatedOn}", }; if (File.Exists(savePath)) { var fileInfo = new FileInfo(savePath); if (fileInfo.Exists) info.Size = fileInfo.Length; } return info; } public override bool CanExport(Save record) => ExportContext.DataRecord is Data.Models.Game; public override async Task ExportAsync(Guid id) { var entity = await gameSaveService.GetAsync(id); try { var savePath = await gameSaveService.GetSavePathAsync(id); if (Path.Exists(savePath)) { var saveEntry = ExportContext.Archive.CreateEntry($"Saves/{id}"); using (var saveEntryStream = saveEntry.Open()) using (var saveFileStream = new FileStream(savePath, FileMode.Open)) { await saveFileStream.CopyToAsync(saveEntryStream); } } return manifestMapper.ToManifest(entity); } catch (Exception ex) { throw new ExportSkippedException(entity, "Could not add save to export file", ex); } } }