В v2/swagger.yaml добавлен тег system-notifications с описанием «нужно право admin-controls»
Новый путь GET /system-notifications/active (operationId systemNotificationsActive): параметры per-page/page/sort (enum published_at/-published_at), ответ {data[], _links, _meta}, отдельно описан ответ 403
Новая схема components.schemas.SystemNotification с полями id (uuid), body_html (санитизированный HTML, язык с откатом на ru, пустая строка допустима) и published_at (date-time, ATOM)
Сверено с кодом hrbox на origin/feature/H-3729. fields() модели, accessRules, pageSizeLimit [1,50] / default 20, сортировка и envelope data у RestController совпадают с описанием. Набор тегов p, br, strong, em, del, ul, ol, li, a подтверждён прогоном SystemNotificationRenderer в контейнере
YAML парсится. Новый фрагмент отдельно проходит openapi-spec-validator. Ошибки валидатора на полном файле уже были в master и к этому MR не относятся
Risk Assessment: 🟢
Verdict
Описание совпадает с реальным эндпоинтом: состав полей, право доступа, пагинация, сортировка, обёртка ответа и whitelist тегов проверены по коду и прогоном рендерера. Багов нет, есть одно мелкое расхождение со свежей конвенцией типизации параметров пагинации.
Issues: 1 (🔴 0 / 🟡 0 / 🔵 1)
YouTrack: https://youtrack.hrenot.com/issue/H-3729
## Связанные MR
- hrbox: https://git.hrenot.com/hrbox/hrbox/-/merge_requests/8461
- Hub: https://git.hrenot.com/hrbox/hub/-/merge_requests/18
- goworker: https://git.hrenot.com/hrbox/hrbox-goworker/-/merge_requests/26
Описание эндпоинта системных объявлений для баннера администраторов (пагинация, сортировка, схема `SystemNotification`).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---
## 📋 Code Review Summary
### Changes Overview
- В `v2/swagger.yaml` добавлен тег `system-notifications` с описанием «нужно право `admin-controls`»
- Новый путь `GET /system-notifications/active` (operationId `systemNotificationsActive`): параметры `per-page`/`page`/`sort` (enum `published_at`/`-published_at`), ответ `{data[], _links, _meta}`, отдельно описан ответ 403
- Новая схема `components.schemas.SystemNotification` с полями `id` (uuid), `body_html` (санитизированный HTML, язык с откатом на ru, пустая строка допустима) и `published_at` (date-time, ATOM)
- Сверено с кодом hrbox на `origin/feature/H-3729`. `fields()` модели, `accessRules`, `pageSizeLimit [1,50]` / default 20, сортировка и envelope `data` у `RestController` совпадают с описанием. Набор тегов `p, br, strong, em, del, ul, ol, li, a` подтверждён прогоном `SystemNotificationRenderer` в контейнере
- YAML парсится. Новый фрагмент отдельно проходит `openapi-spec-validator`. Ошибки валидатора на полном файле уже были в master и к этому MR не относятся
### Risk Assessment: 🟢
### Verdict
Описание совпадает с реальным эндпоинтом: состав полей, право доступа, пагинация, сортировка, обёртка ответа и whitelist тегов проверены по коду и прогоном рендерера. Багов нет, есть одно мелкое расхождение со свежей конвенцией типизации параметров пагинации.
**Issues:** 1 (🔴 0 / 🟡 0 / 🔵 1)
[🔵 Suggestion]: Параметры пагинации типизированы по старому шаблону string, а не по конвенции integer с min/max/default
File:v2/swagger.yaml:8291
Problem: У per-page и page указан type: string, а default и максимум записаны только текстом в description. Этот блок скопирован со старых путей (/file/index, /tag/index, /article/news). У всех свежих v2-путей на AbstractSearchModel (/admin/employment прямо над новым путём, /admin/wallet, /admin/wallet-transaction, /file-processing, /user-api-token, /admin/user-api-token, /user/index) параметры описаны как { type: integer, minimum: 1, default: N }. Если у search-модели задан pageSizeLimit, добавляется ещё maximum: WalletSearch [1,100] даёт maximum: 100, FileProcessingSearch [1,10] даёт maximum: 10. У SystemNotificationSearchpageSizeLimit = [1, 50] и defaultPageSize = 20, так что по той же конвенции должно быть maximum: 50, default: 20.
Suggested fix:
--- a/v2/swagger.yaml
+++ b/v2/swagger.yaml
@@ -8290,19 +8290,17 @@
parameters:
- name: per-page
in: query
- description: How many items return in one page (default 20, max 50).
- schema:
- type: string
+ schema: { type: integer, minimum: 1, maximum: 50, default: 20 }
+ description: Значение больше 50 урезается до 50.
- name: page
in: query
- description: Current page.
- schema:
- type: string
+ schema: { type: integer, minimum: 1, default: 1 }
- name: sort
- description: Sorting field and direction (default -published_at).
in: query
schema:
type: string
enum:
- published_at
- -published_at
+ description: По умолчанию `-published_at`.
Why: Сейчас default и лимит видны только в тексте description. Swagger UI и генераторы клиентов не покажут их как ограничения и сгенерируют строковые page/per-page. Типизированная схема совпадает с соседними путями и с реальным поведением сервера (Yii Pagination урезает значение до pageSizeLimit).
### [🔵 Suggestion]: Параметры пагинации типизированы по старому шаблону string, а не по конвенции integer с min/max/default
**File:** `v2/swagger.yaml:8291`
**Problem:** У `per-page` и `page` указан `type: string`, а default и максимум записаны только текстом в description. Этот блок скопирован со старых путей (`/file/index`, `/tag/index`, `/article/news`). У всех свежих v2-путей на `AbstractSearchModel` (`/admin/employment` прямо над новым путём, `/admin/wallet`, `/admin/wallet-transaction`, `/file-processing`, `/user-api-token`, `/admin/user-api-token`, `/user/index`) параметры описаны как `{ type: integer, minimum: 1, default: N }`. Если у search-модели задан `pageSizeLimit`, добавляется ещё `maximum`: `WalletSearch [1,100]` даёт `maximum: 100`, `FileProcessingSearch [1,10]` даёт `maximum: 10`. У `SystemNotificationSearch` `pageSizeLimit = [1, 50]` и `defaultPageSize = 20`, так что по той же конвенции должно быть `maximum: 50, default: 20`.
**Suggested fix:**
```diff
--- a/v2/swagger.yaml
+++ b/v2/swagger.yaml
@@ -8290,19 +8290,17 @@
parameters:
- name: per-page
in: query
- description: How many items return in one page (default 20, max 50).
- schema:
- type: string
+ schema: { type: integer, minimum: 1, maximum: 50, default: 20 }
+ description: Значение больше 50 урезается до 50.
- name: page
in: query
- description: Current page.
- schema:
- type: string
+ schema: { type: integer, minimum: 1, default: 1 }
- name: sort
- description: Sorting field and direction (default -published_at).
in: query
schema:
type: string
enum:
- published_at
- -published_at
+ description: По умолчанию `-published_at`.
```
**Why:** Сейчас default и лимит видны только в тексте description. Swagger UI и генераторы клиентов не покажут их как ограничения и сгенерируют строковые `page`/`per-page`. Типизированная схема совпадает с соседними путями и с реальным поведением сервера (Yii `Pagination` урезает значение до `pageSizeLimit`).
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
YouTrack: https://youtrack.hrenot.com/issue/H-3729
Связанные MR
Описание эндпоинта системных объявлений для баннера администраторов (пагинация, сортировка, схема
SystemNotification).🤖 Generated with Claude Code
📋 Code Review Summary
Changes Overview
v2/swagger.yamlдобавлен тегsystem-notificationsс описанием «нужно правоadmin-controls»GET /system-notifications/active(operationIdsystemNotificationsActive): параметрыper-page/page/sort(enumpublished_at/-published_at), ответ{data[], _links, _meta}, отдельно описан ответ 403components.schemas.SystemNotificationс полямиid(uuid),body_html(санитизированный HTML, язык с откатом на ru, пустая строка допустима) иpublished_at(date-time, ATOM)origin/feature/H-3729.fields()модели,accessRules,pageSizeLimit [1,50]/ default 20, сортировка и envelopedataуRestControllerсовпадают с описанием. Набор теговp, br, strong, em, del, ul, ol, li, aподтверждён прогономSystemNotificationRendererв контейнереopenapi-spec-validator. Ошибки валидатора на полном файле уже были в master и к этому MR не относятсяRisk Assessment: 🟢
Verdict
Описание совпадает с реальным эндпоинтом: состав полей, право доступа, пагинация, сортировка, обёртка ответа и whitelist тегов проверены по коду и прогоном рендерера. Багов нет, есть одно мелкое расхождение со свежей конвенцией типизации параметров пагинации.
Issues: 1 (🔴 0 / 🟡 0 / 🔵 1)
changed the description
changed the description
[🔵 Suggestion]: Параметры пагинации типизированы по старому шаблону string, а не по конвенции integer с min/max/default
File:
v2/swagger.yaml:8291Problem: У
per-pageиpageуказанtype: string, а default и максимум записаны только текстом в description. Этот блок скопирован со старых путей (/file/index,/tag/index,/article/news). У всех свежих v2-путей наAbstractSearchModel(/admin/employmentпрямо над новым путём,/admin/wallet,/admin/wallet-transaction,/file-processing,/user-api-token,/admin/user-api-token,/user/index) параметры описаны как{ type: integer, minimum: 1, default: N }. Если у search-модели заданpageSizeLimit, добавляется ещёmaximum:WalletSearch [1,100]даётmaximum: 100,FileProcessingSearch [1,10]даётmaximum: 10. УSystemNotificationSearchpageSizeLimit = [1, 50]иdefaultPageSize = 20, так что по той же конвенции должно бытьmaximum: 50, default: 20.Suggested fix:
Why: Сейчас default и лимит видны только в тексте description. Swagger UI и генераторы клиентов не покажут их как ограничения и сгенерируют строковые
page/per-page. Типизированная схема совпадает с соседними путями и с реальным поведением сервера (YiiPaginationурезает значение доpageSizeLimit).added 1 commit
adf04eff- H-3729: GET /system-notifications/activeCompare with previous version
Исправлено в
adf04ef(amend), предложенный фикс применён.resolved all threads
View command line instructions
Checkout
From your project repository, check out a new branch and test the changes.