[reg-fsm] Откат незавершённой регистрации + server-truth шаг (recovery, plan B) #95

Merged
ant merged 2 commits from feat/registration-fsm into feat/registration-payment-decline 2026-06-05 11:08:27 +00:00
Owner

Стек на #91 (feat/registration-payment-decline). После мерджа #91 в dev Gitea перетаргетит этот PR на dev.

Plan B — recovery + источник истины о шаге на сервере

Поверх гарда A из #91. Существующих статусов достаточно — новых не вводим.

Backend

  • resetRegistration (self-scoped по токену): откат незавершённой регистрации к редактированию до отправки в блокчейн. Снимает заморозку профиля/e-mail (users.status → created), чистит документы кандидата + отпечаток заявления (гард A), удаляет непринятую попытку вступительного платежа.
    • Принятые средства (PAID/COMPLETED) или уже созданный on-chain аккаунт → отказ: нужна перерегистрация/возврат средств (отдельная ветка).
  • PaymentRepository.delete.

Frontend

  • SignUp реконструирует шаг с сервера: Joined → шаг оплаты. Процесс переживает перезагрузку и работу в другой вкладке, не завися от localStorage. Приоритет у registration_payment (при отказе — причина, а не «оплатить заново»).
  • WaitingRegistration «Исправить данные» → resetRegistration перед возвратом к данным (после подписи профиль заморожен — локального отката мало).
  • Фича Account/ResetRegistration + Zeus-клиент (codegen, обе копии zeus).

Про active (по запросу — не сломать)

Фронтовые === 'active' гейты (isFullyActive, DepositButton, LoginUser) висят на on-chain user_account.status (registrator-контракт: created→payed→active) — отдельная ось. Recovery/reconstruct трогают только off-chain users.status (mono). Оси не пересекаются → новые присваивания статусов фронтовый active не задевают. payed off-chain намеренно НЕ активировал (коллизия с on-chain payed).

Проверки

controller tsc ✔, sdk typecheck ✔, desktop ESLint (изменённые) ✔. schema.gql/dist gitignored.

🤖 Generated with Claude Code

Стек на #91 (`feat/registration-payment-decline`). После мерджа #91 в `dev` Gitea перетаргетит этот PR на `dev`. ## Plan B — recovery + источник истины о шаге на сервере Поверх гарда A из #91. Существующих статусов достаточно — **новых не вводим**. ### Backend - **`resetRegistration`** (self-scoped по токену): откат незавершённой регистрации к редактированию **до** отправки в блокчейн. Снимает заморозку профиля/e-mail (`users.status → created`), чистит документы кандидата + отпечаток заявления (гард A), удаляет непринятую попытку вступительного платежа. - Принятые средства (PAID/COMPLETED) **или** уже созданный on-chain аккаунт → отказ: нужна перерегистрация/возврат средств (отдельная ветка). - `PaymentRepository.delete`. ### Frontend - **SignUp** реконструирует шаг с сервера: `Joined` → шаг оплаты. Процесс переживает перезагрузку и работу в другой вкладке, не завися от localStorage. Приоритет у `registration_payment` (при отказе — причина, а не «оплатить заново»). - **WaitingRegistration** «Исправить данные» → `resetRegistration` перед возвратом к данным (после подписи профиль заморожен — локального отката мало). - Фича `Account/ResetRegistration` + Zeus-клиент (codegen, обе копии zeus). ### Про `active` (по запросу — не сломать) Фронтовые `=== 'active'` гейты (isFullyActive, DepositButton, LoginUser) висят на **on-chain** `user_account.status` (registrator-контракт: created→payed→active) — отдельная ось. Recovery/reconstruct трогают только off-chain `users.status` (mono). Оси не пересекаются → новые присваивания статусов фронтовый `active` не задевают. `payed` off-chain намеренно НЕ активировал (коллизия с on-chain `payed`). ### Проверки controller tsc ✔, sdk typecheck ✔, desktop ESLint (изменённые) ✔. schema.gql/dist gitignored. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
claude added 1 commit 2026-06-05 09:19:26 +00:00
Plan B (recovery + источник истины о шаге на сервере), поверх гарда A.

Backend:
- resetRegistration (self-scoped по токену): откат незавершённой регистрации
  к редактированию до отправки в блокчейн. Снимает заморозку профиля/e-mail
  (users.status → created), чистит документы кандидата и отпечаток заявления,
  удаляет непринятую попытку вступительного платежа. Принятые средства
  (PAID/COMPLETED) или уже созданный on-chain аккаунт → отказ (нужна
  перерегистрация/возврат — отдельная ветка).
- PaymentRepository.delete.

Frontend:
- SignUp реконструирует шаг с сервера: Joined → шаг оплаты (переживает
  перезагрузку и работу в другой вкладке), приоритет у registration_payment.
- WaitingRegistration «Исправить данные» дёргает resetRegistration перед
  возвратом к данным (после подписи профиль заморожен, локального отката мало).
- Фича Account/ResetRegistration + Zeus-клиент (codegen).

Существующие статусы (joined/registered/active) не меняем, новых не вводим:
фронтовые active-гейты висят на on-chain user_account.status — другая ось,
не пересекается с mono users.status, который трогает recovery.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
claude added 1 commit 2026-06-05 09:54:23 +00:00
Провайдер QR (Bank) не эмитит success-колбэк, деньги подтверждаются вебхуком
на бэке асинхронно — без поллинга экран висел на форме оплаты до перезагрузки.
Каждые 10с подтягиваем аккаунт; как только вступительный платёж покинул PENDING
(принят/отклонён) — уходим на шаг ожидания решения совета, который сам
показывает «платёж принят» либо причину отказа.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ant approved these changes 2026-06-05 11:08:22 +00:00
ant merged commit 6affbd6038 into feat/registration-payment-decline 2026-06-05 11:08:27 +00:00
Sign in to join this conversation.
No Reviewers
No Label
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: C9S/mono#95