Перейти к содержимому
Открытая разработка · обновления каждую неделю

Changelog

Каждое изменение платформы — публично. Безопасность, фичи, исправления — без приукрашиваний и маркетинга.

15
релизов
138
изменений
v1.4.0
сегодня
Распределение
Безопасность74Breaking3Новое6Исправлено40Скорость1Инфраструктура14
17
апр 2026
LatestMinor
v1.4.0сегодня

Реальная оплата через YooKassa для чаевых, сертификатов и подписок

Закрыта последняя крупная дыра в платёжной логике — раньше чаевые, подарочные сертификаты и подписки активировались БЕЗ фактической оплаты, любой пользователь мог напечатать себе сертификат на 999 999 ₽ или активировать PRO-подписку за 0 ₽. Теперь все три проходят через единый flow с PaymentsService и активируются только в webhook payment.succeeded после реального списания денег.

Безопасность3Breaking1Новое5Инфраструктура2
  • БезопасностьЧаевые теперь создаются в PENDING и активируются в PAID только через webhook YooKassa. Раньше Tip.create сразу писал status='PAID' + paidAt: new Date() без какой-либо оплаты — мастеру шли «деньги», которых не было.
  • БезопасностьПодарочные сертификаты теперь создаются в PENDING (зарезервированный код) и переводятся в ACTIVE только webhook'ом. redeem() блокирует PENDING-сертификаты — раньше любой авторизованный пользователь мог дёрнуть POST /gift-certificates с amount=999999 и сразу использовать его на оплату своих броней.
  • БезопасностьПодписки и аддоны теперь создаются в PENDING (новое значение в SubscriptionStatus). Активация в ACTIVE + обновление MasterProfile.subscriptionPlan/Status/ExpiresAt происходит атомарно в webhook payment.succeeded. Раньше subscribe() сразу выдавал PRO/BUSINESS без оплаты.
  • BreakingТребуется миграция БД: npx prisma migrate deploy запустит миграцию 20260417_subscription_pending_status. ALTER TYPE ADD VALUE IF NOT EXISTS — не breaking, не требует обновления данных.
  • НовоеPaymentsService.handleWebhook расширен — switch по paymentType после атомарного перевода Payment в PAID:
  • НовоеКаскадная отмена при payment.canceled — связанная сущность переводится в FAILED/CANCELLED, освобождая ресурсы.
  • НовоеВсе активации идемпотентны через updateMany с условием status='PENDING' — повторный webhook от YooKassa не вызовет двойную активацию.
  • НовоеВсе активации завёрнуты в try/catch — падение downstream-операции не откатывает основной платёж (деньги уже списаны, разбираем руками).
  • НовоеDemo-режим (без YOOKASSA_SHOP_ID) синхронно эмулирует webhook — Tips/Cert/Subscriptions работают локально без реальной YooKassa.
  • ИнфраструктураPaymentsModule помечен @Global() — Tips/GiftCertificates/Subscriptions инжектят PaymentsService без явного импорта.
  • ИнфраструктураPaymentType enum расширен значением GIFT_CERTIFICATE.

2026

14 релизов

Не пропустите следующий релиз

В Telegram-канале — анонсы новых версий, фичи в работе и кейсы. Без спама, только по делу.

Подписаться · @bronogon