Files
magistr/docs/API.md
Zuev 491807cd94
All checks were successful
Build and Push Docker Images / build-and-push-backend (push) Successful in 17s
Build and Push Docker Images / build-and-push-frontend (push) Successful in 10s
Build and Push Docker Images / deploy-to-k8s (push) Successful in 1m57s
docs: Add comprehensive project documentation covering architecture, development, and APIs, and update AGENTS.md.
2026-03-22 02:49:13 +03:00

8.1 KiB
Raw Blame History

🔌 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 символа
  • roleADMIN, 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"
}

Логика:

  1. Создаёт HikariCP пул для нового тенанта
  2. Запускает Flyway миграции на его БД
  3. Обновляет 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 Внутренняя ошибка сервера