Skip to content

Commit ffdb1c5

Browse files
committed
Fixed issue with file-system backup overwriting existing projects.json
1 parent 6828853 commit ffdb1c5

File tree

1 file changed

+60
-5
lines changed

1 file changed

+60
-5
lines changed

src/services/FileSystemBackupService.ts

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,10 @@ class FileSystemBackupService {
281281
}
282282

283283
const account = await this.dataSerializer.serializeUserData(user.id);
284-
const projects = localProjects.map((project) =>
285-
this.unifiedService.convertProjectToMetadata(project, "backup"),
286-
);
284+
285+
// Read existing projects from filesystem and merge with new ones
286+
const existingData = await this.readExistingBackupData();
287+
const mergedProjects = this.mergeProjectsData(existingData.projects, localProjects);
287288

288289
const projectData = new Map();
289290
for (const project of localProjects) {
@@ -304,14 +305,68 @@ class FileSystemBackupService {
304305
});
305306
}
306307

308+
// Merge existing project data with new project data
309+
const mergedProjectData = this.mergeProjectData(existingData.projectData, projectData);
310+
307311
return {
308312
manifest: this.unifiedService.createManifest("backup"),
309313
account,
310-
projects,
311-
projectData,
314+
projects: mergedProjects,
315+
projectData: mergedProjectData,
312316
};
313317
}
314318

319+
private async readExistingBackupData(): Promise<{
320+
projects: any[];
321+
projectData: Map<string, any>;
322+
}> {
323+
if (!this.rootHandle) {
324+
return { projects: [], projectData: new Map() };
325+
}
326+
327+
try {
328+
const adapter = new DirectoryAdapter(this.rootHandle);
329+
330+
if (!(await adapter.exists(this.unifiedService.getPaths().MANIFEST))) {
331+
return { projects: [], projectData: new Map() };
332+
}
333+
334+
const existingData = await this.fileSystemManager.readUnifiedStructure(adapter);
335+
return {
336+
projects: existingData.projects || [],
337+
projectData: existingData.projectData || new Map(),
338+
};
339+
} catch (error) {
340+
console.warn("Could not read existing backup data:", error);
341+
return { projects: [], projectData: new Map() };
342+
}
343+
}
344+
345+
private mergeProjectsData(existingProjects: any[], newProjects: Project[]): any[] {
346+
const existingProjectsMap = new Map();
347+
existingProjects.forEach(project => {
348+
existingProjectsMap.set(project.docUrl, project);
349+
});
350+
351+
// Convert new projects to metadata and update/add them
352+
newProjects.forEach(project => {
353+
const metadata = this.unifiedService.convertProjectToMetadata(project, "backup");
354+
existingProjectsMap.set(project.docUrl, metadata);
355+
});
356+
357+
return Array.from(existingProjectsMap.values());
358+
}
359+
360+
private mergeProjectData(existingProjectData: Map<string, any>, newProjectData: Map<string, any>): Map<string, any> {
361+
const mergedData = new Map(existingProjectData);
362+
363+
for (const [projectId, data] of newProjectData) {
364+
mergedData.set(projectId, data);
365+
}
366+
367+
return mergedData;
368+
}
369+
315370
private async processImport(
316371
filesystemData: any,
317372
projectId?: string,

0 commit comments

Comments
 (0)