feat: sync rcat data (#13628)

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* RevenueCat support: public webhook endpoint, webhook handler/service,
nightly reconciliation and per-user sync; subscriptions now expose
provider and iapStore; new user-facing error for App Store/Play-managed
subscriptions.
* **Chores**
* Multi-provider subscription schema (Provider, IapStore); Stripe
credentials moved into payment.stripe (top-level apiKey/webhookKey
deprecated); new payment.revenuecat config and defaults added.
* **Tests**
  * Comprehensive RevenueCat integration test suite and snapshots.
* **Documentation**
  * Admin config descriptions updated with deprecation guidance.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2025-09-23 16:52:23 +08:00
committed by GitHub
parent 75a6c79b2c
commit 762b702e46
31 changed files with 2059 additions and 33 deletions
+11
View File
@@ -744,6 +744,7 @@ enum ErrorNames {
LICENSE_REVEALED
LINK_EXPIRED
MAILER_SERVICE_IS_NOT_CONFIGURED
MANAGED_BY_APP_STORE_OR_PLAY
MEMBER_NOT_FOUND_IN_SPACE
MEMBER_QUOTA_EXCEEDED
MENTION_USER_DOC_ACCESS_DENIED
@@ -1962,6 +1963,11 @@ type SubscriptionType {
canceledAt: DateTime
createdAt: DateTime!
end: DateTime
"""
If provider is revenuecat, indicates underlying store. Read-only. One of: app_store | play_store
"""
iapStore: String
id: String @deprecated(reason: "removed")
nextBillAt: DateTime
@@ -1970,6 +1976,11 @@ type SubscriptionType {
There won't actually be a subscription with plan 'Free'
"""
plan: SubscriptionPlan!
"""
Payment provider of this subscription. Read-only. One of: stripe | revenuecat
"""
provider: String
recurring: SubscriptionRecurring!
start: DateTime!
status: SubscriptionStatus!