8.1 KiB
🔌 REST API
Все эндпоинты имеют префикс /api/. Ответы возвращаются в формате JSON.
Аутентификация
POST /api/auth/login
Вход в систему.
Тело запроса:
{
"username": "admin",
"password": "admin"
}
Успешный ответ (200):
{
"success": true,
"message": "OK",
"token": "550e8400-e29b-41d4-a716-446655440000",
"role": "ADMIN",
"redirect": "/admin/"
}
Ошибка (401):
{
"success": false,
"message": "Неверное имя пользователя или пароль",
"token": null,
"role": null,
"redirect": null
}
После получения токена клиент должен передавать его в заголовке:
Authorization: Bearer <token>
Пользователи
GET /api/users
Список всех пользователей.
Ответ:
[
{ "id": 1, "username": "admin", "role": "ADMIN" },
{ "id": 2, "username": "Тестовый преподаватель", "role": "TEACHER" }
]
GET /api/users/teachers
Список только преподавателей (роль TEACHER).
POST /api/users
Создание пользователя.
Тело запроса:
{
"username": "Новый преподаватель",
"password": "password123",
"role": "TEACHER"
}
Валидация:
username— обязателенpassword— минимум 4 символаrole—ADMIN,TEACHERилиSTUDENT
DELETE /api/users/{id}
Удаление пользователя.
Расписание (Lessons)
GET /api/users/lessons
Список всех занятий с разрешёнными именами (преподаватель, группа, дисциплина, аудитория).
Ответ:
[
{
"id": 1,
"teacherName": "Тестовый преподаватель",
"groupName": "ИВТ-21-1",
"classroomName": "101 Ленинская",
"educationFormName": "Бакалавриат",
"subjectName": "Высшая математика",
"typeLesson": "Лекция",
"lessonFormat": "Очно",
"day": "Понедельник",
"week": "Верхняя",
"time": "11:40 - 13:10"
}
]
GET /api/users/lessons/{teacherId}
Занятия конкретного преподавателя.
POST /api/users/lessons/create
Создание занятия.
Тело запроса:
{
"teacherId": 2,
"groupId": 1,
"subjectId": 1,
"lessonFormat": "Очно",
"typeLesson": "Лекция",
"classroomId": 1,
"day": "Понедельник",
"week": "Верхняя",
"time": "11:40 - 13:10"
}
Валидация:
| Поле | Правило |
|---|---|
teacherId |
Обязателен, ≠ 0 |
groupId |
Обязателен, ≠ 0 |
subjectId |
Обязателен, ≠ 0 |
lessonFormat |
Очно или Онлайн |
typeLesson |
Лекция, Практическая работа, Лабораторная работа |
classroomId |
Обязателен, ≠ 0 |
day |
Пн–Сб (на русском) |
week |
Верхняя, Нижняя, Обе |
time |
Обязателен |
PUT /api/users/lessons/update/{lessonId}
Обновление занятия. Поддерживает partial update — передаются только изменённые поля.
DELETE /api/users/lessons/delete/{lessonId}
Удаление занятия.
GET /api/users/lessons/ping
Проверка доступности контроллера. Возвращает строку pong.
Группы
GET /api/groups
Список всех групп.
Ответ:
[
{
"id": 1,
"name": "ИВТ-21-1",
"groupSize": 25,
"educationFormId": 1,
"educationFormName": "Бакалавриат"
}
]
POST /api/groups
Создание группы.
{
"name": "ИБ-31м",
"groupSize": 20,
"educationFormId": 2
}
DELETE /api/groups/{id}
Удаление группы.
Аудитории
GET /api/classrooms
Список аудиторий с привязанным оборудованием.
Ответ:
[
{
"id": 1,
"name": "101 Ленинская",
"capacity": 120,
"isAvailable": true,
"equipments": [
{ "id": 1, "name": "Проектор" },
{ "id": 4, "name": "Интерактивная доска" }
]
}
]
POST /api/classrooms
Создание аудитории.
{
"name": "404 Лаборатория",
"capacity": 30,
"isAvailable": true,
"equipmentIds": [1, 2, 3]
}
PUT /api/classrooms/{id}
Обновление аудитории (partial update).
DELETE /api/classrooms/{id}
Удаление аудитории.
Дисциплины
GET /api/subjects
Список всех дисциплин.
POST /api/subjects
{ "name": "Физика" }
DELETE /api/subjects/{id}
Удаление дисциплины.
Оборудование
GET /api/equipments
Список всего оборудования.
POST /api/equipments
{ "name": "3D-принтер" }
DELETE /api/equipments/{id}
Удаление оборудования.
Формы обучения
GET /api/education-forms
Список форм обучения.
Ответ:
[
{ "id": 1, "name": "Бакалавриат" },
{ "id": 2, "name": "Магистратура" }
]
POST /api/education-forms
{ "name": "Аспирантура" }
DELETE /api/education-forms/{id}
Удаление формы обучения. Невозможно, если к ней привязаны группы.
Привязка «Преподаватель ↔ Дисциплина»
GET /api/teacher-subjects
Список всех привязок.
Ответ:
[
{
"userId": 2,
"userName": "Тестовый преподаватель",
"subjectId": 1,
"subjectName": "Высшая математика"
}
]
POST /api/teacher-subjects
{
"userId": 2,
"subjectId": 3
}
DELETE /api/teacher-subjects
{
"userId": 2,
"subjectId": 3
}
Управление тенантами (Базы данных)
GET /api/database/status
Статус текущего подключения (определяется по домену запроса).
Ответ:
{
"tenant": "default",
"connected": true,
"configured": true,
"name": "Default",
"url": "jdbc:postgresql://db:5432/app_db"
}
GET /api/database/tenants
Список всех тенантов.
POST /api/database/tenants
Добавление нового тенанта.
{
"name": "СВФУ",
"domain": "swsu",
"url": "jdbc:postgresql://db-host:5432/swsu_db",
"username": "dbuser",
"password": "dbpass"
}
Логика:
- Создаёт HikariCP пул для нового тенанта
- Запускает Flyway миграции на его БД
- Обновляет Kubernetes ConfigMap
DELETE /api/database/tenants/{domain}
Удаление тенанта.
POST /api/database/test
Тест подключения к произвольной БД (без регистрации тенанта).
{
"url": "jdbc:postgresql://host:5432/testdb",
"username": "user",
"password": "pass"
}
Ответ:
{
"success": true,
"message": "Подключение успешно!"
}
Коды ответов
| Код | Описание |
|---|---|
200 |
Успех |
400 |
Ошибка валидации (с message в теле) |
401 |
Неверные учётные данные |
404 |
Ресурс / тенант не найден |
500 |
Внутренняя ошибка сервера |