Compare commits

..

9 Commits

Author SHA1 Message Date
61799bd4de Add Apple IAP product config to subscription options
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-16 14:22:35 -07:00
113a2e457c Add Apple subscription mobile operations 2026-06-16 14:22:35 -07:00
5293576947 Merge pull request 'Add runLengths to PlayerSummaryFields (per-player run distribution)' (#258) from dean/player-run-lengths into master
Reviewed-on: #258
2026-06-16 20:57:00 +00:00
Dean Wenstrand
0c1afbcc76 Add runLengths to PlayerSummaryFields (per-player run distribution)
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-06-16 13:39:04 -07:00
655209e1c6 Merge pull request 'Add Apple IAP subscription options schema' (#256) from loewy/apple-iap-product-config into master
Reviewed-on: #256
2026-06-16 18:10:00 +00:00
c9576cf405 Add Apple IAP subscription options schema
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-06-16 10:47:07 -07:00
0c0cd7a7bb Merge pull request 'dean/my-drill-runs' (#257) from dean/my-drill-runs into master
Reviewed-on: #257
2026-06-16 04:25:03 +00:00
48b647636e Merge pull request 'Add GetDrillRunLeaderboard query + generated types' (#254) from dean/drill-run-leaderboard into master
Reviewed-on: #254
2026-06-16 00:52:05 +00: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
4 changed files with 242 additions and 0 deletions

View File

@@ -79,6 +79,12 @@ export enum AlignedIntervalEnum {
Year = "YEAR",
}
export type AppleIapSubscriptionOptionsGql = {
__typename?: "AppleIapSubscriptionOptionsGQL";
enabled: Scalars["Boolean"]["output"];
proMonthlyProductId?: Maybe<Scalars["String"]["output"]>;
};
export type BankFeaturesGql = {
__typename?: "BankFeaturesGQL";
bankAngle: Scalars["Float"]["output"];
@@ -2746,6 +2752,7 @@ export type PlayerSummaryGql = {
makePercentage: Scalars["Float"]["output"];
profileImageUri?: Maybe<Scalars["String"]["output"]>;
representativeFullFrameUrl?: Maybe<Scalars["String"]["output"]>;
runLengths: Array<Scalars["Int"]["output"]>;
score?: Maybe<Scalars["Int"]["output"]>;
totalShots: Scalars["Int"]["output"];
totalShotsMade: Scalars["Int"]["output"];
@@ -3385,6 +3392,7 @@ export type StripeProductGql = {
export type StripeSubscriptionOptionsGql = {
__typename?: "StripeSubscriptionOptionsGQL";
appleIap: AppleIapSubscriptionOptionsGql;
products: Array<StripeProductGql>;
trialPeriodDays?: Maybe<Scalars["Int"]["output"]>;
};
@@ -4281,6 +4289,7 @@ export type GetFeedQuery = {
makePercentage: number;
score?: number | null;
longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
@@ -4385,6 +4394,7 @@ export type VideoCardFieldsFragment = {
makePercentage: number;
score?: number | null;
longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
@@ -4521,6 +4531,7 @@ export type GetVideoFeedQuery = {
makePercentage: number;
score?: number | null;
longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
@@ -5001,6 +5012,11 @@ export type GetAvailableSubscriptionOptionsQuery = {
getAvailableSubscriptionOptions: {
__typename?: "StripeSubscriptionOptionsGQL";
trialPeriodDays?: number | null;
appleIap: {
__typename?: "AppleIapSubscriptionOptionsGQL";
enabled: boolean;
proMonthlyProductId?: string | null;
};
products: Array<{
__typename?: "StripeProductGQL";
id: string;
@@ -5030,6 +5046,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;
@@ -5039,6 +5058,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;
}>;
@@ -5048,6 +5099,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;
@@ -5164,6 +5218,7 @@ export type PlayerSummaryFieldsFragment = {
makePercentage: number;
score?: number | null;
longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
};
@@ -6289,6 +6344,7 @@ export type GetVideoDetailsQuery = {
makePercentage: number;
score?: number | null;
longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
@@ -6408,6 +6464,7 @@ export type GetVideoCardQuery = {
makePercentage: number;
score?: number | null;
longestRun: number;
runLengths: Array<number>;
averageDifficulty?: number | null;
averageTimeBetweenShots?: number | null;
}>;
@@ -7057,6 +7114,7 @@ export const PlayerSummaryFieldsFragmentDoc = gql`
makePercentage
score
longestRun
runLengths
averageDifficulty
averageTimeBetweenShots
}
@@ -10579,6 +10637,10 @@ export const GetAvailableSubscriptionOptionsDocument = gql`
query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions {
trialPeriodDays
appleIap {
enabled
proMonthlyProductId
}
products {
id
name
@@ -10666,6 +10728,9 @@ export const GetSubscriptionStatusDocument = gql`
query GetSubscriptionStatus {
getUserSubscriptionStatus {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd
@@ -10740,10 +10805,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

View File

@@ -29,6 +29,10 @@ mutation CreateCustomerPortalSession {
query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions {
trialPeriodDays
appleIap {
enabled
proMonthlyProductId
}
products {
id
name
@@ -50,6 +54,9 @@ query GetAvailableSubscriptionOptions {
query GetSubscriptionStatus {
getUserSubscriptionStatus {
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus
currentPeriodStart
currentPeriodEnd
@@ -59,9 +66,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

@@ -9,6 +9,7 @@ fragment PlayerSummaryFields on PlayerSummaryGQL {
makePercentage
score
longestRun
runLengths
averageDifficulty
averageTimeBetweenShots
}

View File

@@ -688,6 +688,7 @@ type PlayerSummaryGQL {
makePercentage: Float!
score: Int
longestRun: Int!
runLengths: [Int!]!
averageDifficulty: Float
averageTimeBetweenShots: Float
}
@@ -1001,6 +1002,7 @@ type UserRelationship {
type StripeSubscriptionOptionsGQL {
products: [StripeProductGQL!]!
trialPeriodDays: Int
appleIap: AppleIapSubscriptionOptionsGQL!
}
type StripeProductGQL {
@@ -1021,6 +1023,11 @@ type StripePriceGQL {
active: Boolean!
}
type AppleIapSubscriptionOptionsGQL {
enabled: Boolean!
proMonthlyProductId: String
}
type UserSubscriptionStatusGQL {
hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum