import express from 'express'; import { getDraftForUser, saveDraftForUser } from './db.ts'; import { loginUser, logoutSession, registerUser, requireAuth, resolveSession } from './auth.ts'; import type { DraftPayload } from './types.ts'; const app = express(); const port = Number(process.env.PORT || 8787); app.use(express.json({ limit: '10mb' })); app.get('/api/health', (_req, res) => { res.json({ ok: true }); }); app.post('/api/auth/register', (req, res) => { const username = String(req.body?.username || '').trim(); const password = String(req.body?.password || ''); if (username.length < 3 || password.length < 6) { res.status(400).json({ error: '账号至少 3 位,密码至少 6 位' }); return; } try { const result = registerUser(username, password); res.json(result); } catch (error) { res.status(400).json({ error: error instanceof Error ? error.message : '注册失败' }); } }); app.post('/api/auth/login', (req, res) => { const username = String(req.body?.username || '').trim(); const password = String(req.body?.password || ''); if (!username || !password) { res.status(400).json({ error: '请输入账号和密码' }); return; } try { const result = loginUser(username, password); res.json(result); } catch (error) { res.status(401).json({ error: error instanceof Error ? error.message : '登录失败' }); } }); app.get('/api/auth/session', (req, res) => { const header = req.headers.authorization || ''; const token = header.startsWith('Bearer ') ? header.slice(7) : ''; if (!token) { res.status(401).json({ error: '未登录' }); return; } const user = resolveSession(token); if (!user) { res.status(401).json({ error: '登录已失效' }); return; } res.json({ user }); }); app.post('/api/auth/logout', requireAuth, (req, res) => { if (req.authToken) { logoutSession(req.authToken); } res.json({ ok: true }); }); app.get('/api/draft/current', requireAuth, (req, res) => { const draft = getDraftForUser(req.authUser!.id); res.json({ draft }); }); app.post('/api/draft/current', requireAuth, (req, res) => { const payload = req.body?.draft as DraftPayload | undefined; if (!payload || typeof payload !== 'object') { res.status(400).json({ error: '草稿内容无效' }); return; } const draft = saveDraftForUser(req.authUser!.id, payload); res.json({ draft }); }); app.listen(port, '127.0.0.1', () => { console.log(`ScriptFlow server listening on http://127.0.0.1:${port}`); });