Commit Graph
10 Commits
Author SHA1 Message Date
DenisandClaude Opus 4.7 37203aee1b H-3657: задокументировал /file/prepare-upload и /file/finish-upload
Без этих эндпоинтов excel-import flow для wallet-транзакций
неполный — интегратор не понимает откуда взять file_id для
POST /admin/wallet-transaction/excel-processing.

- Новый тег `file` (Methods for uploading files via signed-URL...).
- POST /file/prepare-upload: создаёт File-запись + возвращает signedUrl
  для PUT-загрузки бинарника напрямую в S3.
- POST /file/finish-upload?id=<uuid>: помечает файл как UPLOADED, после
  чего file_id можно использовать в downstream-флоу.
- Подробная описание двухшагового флоу (prepare → PUT signedUrl → finish)
  в описании prepare-upload.
- Идемпотентность через повторный prepare-upload с тем же id.
- Схемы File (полная), FilePrepareUploadBody, FilePrepareUploadResponse.
- В WalletExcelFormBody.file_id ссылка на этот upload-флоу — раньше
  было просто «UUID предварительно загруженного xlsx».

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 16:49:54 +03:00
DenisandClaude Opus 4.7 b8d17240ab H-3657: задокументировал /user/index и /user/search
Источник user_id для дальнейшей передачи в user-list-cache.
Раньше в swagger был только /user/profile (один по id) и /user/items
(минимальный список), но не было пагинированного индекса
с фильтрами — а именно через /user/index интегратор собирает
получателей для массового начисления валюты.

- GET /user/index: пагинация (per-page 1..20), сортировка, фильтры
  по основным атрибутам UserSearch (id, email, name, first_name,
  last_name, department_id, reg_status_id, group_id, position, ...),
  expand-поля.
- GET /user/search?q=&limit=&offset=: быстрый компактный поиск
  по ФИО/email/должности. Возвращает {q, users:[{id, name, position,
  departmentName, isBoss, ...}]}. Требует право show-structure-names —
  иначе users:[].

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 16:06:44 +03:00
DenisandClaude Opus 4.7 1032e5b522 H-3657: задокументировал user-list-cache (источник usersListKey)
Без этого интегратор не понимает откуда взять usersListKey для
POST /admin/wallet-transaction/create.

- Тег user-list-cache (Methods for caching ad-hoc employee selections...).
- POST /user-list-cache/set-user-list: тело {key, userList:{usersId,...}}.
  В описании явно прописал что Content-Type обязательно application/json —
  через form-urlencoded вложенный JsonModel не парсится, и сервер
  молча сохраняет пустую выборку (грабли которые я сам и наступил
  во время smoke-теста).
- GET /user-list-cache/user-list-data?key=<key>: возвращает развёрнутую
  выборку (users, departments, userGroups, ...). Схема ответа проверена
  живьём на denis.hrbox.io — все ключи совпадают.
- Схемы UserListForm, UserListCacheSetBody, UserListData.
- В описании POST /admin/wallet-transaction/create добавил секцию
  «Как получить usersListKey» с пошаговым флоу и ссылкой.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:51:23 +03:00
DenisandClaude Opus 4.7 92d9c73b0c H-3657: description/summary метода create — обратно на русский
Соглашение: info.description и теги — короткое EN (как workflow,
wallet и др.), а внутри самого метода (summary + description) —
русский, потому что туда смотрит уже сам интегратор и важно дать
максимально понятный how-to. Возвращаю русский для
POST /user-api-token/create.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:39:40 +03:00
DenisandClaude Opus 4.7 161dc83b21 H-3657: PAT how-to → описание метода create, тэги/info → короткие EN
- info.description: убрал большой блок «Авторизация по личному API-токену»
  (он висел на стартовой странице Swagger UI). Вместо него — одна
  английская строка-указатель на user-api-token methods, в стиле
  остального вступления.
- BearerAuth securityScheme: однострочное EN-описание.
- Теги admin-wallet, admin-wallet-transaction, file-processing,
  user-api-token, admin-user-api-token: переведены в формат
  «Methods for ...» (как workflow, wallet, shop и т.д.) — короткая
  английская строка на тег.
- POST /user-api-token/create description: подробный how-to (создание,
  Bearer-header, tenant-резолв, отсутствие scopes, lifecycle,
  isValidForDisplay-caveat, запрет на управление под Bearer) — теперь
  лежит здесь, на английском, и сворачивается в UI вместе с эндпоинтом.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 15:17:47 +03:00
DenisandClaude Opus 4.7 4c74aa22f5 H-3656/H-3657: правки после smoke-теста на denis.hrbox.io
- Listing-схемы (Wallet/WalletTransaction/FileProcessing/UserApiToken{,Admin}):
  добавил optional поле `_links` — оно реально возвращается Yii Pagination
  на index-эндпоинтах и без него клиент-генератор не видит поле.
- FileProcessing: дополнил схему полями, которые реально приходят в
  ответе без `?expand=`:
  * `file` — объект с метаданными файла-источника (name, ext, url, ...)
  * `created`/`started`/`finished` — локализованные строки для отображения
  Уточнил `arguments` и `result` (oneOf object/array).

Все остальные эндпоинты (admin/wallet[/view], admin/wallet-transaction[/view],
admin/wallet-transaction/{create,create-from-excel,excel-processing},
file-processing[/view], user-api-token, admin/user-api-token) после
прогона smoke-теста соответствуют документации:
- response shape ↔ schema
- 400 на not-uuid id
- 404 на несуществующий id
- per-page>100 clamps к 100
- 200 с {success:false, errors:[...]} на пустой POST
- 200 с {success:false, message:{type:warning, text:"Обработка файла не найдена"}}
  на несуществующий file_processing_id
- 403 на /user-api-token и /admin/user-api-token под Bearer

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 13:46:56 +03:00
DenisandClaude Opus 4.7 5173f32b0f H-3657: добавил в how-to упоминание isValidForDisplay-проверки
При тестировании наткнулся на 401 «Login Required» с валидным
live-токеном, потому что у юзера-владельца стоял is_hidden=true.
findIdentityByAccessToken после поиска токена ещё прогоняет
User::isValidForDisplay() — это надо явно упоминать в how-to,
иначе интегратор не поймёт почему не работает.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 13:41:50 +03:00
DenisandClaude Opus 4.7 1b4b61bc4f H-3657: вынес create в отдельный путь /user-api-token/create
Фронтенд (frontend/src/api/userApiToken/HRUserApiTokenApi.ts:18) зовёт
именно `${baseUrl}/create`, а не RESTful `POST /user-api-token`.
Оба роута маршрутизируются Yii в actionCreate, но в swagger лучше
документировать тот же путь, что использует прод-клиент — для
консистентности с /admin/wallet-transaction/create.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 13:33:30 +03:00
DenisandClaude Opus 4.7 fe38218334 H-3657: добавил Personal Access Tokens в v2 swagger
- info.description: подробная how-to секция «Авторизация по личному API-токену»
  (создание, формат Bearer-заголовка, tenant-резолв, отсутствие scopes,
  жизненный цикл и автo-revoke при блокировке юзера, запрет на управление
  под Bearer).
- securitySchemes.BearerAuth: новая схема http/bearer (PAT).
- security (global): + BearerAuth, чтобы Try-it-out предлагал три способа auth.
- Теги user-api-token и admin-user-api-token.
- Эндпоинты:
  * GET  /user-api-token, POST /user-api-token, POST /user-api-token/revoke
  * GET  /admin/user-api-token, POST /admin/user-api-token/revoke
  Все management-эндпоинты помечены `security: SessionAuth` и явно
  документируют 403 под Bearer (защита от рекурсии).
- Схемы: UserApiToken, UserApiTokenList, UserApiTokenCreated (с plain),
  UserApiTokenCreateForm, UserApiTokenAdmin (+ user/updatedByUser),
  UserApiTokenAdminList, UserApiTokenStatus.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:23:31 +03:00
DenisandClaude Opus 4.7 2260bf1066 H-3656: уточнил Wallet admin API в v2 swagger
- /admin/wallet-transaction: добавил недостающие фильтры
  (sender_wallet_id, recipient_wallet_id, sender_user_list_key,
  recipient_user_list_key, wallet_user_list_key, department_id,
  entity_id, reference_id) + описания.
- sort: перечислил реальные сортируемые атрибуты для wallet/wallet-transaction.
- reg_status_id / created_at / user_list_key: уточнил формат и поведение.
- WalletTransaction + WalletTransactionFormBody + параметры фильтра:
  заменил инлайн enum [1,2] на $ref walletTransactionType / walletOperationType.
- walletOperationType: добавил отсутствующее значение 9 (Отмена покупки),
  чтобы соответствовать app\models\wallet\enum\WalletOperationType.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 12:04:09 +03:00