sandbox/server/routes/fragments.js

85 lines
3.3 KiB
JavaScript

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;