History
1. Summary
Goal: Агрегация и отображение истории активности пользователя в TMA.
User Value: Пользователь видит свои последние действия — открытия кейсов, результаты рулеток, выводы скинов, выигрыши в розыгрышах.
2. Business Logic
Source Types
Домен объединяет данные из нескольких источников:
| Type | Описание | Источник данных |
|---|---|---|
DAILY_CASE | Бесплатный ежедневный кейс | case_openings |
PAID_CASE | Платный кейс | case_openings |
SPIN | Рулетка | spin_results |
RAFFLE | Выигрыш в розыгрыше | user_inventory (sourceType=RAFFLE_WIN) |
WITHDRAWAL | Вывод скина | withdrawals |
UI Filters
Дополнительные типы для фильтрации в интерфейсе:
| Filter | Включает |
|---|---|
CASE | DAILY_CASE + PAID_CASE |
ROULETTE | SPIN |
Rules
Read-only домен
История только читается — домен не изменяет данные. Записи создаются в соответствующих доменах (cases, streaks, inventory).
- Показываются записи за последние 7 дней
- Максимум 500 записей за запрос (default: 100)
- Сортировка по дате (новые сверху)
3. Architecture
Key Components
| Компонент | Путь | Описание |
|---|---|---|
| Controller | backend/src/domains/history/controllers/user-history.controller.ts | HTTP handlers |
| Service | backend/src/domains/history/services/history.service.ts | Business logic |
| Repository | backend/src/domains/history/repositories/history.repository.ts | Агрегация из 4 таблиц |
| Routes | backend/src/domains/history/routes/user-history.routes.ts | API endpoints |
Data Flow
4. Database Schema
Source Tables
Домен не имеет собственных таблиц — агрегирует данные из:
| Таблица | Модель | Используемые поля |
|---|---|---|
case_openings | CaseOpening | id, userId, caseId, itemId, createdAt |
spin_results | SpinResult | id, userId, rewardType, rewardValue, createdAt |
user_inventory | UserInventory | id, userId, itemId, sourceType, createdAt |
withdrawals | Withdrawal | id, userId, itemId, status, createdAt |
5. API Endpoints
User API
| Метод | Эндпоинт | Описание |
|---|---|---|
| GET | /api/history/recent | Последние события пользователя |
Query Parameters
| Param | Type | Default | Описание |
|---|---|---|---|
type | enum | — | Фильтр по типу события |
caseId | string | — | Фильтр по конкретному кейсу |
limit | number | 100 | Лимит записей (1-500) |
Response Example
{
"items": [
{
"id": "uuid",
"type": "PAID_CASE",
"item": { "name": "AK-47 | Redline", "tier": "RARE" },
"case": { "name": "Weapon Case" },
"createdAt": "2024-01-15T12:00:00Z"
}
],
"total": 42
}
6. Related
- Cases — источник DAILY_CASE, PAID_CASE
- Daily Spins — источник SPIN
- Inventory — источник RAFFLE
- Withdrawals — источник WITHDRAWAL