Перейти к содержанию

🛠 Phase 3 · Реализация недостающих backend endpoints

Цель: Закрыть 4 заглушки (booking-svc, chat-svc, analytics-svc, platform-svc) и довести их до готовности к подключению с мобильного фронта.


📐 Архитектура

Все микросервисы — FastAPI + Postgres (через PostgREST/Supabase) + Redis (cache, pub-sub). Общая инфра в packages/arkhyz-shared/ (auth middleware, db pool, http client).

mobile (tourist-app) → Caddy → kong → {auth, booking, chat, catalog, resort, rtc, analytics, platform}
                                           ↓
                                       Postgres (Supabase) + Redis + ClickHouse (analytics)

🎯 Порядок работ (~5-7 рабочих дней)

Sprint 1 · booking-svc (~2 дня) — критичный путь CJM #1, #3, #4

Endpoints:

POST   /api/v1/bookings/create       — создать бронь (hotel/tour/restaurant/transfer/instructor)
GET    /api/v1/bookings/me           — мои брони (с фильтрами по типу/статусу/дате)
GET    /api/v1/bookings/:id          — детали брони
PATCH  /api/v1/bookings/:id          — обновить (даты, гости, заметки)
POST   /api/v1/bookings/:id/cancel   — отмена (с reason)
POST   /api/v1/bookings/:id/confirm  — подтверждение провайдером

POST   /api/v1/payments/process      — инициировать оплату (метод + сумма)
POST   /api/v1/payments/:id/refund   — возврат
GET    /api/v1/payments/me           — история платежей
GET    /api/v1/payments/methods      — мои карты + альтернативы (СБП/Apple Pay/wallet)
POST   /api/v1/payments/methods      — добавить карту (через токенизацию платёжки)
DELETE /api/v1/payments/methods/:id

POST   /api/v1/trip-booking/aggregate — агрегатор поверх booking-types

Таблицы Postgres: - bookings (id, user_id, type, item_id, dates, guests, status, total, created_at, ...) - payments (id, booking_id, method, amount, status, txn_id, created_at) - payment_methods (id, user_id, brand, last4, exp, default, token)

Внешние интеграции: - ЮKassa SDK или CloudPayments — токенизация + 3D-Secure - СБП — через Tinkoff Open Banking API

Acceptance: - BookingScreen.tsx → реальные /bookings/create без DEMO - PayScreen.tsx → реальный /payments/process с redirect на 3D-Secure - PaymentSuccess.tsx → polls /bookings/:id пока статус = paid


Sprint 2 · chat-svc (~1.5 дня) — CJM #4, #7, #9

Endpoints REST:

GET    /api/v1/chats/me              — мои диалоги (с unread, last_msg, pinned)
POST   /api/v1/chats/start           — начать чат с пользователем (deduped)
GET    /api/v1/chats/:thread_id      — детали + список участников
PATCH  /api/v1/chats/:thread_id      — pin / mute / archive
DELETE /api/v1/chats/:thread_id      — выйти

GET    /api/v1/messages/:thread_id   — пагинация (cursor)
POST   /api/v1/messages              — отправить (text/image/voice)
PATCH  /api/v1/messages/:id          — редактировать
DELETE /api/v1/messages/:id          — удалить
POST   /api/v1/messages/:id/read     — mark as read

WebSocket каналы (через rtc-svc): - chat_:thread_id — новые сообщения, typing, presence - realtime:user_:id — общие нотификации (новый чат, упоминания)

Таблицы: - chat_threads (id, type=p2p/group/support, participants[], created_by, created_at, ...) - chat_messages (id, thread_id, sender_id, body, attachments[], reply_to_id, sent_at, read_by[])

Acceptance: - ChatsScreen.tsx → real /chats/me - ChatThreadScreen → real /messages/:thread + WS subscription - HotelDetail/Booking «Чат с поставщиком» → real chatsApi.startWith(provider_id)


Sprint 3 · platform-svc (~1 день) — push, config, feature flags

Endpoints:

GET    /api/v1/platform/config        — env-конфиг для клиента (фича-флаги, версии, URL)
GET    /api/v1/platform/me            — feature-flags для текущего юзера

POST   /api/v1/push/register          — token + platform (ios/android/web)
DELETE /api/v1/push/register          — отписать устройство
PATCH  /api/v1/push/preferences       — что отправлять (booking/queue/friend/marketing)
GET    /api/v1/push/preferences

POST   /api/v1/push/send              — внутренний (admin) — отправить рассылку
POST   /api/v1/push/test              — отправить тест себе (для PushSettings.tsx)

Внешние: - OneSignal SDK (или собственный FCM/APNs клиент)

Таблицы: - push_devices (id, user_id, token, platform, app_version, last_seen) - push_preferences (user_id, kind, enabled) - feature_flags (key, condition, payload)

Acceptance: - PushSettingsScreen → real /push/preferences - iOS/Android push registration через lib/push.ts


Sprint 4 · analytics-svc (~1 день) — события + метрики

Endpoints:

POST   /api/v1/events                 — отправить событие (screen_view, click, conversion)
POST   /api/v1/events/batch           — пакетная отправка (для offline-сбора)
GET    /api/v1/metrics/me             — мои метрики (визиты, потрачено, бейджи)
GET    /api/v1/metrics/funnel         — воронка для админ-панели

Хранилище: - ClickHouse (events table) — fast time-series для админки

Acceptance: - lib/analytics.ts (новый) — простой track(event, props) API - Подключить в ключевые точки: open-screen, button-click, booking-success, payment


Sprint 5 · WebSocket каналы в rtc-svc (~0.5 дня)

Сейчас работает: - realtime:user_:id — общие нотификации - friends_:userid — live-локации друзей - lift_queues — live-очереди подъёмников

Дополнить: - chat_:thread_id — новые сообщения в чате - tracking_:session_id — share GPS-трека в реальном времени (для друзей) - provider_:provider_id — нотификации провайдеру (новая бронь, отзыв)


Sprint 6 · Доработка resort-svc (~0.5 дня)

Уже реализовано большинство, но проверить: - /skipass/me/issue — реальная покупка пасса (сейчас только /issue-demo) - /recommendations/plan-day — корректность ML-логики - /badges/me — корректное вычисление progress_pct


📅 Ориентировочный график

Неделя Sprint Сервис Готово
1 (пн-ср) Sprint 1 booking-svc bookings + payments + методы
1 (чт-пт) Sprint 2 chat-svc REST + WS интеграция с rtc
2 (пн) Sprint 3 platform-svc push + config + feature flags
2 (вт) Sprint 4 analytics-svc events + ClickHouse
2 (ср) Sprint 5+6 rtc-svc + resort-svc dop-каналы, real skipass

Итого: ~5-7 рабочих дней до полной готовности backend.


⏭ Phase 4 · Full integration (после Phase 3)

После готовности backend:

  1. Подключение real-API в tourist-app (поэкранно, по 5 за итерацию):
  2. CJM #1: HotelDetail → Booking → Pay → Success → Bookings
  3. CJM #2: Snow → Lifts → Tracking → SkiStories
  4. CJM #3: Catalog → Detail → Booking → Pay
  5. CJM #4: Instructors → Detail → MyBookings → Chat
  6. CJM #5: SlopeFood/Rentals → Cart → Order → MyOrders
  7. CJM #6: Stories → User → Friends-live → Map3D
  8. CJM #7: Chats → Thread → Voice/Video
  9. CJM #8: Roles → Provider Dashboard → Form
  10. CJM #9: Provider → Bookings → Confirm → Chat

  11. WebSocket подписки включаются на каждом релевантном экране.

  12. Native build (Capacitor) — iOS + Android.

  13. TestFlight + Google Play closed beta — обратная связь.

  14. Production launch — публикация в Store.

Срок Phase 4: ~5-7 рабочих дней.


🎯 Старт: Sprint 1 — booking-svc

Начинаю прямо сейчас: 1. Скелет FastAPI приложения (роутеры, схемы, db dependency) 2. Postgres миграции (bookings, payments, payment_methods) 3. Endpoints CRUD для bookings 4. Payment-flow (заглушка — без реальной токенизации, чтобы не блокировать UI) 5. Подключение в Caddy + docker-compose 6. Smoke-тест из tourist-app