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

View File

@@ -923,6 +923,7 @@ export enum ErrorNames {
LICENSE_REVEALED = 'LICENSE_REVEALED',
LINK_EXPIRED = 'LINK_EXPIRED',
MAILER_SERVICE_IS_NOT_CONFIGURED = 'MAILER_SERVICE_IS_NOT_CONFIGURED',
MANAGED_BY_APP_STORE_OR_PLAY = 'MANAGED_BY_APP_STORE_OR_PLAY',
MEMBER_NOT_FOUND_IN_SPACE = 'MEMBER_NOT_FOUND_IN_SPACE',
MEMBER_QUOTA_EXCEEDED = 'MEMBER_QUOTA_EXCEEDED',
MENTION_USER_DOC_ACCESS_DENIED = 'MENTION_USER_DOC_ACCESS_DENIED',
@@ -2583,6 +2584,8 @@ export interface SubscriptionType {
canceledAt: Maybe<Scalars['DateTime']['output']>;
createdAt: Scalars['DateTime']['output'];
end: Maybe<Scalars['DateTime']['output']>;
/** If provider is revenuecat, indicates underlying store. Read-only. One of: app_store | play_store */
iapStore: Maybe<Scalars['String']['output']>;
/** @deprecated removed */
id: Maybe<Scalars['String']['output']>;
nextBillAt: Maybe<Scalars['DateTime']['output']>;
@@ -2591,6 +2594,8 @@ export interface 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: Maybe<Scalars['String']['output']>;
recurring: SubscriptionRecurring;
start: Scalars['DateTime']['output'];
status: SubscriptionStatus;