# Модули Кодекса Сюда Кодекс кладёт файлы-плагины Fastify: `finance.js`, `tasks.js`, `social.js`, `calendar.js`. Сервер (`src/server.js`) подхватывает их автоматически — все `*.js` отсюда. ## Шаблон модуля ```js // src/modules/finance.js import crypto from 'node:crypto'; import { db } from '../core/db.js'; import { bus } from '../core/bus.js'; import { requireMember } from '../core/guards.js'; export default async function financeRoutes(fastify) { fastify.get('/spaces/:id/transactions', async (request) => { await requireMember(request, request.params.id); const transactions = db .prepare('SELECT * FROM transactions WHERE space_id = ? ORDER BY created_at DESC') .all(request.params.id); return { transactions }; }); fastify.post('/spaces/:id/transactions', async (request, reply) => { await requireMember(request, request.params.id); // ... валидация по CONTRACT.md ... const tx = { /* ... */ }; // db.prepare(...).run(...) bus.emit(request.params.id, { type: 'tx.created', space_id: request.params.id, payload: tx }); return reply.code(201).send({ transaction: tx }); }); } ``` Доступно из ядра: - `db` — better-sqlite3 (см. `core/db.js`) - `bus` — реалтайм-шина: `bus.emit(spaceId, { type, space_id, payload })` - `requireMember(request, spaceId)` — бросает 403/404 (ядро ловит и форматирует ошибку) Не трогай `core/`, `server.js`. Ошибки из `requireMember` ядро обрабатывает само (глобальный errorHandler), поэтому можно просто `await requireMember(...)` без try/catch.