Files
Ulas Kalayci e48d249fbe chore: release v0.20.24
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-20 10:05:12 +02:00

63 lines
1.7 KiB
JavaScript

/**
* Modul: Globale Suche (Search)
* Zweck: Volltext-Suche über Aufgaben, Kalender-Events und Notizen
* Abhängigkeiten: express, server/db.js
*/
import express from 'express';
import * as db from '../db.js';
const router = express.Router();
const LIMIT = 5;
/**
* GET /api/v1/search?q=<query>
* Durchsucht Aufgaben, Kalender-Events und Notizen des Nutzers.
* Response: { tasks: Task[], events: Event[], notes: Note[] }
*/
router.get('/', (req, res) => {
try {
const q = String(req.query.q ?? '').trim();
if (q.length < 2) return res.json({ tasks: [], events: [], notes: [] });
const like = `%${q}%`;
const userId = req.session.userId;
const tasks = db.get().prepare(`
SELECT id, title, status, priority, due_date
FROM tasks
WHERE parent_task_id IS NULL
AND (created_by = ? OR assigned_to = ?)
AND (title LIKE ? OR description LIKE ?)
ORDER BY CASE status WHEN 'done' THEN 1 ELSE 0 END,
due_date ASC NULLS LAST
LIMIT ?
`).all(userId, userId, like, like, LIMIT);
const events = db.get().prepare(`
SELECT id, title, start_datetime, all_day
FROM calendar_events
WHERE created_by = ?
AND (title LIKE ? OR description LIKE ?)
ORDER BY start_datetime ASC
LIMIT ?
`).all(userId, like, like, LIMIT);
const notes = db.get().prepare(`
SELECT id, title, content
FROM notes
WHERE created_by = ?
AND (title LIKE ? OR content LIKE ?)
ORDER BY pinned DESC, updated_at DESC
LIMIT ?
`).all(userId, like, like, LIMIT);
res.json({ tasks, events, notes });
} catch (err) {
res.status(500).json({ error: 'Interner Fehler', code: 500 });
}
});
export default router;