File size: 1,805 Bytes
c562e21
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# Модули Кодекса

Сюда Кодекс кладёт файлы-плагины 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.