esp32blockly/server/projects.js

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;