Много разных изменений

This commit is contained in:
Zuev
2026-08-20 00:55:27 +03:00
parent 3599d850f6
commit a1c4ee4298
78 changed files with 4698 additions and 428 deletions

View File

@@ -230,10 +230,39 @@ Refresh-токен ротируется при каждом успешном о
`UserResponse` единый для списков пользователей, списков преподавателей и ответов создания/восстановления. Поля `departmentName`, `departmentId` и `status` не выводятся только если равны `null`.
### `GET /api/users/page`
Пагинированный реестр пользователей для администратора. Параметры: `query`, `role`,
`departmentId`, `includeArchived`, `page`, `size`, `sort`, `direction`. Размер страницы
ограничен диапазоном `1..100`; поддерживаемые поля сортировки — `fullName`, `username`,
`role`, `status`.
Пагинированные endpoints используют общий ответ:
```json
{
"items": [],
"page": 0,
"size": 25,
"totalItems": 0,
"totalPages": 0,
"first": true,
"last": true
}
```
### `GET /api/users/teachers`
Список только преподавателей (роль `TEACHER`).
### `GET /api/users/teachers/options`
Серверный поиск преподавателей для асинхронных списков. Параметры: `query`,
`departmentId`, `selectedId`, `limit` (`1..50`). Поиск выполняется по логину, ФИО и
должности; архивные записи исключаются. Для роли `DEPARTMENT` backend принудительно
использует кафедру текущего пользователя и учитывает действующие основные и дополнительные
назначения из `teacher_department_assignments`. `selectedId` не обходит это ограничение.
### `GET /api/users/teachers/{departmentId}`
Список преподавателей привязанных к конкретной кафедре (роль `TEACHER`, код кафедры `departmentId`). Ответ использует ту же структуру `UserResponse`, что и `GET /api/users`.
@@ -309,6 +338,7 @@ Refresh-токен ротируется при каждом успешном о
| Метод | URL | Назначение |
|-------|-----|------------|
| `GET` | `/api/teacher-requests?status=PENDING` | Список заявок, опционально с фильтром статуса |
| `GET` | `/api/teacher-requests/page?query=&status=PENDING&page=0&size=25` | Пагинированный поиск заявок по логину, ФИО, должности и кафедре |
| `POST` | `/api/teacher-requests/{id}/approve` | Одобрить заявку, скорректировать данные и создать преподавателя |
| `POST` | `/api/teacher-requests/{id}/reject` | Отклонить заявку |
@@ -567,6 +597,7 @@ GET /api/schedule?groupId=1&startDate=2026-04-27&endDate=2026-05-03
| Метод | URL | Назначение |
|-------|-----|------------|
| `GET` | `/api/admin/academic-calendars` | Список графиков, фильтры `academicYearId`, `specialtyId`, `profileId` |
| `GET` | `/api/admin/academic-calendars/options` | Асинхронный поиск совместимых графиков для комбобокса |
| `GET` | `/api/admin/academic-calendars/{id}` | Один график |
| `POST` | `/api/admin/academic-calendars` | Создать график |
| `PUT` | `/api/admin/academic-calendars/{id}` | Обновить график |
@@ -593,6 +624,11 @@ GET /api/schedule?groupId=1&startDate=2026-04-27&endDate=2026-05-03
название автоматически как `код специальности — профиль обучения — форма обучения — учебный год`.
Отдельного пользовательского названия у календарного графика нет.
`GET /api/admin/academic-calendars/options` принимает `query`, `academicYearId`,
`specialtyId`, `profileId`, `studyFormId`, `selectedId` и `limit` (`1..50`). Поиск
выполняется по составному названию, учебному году, коду/названию специальности, профилю и
форме обучения. Фасетные параметры позволяют не показывать группе несовместимые графики.
`POST /api/admin/academic-calendars` создаёт график и начальную сетку одной транзакцией.
Для каждого курса из диапазона `1..courseCount` backend сохраняет один период с кодом `Т`
на весь учебный год, включая обе его границы. Поэтому обычные занятия разрешены сразу после
@@ -1305,6 +1341,21 @@ payload обрабатываются один раз, используется
Параметр `includeArchived=true` возвращает все группы, включая архивные и завершившие обучение.
### `GET /api/groups/page`
Пагинированный реестр групп. Параметры: `query`, повторяемый `educationFormId`,
`departmentId`, `yearStartStudy`, `includeArchived`, `page`, `size`, `sort`, `direction`.
Поддерживаемые поля сортировки: `name`, `yearStartStudy`, `groupSize`, `status`. Поиск
проверяет название группы, код и название специальности, профиль и форму обучения. Для
роли `DEPARTMENT` кафедра всегда берётся из JWT-контекста независимо от переданного фильтра.
### `GET /api/groups/options`
Асинхронный поиск активных групп. Параметры: `query`, `departmentId`, `selectedId`, `limit`
(`1..50`). Завершившие обучение и архивные группы исключаются. Для роли `DEPARTMENT`
действует то же принудительное ограничение своей кафедрой, включая восстановление выбранного
`selectedId`.
**Ответ:**
```json
[
@@ -1408,7 +1459,7 @@ legacy-alias для старых клиентов и исторически со
| Метод | URL | Назначение |
|-------|-----|------------|
| `GET` | `/api/subgroups` | Список всех подгрупп |
| `GET` | `/api/subgroups?groupId=1&groupId=2` | Подгруппы выбранных групп; без параметра — совместимый список всех подгрупп, не более 100 ID групп за запрос |
| `GET` | `/api/groups/{groupId}/subgroups` | Подгруппы конкретной группы |
| `POST` | `/api/groups/{groupId}/subgroups` | Создать подгруппу |
| `PUT` | `/api/groups/{groupId}/subgroups/{id}` | Обновить подгруппу |
@@ -1486,6 +1537,12 @@ legacy-alias для старых клиентов и исторически со
Список аудиторий с привязанным оборудованием.
### `GET /api/classrooms/options`
Асинхронный поиск доступных неархивных аудиторий по названию и корпусу. Параметры:
`query`, `selectedId`, `limit` (`1..50`). Выбранная запись добавляется в результат, если
она не попала в первую страницу поиска.
**Ответ:**
```json
[
@@ -1539,6 +1596,12 @@ legacy-alias для старых клиентов и исторически со
Список всех дисциплин.
### `GET /api/subjects/page`
Пагинированный реестр дисциплин. Параметры: `query`, `departmentId`, `includeArchived`,
`page`, `size`, `sort`, `direction`; сортировка разрешена по `name`, `code`,
`departmentId`, `status`. Роль `DEPARTMENT` всегда ограничивается своей кафедрой на backend.
```json
{
"name": "Физика",
@@ -1620,14 +1683,17 @@ legacy-alias для старых клиентов и исторически со
### `GET /api/teacher-subjects`
Список всех привязок.
Список привязок. Повторяемый параметр `subjectId` ограничивает результат указанными
дисциплинами; за один запрос принимается не более 100 ID. Без параметра сохраняется
совместимый режим получения всех доступных текущей роли привязок.
**Ответ:**
```json
[
{
"userId": 2,
"userName": "Тестовый преподаватель",
"username": "teacher2",
"fullName": "Тестовый преподаватель",
"subjectId": 1,
"subjectName": "Высшая математика"
}

File diff suppressed because one or more lines are too long