diff --git a/apps/server/src/routes/routes.ts b/apps/server/src/routes/routes.ts index 2f209795cc..69a3edc123 100644 --- a/apps/server/src/routes/routes.ts +++ b/apps/server/src/routes/routes.ts @@ -41,7 +41,6 @@ import passwordApiRoute from "./api/password.js"; import recentChangesApiRoute from "./api/recent_changes.js"; import recoveryCodes from './api/recovery_codes.js'; import relationMapApiRoute from "./api/relation-map.js"; -import revisionsApiRoute from "./api/revisions.js"; import scriptRoute from "./api/script.js"; import searchRoute from "./api/search.js"; import senderRoute from "./api/sender.js"; @@ -136,16 +135,10 @@ function register(app: express.Application) { apiRoute(PST, "/api/attachments/:attachmentId/upload-modified-file", filesRoute.uploadModifiedFileToAttachment); route(PUT, "/api/attachments/:attachmentId/file", [auth.checkApiAuthOrElectron, uploadMiddlewareWithErrorHandling, csrfMiddleware], filesRoute.updateAttachment, apiResultHandler); - apiRoute(GET, "/api/notes/:noteId/revisions", revisionsApiRoute.getRevisions); - apiRoute(DEL, "/api/notes/:noteId/revisions", revisionsApiRoute.eraseAllRevisions); - apiRoute(PST, "/api/revisions/erase-all-excess-revisions", revisionsApiRoute.eraseAllExcessRevisions); - apiRoute(GET, "/api/revisions/:revisionId", revisionsApiRoute.getRevision); - apiRoute(GET, "/api/revisions/:revisionId/blob", revisionsApiRoute.getRevisionBlob); - apiRoute(DEL, "/api/revisions/:revisionId", revisionsApiRoute.eraseRevision); - apiRoute(PST, "/api/revisions/:revisionId/restore", revisionsApiRoute.restoreRevision); route(GET, "/api/revisions/:revisionId/image/:filename", [auth.checkApiAuthOrElectron], imageRoute.returnImageFromRevision); - route(GET, "/api/revisions/:revisionId/download", [auth.checkApiAuthOrElectron], revisionsApiRoute.downloadRevision); + // TODO: Re-enable once we suppourt route() + // route(GET, "/api/revisions/:revisionId/download", [auth.checkApiAuthOrElectron], revisionsApiRoute.downloadRevision); route(GET, "/api/branches/:branchId/export/:type/:format/:version/:taskId", [auth.checkApiAuthOrElectron], exportRoute.exportBranch); asyncRoute(PST, "/api/notes/:parentNoteId/notes-import", [auth.checkApiAuthOrElectron, uploadMiddlewareWithErrorHandling, csrfMiddleware], importRoute.importNotesToBranch, apiResultHandler); @@ -271,7 +264,6 @@ function register(app: express.Application) { apiRoute(PST, "/api/other/render-markdown", otherRoute.renderMarkdown); apiRoute(PST, "/api/other/to-markdown", otherRoute.toMarkdown); apiRoute(GET, "/api/recent-changes/:ancestorNoteId", recentChangesApiRoute.getRecentChanges); - apiRoute(GET, "/api/edited-notes/:date", revisionsApiRoute.getEditedNotesOnDate); apiRoute(PST, "/api/note-map/:noteId/tree", noteMapRoute.getTreeMap); apiRoute(PST, "/api/note-map/:noteId/link", noteMapRoute.getLinkMap); diff --git a/apps/server/src/routes/api/revisions.ts b/packages/trilium-core/src/routes/api/revisions.ts similarity index 87% rename from apps/server/src/routes/api/revisions.ts rename to packages/trilium-core/src/routes/api/revisions.ts index afa5a3c39b..37421adc45 100644 --- a/apps/server/src/routes/api/revisions.ts +++ b/packages/trilium-core/src/routes/api/revisions.ts @@ -1,14 +1,15 @@ import { EditedNotesResponse, RevisionItem, RevisionPojo } from "@triliumnext/commons"; -import { becca_service, binary_utils, blob as blobService, erase as eraseService, NotePojo } from "@triliumnext/core"; import type { Request, Response } from "express"; import path from "path"; import becca from "../../becca/becca.js"; import type BNote from "../../becca/entities/bnote.js"; import type BRevision from "../../becca/entities/brevision.js"; -import cls from "../../services/cls.js"; -import sql from "../../services/sql.js"; -import utils from "../../services/utils.js"; +import blobService from "../../services/blob.js"; +import eraseService from "../../services/erase.js"; +import { NotePojo } from "../../becca/becca-interface.js"; +import { becca_service, binary_utils, cls, getSql } from "../../index.js"; +import { formatDownloadTitle, getContentDisposition } from "../../services/utils/index.js"; interface NotePath { noteId: string; @@ -60,7 +61,7 @@ function getRevision(req: Request) { } function getRevisionFilename(revision: BRevision) { - let filename = utils.formatDownloadTitle(revision.title, revision.type, revision.mime); + let filename = formatDownloadTitle(revision.title, revision.type, revision.mime); if (!revision.dateCreated) { throw new Error("Missing creation date for revision."); @@ -90,14 +91,14 @@ function downloadRevision(req: Request, res: Response) { const filename = getRevisionFilename(revision); - res.setHeader("Content-Disposition", utils.getContentDisposition(filename)); + res.setHeader("Content-Disposition", getContentDisposition(filename)); res.setHeader("Content-Type", revision.mime); res.send(revision.getContent()); } function eraseAllRevisions(req: Request) { - const revisionIdsToErase = sql.getColumn("SELECT revisionId FROM revisions WHERE noteId = ?", [req.params.noteId]); + const revisionIdsToErase = getSql().getColumn("SELECT revisionId FROM revisions WHERE noteId = ?", [req.params.noteId]); eraseService.eraseRevisions(revisionIdsToErase); } @@ -107,7 +108,7 @@ function eraseRevision(req: Request) { } function eraseAllExcessRevisions() { - const allNoteIds = sql.getRows("SELECT noteId FROM notes WHERE SUBSTRING(noteId, 1, 1) != '_'") as { noteId: string }[]; + const allNoteIds = getSql().getRows("SELECT noteId FROM notes WHERE SUBSTRING(noteId, 1, 1) != '_'") as { noteId: string }[]; allNoteIds.forEach((row) => { becca.getNote(row.noteId)?.eraseExcessRevisionSnapshots(); }); @@ -119,7 +120,7 @@ function restoreRevision(req: Request) { if (revision) { const note = revision.getNote(); - sql.transactional(() => { + getSql().transactional(() => { note.saveRevision(); for (const oldNoteAttachment of note.getAttachments()) { @@ -148,7 +149,7 @@ function restoreRevision(req: Request) { } function getEditedNotesOnDate(req: Request) { - const noteIds = sql.getColumn(/*sql*/`\ + const noteIds = getSql().getColumn(/*sql*/`\ SELECT notes.* FROM notes WHERE noteId IN ( diff --git a/packages/trilium-core/src/routes/index.ts b/packages/trilium-core/src/routes/index.ts index 2aca61bfe5..5233437861 100644 --- a/packages/trilium-core/src/routes/index.ts +++ b/packages/trilium-core/src/routes/index.ts @@ -13,6 +13,7 @@ import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity"; import cloningApiRoute from "./api/cloning"; import sqlRoute from "./api/sql"; import attributesRoute from "./api/attributes"; +import revisionsApiRoute from "./api/revisions"; // TODO: Deduplicate with routes.ts const GET = "get", @@ -70,6 +71,15 @@ export function buildSharedApiRoutes(apiRoute: any) { apiRoute(GET, "/api/attribute-names/", attributesRoute.getAttributeNames); apiRoute(GET, "/api/attribute-values/:attributeName", attributesRoute.getValuesForAttribute); + apiRoute(GET, "/api/notes/:noteId/revisions", revisionsApiRoute.getRevisions); + apiRoute(DEL, "/api/notes/:noteId/revisions", revisionsApiRoute.eraseAllRevisions); + apiRoute(PST, "/api/revisions/erase-all-excess-revisions", revisionsApiRoute.eraseAllExcessRevisions); + apiRoute(GET, "/api/revisions/:revisionId", revisionsApiRoute.getRevision); + apiRoute(GET, "/api/revisions/:revisionId/blob", revisionsApiRoute.getRevisionBlob); + apiRoute(DEL, "/api/revisions/:revisionId", revisionsApiRoute.eraseRevision); + apiRoute(PST, "/api/revisions/:revisionId/restore", revisionsApiRoute.restoreRevision); + apiRoute(GET, "/api/edited-notes/:date", revisionsApiRoute.getEditedNotesOnDate); + apiRoute(PUT, "/api/branches/:branchId/move-to/:parentBranchId", branchesApiRoute.moveBranchToParent); apiRoute(PUT, "/api/branches/:branchId/move-before/:beforeBranchId", branchesApiRoute.moveBranchBeforeNote); apiRoute(PUT, "/api/branches/:branchId/move-after/:afterBranchId", branchesApiRoute.moveBranchAfterNote);