Spaces:
Paused
Paused
|
Download apps/api/src/modules/README.md from nenbuj/we-superapp: direct link, hf CLI and curl.
- Browser
- Download file 1.81 kB
-
https://huggingface.co/spaces/nenbuj/we-superapp/resolve/main/apps/api/src/modules/README.md
- Command line
-
hf download hf://spaces/nenbuj/we-superapp/apps/api/src/modules/README.md
-
curl -L -o README.md https://huggingface.co/spaces/nenbuj/we-superapp/resolve/main/apps/api/src/modules/README.md
1.81 kB
| # Модули Кодекса | |
| Сюда Кодекс кладёт файлы-плагины 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. | |