Детальное описание всех микросервисов Stage+ платформы
Обновлено: 2026-02-21
Stage+ состоит из 7 микросервисов и 2 клиентских приложений, каждый с чётко определённой областью ответственности.
Основной API сервис, обеспечивающий каталог автомобилей, управление заказами, файловые операции и интеграцию с Bitrix24.
Framework: FastAPI 0.115.0
Database: PostgreSQL (SQLAlchemy 2.0 async)
Cache: Redis 5.1.0
Storage: MinIO 7.2.9 (S3-compatible)
Queue: Celery 5.4.0
WebSocket: websockets 13.0
Monitoring: Prometheus metrics
GET /api/v1/cars # Каталог (фильтры, пагинация, витрина)
GET /api/v1/cars/brands # Список марок с количеством
GET /api/v1/cars/brands/{brand}/models # Модели для марки
GET /api/v1/cars/{id} # Детали автомобиля + расчёт стоимости
POST /api/v1/cars/{id}/favorite # Добавить в избранное
DELETE /api/v1/cars/{id}/favorite # Убрать из избранного
GET /api/v1/cars/favorites # Избранные автомобили пользователя
GET /api/v1/orders # Список заказов (клиенты видят только свои)
GET /api/v1/orders/{id} # Детали заказа с историей статусов
POST /api/v1/files/upload # Загрузка файла в MinIO
GET /api/v1/files/{id}/download # Скачивание файла
GET /api/v1/rates # Курсы валют (проксирует calculator-service)
POST /api/v1/webhooks/bitrix # Входящий веб-хук от Bitrix24
id UUID PRIMARY KEY
ajes_lot_id VARCHAR(50) UNIQUE -- ID лота в AJES
make VARCHAR(100) -- Марка (Toyota, Honda)
model VARCHAR(100) -- Модель (Camry, Civic)
year INTEGER -- Год выпуска
country ENUM -- japan|korea|china
engine_volume INTEGER -- Объём двигателя (cc)
fuel_type VARCHAR(50) -- Тип топлива
transmission VARCHAR(50) -- Коробка передач
drive VARCHAR(20) -- Привод (2WD, 4WD, AWD)
horsepower INTEGER -- Мощность (л.с.)
color VARCHAR(100) -- Цвет
mileage INTEGER -- Пробег (км)
auction_name VARCHAR(100) -- Название аукциона
auction_date DATE -- Дата аукциона
auction_grade VARCHAR(20) -- Оценка
start_price INTEGER -- Стартовая цена (JPY)
sold_price INTEGER -- Цена продажи (JPY)
status ENUM -- available|sold|reserved|in_transit|delivered
photos JSONB -- {"urls": [...], "keys": [...]}
raw_data JSONB -- Сырые данные от парсеров
created_at TIMESTAMP
updated_at TIMESTAMP
id UUID PRIMARY KEY
user_id UUID -- Связь с пользователем (IAM)
contact_phone VARCHAR(20) -- Телефон клиента
bitrix_deal_id INTEGER UNIQUE -- ID сделки в Bitrix24
car_id UUID REFERENCES cars -- Связанный автомобиль
car_description VARCHAR(500) -- Описание авто
status ENUM -- 12 стадий процесса
bitrix_data JSONB -- Данные от Bitrix24
notes TEXT -- Заметки
created_at TIMESTAMP
updated_at TIMESTAMP
Статусы заказов (12 стадий):
REQUEST - Заявка принятаSEARCH - Поиск на аукционеWON - Авто выиграноPAYMENT - ОплатаDOCUMENTS - Оформление документовSHIPPING - ОтгрузкаIN_TRANSIT - В путиCUSTOMS - Таможенное оформлениеDELIVERY - Доставка клиентуCOMPLETED - ЗавершеноCANCELLED - Отмененоid UUID PRIMARY KEY
uploaded_by UUID -- Кто загрузил (IAM user_id)
original_name VARCHAR(500) -- Оригинальное имя файла
mime_type VARCHAR(100) -- MIME тип
size_bytes INTEGER -- Размер в байтах
bucket VARCHAR(100) -- MinIO bucket (stageplus)
object_key VARCHAR(500) -- Путь в MinIO: {type}/{year}/{month}/{uuid}.{ext}
width INTEGER -- Ширина изображения (nullable)
height INTEGER -- Высота изображения (nullable)
thumbnail_key VARCHAR(500) -- Путь к миниатюре (nullable)
created_at TIMESTAMP
stageplus_core БДREST API: https://stage-plus.bitrix24.ru/rest/1/qsjk0s45wzl09t1g
Маппинг стадий Bitrix24 → OrderStatus:
BITRIX_STAGE_MAP = {
"NEW": OrderStatus.REQUEST,
"PREPARATION": OrderStatus.REQUEST,
"PREPAYMENT_INVOICE": OrderStatus.SEARCH, # Поиск авто
"EXECUTING": OrderStatus.WON, # Куплен
"FINAL_INVOICE": OrderStatus.PAYMENT,
"UC_2BIXLX": OrderStatus.PAYMENT, # Подтверждение оплаты
"UC_AYT3XI": OrderStatus.DOCUMENTS, # Ярд фото
"UC_HMVQOV": OrderStatus.SHIPPING, # Заявлен на рейс
"UC_LXZ8VH": OrderStatus.IN_TRANSIT, # В пути до Владивостока
"UC_XOH1LJ": OrderStatus.CUSTOMS, # Прибыл на СВХ
"UC_DDB6G9": OrderStatus.CUSTOMS, # Таможня
"UC_S1PSLJ": OrderStatus.CUSTOMS, # СБКТС фото
"UC_NM4AA9": OrderStatus.DELIVERY, # Доставка автовоз
"UC_JMTZXD": OrderStatus.DELIVERY, # Готово к выдаче
"WON": OrderStatus.COMPLETED,
"LOSE": OrderStatus.CANCELLED
}
Сервис управления идентификацией и доступом. Обеспечивает аутентификацию через SMS-коды, управление пользователями, регистрацию устройств для push-уведомлений.
Framework: FastAPI 0.115.0
Database: PostgreSQL (SQLAlchemy 2.0 async)
Auth: JWT (python-jose)
Password: bcrypt hashing
Push: Firebase Admin SDK 6.6.0
OTP: Redis + HTTP to OTP Bot
POST /iam/auth/send-code # Отправка SMS кода через OTP Bot
POST /iam/auth/verify # Проверка кода + создание JWT
POST /iam/auth/login # Вход менеджера (телефон + пароль)
POST /iam/auth/refresh # Обновление access token
GET /iam/users/me # Профиль текущего пользователя
PATCH /iam/users/me # Обновление профиля
GET /iam/users # Список пользователей (manager+)
GET /iam/users/{id} # Пользователь по ID (manager+)
PATCH /iam/users/{id} # Обновление пользователя (admin)
POST /iam/notifications/device-token # Регистрация FCM токена
DELETE /iam/notifications/device-token # Удаление токена
GET /iam/app/versions # Список версий приложения
POST /iam/app/versions # Добавление новой версии
GET /iam/app/version-stats # Статистика по версиям
id UUID PRIMARY KEY
phone VARCHAR(20) UNIQUE -- Основной идентификатор
password_hash VARCHAR(255) -- bcrypt hash (для менеджеров)
role ENUM -- client|manager|admin
first_name VARCHAR(100)
last_name VARCHAR(100)
avatar_file_id UUID -- Ссылка на файл
is_active BOOLEAN DEFAULT TRUE
is_online BOOLEAN DEFAULT FALSE
last_seen TIMESTAMP
bitrix_contact_id INTEGER -- ID контакта в Bitrix24
app_version VARCHAR(20) -- Версия клиентского приложения
app_platform VARCHAR(20) -- ios|android|web
created_at TIMESTAMP
updated_at TIMESTAMP
id UUID PRIMARY KEY
user_id UUID REFERENCES users
platform VARCHAR(20) -- ios|android|web
token VARCHAR(500) -- FCM registration token
is_active BOOLEAN DEFAULT TRUE
created_at TIMESTAMP
updated_at TIMESTAMP
id UUID PRIMARY KEY
platform VARCHAR(20) -- ios|android
version VARCHAR(20) -- 1.0.0
build_number VARCHAR(20) -- 123
is_required BOOLEAN DEFAULT FALSE -- Принудительное обновление
is_active BOOLEAN DEFAULT TRUE
release_notes TEXT
created_at TIMESTAMP
Поддерживаемые провайдеры:
telegram - OTP Bot (dev/staging)smsru - SMS.ru (production)smsaero - SMS Aero (backup)Формат кода: 4 цифры, TTL 5 минут
{
"id": "user-uuid",
"role": "client|manager|admin",
"type": "access|refresh",
"exp": 1640995200,
"long": false
}
Access token: 7 дней
Refresh token: 30 дней
stageplus_iam БДСервис реального времени для чатов между клиентами и менеджерами. Поддерживает WebSocket соединения, обмен файлами, типизированные сообщения и push-уведомления.
Framework: FastAPI 0.115.0
Database: PostgreSQL (SQLAlchemy 2.0 async)
WebSocket: websockets 13.0
PubSub: Redis (межсерверная синхронизация)
Storage: MinIO (файлы в сообщениях)
Push: Firebase Admin SDK
GET /chat/chats # Список чатов пользователя
POST /chat/chats # Создание нового чата
GET /chat/chats/unassigned # Неназначенные обращения (manager+)
GET /chat/chats/{id} # Детали чата
PATCH /chat/chats/{id} # Переименование чата
POST /chat/chats/{id}/join # Менеджер подключается к чату
POST /chat/chats/{id}/read # Отметка чата как прочитанного
GET /chat/chats/{id}/messages # История сообщений (пагинация)
POST /chat/chats/{id}/messages # Отправка сообщения
PATCH /chat/messages/{id} # Редактирование сообщения
DELETE /chat/messages/{id} # Удаление сообщения
GET /chat/ws?token=jwt # WebSocket соединение
POST /chat/files/upload # Загрузка файлов для сообщений
Входящие события (от клиента):
{"type": "ping"}
{"type": "typing", "chat_id": "uuid"}
{"type": "send_message", "chat_id": "uuid", "text": "...", "msg_type": "text"}
{"type": "send_message", "chat_id": "uuid", "text": "...", "file_ids": ["uuid1"]}
{"type": "send_message", "chat_id": "uuid", "car_id": "uuid", "msg_type": "car_link"}
{"type": "edit_message", "message_id": "uuid", "text": "..."}
{"type": "delete_message", "message_id": "uuid"}
{"type": "read", "chat_id": "uuid", "message_id": "uuid"}
Исходящие события (к клиенту):
{"type": "pong"}
{"type": "message", "data": {...}} // Новое сообщение
{"type": "message_updated", "data": {...}} // Редактирование
{"type": "message_deleted", "message_id": "uuid"}
{"type": "typing", "chat_id": "uuid", "user_id": "uuid", "user_name": "..."}
{"type": "user_online", "user_id": "uuid", "is_online": true}
{"type": "error", "message": "..."}
id UUID PRIMARY KEY
type ENUM DEFAULT 'private' -- private|group
name VARCHAR(255) -- Название (для групповых)
is_active BOOLEAN DEFAULT TRUE
last_message_id UUID
last_message_at TIMESTAMP
created_at TIMESTAMP
id UUID PRIMARY KEY
chat_id UUID REFERENCES chats
user_id UUID -- Ссылка на пользователя (IAM)
role ENUM DEFAULT 'member' -- member|admin
is_muted BOOLEAN DEFAULT FALSE
unread_count INTEGER DEFAULT 0
last_read_message_id UUID
joined_at TIMESTAMP
id UUID PRIMARY KEY
chat_id UUID REFERENCES chats
sender_id UUID -- Отправитель (IAM user_id)
type ENUM DEFAULT 'text' -- text|image|document|video|voice|car_link|system
text TEXT -- Содержимое сообщения
reply_to_id UUID REFERENCES messages -- Ответ на сообщение
car_id UUID -- Ссылка на автомобиль (Core API)
is_edited BOOLEAN DEFAULT FALSE
is_deleted BOOLEAN DEFAULT FALSE
created_at TIMESTAMP
updated_at TIMESTAMP
id UUID PRIMARY KEY
message_id UUID REFERENCES messages
file_id UUID -- ID файла (денормализация)
sort_order INTEGER DEFAULT 0
original_name VARCHAR(500) -- Денормализованные метаданные
mime_type VARCHAR(100) -- для быстрого доступа
object_key VARCHAR(500) -- MinIO путь
thumbnail_key VARCHAR(500) -- Путь к миниатюре
Отправляются через Firebase FCM при получении нового сообщения (если пользователь не в сети).
Формат:
{
"title": "Имя отправителя",
"body": "Текст сообщения",
"data": {
"type": "chat_message",
"chat_id": "uuid",
"message_id": "uuid"
}
}
stageplus_chat БДmessage_files для производительностиМикросервис для расчёта полной стоимости автомобиля с учётом цены на аукционе, таможенных пошлин, брокерских услуг и доставки.
Framework: FastAPI
HTTP Client: httpx (для внешних API)
Cache: In-memory (курсы валют)
Dependencies: Car Specs Service, CBR API
POST /calculator/calculate # Расчёт полной стоимости
GET /calculator/rates # Текущие курсы валют
GET /calculator/health # Health check
Входные данные:
{
"price_jpy": 800000, // Цена на аукционе (JPY)
"engine_volume": 2000, // Объём двигателя (cc)
"year": 2018, // Год выпуска
"make": "Toyota", // Марка (опционально)
"model": "Camry", // Модель (опционально)
"horsepower": 150, // Мощность (опционально)
// Расходы в Японии
"frakht_jpy": 80000, // Фрахт
"fob_jpy": 90000, // FOB
// Расходы в России
"broker_rub": 65000, // Брокерские услуги
"expertise_rub": 5000, // Экспертиза
"lab_rub": 8000, // Лабораторные испытания
"commission_rub": 50000, // Комиссия
"transport_rub": 95000 // Доставка по России
}
Выходные данные:
{
"price_jpy": 800000,
"price_rub": 720000, // По курсу CBR
"jpy_rate": 0.90, // Курс JPY/RUB
"eur_rate": 105.50, // Курс EUR/RUB
"car_age_years": 8, // Возраст автомобиля
"horsepower": 150, // Мощность (определена автоматически)
"hp_source": "specs", // provided|specs|estimated
// Расходы в Японии
"frakht_jpy": 80000,
"fob_jpy": 90000,
"japan_expenses_jpy": 170000,
"japan_expenses_rub": 153000,
// Таможенные расходы
"customs_duty_rub": 247500, // 33% от стоимости для авто >5 лет
"customs_fee_rub": 7500, // Таможенный сбор
"utilization_fee_rub": 56800, // Утилизационный сбор (по мощности)
// Расходы в России
"broker_rub": 65000,
"expertise_rub": 5000,
"lab_rub": 8000,
"commission_rub": 50000,
"transport_rub": 95000,
// Итоговые суммы
"total_vladivostok_rub": 1252800, // До Владивостока
"total_city_rub": 1347800 // С доставкой в город
}
Определение мощности:
hp = cc * 0.07 (примерно)Таможенная пошлина:
Утилизационный сбор:
Источники:
Кэширование: 1 час в памяти
Справочник технических характеристик автомобилей. Содержит базу данных спецификаций с возможностью поиска по марке, модели и объёму двигателя.
Framework: FastAPI 0.115.0
Database: PostgreSQL
Parser: BeautifulSoup4 + requests (drom.ru)
GET /car-specs/specs # Поиск характеристик
GET /car-specs/specs/{id} # Характеристика по ID
POST /car-specs/specs # Добавление характеристики
POST /car-specs/specs/bulk # Массовый импорт
GET /car-specs/brands # Список марок
GET /car-specs/brands/{make}/models # Модели марки
POST /car-specs/parse/start # Запуск парсера drom.ru
GET /car-specs/parse/status # Статус парсинга
id INTEGER PRIMARY KEY
make VARCHAR -- Марка (Toyota, Honda)
model VARCHAR -- Модель (Camry, Civic)
generation VARCHAR -- Поколение (XV70, X Gen)
year_from INTEGER -- Год начала выпуска
year_to INTEGER -- Год окончания
engine_volume INTEGER -- Объём двигателя (cc)
fuel_type VARCHAR -- Тип топлива
horsepower INTEGER -- Мощность (л.с.)
engine_code VARCHAR -- Код двигателя (2AZ-FE)
UNIQUE (make, model, engine_volume, fuel_type, generation)
INDEX (make, model)
Процесс парсинга:
Статус парсинга:
{
"status": "running|completed|failed",
"progress": {
"brands_total": 50,
"brands_completed": 25,
"current_brand": "Toyota",
"specs_added": 1250
},
"started_at": "2026-02-21T12:00:00Z",
"completed_at": null,
"error": null
}
Запрос:
GET /car-specs/specs?make=Toyota&model=Camry&engine_volume=2000
Ответ:
[
{
"id": 12345,
"make": "Toyota",
"model": "Camry",
"generation": "XV70",
"year_from": 2017,
"year_to": 2023,
"engine_volume": 2000,
"fuel_type": "Бензин",
"horsepower": 150,
"engine_code": "2AR-FE"
}
]
Парсер аукционных площадок для сбора информации об автомобилях. Поддерживает несколько источников данных с кросс-валидацией между ними.
Framework: FastAPI 0.115.0
Database: PostgreSQL (отдельная схема)
Parser: BeautifulSoup4 + lxml + httpx
GET /auction/lots # Список лотов (фильтры, пагинация)
GET /auction/lots/{id} # Детали лота
POST /auction/parse/start # Запуск парсинга
GET /auction/parse/status # Статус парсинга
Все таблицы в отдельной схеме PostgreSQL для изоляции от основных данных.
id INTEGER PRIMARY KEY
source VARCHAR(20) -- sferacar|tokidoki|ajes
source_id VARCHAR(100) -- ID в источнике
auction_name VARCHAR(100) -- Название аукциона
lot_number VARCHAR(50) -- Номер лота
auction_date DATE -- Дата аукциона
make VARCHAR(100) -- Марка
model VARCHAR(200) -- Модель
modification VARCHAR(200) -- Модификация/комплектация
chassis VARCHAR(100) -- Номер кузова
year INTEGER -- Год выпуска
engine_cc INTEGER -- Объём двигателя
mileage INTEGER -- Пробег
grade VARCHAR(20) -- Оценка (4.5, R, A)
transmission VARCHAR(20) -- Коробка передач
body_type VARCHAR(50) -- Тип кузова
color VARCHAR(50) -- Цвет
fuel_type VARCHAR(30) -- Тип топлива
drive_type VARCHAR(30) -- Тип привода
horsepower INTEGER -- Мощность
price_jpy INTEGER -- Цена в йенах
price_rub INTEGER -- Цена в рублях (по курсу)
is_hybrid BOOLEAN DEFAULT FALSE
is_electric BOOLEAN DEFAULT FALSE
created_at TIMESTAMP
updated_at TIMESTAMP
cross_validated BOOLEAN DEFAULT FALSE -- Найден в другом источнике
cross_source VARCHAR(20) -- Источник кросс-валидации
cross_source_id VARCHAR(100) -- ID в другом источнике
UNIQUE (source, source_id)
INDEX (make, model)
INDEX (chassis)
id INTEGER PRIMARY KEY
lot_id INTEGER REFERENCES auction_lots
url VARCHAR(500) -- URL фотографии
source VARCHAR(20) -- Источник фото
position INTEGER DEFAULT 0 -- Порядок фотографий
Особенности:
Пример извлекаемых данных:
{
"source": "sferacar",
"source_id": "12345-67890",
"auction_name": "USS Tokyo",
"lot_number": "A12345",
"auction_date": "2026-02-20",
"make": "Toyota",
"model": "Camry",
"chassis": "JTDBF31E123456789",
"year": 2018,
"engine_cc": 2000,
"mileage": 45000,
"grade": "4.0",
"price_jpy": 850000,
"photos": [
{"url": "https://...", "position": 1},
{"url": "https://...", "position": 2}
]
}
Данные из auction_data используются для обновления каталога в Core API:
Микросервис для отправки одноразовых SMS-кодов. В dev/staging окружении отправляет коды в Telegram группу, в production использует SMS-шлюзы.
Framework: FastAPI
HTTP Client: httpx
Telegram: Bot API
SMS: SMS.ru, SMS Aero APIs
POST /otp/send-code # Отправка SMS кода
GET /otp/health # Health check
Запрос:
{
"phone": "+79001234567",
"code": "1234"
}
Ответ:
{
"status": "sent"
}
Конфигурация:
BOT_TOKEN - токен Telegram ботаCHAT_ID - ID группы/чата для отправкиФормат сообщения:
🔐 OTP код
📱 Телефон: +79001234567
🔑 Код: 1234
⏰ Время: 14:25:30
Действителен 5 минут
SMS.ru API:
POST https://sms.ru/sms/send
{
"to": "79001234567",
"msg": "Stage+ код подтверждения: 1234",
"json": 1
}
SMS Aero API:
POST https://gate.smsaero.ru/v2/sms/send
{
"number": "79001234567",
"text": "Stage+ код: 1234",
"sign": "SMS Aero"
}
Мобильное приложение для iOS и Android. Предоставляет клиентам доступ к каталогу автомобилей, чатам с менеджерами, отслеживанию заказов.
Framework: Flutter 3.2+ (Dart)
State Management: Riverpod 2.6.1
Navigation: GoRouter 17.1.0
HTTP: Dio 5.9.1
WebSocket: web_socket_channel 3.0.3
Storage: flutter_secure_storage 10.0.0
Push: Firebase Messaging 16.1.1
Images: cached_network_image 3.4.1
Clean Architecture + Feature-based structure:
lib/
├── core/ # Общие компоненты
│ ├── di/ # Dependency Injection (get_it)
│ ├── network/ # API клиенты (3 Dio инстанса)
│ ├── storage/ # Безопасное хранение токенов
│ ├── theme/ # UI тема и стили
│ └── services/ # Push-уведомления
├── features/ # Функциональные модули
│ ├── auth/ # Аутентификация
│ ├── home/ # Главная страница
│ ├── cars/ # Каталог автомобилей
│ ├── chat/ # Чаты с менеджерами
│ ├── orders/ # Заказы и статусы
│ └── profile/ # Профиль пользователя
└── app.dart # Корневой виджет
Три отдельных Dio инстанса:
// Core API (cars, orders, rates)
final dio = Dio(BaseOptions(baseUrl: 'https://mapp.stage-plus.ru/api/v1'));
// IAM Service (auth, users)
final iamDio = Dio(BaseOptions(baseUrl: 'https://mapp.stage-plus.ru/iam'));
// Chat Service (chats, messages, files)
final chatDio = Dio(BaseOptions(baseUrl: 'https://mapp.stage-plus.ru/chat'));
Автоматические возможности:
Функциональность:
Поддерживаемые события:
send_message - отправка сообщенийtyping - индикатор набора текстаread - отметка прочитанногоedit_message - редактированиеdelete_message - удалениеПровайдеры по доменам:
// Аутентификация
final authProvider = StateNotifierProvider<AuthNotifier, AuthState>
// Каталог автомобилей
final carsProvider = FutureProvider<List<Car>>
final carDetailProvider = FutureProvider.family<Car, String>
// Чаты
final chatsProvider = StateNotifierProvider<ChatsNotifier, ChatsState>
final messagesProvider = StateNotifierProvider.family<MessagesNotifier, String>
// WebSocket
final wsProvider = StateNotifierProvider<WsNotifier, WsState>
Message Queue Service:
Firebase Messaging:
Веб-интерфейс для менеджеров и администраторов. Предоставляет управление заказами, чатами с клиентами, каталогом автомобилей, пользователями.
Framework: React 19 + TypeScript
Build Tool: Vite 7.3.1
Router: React Router DOM 7.13.0
State: TanStack Query 5.90.20 + Zustand 5.0.11
HTTP: Axios 1.13.5
Push: Firebase 12.9.0
Icons: Lucide React 0.563.0
src/
├── api/ # API клиенты
│ ├── client.ts # 3 axios инстанса
│ ├── ws.ts # WebSocket клиент
│ └── firebase.ts # Push-уведомления
├── pages/ # Страницы приложения
│ ├── Login.tsx # Авторизация менеджера
│ ├── Catalog.tsx # Управление каталогом
│ ├── Chats.tsx # Чаты с клиентами
│ ├── Orders.tsx # Заказы и статусы
│ ├── Clients.tsx # Управление клиентами
│ ├── Managers.tsx # Управление менеджерами
│ ├── Stats.tsx # Аналитика и статистика
│ └── Profile.tsx # Профиль менеджера
├── components/ # Компоненты UI
├── hooks/ # Custom hooks (React Query)
├── types/ # TypeScript типы
└── layouts/ # Макеты страниц
Три отдельных axios инстанса:
// Core API (cars, orders, rates)
const api = axios.create({baseURL: 'https://mapp.stage-plus.ru/api/v1'})
// IAM Service (auth, users, notifications)
export const iamApi = axios.create({baseURL: 'https://mapp.stage-plus.ru/iam'})
// Chat Service (chats, messages, files)
export const chatApi = axios.create({baseURL: 'https://mapp.stage-plus.ru/chat'})
Автоматические возможности:
TanStack Query для серверного состояния:
// Запросы с кэшированием и автообновлением
const { data: cars } = useQuery({
queryKey: ['cars', filters],
queryFn: () => api.get('/cars', { params: filters })
})
// Мутации с оптимистичными обновлениями
const mutation = useMutation({
mutationFn: (data) => chatApi.post('/chats', data),
onSuccess: () => queryClient.invalidateQueries(['chats'])
})
Zustand для локального состояния:
// Глобальные состояния (UI, WebSocket, auth)
const useAuthStore = create((set) => ({
user: null,
isAuthenticated: false,
login: (user) => set({ user, isAuthenticated: true }),
logout: () => set({ user: null, isAuthenticated: false })
}))
Real-time обновления:
Firebase Web Push:
Обновлено: 2026-02-21 | Автор: Stage+ Development Team