H-3729: GET /system-notifications/active #45

Open
anton wants to merge 1 commits from feature/H-3729 into master
anton commented 2026-10-01 11:27:42 +00:00 (Migrated from git.hrenot.com)

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 (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)
anton commented 2026-10-01 11:27:59 +00:00 (Migrated from git.hrenot.com)

changed the description

changed the description
anton commented 2026-10-01 11:44:43 +00:00 (Migrated from git.hrenot.com)

changed the description

changed the description
anton commented 2026-10-01 11:44:44 +00:00 (Migrated from git.hrenot.com)

[🔵 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:

--- 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`).
anton commented 2026-10-01 12:00:29 +00:00 (Migrated from git.hrenot.com)

added 1 commit

  • adf04eff - H-3729: GET /system-notifications/active

Compare with previous version

added 1 commit <ul><li>adf04eff - H-3729: GET /system-notifications/active</li></ul> [Compare with previous version](/hrbox-public/api/-/merge_requests/45/diffs?diff_id=40699&start_sha=f3cebce16719b95c64f198c12ff6ad1a91e5a660)
anton commented 2026-10-01 12:00:48 +00:00 (Migrated from git.hrenot.com)

Исправлено в adf04ef (amend), предложенный фикс применён.

Исправлено в adf04ef (amend), предложенный фикс применён.
anton commented 2026-10-01 12:00:49 +00:00 (Migrated from git.hrenot.com)

resolved all threads

resolved all threads
You are not authorized to merge this pull request.
This pull request can be merged automatically.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feature/H-3729:feature/H-3729
git checkout feature/H-3729
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: hrbox-public/api#45