chore(core): port revisions route

This commit is contained in:
Elian Doran 2026-02-09 19:38:24 +02:00
parent 969860c344
commit 08f1d44d90
No known key found for this signature in database
3 changed files with 23 additions and 20 deletions

View File

@ -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);

View File

@ -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<string>("SELECT revisionId FROM revisions WHERE noteId = ?", [req.params.noteId]);
const revisionIdsToErase = getSql().getColumn<string>("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<string>(/*sql*/`\
const noteIds = getSql().getColumn<string>(/*sql*/`\
SELECT notes.*
FROM notes
WHERE noteId IN (

View File

@ -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);