mirror of
https://github.com/zadam/trilium.git
synced 2025-11-17 18:50:41 +01:00
chore(monorepo/server): move server-side source code
This commit is contained in:
95
apps/server/src/routes/api/autocomplete.ts
Normal file
95
apps/server/src/routes/api/autocomplete.ts
Normal file
@@ -0,0 +1,95 @@
|
||||
"use strict";
|
||||
|
||||
import beccaService from "../../becca/becca_service.js";
|
||||
import searchService from "../../services/search/services/search.js";
|
||||
import log from "../../services/log.js";
|
||||
import utils from "../../services/utils.js";
|
||||
import cls from "../../services/cls.js";
|
||||
import becca from "../../becca/becca.js";
|
||||
import type { Request } from "express";
|
||||
import ValidationError from "../../errors/validation_error.js";
|
||||
import sql from "../../services/sql.js";
|
||||
|
||||
function getAutocomplete(req: Request) {
|
||||
if (typeof req.query.query !== "string") {
|
||||
throw new ValidationError("Invalid query data type.");
|
||||
}
|
||||
const query = (req.query.query || "").trim();
|
||||
const fastSearch = String(req.query.fastSearch).toLowerCase() === "false" ? false : true;
|
||||
|
||||
const activeNoteId = req.query.activeNoteId || "none";
|
||||
|
||||
let results;
|
||||
|
||||
const timestampStarted = Date.now();
|
||||
|
||||
if (query.length === 0 && typeof activeNoteId === "string") {
|
||||
results = getRecentNotes(activeNoteId);
|
||||
} else {
|
||||
results = searchService.searchNotesForAutocomplete(query, fastSearch);
|
||||
}
|
||||
|
||||
const msTaken = Date.now() - timestampStarted;
|
||||
|
||||
if (msTaken >= 100) {
|
||||
log.info(`Slow autocomplete took ${msTaken}ms`);
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
function getRecentNotes(activeNoteId: string) {
|
||||
let extraCondition = "";
|
||||
const params = [activeNoteId];
|
||||
|
||||
const hoistedNoteId = cls.getHoistedNoteId();
|
||||
if (hoistedNoteId !== "root") {
|
||||
extraCondition = `AND recent_notes.notePath LIKE ?`;
|
||||
params.push(`%${hoistedNoteId}%`);
|
||||
}
|
||||
|
||||
const recentNotes = becca.getRecentNotesFromQuery(
|
||||
`
|
||||
SELECT
|
||||
recent_notes.*
|
||||
FROM
|
||||
recent_notes
|
||||
JOIN notes USING(noteId)
|
||||
WHERE
|
||||
notes.isDeleted = 0
|
||||
AND notes.noteId != ?
|
||||
${extraCondition}
|
||||
ORDER BY
|
||||
utcDateCreated DESC
|
||||
LIMIT 200`,
|
||||
params
|
||||
);
|
||||
|
||||
return recentNotes.map((rn) => {
|
||||
const notePathArray = rn.notePath.split("/");
|
||||
|
||||
const { title, icon } = beccaService.getNoteTitleAndIcon(notePathArray[notePathArray.length - 1]);
|
||||
const notePathTitle = beccaService.getNoteTitleForPath(notePathArray);
|
||||
|
||||
return {
|
||||
notePath: rn.notePath,
|
||||
noteTitle: title,
|
||||
notePathTitle,
|
||||
highlightedNotePathTitle: utils.escapeHtml(notePathTitle),
|
||||
icon: icon ?? "bx bx-note"
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
// Get the total number of notes
|
||||
function getNotesCount(req: Request) {
|
||||
const notesCount = sql.getRow(
|
||||
/*sql*/`SELECT COUNT(*) AS count FROM notes WHERE isDeleted = 0;`,
|
||||
) as { count: number };
|
||||
return notesCount.count;
|
||||
}
|
||||
|
||||
export default {
|
||||
getAutocomplete,
|
||||
getNotesCount
|
||||
};
|
||||
Reference in New Issue
Block a user