# Ландшафт и границы

Источник: https://docs.novapoker.ru/dev/
Дорожка: разработка
Сверено с кодом: Mon Aug 24
Код: docs/superpowers/specs/2026-08-22-as-built-system-spec.md

---

Один бэкенд и три фронта под разные роли.

| Сервис | Стек | Таргет | Аудитория |
|---|---|---|---|
| **poker-api** | Node, TypeScript, NestJS, Prisma, PostgreSQL, socket.io, pg-boss; pnpm-workspace (`apps/server` + `packages/rating`) | сервер, HTTP и WS на одном порту | все клиенты |
| **poker-player** | Expo / React Native, expo-router, react-query, zustand, i18next | iOS, Android, web-сборка | игроки |
| **poker-organizer** | Expo / React Native, тот же набор | прежде всего Expo Web — планшет или ноутбук в заведении | владельцы клубов, ТД, дилеры |
| **poker-admin** | React + Vite, TanStack Router, react-query, zustand, Tailwind | статика в `dist/` | платформенные админы |

## Контракт между фронтами и бэкендом

**Связь только по HTTP и WebSocket.** Общего кода у фронтов и бэкенда нет —
контракт материализован в `apps/server/openapi.json` (83 пути) и собирается
командой `pnpm --filter server openapi` из CLI-плагина `@nestjs/swagger`.
У приложения игрока из него генерируются типы: `pnpm gen:api` кладёт результат
в `src/api/schema.d.ts`.

Базовый адрес API у каждого фронта — переменная окружения: `VITE_API_URL` у
админки, `EXPO_PUBLIC_API_URL` у игрока и организатора. Значение — голый origin
без версии; префикс `/api/v1` дописывает HTTP-клиент, чтобы он жил в одном месте.

У админки эта переменная — **аргумент сборки, а не переменная рантайма**.
Подробности и последствия — в [карточке poker-admin](https://docs.novapoker.ru/dev/poker-admin.md).

## Границы: чего в системе нет

- **Денежного контура.** `entryFee` — мёртвая колонка со значением 0,
  `paymentStatus` всегда `not_required`.
- **Ре-энтри, ребаев, аддонов.** Вылет окончателен, обратим только через отмену
  последнего вылета.
- **Учёта нокаутов.** Кто кого выбил, не хранится: в рейтинге есть только места
  и победы.
- **Работающего `lateRegLevel`.** Поле хранится в шаблоне блайндов, но нигде не
  проверяется.
- **Статуса `announced`.** Он есть в перечислении, но не используется — турнир
  создаётся сразу в `registration`.
- **Полноценной пагинации.** Ограничения фиксированные: афиша не больше 50,
  уровневый лидерборд — топ-100, уведомления — последние 50; остальные списки
  отдаются целиком.
- **Английского интерфейса.** Двуязычны только данные, строки интерфейса русские.
- **Нативных сборок.** EAS не настроен; рабочие таргеты — Expo Dev Server и
  web-экспорт.

## Что рядом

- Карточки сервисов: [poker-api](https://docs.novapoker.ru/dev/poker-api.md),
  [poker-player](https://docs.novapoker.ru/dev/poker-player.md),
  [poker-organizer](https://docs.novapoker.ru/dev/poker-organizer.md),
  [poker-admin](https://docs.novapoker.ru/dev/poker-admin.md).
- [Продуктовый обзор](https://docs.novapoker.ru/product.md) — тот же ландшафт со стороны пользователя.
- [Карта документации](https://docs.novapoker.ru/map.md) — все статьи и дата последней сверки с кодом.
