06 admin kyc
AdminKycEndpoint — KYC верификация для операторов.
Роли¶
_requireRoles проверяет JOIN admin_user_roles → admin_roles:
| Проверка | Допустимые роли |
|---|---|
_requireAdmin (базовая, без ролей) |
любая admin-запись в admin_user_roles |
_requireRoles(['operator', 'superadmin']) |
operator, superadmin |
_requireRoles(['superadmin', 'operator']) |
superadmin, operator (эквивалентно) |
getQueue и getDetail используют только _requireAdmin — доступны любому admin.
Методы¶
| Метод | Роль | Результат |
|---|---|---|
getQueue() |
любой admin | Список KYC в статусе pending_operator_review с масками профиля и presigned URL документов |
getDetail(userId) |
любой admin | Полная KYC карточка: статусы, presigned URLs (front/back/selfie), маски профиля |
revealOcrResult(kycId, reason) |
operator, superadmin | Расшифрованный KycOcrResult + audit ocr_revealed |
approve(userId) |
superadmin, operator | KycService.operatorApprove + audit kyc_approve |
reject(userId, reason) |
superadmin, operator | KycService.operatorReject(reason) + audit kyc_reject |
finalize(userId) |
superadmin, operator | KycService.finalizeVerification + audit kyc_finalize |
setKycTier(userId, tier) |
superadmin, operator | Ручная установка tier + accountTierOverriddenByAdmin=true + audit kyc_set_tier |
finalize() — пошагово¶
Делегирует в KycService.finalizeVerification, который выполняет транзакцию:
KycVerification.status→'fully_verified', фиксируетoperatorReviewedAt.User.status→'active'.UserProfile.isLocked→true,lockedAt= now; auditprofile_locked.- Если
!accountTierOverriddenByAdmin:UserProfile.accountTier→'STANDARD'.
После транзакции (fire-and-forget, не ломает finalize при ошибке):
- Push-уведомление пользователю: шаблон
kycFullyVerified, локаль поlanguageCode(TH→th, RU/KZ/BY/UA→ru, иначе en), каналsecurity.
После finalize — TODO(IPPS): PM-endpoint /accounts/external/ipps для внешнего банковского кошелька ещё не реализован. Внутренний tbAccountId уже существует (создан в confirmKycData), баланс работает.
revealOcrResult¶
reason≥ 10 символов обязателен (ArgumentErrorиначе).- Расшифровывает
kyc_verification.ocrResultчерезPiiDecryptionService.decryptOcrForAdmin. - Пишет audit
ocr_revealedс полямиkycId,reason,traceId.
setKycTier¶
Допустимые значения tier: BASIC, STANDARD, PREMIUM, VIP.
После ручной установки устанавливается флаг accountTierOverriddenByAdmin=true — автологика KYC (finalizeVerification, operatorApprove) не будет перезаписывать tier.
getQueue — формат ответа¶
Загружает все профили одним запросом (IN-set), а не N запросами. frontUrl и selfieUrl — presigned S3 через StorageService.getDownloadUrl.
Важно¶
approveиfinalize— разные шаги.approve= operatorApprove (промежуточный статус),finalize= полная активация пользователя.- Audit всегда содержит
adminId(добавляется в JSON merge внутри_audit). - Ошибка записи в audit_log логируется как warning, не прерывает выполнение метода.