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 recentChangesApiRoute from "./api/recent_changes.js";
import recoveryCodes from './api/recovery_codes.js'; import recoveryCodes from './api/recovery_codes.js';
import relationMapApiRoute from "./api/relation-map.js"; import relationMapApiRoute from "./api/relation-map.js";
import revisionsApiRoute from "./api/revisions.js";
import scriptRoute from "./api/script.js"; import scriptRoute from "./api/script.js";
import searchRoute from "./api/search.js"; import searchRoute from "./api/search.js";
import senderRoute from "./api/sender.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); apiRoute(PST, "/api/attachments/:attachmentId/upload-modified-file", filesRoute.uploadModifiedFileToAttachment);
route(PUT, "/api/attachments/:attachmentId/file", [auth.checkApiAuthOrElectron, uploadMiddlewareWithErrorHandling, csrfMiddleware], filesRoute.updateAttachment, apiResultHandler); 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/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); 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); 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/render-markdown", otherRoute.renderMarkdown);
apiRoute(PST, "/api/other/to-markdown", otherRoute.toMarkdown); apiRoute(PST, "/api/other/to-markdown", otherRoute.toMarkdown);
apiRoute(GET, "/api/recent-changes/:ancestorNoteId", recentChangesApiRoute.getRecentChanges); 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/tree", noteMapRoute.getTreeMap);
apiRoute(PST, "/api/note-map/:noteId/link", noteMapRoute.getLinkMap); apiRoute(PST, "/api/note-map/:noteId/link", noteMapRoute.getLinkMap);

View File

@ -1,14 +1,15 @@
import { EditedNotesResponse, RevisionItem, RevisionPojo } from "@triliumnext/commons"; 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 type { Request, Response } from "express";
import path from "path"; import path from "path";
import becca from "../../becca/becca.js"; import becca from "../../becca/becca.js";
import type BNote from "../../becca/entities/bnote.js"; import type BNote from "../../becca/entities/bnote.js";
import type BRevision from "../../becca/entities/brevision.js"; import type BRevision from "../../becca/entities/brevision.js";
import cls from "../../services/cls.js"; import blobService from "../../services/blob.js";
import sql from "../../services/sql.js"; import eraseService from "../../services/erase.js";
import utils from "../../services/utils.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 { interface NotePath {
noteId: string; noteId: string;
@ -60,7 +61,7 @@ function getRevision(req: Request) {
} }
function getRevisionFilename(revision: BRevision) { 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) { if (!revision.dateCreated) {
throw new Error("Missing creation date for revision."); throw new Error("Missing creation date for revision.");
@ -90,14 +91,14 @@ function downloadRevision(req: Request, res: Response) {
const filename = getRevisionFilename(revision); const filename = getRevisionFilename(revision);
res.setHeader("Content-Disposition", utils.getContentDisposition(filename)); res.setHeader("Content-Disposition", getContentDisposition(filename));
res.setHeader("Content-Type", revision.mime); res.setHeader("Content-Type", revision.mime);
res.send(revision.getContent()); res.send(revision.getContent());
} }
function eraseAllRevisions(req: Request) { 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); eraseService.eraseRevisions(revisionIdsToErase);
} }
@ -107,7 +108,7 @@ function eraseRevision(req: Request) {
} }
function eraseAllExcessRevisions() { 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) => { allNoteIds.forEach((row) => {
becca.getNote(row.noteId)?.eraseExcessRevisionSnapshots(); becca.getNote(row.noteId)?.eraseExcessRevisionSnapshots();
}); });
@ -119,7 +120,7 @@ function restoreRevision(req: Request) {
if (revision) { if (revision) {
const note = revision.getNote(); const note = revision.getNote();
sql.transactional(() => { getSql().transactional(() => {
note.saveRevision(); note.saveRevision();
for (const oldNoteAttachment of note.getAttachments()) { for (const oldNoteAttachment of note.getAttachments()) {
@ -148,7 +149,7 @@ function restoreRevision(req: Request) {
} }
function getEditedNotesOnDate(req: Request) { function getEditedNotesOnDate(req: Request) {
const noteIds = sql.getColumn<string>(/*sql*/`\ const noteIds = getSql().getColumn<string>(/*sql*/`\
SELECT notes.* SELECT notes.*
FROM notes FROM notes
WHERE noteId IN ( WHERE noteId IN (

View File

@ -13,6 +13,7 @@ import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity";
import cloningApiRoute from "./api/cloning"; import cloningApiRoute from "./api/cloning";
import sqlRoute from "./api/sql"; import sqlRoute from "./api/sql";
import attributesRoute from "./api/attributes"; import attributesRoute from "./api/attributes";
import revisionsApiRoute from "./api/revisions";
// TODO: Deduplicate with routes.ts // TODO: Deduplicate with routes.ts
const GET = "get", const GET = "get",
@ -70,6 +71,15 @@ export function buildSharedApiRoutes(apiRoute: any) {
apiRoute(GET, "/api/attribute-names/", attributesRoute.getAttributeNames); apiRoute(GET, "/api/attribute-names/", attributesRoute.getAttributeNames);
apiRoute(GET, "/api/attribute-values/:attributeName", attributesRoute.getValuesForAttribute); 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-to/:parentBranchId", branchesApiRoute.moveBranchToParent);
apiRoute(PUT, "/api/branches/:branchId/move-before/:beforeBranchId", branchesApiRoute.moveBranchBeforeNote); apiRoute(PUT, "/api/branches/:branchId/move-before/:beforeBranchId", branchesApiRoute.moveBranchBeforeNote);
apiRoute(PUT, "/api/branches/:branchId/move-after/:afterBranchId", branchesApiRoute.moveBranchAfterNote); apiRoute(PUT, "/api/branches/:branchId/move-after/:afterBranchId", branchesApiRoute.moveBranchAfterNote);