# Family Budget — Backend API-сервер на Express + TypeScript + PostgreSQL. ## Запуск ```bash # 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-сервера | ## Структура проекта ```text 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, атомарный импорт │ ├── 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` | Импорт банковской выписки (JSON 1.0) | ### Транзакции | Метод | 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** — серверные сессии с таймаутом по бездействию