Files
vakabunga db4d5e4d00 fix: yield to event loop after each SSE write to flush socket
The for-await loop over OpenAI stream chunks runs synchronously when
data is buffered, causing res.write() calls to queue without flushing.
Add setImmediate yield after each progress event so the event loop
reaches its I/O phase and pushes data to the network immediately.
2026-03-14 19:59:22 +03:00
..

Family Budget — Backend

API-сервер на Express + TypeScript + PostgreSQL.

Запуск

# 1. Установить зависимости (из корня монорепо)
npm install

# 2. Собрать shared-типы
npm run build -w shared

# 3. Скопировать и заполнить .env
cp .env.example .env

# 4. Создать БД PostgreSQL
createdb family_budget

# 5. Запустить в dev-режиме (миграции применяются автоматически при старте)
npm run dev -w backend

Сервер стартует на http://localhost:3000 (или на порту из PORT).

Скрипты

Скрипт Команда Описание
dev npm run dev -w backend Запуск с hot-reload (tsx watch)
build npm run build -w backend Компиляция TypeScript → dist/
start npm run start -w backend Запуск скомпилированного сервера
migrate npm run migrate -w backend Применить миграции вручную (без старта)

Переменные окружения

Переменная По умолчанию Описание
DB_HOST localhost Хост PostgreSQL
DB_PORT 5432 Порт PostgreSQL
DB_NAME family_budget Имя базы данных
DB_USER postgres Пользователь БД
DB_PASSWORD postgres Пароль БД
APP_USER_LOGIN admin Логин для входа в приложение
APP_USER_PASSWORD changeme Пароль для входа в приложение
SESSION_TIMEOUT_MS 10800000 Таймаут сессии по бездействию (3 часа)
PORT 3000 Порт HTTP-сервера
LLM_API_KEY Ключ OpenAI API для конвертации PDF в JSON; без него импорт PDF возвращает 503
LLM_API_BASE_URL https://api.openai.com/v1 Адрес LLM API (OpenAI-совместимый); для локальной модели, напр. Ollama: http://localhost:11434/v1

Структура проекта

backend/src/
├── app.ts                  — точка входа: Express, миграции, монтирование роутов
├── config.ts               — чтение переменных окружения
├── utils.ts                — утилиты (maskAccountNumber, asyncHandler)
├── db/
│   ├── pool.ts             — пул подключений pg
│   └── migrate.ts          — миграции (встроенный SQL) + seed 23 категорий
├── middleware/
│   └── auth.ts             — проверка сессии, таймаут 3 ч, обновление last_activity_at
├── services/
│   ├── auth.ts             — login / logout / me
│   ├── import.ts           — валидация, fingerprint, direction, атомарный импорт
│   ├── pdfToStatement.ts   — конвертация PDF → JSON 1.0 через LLM (OpenAI)
│   ├── transactions.ts     — список с фильтрами + обновление (categoryId, comment)
│   ├── accounts.ts         — список счетов, обновление алиаса
│   ├── categories.ts       — список категорий (фильтр isActive)
│   ├── categoryRules.ts    — CRUD правил + apply к прошлым транзакциям
│   └── analytics.ts        — summary, by-category, timeseries
└── routes/
    ├── auth.ts             — POST login/logout, GET me
    ├── import.ts           — POST /api/import/statement
    ├── transactions.ts     — GET /api/transactions, PUT /api/transactions/:id
    ├── accounts.ts         — GET /api/accounts, PUT /api/accounts/:id
    ├── categories.ts       — GET /api/categories
    ├── categoryRules.ts    — GET/POST/PATCH /api/category-rules, POST :id/apply
    └── analytics.ts        — GET summary, by-category, timeseries

API-эндпоинты

Авторизация

Метод URL Описание
POST /api/auth/login Вход (login + password)
POST /api/auth/logout Выход (инвалидация сессии)
GET /api/auth/me Текущий пользователь

Импорт

Метод URL Описание
POST /api/import/statement Импорт банковской выписки (PDF или JSON 1.0; PDF конвертируется через LLM)

Транзакции

Метод URL Описание
GET /api/transactions Список с фильтрами и пагинацией
PUT /api/transactions/:id Обновить категорию / комментарий

Справочники

Метод URL Описание
GET /api/accounts Список счетов
PUT /api/accounts/:id Обновить алиас счёта
GET /api/categories Список категорий

Правила категоризации

Метод URL Описание
GET /api/category-rules Список правил
POST /api/category-rules Создать правило
PATCH /api/category-rules/:id Частичное обновление / деактивация
POST /api/category-rules/:id/apply Применить к прошлым транзакциям

Аналитика

Метод URL Описание
GET /api/analytics/summary Сводка: расходы, доходы, топ-5
GET /api/analytics/by-category Расходы по категориям
GET /api/analytics/timeseries Динамика (day / week / month)

База данных

Миграции применяются автоматически при старте сервера. Таблицы:

  • accounts — банковские счета (bank, account_number, currency, alias)
  • categories — 23 категории с типами expense / income / transfer (seed)
  • transactions — операции с fingerprint-дедупликацией, привязкой к счёту и категории
  • category_rules — правила авто-категоризации (pattern, match_type, priority)
  • sessions — серверные сессии с таймаутом по бездействию