Skip to main content

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Включает
CASEDAILY_CASE + PAID_CASE
ROULETTESPIN

Rules

Read-only домен

История только читается — домен не изменяет данные. Записи создаются в соответствующих доменах (cases, streaks, inventory).

  • Записи возвращаются по давности с настраиваемым лимитом (без фильтрации по дате)
  • Максимум 500 записей за запрос (default в controller: 100, default в service/repo: 10)
  • Сортировка по дате (новые сверху)

3. Architecture

Key Components

КомпонентПутьОписание
Controllerbackend/src/domains/history/controllers/user-history.controller.tsHTTP handlers
Servicebackend/src/domains/history/services/history.service.tsBusiness logic
Repositorybackend/src/domains/history/repositories/history.repository.tsАгрегация из 4 таблиц
Routesbackend/src/domains/history/routes/user-history.routes.tsAPI endpoints
Schemasbackend/src/domains/history/schemas/user-history.schemas.tsSwagger/validation schemas
Typesbackend/src/domains/history/types/history.types.tsDomain types (HistoryItem, HistoryFilters, RewardSnapshot)

Data Flow


4. Database Schema

Source Tables

Домен не имеет собственных таблиц — агрегирует данные из:

ТаблицаМодельИспользуемые поля
case_openingsCaseOpeningid, userId, caseId, rewardSnapshot (Json), paidScrap (Int), openedAt + relations: case.name, case.imageUrl, case.caseType.isDailyFree
spin_resultsSpinResultid, userId, rewardSnapshot (Json), spunAt + relations: spin.name, spin.priceScrap, spin.spinType.name
user_inventoryUserInventoryid, userId, itemId, sourceType, acquiredAt + relations: item.tier, item.itemType
withdrawalsWithdrawalid, userId, itemId, status (enum: PENDING, PROCESSING, SENT, COMPLETED, FAILED, CANCELLED — history endpoint фильтрует до COMPLETED, FAILED, CANCELLED), requestedAt, completedAt + relations: item.name, item.imageUrl, item.tier, item.itemType

5. API Endpoints

User API

МетодЭндпоинтОписание
GET/api/history/recentПоследние события пользователя

Query Parameters

ParamTypeDefaultОписание
typeenumФильтр по типу: DAILY_CASE, PAID_CASE, SPIN, RAFFLE, WITHDRAWAL, CASE (= DAILY_CASE + PAID_CASE), ROULETTE (= SPIN)
caseIdstringФильтр по конкретному кейсу
limitnumber100Лимит записей (1-500)

Response Example

{
"success": true,
"data": [
{
"id": "clxyz...",
"sourceType": "PAID_CASE",
"sourceName": "Military Box",
"sourceImage": "https://...",
"caseId": "case-uuid",
"reward": {
"type": "ITEM",
"name": "AK-47 | Redline",
"itemId": "item-uuid",
"itemName": "AK-47 | Redline",
"itemImageUrl": "https://...",
"itemTier": "TIER_3",
"itemType": "SKIN"
},
"paidScrap": 150,
"timestamp": "2024-01-15T12:00:00.000Z"
}
]
}