78 lines
2.3 KiB
JavaScript
78 lines
2.3 KiB
JavaScript
import { Router } from 'express';
|
|
import { requireAuth } from './auth.js';
|
|
import {
|
|
listProjectsByUser,
|
|
upsertProject,
|
|
getProjectByName,
|
|
deleteProjectByName,
|
|
} from './db.js';
|
|
|
|
const router = Router();
|
|
|
|
function isValidName(name) {
|
|
return typeof name === 'string' && name.trim().length > 0 && name.trim().length <= 128;
|
|
}
|
|
|
|
router.get('/', requireAuth, async (req, res) => {
|
|
try {
|
|
const rows = await listProjectsByUser(req.user.id);
|
|
const projects = rows.map((row) => ({
|
|
name: row.name,
|
|
state: JSON.parse(row.state_json),
|
|
updatedAt: row.updated_at,
|
|
}));
|
|
res.json({ projects });
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
router.post('/', requireAuth, async (req, res) => {
|
|
const { name, state } = req.body || {};
|
|
if (!isValidName(name)) return res.status(400).json({ error: 'Invalid project name' });
|
|
if (!state || typeof state !== 'object') return res.status(400).json({ error: 'Invalid project state' });
|
|
|
|
try {
|
|
await upsertProject({
|
|
userId: req.user.id,
|
|
name: name.trim(),
|
|
stateJson: JSON.stringify(state),
|
|
});
|
|
res.json({ ok: true });
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
router.get('/:name', requireAuth, async (req, res) => {
|
|
const name = decodeURIComponent(req.params.name || '');
|
|
if (!isValidName(name)) return res.status(400).json({ error: 'Invalid project name' });
|
|
|
|
try {
|
|
const row = await getProjectByName({ userId: req.user.id, name: name.trim() });
|
|
if (!row) return res.status(404).json({ error: 'Project not found' });
|
|
res.json({
|
|
name: row.name,
|
|
state: JSON.parse(row.state_json),
|
|
updatedAt: row.updated_at,
|
|
});
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
router.delete('/:name', requireAuth, async (req, res) => {
|
|
const name = decodeURIComponent(req.params.name || '');
|
|
if (!isValidName(name)) return res.status(400).json({ error: 'Invalid project name' });
|
|
|
|
try {
|
|
const ok = await deleteProjectByName({ userId: req.user.id, name: name.trim() });
|
|
if (!ok) return res.status(404).json({ error: 'Project not found' });
|
|
res.json({ ok: true });
|
|
} catch (err) {
|
|
res.status(500).json({ error: err.message });
|
|
}
|
|
});
|
|
|
|
export default router;
|