From 5f1075879fe29131c7f0fe5b42671e64a3ee6a77 Mon Sep 17 00:00:00 2001 From: Andras Schmelczer Date: Tue, 10 Dec 2024 22:24:31 +0000 Subject: [PATCH] Extract event handlers --- plugin/src/events/sync-event-handler.ts | 74 ++++--------------- .../sync-locally-deleted-file.ts | 22 ++++++ .../sync-locally-renamed-file.ts | 30 ++++++++ .../sync-locally-updated-file.ts | 36 +++++++++ .../src/sync-functions/sync-new-local-file.ts | 29 ++++++++ 5 files changed, 130 insertions(+), 61 deletions(-) create mode 100644 plugin/src/sync-functions/sync-locally-deleted-file.ts create mode 100644 plugin/src/sync-functions/sync-locally-renamed-file.ts create mode 100644 plugin/src/sync-functions/sync-locally-updated-file.ts create mode 100644 plugin/src/sync-functions/sync-new-local-file.ts diff --git a/plugin/src/events/sync-event-handler.ts b/plugin/src/events/sync-event-handler.ts index 9ca66cc5..2c091bf0 100644 --- a/plugin/src/events/sync-event-handler.ts +++ b/plugin/src/events/sync-event-handler.ts @@ -3,6 +3,10 @@ import { FileEventHandler } from "./file-event-handler"; import { Logger } from "src/logger"; import { SyncServer } from "src/services/sync_service"; import { Database } from "src/database/database"; +import { syncLocallyDeletedFile } from "src/sync-functions/sync-locally-deleted-file"; +import { syncLocallyRenamedFile } from "src/sync-functions/sync-locally-renamed-file"; +import { syncLocallyUpdatedFile } from "src/sync-functions/sync-locally-updated-file"; +import { syncNewLocalFile } from "src/sync-functions/sync-new-local-file"; export class SyncEventHandler implements FileEventHandler { constructor(private database: Database, private syncServer: SyncServer) {} @@ -10,18 +14,7 @@ export class SyncEventHandler implements FileEventHandler { async onCreate(file: TAbstractFile): Promise { if (file instanceof TFile) { Logger.getInstance().info(`File created: ${file.path}`); - - const result = await this.syncServer.create({ - relativePath: file.path, - content: await file.vault.readBinary(file), - createdDate: new Date(file.stat.ctime), - }); - - await this.database.setDocument({ - relativePath: file.path, - documentId: result.documentId, - parentVersionId: result.versionId, - }); + syncNewLocalFile(this.database, this.syncServer, file); } else { Logger.getInstance().info(`Folder created: ${file.path}, ignored`); } @@ -30,18 +23,7 @@ export class SyncEventHandler implements FileEventHandler { async onDelete(file: TAbstractFile): Promise { if (file instanceof TFile) { Logger.getInstance().info(`File deleted: ${file.path}`); - - const metadata = this.database.getDocument(file.path); - if (!metadata) { - throw `Document metadata not found for ${file.path}`; - } - - await this.syncServer.delete({ - documentId: metadata.documentId, - createdDate: new Date(), // We got the event now, so it must have been deleted now - }); - - await this.database.removeDocument(file.path); + syncLocallyDeletedFile(this.database, this.syncServer, file.path); } else { Logger.getInstance().info(`Folder deleted: ${file.path}, ignored`); } @@ -51,25 +33,12 @@ export class SyncEventHandler implements FileEventHandler { Logger.getInstance().info(`File renamed: ${oldPath} -> ${file.path}`); if (file instanceof TFile) { - const metadata = this.database.getDocument(oldPath); - if (!metadata) { - throw `Document metadata not found for ${oldPath}`; - } - - const response = await this.syncServer.update({ - documentId: metadata.documentId, - parentVersionId: metadata.parentVersionId, - relativePath: file.path, - content: await file.vault.readBinary(file), - createdDate: new Date(file.stat.ctime), - }); - - await this.database.moveDocument({ - oldRelativePath: oldPath, - relativePath: file.path, - documentId: response.documentId, - parentVersionId: response.versionId, - }); + syncLocallyRenamedFile( + this.database, + this.syncServer, + file, + oldPath + ); } else { Logger.getInstance().info( `Folder renamed: ${oldPath} -> ${file.path}, ignored` @@ -81,24 +50,7 @@ export class SyncEventHandler implements FileEventHandler { Logger.getInstance().info(`File modified: ${file.path}`); if (file instanceof TFile) { - const metadata = this.database.getDocument(file.path); - if (!metadata) { - throw `Document metadata not found for ${file.path}`; - } - - const response = await this.syncServer.update({ - documentId: metadata.documentId, - parentVersionId: metadata.parentVersionId, - relativePath: file.path, - content: await file.vault.readBinary(file), - createdDate: new Date(file.stat.ctime), - }); - - await this.database.setDocument({ - relativePath: file.path, - documentId: response.documentId, - parentVersionId: response.versionId, - }); + syncLocallyUpdatedFile(this.database, this.syncServer, file); } else { Logger.getInstance().info(`Folder modified: ${file.path}, ignored`); } diff --git a/plugin/src/sync-functions/sync-locally-deleted-file.ts b/plugin/src/sync-functions/sync-locally-deleted-file.ts new file mode 100644 index 00000000..f0d85075 --- /dev/null +++ b/plugin/src/sync-functions/sync-locally-deleted-file.ts @@ -0,0 +1,22 @@ +import { TFile } from "obsidian"; +import { Database } from "src/database/database"; +import { RelativePath } from "src/database/document-metadata"; +import { SyncServer } from "src/services/sync_service"; + +export async function syncLocallyDeletedFile( + database: Database, + syncServer: SyncServer, + path: RelativePath +) { + const metadata = database.getDocument(path); + if (!metadata) { + throw `Document metadata not found for ${path}`; + } + + await syncServer.delete({ + documentId: metadata.documentId, + createdDate: new Date(), // We got the event now, so it must have been deleted now + }); + + await database.removeDocument(path); +} diff --git a/plugin/src/sync-functions/sync-locally-renamed-file.ts b/plugin/src/sync-functions/sync-locally-renamed-file.ts new file mode 100644 index 00000000..cd7f4fad --- /dev/null +++ b/plugin/src/sync-functions/sync-locally-renamed-file.ts @@ -0,0 +1,30 @@ +import { TFile } from "obsidian"; +import { Database } from "src/database/database"; +import { SyncServer } from "src/services/sync_service"; + +export async function syncLocallyRenamedFile( + database: Database, + syncServer: SyncServer, + file: TFile, + oldPath: string +) { + const metadata = database.getDocument(oldPath); + if (!metadata) { + throw `Document metadata not found for ${oldPath}`; + } + + const response = await syncServer.update({ + documentId: metadata.documentId, + parentVersionId: metadata.parentVersionId, + relativePath: file.path, + content: await file.vault.readBinary(file), + createdDate: new Date(file.stat.ctime), + }); + + await database.moveDocument({ + oldRelativePath: oldPath, + relativePath: file.path, + documentId: response.documentId, + parentVersionId: response.versionId, + }); +} diff --git a/plugin/src/sync-functions/sync-locally-updated-file.ts b/plugin/src/sync-functions/sync-locally-updated-file.ts new file mode 100644 index 00000000..43182cfe --- /dev/null +++ b/plugin/src/sync-functions/sync-locally-updated-file.ts @@ -0,0 +1,36 @@ +import { TFile } from "obsidian"; +import { Database } from "src/database/database"; +import { SyncServer } from "src/services/sync_service"; + +export async function syncLocallyUpdatedFile( + database: Database, + syncServer: SyncServer, + file: TFile +) { + const metadata = database.getDocument(file.path); + if (!metadata) { + throw `Document metadata not found for ${file.path}`; + } + + const response = await syncServer.update({ + documentId: metadata.documentId, + parentVersionId: metadata.parentVersionId, + relativePath: file.path, + content: await file.vault.readBinary(file), + createdDate: new Date(file.stat.ctime), + }); + + if (file.path !== response.relativePath) { + file.vault.rename(file, response.relativePath); + } + + if ((await file.vault.read(file)) !== response.contentBase64) { + // todo - reconcile + } + + await database.setDocument({ + relativePath: file.path, + documentId: response.documentId, + parentVersionId: response.versionId, + }); +} diff --git a/plugin/src/sync-functions/sync-new-local-file.ts b/plugin/src/sync-functions/sync-new-local-file.ts new file mode 100644 index 00000000..656d7966 --- /dev/null +++ b/plugin/src/sync-functions/sync-new-local-file.ts @@ -0,0 +1,29 @@ +import { TFile } from "obsidian"; +import { Database } from "src/database/database"; +import { SyncServer } from "src/services/sync_service"; + +export async function syncNewLocalFile( + database: Database, + syncServer: SyncServer, + file: TFile +) { + const response = await syncServer.create({ + relativePath: file.path, + content: await file.vault.readBinary(file), + createdDate: new Date(file.stat.ctime), + }); + + if (file.path !== response.relativePath) { + file.vault.rename(file, response.relativePath); + } + + if ((await file.vault.read(file)) !== response.contentBase64) { + // todo - reconcile + } + + await database.setDocument({ + relativePath: response.relativePath, + documentId: response.documentId, + parentVersionId: response.versionId, + }); +}