import { Router } from 'express'; import { v4 as uuidv4 } from 'uuid'; import db from '../db.js'; import { authenticateToken } from '../middleware/auth.js'; const router = Router(); router.get('/search', authenticateToken, (req, res) => { const { q, tag } = req.query; let query = `SELECT f.*, l.name as lorebook_name FROM fragments f JOIN lorebooks l ON f.lorebook_id = l.id WHERE l.user_id = ?`; const params = [req.userId]; if (q) { query += ` AND (f.title LIKE ? OR f.content LIKE ?)`; params.push(`%${q}%`, `%${q}%`); } if (tag) { query += ` AND f.tags LIKE ?`; params.push(`%"${tag}"%`); } query += ` ORDER BY f.updated_at DESC LIMIT 50`; const fragments = db.prepare(query).all(...params); res.json({ fragments }); }); router.get('/:id', authenticateToken, (req, res) => { const fragment = db.prepare(` SELECT f.*, l.name as lorebook_name, l.user_id FROM fragments f JOIN lorebooks l ON f.lorebook_id = l.id WHERE f.id = ? AND l.user_id = ? `).get(req.params.id, req.userId); if (!fragment) return res.status(404).json({ error: 'Fragment not found' }); res.json({ fragment }); }); router.post('/lorebook/:lorebookId', authenticateToken, (req, res) => { const { title, content, tags, linked_characters } = req.body; if (!title) return res.status(400).json({ error: 'Title is required' }); const lorebook = db.prepare('SELECT * FROM lorebooks WHERE id = ? AND user_id = ?').get(req.params.lorebookId, req.userId); if (!lorebook) return res.status(404).json({ error: 'Lorebook not found' }); const id = uuidv4(); db.prepare('INSERT INTO fragments (id, lorebook_id, title, content, tags, linked_characters) VALUES (?, ?, ?, ?, ?, ?)') .run(id, req.params.lorebookId, title, content || '', JSON.stringify(tags || []), JSON.stringify(linked_characters || [])); const fragment = db.prepare('SELECT * FROM fragments WHERE id = ?').get(id); res.status(201).json({ fragment }); }); router.put('/:id', authenticateToken, (req, res) => { const { title, content, tags, linked_characters } = req.body; const fragment = db.prepare(` SELECT f.* FROM fragments f JOIN lorebooks l ON f.lorebook_id = l.id WHERE f.id = ? AND l.user_id = ? `).get(req.params.id, req.userId); if (!fragment) return res.status(404).json({ error: 'Fragment not found' }); db.prepare('UPDATE fragments SET title = ?, content = ?, tags = ?, linked_characters = ?, updated_at = datetime(\'now\') WHERE id = ?') .run( title || fragment.title, content !== undefined ? content : fragment.content, tags ? JSON.stringify(tags) : fragment.tags, linked_characters ? JSON.stringify(linked_characters) : fragment.linked_characters, req.params.id ); const updated = db.prepare('SELECT * FROM fragments WHERE id = ?').get(req.params.id); res.json({ fragment: updated }); }); router.delete('/:id', authenticateToken, (req, res) => { const fragment = db.prepare(` SELECT f.* FROM fragments f JOIN lorebooks l ON f.lorebook_id = l.id WHERE f.id = ? AND l.user_id = ? `).get(req.params.id, req.userId); if (!fragment) return res.status(404).json({ error: 'Fragment not found' }); db.prepare('DELETE FROM fragments WHERE id = ?').run(req.params.id); res.json({ message: 'Fragment deleted' }); }); export default router;