Compare commits

...

14 Commits

Author SHA1 Message Date
fe95ab824e Add Apple subscription mobile operations
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-15 16:12:38 -07:00
079e4e8719 Merge pull request 'Add Apple subscription sync schema' (#253) from apple-iap-pr2-backend-schema into master
Reviewed-on: #253
2026-06-12 04:50:36 +00:00
af68bc3c60 Add Apple subscription sync schema
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-11 18:40:54 -07:00
f12d2c5a1b Merge pull request 'Add Apple entitlement source enum' (#252) from apple-entitlement-source-enum into master
Reviewed-on: #252
2026-06-11 21:55:26 +00:00
4e3f649a2c Add Apple entitlement source enum
All checks were successful
Tests / Tests (pull_request) Successful in 28s
2026-06-11 12:43:03 -07:00
7cef75b2ca Merge pull request 'dean/get-video-card-query' (#250) from dean/get-video-card-query into master
Reviewed-on: #250
2026-06-09 05:05:52 +00:00
9358205327 Merge pull request 'Add quotaEnforcementEnabled to deployed config' (#249) from loewy/expose-quota-enforcement-config into master
Reviewed-on: #249
2026-05-28 23:18:01 +00:00
88634a32e9 add quotaEnforcementEnabled to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-28 14:52:51 -07:00
f7200a2e9f Merge pull request 'Add upload quota status operation' (#248) from loewy/quota-status-buckets into master
Reviewed-on: #248
2026-05-28 21:46:56 +00:00
7d839c0fa6 Add upload quota status operation
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-27 16:52:43 -07:00
ab1e604871 Merge pull request 'Add quota bucket status fields' (#247) from loewy/quota-status-buckets into master
Reviewed-on: #247
2026-05-26 02:47:40 +00:00
deb724b430 Add quota bucket status fields
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-05-25 16:26:57 -07:00
c586bdf1a6 Merge pull request 'Add username + profileImageUri to PlayerClusterGQL' (#246) from dean/player-cluster-username into master
Reviewed-on: #246
2026-05-12 00:27:06 +00:00
a12b3e1210 Merge pull request 'Add averageDifficulty to PlayerSummaryFields' (#245) from dean/player-summaries-avg-difficulty-types into master
Reviewed-on: #245
2026-05-11 22:41:52 +00:00
5 changed files with 464 additions and 0 deletions

View File

@@ -290,6 +290,7 @@ export type DeployedConfigGql = {
environment: Scalars["String"]["output"];
firebase: Scalars["Boolean"]["output"];
minimumAllowedAppVersion: Scalars["String"]["output"];
quotaEnforcementEnabled: Scalars["Boolean"]["output"];
subscriptionGatingEnabled: Scalars["Boolean"]["output"];
};
@@ -330,6 +331,7 @@ export type EditableShotFieldInputGql = {
export enum EntitlementSourceTypeEnum {
Admin = "ADMIN",
AlphaLegacy = "ALPHA_LEGACY",
Apple = "APPLE",
Manual = "MANUAL",
Stripe = "STRIPE",
}
@@ -2428,6 +2430,7 @@ export type Mutation = {
startChallenge: ChallengeEntry;
submitCancellationFeedback: Scalars["Boolean"]["output"];
submitChallengeEntry: ChallengeEntry;
syncAppleSubscription: SyncAppleSubscriptionResultGql;
undismissChallenge: Scalars["Boolean"]["output"];
unfollowUser: UserGql;
updateShotAnnotations: UpdateShotAnnotationReturn;
@@ -2631,6 +2634,10 @@ export type MutationSubmitChallengeEntryArgs = {
videoId: Scalars["ID"]["input"];
};
export type MutationSyncAppleSubscriptionArgs = {
input: SyncAppleSubscriptionInputGql;
};
export type MutationUndismissChallengeArgs = {
challengeId: Scalars["ID"]["input"];
};
@@ -2813,6 +2820,7 @@ export type Query = {
challenges: Array<Challenge>;
doesUsernameExist: Scalars["Boolean"]["output"];
getAggregatedShotMetrics: Array<AggregateResultGql>;
getAppleAppAccountToken: Scalars["String"]["output"];
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGql;
getBucketSet?: Maybe<BucketSetGql>;
getDeployedConfig: DeployedConfigGql;
@@ -3023,15 +3031,29 @@ export type QueryWaitForArgs = {
duration: Scalars["Float"]["input"];
};
export type QuotaBucketStatusGql = {
__typename?: "QuotaBucketStatusGQL";
appliesToUploadKind: Scalars["String"]["output"];
canUpload: Scalars["Boolean"]["output"];
durationLimitSeconds?: Maybe<Scalars["Int"]["output"]>;
durationRemainingSeconds?: Maybe<Scalars["Float"]["output"]>;
durationUsedSeconds: Scalars["Float"]["output"];
periodEnd: Scalars["DateTime"]["output"];
periodStart: Scalars["DateTime"]["output"];
quotaKey: Scalars["String"]["output"];
};
export type QuotaStatusGql = {
__typename?: "QuotaStatusGQL";
canUpload: Scalars["Boolean"]["output"];
durationLimitSeconds?: Maybe<Scalars["Int"]["output"]>;
durationRemainingSeconds?: Maybe<Scalars["Float"]["output"]>;
durationUsedSeconds: Scalars["Float"]["output"];
importQuotaBuckets: Array<QuotaBucketStatusGql>;
maxVideoDurationSeconds?: Maybe<Scalars["Int"]["output"]>;
periodEnd: Scalars["DateTime"]["output"];
periodStart: Scalars["DateTime"]["output"];
recordingQuotaBuckets: Array<QuotaBucketStatusGql>;
tierName: Scalars["String"]["output"];
};
@@ -3362,6 +3384,27 @@ export type SuccessfulAddAddShotAnnotationErrors =
| AddShotAnnotationErrors
| SuccessfulAdd;
export type SyncAppleSubscriptionInputGql = {
signedRenewalInfo?: InputMaybe<Scalars["String"]["input"]>;
signedTransactionInfo: Scalars["String"]["input"];
};
export type SyncAppleSubscriptionResultGql = {
__typename?: "SyncAppleSubscriptionResultGQL";
appleStatus?: Maybe<Scalars["Int"]["output"]>;
entitlementEndsAt?: Maybe<Scalars["DateTime"]["output"]>;
entitlementSource?: Maybe<EntitlementSourceTypeEnum>;
entitlementStartsAt?: Maybe<Scalars["DateTime"]["output"]>;
errorCode?: Maybe<Scalars["String"]["output"]>;
errorMessage?: Maybe<Scalars["String"]["output"]>;
expiresAt?: Maybe<Scalars["DateTime"]["output"]>;
hasActiveSubscription: Scalars["Boolean"]["output"];
latestTransactionId?: Maybe<Scalars["String"]["output"]>;
ok: Scalars["Boolean"]["output"];
originalTransactionId?: Maybe<Scalars["String"]["output"]>;
productId?: Maybe<Scalars["String"]["output"]>;
};
export type TableStateGql = {
__typename?: "TableStateGQL";
homography?: Maybe<HomographyInfoGql>;
@@ -4119,6 +4162,7 @@ export type GetDeployedConfigQuery = {
firebase: boolean;
minimumAllowedAppVersion: string;
subscriptionGatingEnabled: boolean;
quotaEnforcementEnabled: boolean;
defaultAndroidRecordingFormat: StreamSegmentTypeEnum;
bucketUrl: string;
bannerMessages: Array<{
@@ -4903,6 +4947,9 @@ export type GetSubscriptionStatusQuery = {
getUserSubscriptionStatus: {
__typename?: "UserSubscriptionStatusGQL";
hasActiveSubscription: boolean;
entitlementSource?: EntitlementSourceTypeEnum | null;
entitlementStartsAt?: any | null;
entitlementEndsAt?: any | null;
subscriptionStatus?: StripeSubscriptionStatusEnum | null;
currentPeriodStart?: any | null;
currentPeriodEnd?: any | null;
@@ -4912,6 +4959,38 @@ export type GetSubscriptionStatusQuery = {
};
};
export type GetAppleAppAccountTokenQueryVariables = Exact<{
[key: string]: never;
}>;
export type GetAppleAppAccountTokenQuery = {
__typename?: "Query";
getAppleAppAccountToken: string;
};
export type SyncAppleSubscriptionMutationVariables = Exact<{
signedTransactionInfo: Scalars["String"]["input"];
}>;
export type SyncAppleSubscriptionMutation = {
__typename?: "Mutation";
syncAppleSubscription: {
__typename?: "SyncAppleSubscriptionResultGQL";
ok: boolean;
errorCode?: string | null;
errorMessage?: string | null;
hasActiveSubscription: boolean;
entitlementSource?: EntitlementSourceTypeEnum | null;
entitlementStartsAt?: any | null;
entitlementEndsAt?: any | null;
appleStatus?: number | null;
originalTransactionId?: string | null;
latestTransactionId?: string | null;
productId?: string | null;
expiresAt?: any | null;
};
};
export type CancelSubscriptionMutationVariables = Exact<{
[key: string]: never;
}>;
@@ -4921,6 +5000,9 @@ export type CancelSubscriptionMutation = {
cancelSubscription: {
__typename?: "UserSubscriptionStatusGQL";
hasActiveSubscription: boolean;
entitlementSource?: EntitlementSourceTypeEnum | null;
entitlementStartsAt?: any | null;
entitlementEndsAt?: any | null;
subscriptionStatus?: StripeSubscriptionStatusEnum | null;
currentPeriodStart?: any | null;
currentPeriodEnd?: any | null;
@@ -5784,6 +5866,47 @@ export type GetUserPlayTimeQuery = {
getPlayTime: { __typename?: "UserPlayTimeGQL"; totalSeconds: number };
};
export type GetUploadQuotaStatusQueryVariables = Exact<{
[key: string]: never;
}>;
export type GetUploadQuotaStatusQuery = {
__typename?: "Query";
getQuotaStatus: {
__typename?: "QuotaStatusGQL";
tierName: string;
periodStart: any;
periodEnd: any;
durationUsedSeconds: number;
durationLimitSeconds?: number | null;
maxVideoDurationSeconds?: number | null;
durationRemainingSeconds?: number | null;
canUpload: boolean;
importQuotaBuckets: Array<{
__typename?: "QuotaBucketStatusGQL";
quotaKey: string;
appliesToUploadKind: string;
periodStart: any;
periodEnd: any;
durationUsedSeconds: number;
durationLimitSeconds?: number | null;
durationRemainingSeconds?: number | null;
canUpload: boolean;
}>;
recordingQuotaBuckets: Array<{
__typename?: "QuotaBucketStatusGQL";
quotaKey: string;
appliesToUploadKind: string;
periodStart: any;
periodEnd: any;
durationUsedSeconds: number;
durationLimitSeconds?: number | null;
durationRemainingSeconds?: number | null;
canUpload: boolean;
}>;
};
};
export type GetUsernamesQueryVariables = Exact<{
matchString: Scalars["String"]["input"];
limit?: InputMaybe<Scalars["Int"]["input"]>;
@@ -8734,6 +8857,7 @@ export const GetDeployedConfigDocument = gql`
firebase
minimumAllowedAppVersion
subscriptionGatingEnabled
quotaEnforcementEnabled
bannerMessages {
color
dismissible
@@ -10303,6 +10427,9 @@ export const GetSubscriptionStatusDocument = gql`
query GetSubscriptionStatus {
getUserSubscriptionStatus {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd
@@ -10377,10 +10504,146 @@ export type GetSubscriptionStatusQueryResult = Apollo.QueryResult<
GetSubscriptionStatusQuery,
GetSubscriptionStatusQueryVariables
>;
export const GetAppleAppAccountTokenDocument = gql`
query GetAppleAppAccountToken {
getAppleAppAccountToken
}
`;
/**
* __useGetAppleAppAccountTokenQuery__
*
* To run a query within a React component, call `useGetAppleAppAccountTokenQuery` and pass it any options that fit your needs.
* When your component renders, `useGetAppleAppAccountTokenQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetAppleAppAccountTokenQuery({
* variables: {
* },
* });
*/
export function useGetAppleAppAccountTokenQuery(
baseOptions?: Apollo.QueryHookOptions<
GetAppleAppAccountTokenQuery,
GetAppleAppAccountTokenQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetAppleAppAccountTokenQuery,
GetAppleAppAccountTokenQueryVariables
>(GetAppleAppAccountTokenDocument, options);
}
export function useGetAppleAppAccountTokenLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetAppleAppAccountTokenQuery,
GetAppleAppAccountTokenQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetAppleAppAccountTokenQuery,
GetAppleAppAccountTokenQueryVariables
>(GetAppleAppAccountTokenDocument, options);
}
export function useGetAppleAppAccountTokenSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetAppleAppAccountTokenQuery,
GetAppleAppAccountTokenQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetAppleAppAccountTokenQuery,
GetAppleAppAccountTokenQueryVariables
>(GetAppleAppAccountTokenDocument, options);
}
export type GetAppleAppAccountTokenQueryHookResult = ReturnType<
typeof useGetAppleAppAccountTokenQuery
>;
export type GetAppleAppAccountTokenLazyQueryHookResult = ReturnType<
typeof useGetAppleAppAccountTokenLazyQuery
>;
export type GetAppleAppAccountTokenSuspenseQueryHookResult = ReturnType<
typeof useGetAppleAppAccountTokenSuspenseQuery
>;
export type GetAppleAppAccountTokenQueryResult = Apollo.QueryResult<
GetAppleAppAccountTokenQuery,
GetAppleAppAccountTokenQueryVariables
>;
export const SyncAppleSubscriptionDocument = gql`
mutation SyncAppleSubscription($signedTransactionInfo: String!) {
syncAppleSubscription(
input: { signedTransactionInfo: $signedTransactionInfo }
) {
ok
errorCode
errorMessage
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
appleStatus
originalTransactionId
latestTransactionId
productId
expiresAt
}
}
`;
export type SyncAppleSubscriptionMutationFn = Apollo.MutationFunction<
SyncAppleSubscriptionMutation,
SyncAppleSubscriptionMutationVariables
>;
/**
* __useSyncAppleSubscriptionMutation__
*
* To run a mutation, you first call `useSyncAppleSubscriptionMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useSyncAppleSubscriptionMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [syncAppleSubscriptionMutation, { data, loading, error }] = useSyncAppleSubscriptionMutation({
* variables: {
* signedTransactionInfo: // value for 'signedTransactionInfo'
* },
* });
*/
export function useSyncAppleSubscriptionMutation(
baseOptions?: Apollo.MutationHookOptions<
SyncAppleSubscriptionMutation,
SyncAppleSubscriptionMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
SyncAppleSubscriptionMutation,
SyncAppleSubscriptionMutationVariables
>(SyncAppleSubscriptionDocument, options);
}
export type SyncAppleSubscriptionMutationHookResult = ReturnType<
typeof useSyncAppleSubscriptionMutation
>;
export type SyncAppleSubscriptionMutationResult =
Apollo.MutationResult<SyncAppleSubscriptionMutation>;
export type SyncAppleSubscriptionMutationOptions = Apollo.BaseMutationOptions<
SyncAppleSubscriptionMutation,
SyncAppleSubscriptionMutationVariables
>;
export const CancelSubscriptionDocument = gql`
mutation CancelSubscription {
cancelSubscription {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd
@@ -12099,6 +12362,105 @@ export type GetUserPlayTimeQueryResult = Apollo.QueryResult<
GetUserPlayTimeQuery,
GetUserPlayTimeQueryVariables
>;
export const GetUploadQuotaStatusDocument = gql`
query GetUploadQuotaStatus {
getQuotaStatus {
tierName
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
maxVideoDurationSeconds
durationRemainingSeconds
canUpload
importQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
recordingQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
}
}
`;
/**
* __useGetUploadQuotaStatusQuery__
*
* To run a query within a React component, call `useGetUploadQuotaStatusQuery` and pass it any options that fit your needs.
* When your component renders, `useGetUploadQuotaStatusQuery` returns an object from Apollo Client that contains loading, error, and data properties
* you can use to render your UI.
*
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
*
* @example
* const { data, loading, error } = useGetUploadQuotaStatusQuery({
* variables: {
* },
* });
*/
export function useGetUploadQuotaStatusQuery(
baseOptions?: Apollo.QueryHookOptions<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>(GetUploadQuotaStatusDocument, options);
}
export function useGetUploadQuotaStatusLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>(GetUploadQuotaStatusDocument, options);
}
export function useGetUploadQuotaStatusSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>(GetUploadQuotaStatusDocument, options);
}
export type GetUploadQuotaStatusQueryHookResult = ReturnType<
typeof useGetUploadQuotaStatusQuery
>;
export type GetUploadQuotaStatusLazyQueryHookResult = ReturnType<
typeof useGetUploadQuotaStatusLazyQuery
>;
export type GetUploadQuotaStatusSuspenseQueryHookResult = ReturnType<
typeof useGetUploadQuotaStatusSuspenseQuery
>;
export type GetUploadQuotaStatusQueryResult = Apollo.QueryResult<
GetUploadQuotaStatusQuery,
GetUploadQuotaStatusQueryVariables
>;
export const GetUsernamesDocument = gql`
query getUsernames(
$matchString: String!

View File

@@ -6,6 +6,7 @@ query getDeployedConfig {
firebase
minimumAllowedAppVersion
subscriptionGatingEnabled
quotaEnforcementEnabled
bannerMessages {
color
dismissible

View File

@@ -50,6 +50,9 @@ query GetAvailableSubscriptionOptions {
query GetSubscriptionStatus {
getUserSubscriptionStatus {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd
@@ -59,9 +62,35 @@ query GetSubscriptionStatus {
}
}
query GetAppleAppAccountToken {
getAppleAppAccountToken
}
mutation SyncAppleSubscription($signedTransactionInfo: String!) {
syncAppleSubscription(
input: { signedTransactionInfo: $signedTransactionInfo }
) {
ok
errorCode
errorMessage
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
appleStatus
originalTransactionId
latestTransactionId
productId
expiresAt
}
}
mutation CancelSubscription {
cancelSubscription {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd

View File

@@ -49,6 +49,39 @@ query GetUserPlayTime($userId: Int!, $filters: VideoFilterInput) {
}
}
query GetUploadQuotaStatus {
getQuotaStatus {
tierName
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
maxVideoDurationSeconds
durationRemainingSeconds
canUpload
importQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
recordingQuotaBuckets {
quotaKey
appliesToUploadKind
periodStart
periodEnd
durationUsedSeconds
durationLimitSeconds
durationRemainingSeconds
canUpload
}
}
}
query getUsernames(
$matchString: String!
$limit: Int = null

View File

@@ -98,6 +98,7 @@ type Query {
): UserRelationshipsResult!
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL!
getUserSubscriptionStatus: UserSubscriptionStatusGQL!
getAppleAppAccountToken: String!
getQuotaStatus: QuotaStatusGQL!
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
getUserVideos(
@@ -688,6 +689,7 @@ type DeployedConfigGQL {
environment: String!
minimumAllowedAppVersion: String!
subscriptionGatingEnabled: Boolean!
quotaEnforcementEnabled: Boolean!
bannerMessages: [BannerGQL!]!
defaultAndroidRecordingFormat: StreamSegmentTypeEnum!
bucketUrl: String!
@@ -1019,6 +1021,7 @@ enum EntitlementSourceTypeEnum {
ADMIN
MANUAL
STRIPE
APPLE
ALPHA_LEGACY
}
@@ -1040,6 +1043,19 @@ type QuotaStatusGQL {
durationUsedSeconds: Float!
durationLimitSeconds: Int
maxVideoDurationSeconds: Int
importQuotaBuckets: [QuotaBucketStatusGQL!]!
recordingQuotaBuckets: [QuotaBucketStatusGQL!]!
durationRemainingSeconds: Float
canUpload: Boolean!
}
type QuotaBucketStatusGQL {
quotaKey: String!
appliesToUploadKind: String!
periodStart: DateTime!
periodEnd: DateTime!
durationUsedSeconds: Float!
durationLimitSeconds: Int
durationRemainingSeconds: Float
canUpload: Boolean!
}
@@ -1161,6 +1177,9 @@ type Mutation {
retireTags(tagIds: [Int!]!): Boolean!
ensureStripeCustomerExists: UserGQL!
deleteUser: Boolean!
syncAppleSubscription(
input: SyncAppleSubscriptionInputGQL!
): SyncAppleSubscriptionResultGQL!
createSubscription(priceId: String!): CreateSubscriptionResultGQL!
createCustomerPortalSession: CreateCustomerPortalSessionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL!
@@ -1314,6 +1333,26 @@ input EditUserInputGQL {
agreesToMarketing: Boolean = null
}
type SyncAppleSubscriptionResultGQL {
ok: Boolean!
errorCode: String
errorMessage: String
hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum
entitlementStartsAt: DateTime
entitlementEndsAt: DateTime
appleStatus: Int
originalTransactionId: String
latestTransactionId: String
productId: String
expiresAt: DateTime
}
input SyncAppleSubscriptionInputGQL {
signedTransactionInfo: String!
signedRenewalInfo: String = null
}
type CreateSubscriptionResultGQL {
checkoutUrl: String!
sessionId: String!