From dcfc1119ebf9d609e55bd8656a0dd598d18369a4 Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Mon, 9 Feb 2026 18:38:51 +0200 Subject: [PATCH] chore(core): port sql route --- apps/server/src/routes/routes.ts | 5 +---- .../trilium-core}/src/routes/api/sql.ts | 8 +++++--- packages/trilium-core/src/routes/index.ts | 4 ++++ 3 files changed, 10 insertions(+), 7 deletions(-) rename {apps/server => packages/trilium-core}/src/routes/api/sql.ts (91%) diff --git a/apps/server/src/routes/routes.ts b/apps/server/src/routes/routes.ts index 9bbc88390d..ab378fd18b 100644 --- a/apps/server/src/routes/routes.ts +++ b/apps/server/src/routes/routes.ts @@ -11,9 +11,9 @@ import etapiBackupRoute from "../etapi/backup.js"; import etapiBranchRoutes from "../etapi/branches.js"; import etapiMetricsRoute from "../etapi/metrics.js"; import etapiNoteRoutes from "../etapi/notes.js"; +import etapiRevisionsRoutes from "../etapi/revisions.js"; import etapiSpecRoute from "../etapi/spec.js"; import etapiSpecialNoteRoutes from "../etapi/special_notes.js"; -import etapiRevisionsRoutes from "../etapi/revisions.js"; import auth from "../services/auth.js"; import openID from '../services/open_id.js'; import { isElectron } from "../services/utils.js"; @@ -49,7 +49,6 @@ import senderRoute from "./api/sender.js"; import setupApiRoute from "./api/setup.js"; import similarNotesRoute from "./api/similar_notes.js"; import specialNotesRoute from "./api/special_notes.js"; -import sqlRoute from "./api/sql.js"; import syncApiRoute from "./api/sync.js"; import systemInfoRoute from "./api/system_info.js"; import totp from './api/totp.js'; @@ -246,8 +245,6 @@ function register(app: express.Application) { apiRoute(PST, "/api/special-notes/launchers/:parentNoteId/:launcherType", specialNotesRoute.createLauncher); apiRoute(PUT, "/api/special-notes/api-script-launcher", specialNotesRoute.createOrUpdateScriptLauncherFromApi); - apiRoute(GET, "/api/sql/schema", sqlRoute.getSchema); - apiRoute(PST, "/api/sql/execute/:noteId", sqlRoute.execute); asyncRoute(PST, "/api/database/anonymize/:type", [auth.checkApiAuthOrElectron, csrfMiddleware], databaseRoute.anonymize, apiResultHandler); apiRoute(GET, "/api/database/anonymized-databases", databaseRoute.getExistingAnonymizedDatabases); diff --git a/apps/server/src/routes/api/sql.ts b/packages/trilium-core/src/routes/api/sql.ts similarity index 91% rename from apps/server/src/routes/api/sql.ts rename to packages/trilium-core/src/routes/api/sql.ts index 71c404a9d0..f7f8f61dc0 100644 --- a/apps/server/src/routes/api/sql.ts +++ b/packages/trilium-core/src/routes/api/sql.ts @@ -1,9 +1,9 @@ -import { ValidationError } from "@triliumnext/core"; import type { Request } from "express"; import becca from "../../becca/becca.js"; -import sql from "../../services/sql.js"; -import { safeExtractMessageAndStackFromError } from "../../services/utils.js"; +import { getSql } from "../../services/sql/index.js"; +import { ValidationError } from "../../errors.js"; +import { safeExtractMessageAndStackFromError } from "../../services/utils/index.js"; interface Table { name: string; @@ -11,6 +11,7 @@ interface Table { } function getSchema() { + const sql = getSql(); const tableNames = sql.getColumn(/*sql*/`SELECT name FROM sqlite_master WHERE type='table' AND name NOT LIKE 'sqlite_%' ORDER BY name`); const tables: Table[] = []; @@ -25,6 +26,7 @@ function getSchema() { } function execute(req: Request) { + const sql = getSql(); const note = becca.getNoteOrThrow(req.params.noteId); const content = note.getContent(); diff --git a/packages/trilium-core/src/routes/index.ts b/packages/trilium-core/src/routes/index.ts index e2dac9f092..4cb2befa39 100644 --- a/packages/trilium-core/src/routes/index.ts +++ b/packages/trilium-core/src/routes/index.ts @@ -11,6 +11,7 @@ import appInfoRoute from "./api/app_info"; import statsRoute from "./api/stats"; import AbstractBeccaEntity from "../becca/entities/abstract_becca_entity"; import cloningApiRoute from "./api/cloning"; +import sqlRoute from "./api/sql"; // TODO: Deduplicate with routes.ts const GET = "get", @@ -81,6 +82,9 @@ export function buildSharedApiRoutes(apiRoute: any) { apiRoute(GET, "/api/stats/note-size/:noteId", statsRoute.getNoteSize); apiRoute(GET, "/api/stats/subtree-size/:noteId", statsRoute.getSubtreeSize); + apiRoute(GET, "/api/sql/schema", sqlRoute.getSchema); + apiRoute(PST, "/api/sql/execute/:noteId", sqlRoute.execute); + apiRoute(GET, "/api/app-info", appInfoRoute.getAppInfo); apiRoute(GET, "/api/other/icon-usage", otherRoute.getIconUsage); }