85 lines
3.3 KiB
JavaScript
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;
|