"use strict"; const noteCacheService = require('../../services/note_cache/note_cache.js'); const repository = require('../../services/repository'); const log = require('../../services/log'); const utils = require('../../services/utils'); const optionService = require('../../services/options'); async function getAutocomplete(req) { const query = req.query.query.trim(); const activeNoteId = req.query.activeNoteId || 'none'; let results; const timestampStarted = Date.now(); if (query.length === 0) { results = await getRecentNotes(activeNoteId); } else { results = await noteCacheService.findNotesForAutocomplete(query); } const msTaken = Date.now() - timestampStarted; if (msTaken >= 100) { log.info(`Slow autocomplete took ${msTaken}ms`); } return results; } async function getRecentNotes(activeNoteId) { let extraCondition = ''; const hoistedNoteId = await optionService.getOption('hoistedNoteId'); if (hoistedNoteId !== 'root') { extraCondition = `AND recent_notes.notePath LIKE '%${utils.sanitizeSql(hoistedNoteId)}%'`; } const recentNotes = await repository.getEntities(` SELECT recent_notes.* FROM recent_notes JOIN notes USING(noteId) WHERE recent_notes.isDeleted = 0 AND notes.isDeleted = 0 AND notes.noteId != ? ${extraCondition} ORDER BY utcDateCreated DESC LIMIT 200`, [activeNoteId]); return recentNotes.map(rn => { const title = noteCacheService.getNoteTitleForPath(rn.notePath.split('/')); return { notePath: rn.notePath, notePathTitle: title, highlightedNotePathTitle: utils.escapeHtml(title) }; }); } module.exports = { getAutocomplete };