Мультитенантность

Каждая школа — это изолированный тенант. Данные одной школы никогда не пересекаются с данными другой.

Базовый адрес

Все запросы идут на единый базовый адрес с префиксом версии:

Base URL
https://api.edumentor.kz/api/v1

Определение школы

Для эндпоинтов школы (/api/v1/t/*) сервер должен знать, к какой школе относится запрос. Школа определяется одним из двух способов:

СпособКакПриоритет
ЗаголовокX-Tenant-Subdomain: acmeОсновной — используйте его
Поддомен в HostЗапрос на acme.edumentor.kz (≥3 части в домене)Запасной
Рекомендация
Передавайте субдомен явным заголовком X-Tenant-Subdomain. Так один и тот же базовый адрес работает для всех школ, без манипуляций с доменом.
Пример запроса к школе
curl https://api.edumentor.kz/api/v1/t/courses \
  -H "Authorization: Bearer <token>" \
  -H "X-Tenant-Subdomain: acme"

Три уровня эндпоинтов

ПрефиксТенант нужен?Назначение
/api/v1/auth/*НетВход, регистрация, поиск школ — публичные
/api/v1/public/*Нет (субдомен в query)Публичный брендинг школы до входа
/api/v1/admin/*НетСуперадмин платформы (над всеми школами)
/api/v1/t/*ДаВсе данные конкретной школы

Изоляция данных

  • Токен привязан к школе: его tenant_id сверяется с определённой по заголовку школой. Чужой токен к чужой школе не подойдёт.
  • Каждая запись в базе несёт tenant_id, и каждый запрос фильтруется по нему.
  • Запрос к объекту другой школы возвращает 404 — без подсказок о его существовании.
Несуществующая или приостановленная школа
Если школа не найдена, удалена или приостановлена, публичные эндпоинты брендинга отвечают 404 (без перечисления школ), а защищённые — 403.

Брендинг до входа

Экран входа школы получает логотип и цвета без авторизации через GET /public/tenant. Субдомен передаётся query-параметром.