Все ответы 422 используют общий UnprocessableEntity с неуместным примером про пароль ("Password must be at least 6 characters"), который не релевантен для большинства эндпоинтов.
Создать контекстные примеры для каждого эндпоинта или группы эндпоинтов.
-
/dictionary/user/statuses— заменитьname: "John Doe"на реальные статусы (New, Active, Blocked, Unconfirmed)
-
GET /user/user/index— ошибки фильтров (UserSearch)КОД: actionIndex() → $searchModel->getFirstErrors() РЕАЛЬНЫЕ ОШИБКИ: page, status, groupIds, courseIds ПРИМЕРЫ: "Page must be number" ❌ ПРОБЛЕМА: responses.yaml показывает пример про "Password must be at least 6 characters" Пароль НИКОГДА не валидируется в GET методах! ✓ ИСПРАВЛЕНИЕ: Заменить пример на ошибки фильтрации (page, status)
-
GET /user/user/admin— ошибки фильтров (AdminSearch)КОД: actionAdmin() → $searchModel->getFirstErrors() РЕАЛЬНЫЕ ОШИБКИ: page, sort ПРИМЕРЫ: "Page must be number" ❌ ПРОБЛЕМА: responses.yaml показывает пример про пароль Пароль НИКОГДА не валидируется! ✓ ИСПРАВЛЕНИЕ: Заменить пример на ошибки фильтрации
-
POST /user/user/create— валидация UserFormКОД: actionCreate() → $model->validate() → $model->getFirstErrors() РЕАЛЬНЫЕ ОШИБКИ: username, email, password, role ПРИМЕРЫ: - username: "Username cannot be blank", "Username must contain at least 2 characters" - email: "Email cannot be blank", "Email must be a valid email address" - password: "Password must be at least 6 characters" - role: "The role does not exist" ✅ ПАРОЛЬ УМЕСТЕН здесь! responses.yaml пример подходит
-
PUT /user/user/update— валидация UserFormКОД: actionUpdate() → $model->validate() → $model->getFirstErrors() РЕАЛЬНЫЕ ОШИБКИ: email, role (пароль опционален) ПРИМЕРЫ: - email: "Email must be a valid email address" - role: "The role does not exist" ❌ ПРОБЛЕМА: responses.yaml показывает пример про пароль При обновлении пароль не всегда валидируется ✓ ИСПРАВЛЕНИЕ: Заменить пример на ошибки email/role
-
POST /user/user/add-course— назначение курса (AddCourseForm)КОД: actionAddCourse() → $form->validate() → $form->getFirstErrors() РЕАЛЬНЫЕ ОШИБКИ: userIds, courseIds ПРИМЕРЫ: - userIds: "userIds должен быть массив" - courseIds: "courseIds должен быть массив", "В courseIds указан не верный ИД" ❌ ПРОБЛЕМА: responses.yaml показывает пример про пароль Пароль НИКОГДА не валидируется в этой форме! ✓ ИСПРАВЛЕНИЕ: Заменить пример на ошибки массивов (userIds, courseIds)
-
POST /user/user/delete-course— отзыв курса (AddCourseForm)КОД: actionDeleteCourse() → $form->validate() → $form->getFirstErrors() РЕАЛЬНЫЕ ОШИБКИ: userIds, courseIds (те же, что и add-course) ПРИМЕРЫ: - userIds: "userIds должен быть массив" - courseIds: "courseIds должен быть массив" ❌ ПРОБЛЕМА: responses.yaml показывает пример про пароль Пароль НИКОГДА не валидируется! ✓ ИСПРАВЛЕНИЕ: Заменить пример на ошибки массивов
-
POST /user/user/load— импорт пользователейerrors: fileImport: - "Файл не загружен" - "Неподдерживаемый формат файла"
-
GET /user/import-report/index— история импортовerrors: page: - "Некорректный номер страницы"
-
GET /group/group/index— список группerrors: page: - "Номер страницы должен быть положительным числом"
-
POST /group/group/create— создание группыerrors: name: - "Название группы обязательно" - "Группа с таким названием уже существует" parent_id: - "Родительская группа не найдена"
-
PUT /group/group/update— обновление группыerrors: id: - "Группа не найдена" name: - "Название группы обязательно" parent_id: - "Нельзя переместить группу в её дочернюю группу"
-
DELETE /group/group/delete— удаление группerrors: ids: - "Не указаны ID групп для удаления"
-
POST /group/group/add-user— добавление пользователяerrors: user_id: - "Пользователь не найден" group_id: - "Группа не найдена"
-
POST /group/group/move-user— перемещение пользователяerrors: user_id: - "Пользователь не найден" from_group_id: - "Исходная группа не найдена" to_group_id: - "Целевая группа не найдена"
-
POST /group/group/assign-courses— назначение курсов группеerrors: group_id: - "Группа не найдена" course_ids: - "Курс не найден"
-
GET /certificate/certificate/index— список сертификатовerrors: page: - "Некорректный номер страницы"
-
POST /certificate/certificate/create— выдача сертификатаerrors: user_id: - "Пользователь не найден" template_id: - "Шаблон сертификата не найден" course_id: - "Курс не найден"
-
POST /certificate/certificate/export-zip— экспорт в ZIPerrors: ids: - "Не указаны ID сертификатов"
-
GET /certificate/template/index— список шаблоновerrors: page: - "Некорректный номер страницы"
-
POST /certificate/template/create— создание шаблонаerrors: name: - "Название шаблона обязательно" type: - "Некорректный тип сертификата"
-
GET /certificate/template-field/index— поля шаблонаerrors: template_id: - "Шаблон не найден"
-
POST /certificate/template-field/create— создание поляerrors: name: - "Название поля обязательно" template_id: - "Шаблон не найден"
-
GET /course/course/index— список курсовerrors: page: - "Некорректный номер страницы"
Добавить example напрямую в каждый эндпоинт вместо ссылки на общий UnprocessableEntity.
Создать разные response schemas:
ValidationErrorUserValidationErrorGroupValidationErrorCertificate- и т.д.
Использовать более универсальный пример:
errors:
field_name:
- "Значение поля некорректно"- Высокий:
/dictionary/user/statuses(200) — явная ошибка - Высокий:
/user/user/create,/user/user/update— часто используются - Средний: Groups, Certificates — важные модули
- Низкий: GET-методы с пагинацией — редко возвращают 422
openapi-publish/specs/core/common/responses.yaml— общие ответыopenapi-publish/specs/users.yaml— модуль пользователейopenapi-publish/specs/groups.yaml— модуль групп (если есть)openapi-publish/specs/certificates.yaml— модуль сертификатов (если есть)openapi-publish/specs/learning.yaml— модуль курсов (если есть)openapi-publish/space-platform-api.yaml— собранный файл