From 8a502ce820c321c2880a7b2b88b0a24d3ce951cc Mon Sep 17 00:00:00 2001 From: Michael Babienco Date: Wed, 22 Apr 2026 11:44:27 +0900 Subject: [PATCH] Move more recent saved data to internal --- src/MayShow.Shared/Models/Settings.cs | 81 ++++++++++++++++++++++++--- 1 file changed, 72 insertions(+), 9 deletions(-) diff --git a/src/MayShow.Shared/Models/Settings.cs b/src/MayShow.Shared/Models/Settings.cs index 1d7fd35..c02c6f9 100644 --- a/src/MayShow.Shared/Models/Settings.cs +++ b/src/MayShow.Shared/Models/Settings.cs @@ -178,11 +178,12 @@ class Settings : ChangeNotifier LastSaved = lastSaved, BaseFolder = data.Key, }; + // sync UUIDs // if UUID exists in BaseFolder/(Constants.ReportSavedDataFileName), use that UUID instead. - var existingReportDataPath = Path.Combine(reportInfo.BaseFolder, Constants.ReportSavedDataFileName); - if (File.Exists(existingReportDataPath)) + var externalReportDataPath = Path.Combine(reportInfo.BaseFolder, Constants.ReportSavedDataFileName); + if (File.Exists(externalReportDataPath)) { - var originalReportData = JsonSerializer.Deserialize(File.ReadAllText(existingReportDataPath), jsonContext.PDFReport); + var originalReportData = JsonSerializer.Deserialize(File.ReadAllText(externalReportDataPath), jsonContext.PDFReport); if (originalReportData != null) { if (!string.IsNullOrWhiteSpace(originalReportData.UUID)) @@ -194,15 +195,77 @@ class Settings : ChangeNotifier { // update UUID so they are in sync between internal and external folders originalReportData.UUID = reportInfo.UUID; - using var memoryStream = new MemoryStream(); - JsonSerializer.Serialize(memoryStream, report, jsonContext.PDFReport); - memoryStream.Position = 0; - using var reader = new StreamReader(memoryStream); - var updatedJson = reader.ReadToEnd(); - File.WriteAllText(existingReportDataPath, updatedJson); + Utilities.SaveReportDataSync(originalReportData, externalReportDataPath, jsonContext.PDFReport); } } } + // update report data itself and move to internal -- everything is moving to internal storage dir, + // so if there is external data, use whatever is the most recent. + // reportInfo.UUID now has the UUID we want to use. + var internalReportFolderPath = Path.Combine(internalPath, reportInfo.UUID); + var internalDataFilePath = Path.Combine(internalReportFolderPath, Constants.ReportSavedDataFileName); + if (!Path.Exists(internalReportFolderPath)) + { + // internal path doesn't exist at all so never saved internally before. + // make the dir and copy data to internal dir. + Directory.CreateDirectory(internalReportFolderPath); + if (File.Exists(externalReportDataPath)) + { + File.Copy(externalReportDataPath, Path.Combine(internalReportFolderPath, Constants.ReportSavedDataFileName)); + } + } + else + { + // see which JSON file is newer (based on last saved time) and use that data. + if (!File.Exists(internalDataFilePath)) + { + // internal file doesn't exist, copy in from external + if (File.Exists(externalReportDataPath)) + { + File.Copy(externalReportDataPath, internalDataFilePath); + } + } + else if (File.Exists(internalDataFilePath) && File.Exists(externalReportDataPath)) + { + // both files exist. load report data and compare dates. + var internalReportData = JsonSerializer.Deserialize(File.ReadAllText(internalDataFilePath), jsonContext.PDFReport); + var externalReportData = JsonSerializer.Deserialize(File.ReadAllText(externalReportDataPath), jsonContext.PDFReport); + if (internalReportData != null && externalReportData != null) + { + var isExternalNewer = (externalReportData.LastSaved ?? DateTime.MinValue) + > (internalReportData.LastSaved ?? DateTime.MinValue); + if (isExternalNewer) // else internal is newer so nothing to do + { + File.Move(internalDataFilePath, Path.Combine(internalReportFolderPath, "old_report_data.json")); + File.Copy(externalReportDataPath, internalDataFilePath, true); + reportInfo.Title = externalReportData.Title; + reportInfo.LastSaved = externalReportData.LastSaved; + } + } + else if (internalReportData == null && externalReportData != null) + { + // move data to internal dir + if (File.Exists(externalReportDataPath)) + { + File.Copy(externalReportDataPath, internalDataFilePath, true); + } + } + } + } + reportInfo.BaseFolder = internalReportFolderPath; + // make sure BaseFolder is set right just in case -- now always points to internal directory. + // (it's actually now redundant because all settings are internal... + // but for now we'll just let it stick around.) + if (File.Exists(internalDataFilePath)) + { + var internalReportData = JsonSerializer.Deserialize(File.ReadAllText(internalDataFilePath), jsonContext.PDFReport); + if (internalReportData != null) + { + internalReportData.BaseFolder = internalReportFolderPath; + Utilities.SaveReportDataSync(internalReportData, internalDataFilePath, jsonContext.PDFReport); + } + } + // ok, finally done upgrading this report. list.Add(reportInfo); } settings.AllReportInfo = list.OrderBy(x => x.Title).ToList();