feat(server): refresh subscription (#13670)

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

* **New Features**
* Added an on-demand mutation to refresh the current user's
subscriptions, syncing with RevenueCat when applicable and handling
Stripe-only cases.
* Subscription variant normalization for clearer plan information and
consistent results.

* **Tests**
* Added tests for refresh behavior: empty state, RevenueCat-backed
multi-step sync, and Stripe-only scenarios.

* **Client**
* New client operation to invoke the refresh mutation and retrieve
updated subscription fields.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
This commit is contained in:
DarkSky
2025-09-29 20:35:18 +08:00
committed by GitHub
parent 8006812bc0
commit 2d1caff45c
6 changed files with 240 additions and 14 deletions

View File

@@ -2218,6 +2218,25 @@ export const setWorkspacePublicByIdMutation = {
}`,
};
export const refreshSubscriptionMutation = {
id: 'refreshSubscriptionMutation' as const,
op: 'refreshSubscription',
query: `mutation refreshSubscription {
refreshUserSubscriptions {
id
status
plan
recurring
start
end
nextBillAt
canceledAt
variant
}
}`,
deprecations: ["'id' is deprecated: removed"],
};
export const subscriptionQuery = {
id: 'subscriptionQuery' as const,
op: 'subscription',

View File

@@ -0,0 +1,13 @@
mutation refreshSubscription {
refreshUserSubscriptions {
id
status
plan
recurring
start
end
nextBillAt
canceledAt
variant
}
}

View File

@@ -1451,6 +1451,8 @@ export interface Mutation {
/** mark notification as read */
readNotification: Scalars['Boolean']['output'];
recoverDoc: Scalars['DateTime']['output'];
/** Refresh current user subscriptions and return latest. */
refreshUserSubscriptions: Array<SubscriptionType>;
releaseDeletedBlobs: Scalars['Boolean']['output'];
/** Remove user avatar */
removeAvatar: RemoveAvatar;
@@ -5996,6 +5998,26 @@ export type SetWorkspacePublicByIdMutation = {
updateWorkspace: { __typename?: 'WorkspaceType'; id: string };
};
export type RefreshSubscriptionMutationVariables = Exact<{
[key: string]: never;
}>;
export type RefreshSubscriptionMutation = {
__typename?: 'Mutation';
refreshUserSubscriptions: Array<{
__typename?: 'SubscriptionType';
id: string | null;
status: SubscriptionStatus;
plan: SubscriptionPlan;
recurring: SubscriptionRecurring;
start: string;
end: string | null;
nextBillAt: string | null;
canceledAt: string | null;
variant: SubscriptionVariant | null;
}>;
};
export type SubscriptionQueryVariables = Exact<{ [key: string]: never }>;
export type SubscriptionQuery = {
@@ -7081,6 +7103,11 @@ export type Mutations =
variables: SetWorkspacePublicByIdMutationVariables;
response: SetWorkspacePublicByIdMutation;
}
| {
name: 'refreshSubscriptionMutation';
variables: RefreshSubscriptionMutationVariables;
response: RefreshSubscriptionMutation;
}
| {
name: 'updateDocDefaultRoleMutation';
variables: UpdateDocDefaultRoleMutationVariables;