feat(backend): lessons CRUD service and routes

This commit is contained in:
2026-05-20 20:47:43 +02:00
parent 3ff79b252c
commit 8af8ad54fa
5 changed files with 234 additions and 13 deletions

View File

@@ -1,28 +1,23 @@
import express, { type Express, type NextFunction, type Request, type Response } from 'express';
import { ZodError } from 'zod';
import type { Db } from './db/client.js';
import { ApiError } from './lib/errors.js';
import { lessonsRouter } from './routes/lessons.js';
export function createApp(): Express {
export function createApp(db: Db): Express {
const app = express();
app.use(express.json({ limit: '5mb' }));
app.get('/api/health', (_req, res) => {
res.json({ ok: true });
});
// Routes mounted in later tasks.
app.get('/api/health', (_req, res) => res.json({ ok: true }));
app.use('/api/lessons', lessonsRouter(db));
app.use((err: unknown, _req: Request, res: Response, _next: NextFunction) => {
if (err instanceof ZodError) {
res.status(400).json({
error: { code: 'VALIDATION_ERROR', message: 'Invalid input', details: err.flatten() },
});
res.status(400).json({ error: { code: 'VALIDATION_ERROR', message: 'Invalid input', details: err.flatten() } });
return;
}
if (err instanceof ApiError) {
res.status(err.status).json({
error: { code: err.code, message: err.message, details: err.details },
});
res.status(err.status).json({ error: { code: err.code, message: err.message, details: err.details } });
return;
}
console.error(err);