Мультитенантность
Каждая школа — это изолированный тенант. Данные одной школы никогда не пересекаются с данными другой.
Базовый адрес
Все запросы идут на единый базовый адрес с префиксом версии:
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-параметром.