Compare commits

...

10 Commits

Author SHA1 Message Date
8367c2d0cd add createCustomerPortalSession
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-04-30 11:44:34 -07:00
b0c62f6e80 Merge pull request 'Trim getFeed query fragment' (#237) from loewy/trim-get-feed-query-fragment into master
Reviewed-on: #237
2026-04-29 20:26:40 +00:00
bc1ff66467 trim uncessary requested fields
All checks were successful
Tests / Tests (pull_request) Successful in 38s
2026-04-28 12:53:25 -07:00
ae37a3d9d9 Merge pull request 'Default getLongestRunsLeaderboard limit to 50' (#236) from dean/leaderboard-default-top-50 into master
Reviewed-on: #236
2026-04-24 00:01:23 +00:00
Dean Wenstrand
114b21400e Default getLongestRunsLeaderboard limit to 50
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-23 16:56:56 -07:00
ad9cab4543 Merge pull request 'Get Game Type Tag Operations' (#234) from loewy/get-game-type-tag-metrics-operation into master
Reviewed-on: #234
2026-04-14 20:11:43 +00:00
cd3ecdfba4 Merge pull request 'Add schema getGameTypeTagMetrics' (#232) from loewy/add-get-game-type-tag-metrics into master
Reviewed-on: #232
2026-04-01 23:23:16 +00:00
28ba01c07f operation
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-30 15:31:24 -07:00
27a0c08cd5 add schema getGameTypeTagMetrics
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-03-30 13:09:18 -07:00
99f0913fd8 Merge pull request 'Add manual entitlement GraphQL schema fields' (#231) from ivan/manual-entitlement-abstraction-gql into master
Reviewed-on: #231
2026-03-22 18:32:22 +00:00
5 changed files with 241 additions and 82 deletions

View File

@@ -224,6 +224,11 @@ export type CreateBucketSetInput = {
keyName: Scalars["String"]["input"]; keyName: Scalars["String"]["input"];
}; };
export type CreateCustomerPortalSessionResultGql = {
__typename?: "CreateCustomerPortalSessionResultGQL";
portalUrl: Scalars["String"]["output"];
};
export type CreateSubscriptionResultGql = { export type CreateSubscriptionResultGql = {
__typename?: "CreateSubscriptionResultGQL"; __typename?: "CreateSubscriptionResultGQL";
checkoutUrl: Scalars["String"]["output"]; checkoutUrl: Scalars["String"]["output"];
@@ -2191,6 +2196,26 @@ export type FloatRangeFilter = {
lessThanInclusive?: Scalars["Boolean"]["input"]; lessThanInclusive?: Scalars["Boolean"]["input"];
}; };
export type GameTypeTagMetric = {
__typename?: "GameTypeTagMetric";
madeShots: Scalars["Int"]["output"];
makeRate: Scalars["Float"]["output"];
shotCount: Scalars["Int"]["output"];
tableSize?: Maybe<Scalars["Float"]["output"]>;
tagLabel: Scalars["String"]["output"];
tagName: Scalars["String"]["output"];
};
export type GameTypeTagMetricsInput = {
createdAt?: InputMaybe<DateRangeFilter>;
groupByTableSize?: Scalars["Boolean"]["input"];
includePrivate?: IncludePrivateEnum;
includeUnknown?: Scalars["Boolean"]["input"];
maxTags?: InputMaybe<Scalars["Int"]["input"]>;
tagClass?: InputMaybe<Scalars["String"]["input"]>;
userId: Scalars["Int"]["input"];
};
export type GetProfileUploadLinkErrors = { export type GetProfileUploadLinkErrors = {
__typename?: "GetProfileUploadLinkErrors"; __typename?: "GetProfileUploadLinkErrors";
error: TooManyProfileImageUploadsErr; error: TooManyProfileImageUploadsErr;
@@ -2353,6 +2378,7 @@ export type Mutation = {
commentOnVideo: Scalars["Boolean"]["output"]; commentOnVideo: Scalars["Boolean"]["output"];
createBucketSet: BucketSetGql; createBucketSet: BucketSetGql;
createChallenge: Challenge; createChallenge: Challenge;
createCustomerPortalSession: CreateCustomerPortalSessionResultGql;
createRuleSet: RuleSet; createRuleSet: RuleSet;
createSubscription: CreateSubscriptionResultGql; createSubscription: CreateSubscriptionResultGql;
createUploadStream: CreateUploadStreamReturn; createUploadStream: CreateUploadStreamReturn;
@@ -2431,6 +2457,10 @@ export type MutationCreateChallengeArgs = {
startDate: Scalars["DateTime"]["input"]; startDate: Scalars["DateTime"]["input"];
}; };
export type MutationCreateCustomerPortalSessionArgs = {
returnUrl?: InputMaybe<Scalars["String"]["input"]>;
};
export type MutationCreateRuleSetArgs = { export type MutationCreateRuleSetArgs = {
description?: InputMaybe<Scalars["String"]["input"]>; description?: InputMaybe<Scalars["String"]["input"]>;
name: Scalars["String"]["input"]; name: Scalars["String"]["input"];
@@ -2732,6 +2762,7 @@ export type Query = {
getBucketSet?: Maybe<BucketSetGql>; getBucketSet?: Maybe<BucketSetGql>;
getDeployedConfig: DeployedConfigGql; getDeployedConfig: DeployedConfigGql;
getFeedVideos: VideoHistoryGql; getFeedVideos: VideoHistoryGql;
getGameTypeTagMetrics: Array<GameTypeTagMetric>;
getLoggedInUser?: Maybe<UserGql>; getLoggedInUser?: Maybe<UserGql>;
getLongestRunsLeaderboard: RunLeaderboardGql; getLongestRunsLeaderboard: RunLeaderboardGql;
getMakesLeaderboard: CountLeaderboardGql; getMakesLeaderboard: CountLeaderboardGql;
@@ -2799,6 +2830,10 @@ export type QueryGetFeedVideosArgs = {
limit?: Scalars["Int"]["input"]; limit?: Scalars["Int"]["input"];
}; };
export type QueryGetGameTypeTagMetricsArgs = {
input: GameTypeTagMetricsInput;
};
export type QueryGetLongestRunsLeaderboardArgs = { export type QueryGetLongestRunsLeaderboardArgs = {
interval?: InputMaybe<TimeInterval>; interval?: InputMaybe<TimeInterval>;
limit?: Scalars["Int"]["input"]; limit?: Scalars["Int"]["input"];
@@ -4072,15 +4107,11 @@ export type GetFeedQuery = {
id: number; id: number;
name?: string | null; name?: string | null;
screenshotUri?: string | null; screenshotUri?: string | null;
totalShotsMade: number;
totalShots: number; totalShots: number;
makePercentage: number; makePercentage: number;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
averageDifficulty?: number | null; averageDifficulty?: number | null;
createdAt?: any | null;
updatedAt?: any | null;
startTime?: any | null; startTime?: any | null;
endTime?: any | null;
private: boolean; private: boolean;
elapsedTime?: number | null; elapsedTime?: number | null;
tableSize: number; tableSize: number;
@@ -4095,26 +4126,13 @@ export type GetFeedQuery = {
__typename?: "UploadStreamGQL"; __typename?: "UploadStreamGQL";
id: string; id: string;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
isCompleted: boolean;
streamSegmentType: StreamSegmentTypeEnum; streamSegmentType: StreamSegmentTypeEnum;
} | null; } | null;
tags: Array<{ tags: Array<{ __typename?: "VideoTag"; name: string }>;
__typename?: "VideoTag";
name: string;
tagClasses: Array<{ __typename?: "VideoTagClass"; name: string }>;
}>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
id: number; id: number;
status: ProcessingStatusEnum; status: ProcessingStatusEnum;
errors: Array<{
__typename?: "VideoProcessingErrorGQL";
message: string;
}>;
statuses: Array<{
__typename?: "VideoProcessingStatusGQL";
status: ProcessingStatusEnum;
}>;
} | null; } | null;
reactions: Array<{ reactions: Array<{
__typename?: "ReactionGQL"; __typename?: "ReactionGQL";
@@ -4174,15 +4192,11 @@ export type VideoCardFieldsFragment = {
id: number; id: number;
name?: string | null; name?: string | null;
screenshotUri?: string | null; screenshotUri?: string | null;
totalShotsMade: number;
totalShots: number; totalShots: number;
makePercentage: number; makePercentage: number;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
averageDifficulty?: number | null; averageDifficulty?: number | null;
createdAt?: any | null;
updatedAt?: any | null;
startTime?: any | null; startTime?: any | null;
endTime?: any | null;
private: boolean; private: boolean;
elapsedTime?: number | null; elapsedTime?: number | null;
tableSize: number; tableSize: number;
@@ -4197,23 +4211,13 @@ export type VideoCardFieldsFragment = {
__typename?: "UploadStreamGQL"; __typename?: "UploadStreamGQL";
id: string; id: string;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
isCompleted: boolean;
streamSegmentType: StreamSegmentTypeEnum; streamSegmentType: StreamSegmentTypeEnum;
} | null; } | null;
tags: Array<{ tags: Array<{ __typename?: "VideoTag"; name: string }>;
__typename?: "VideoTag";
name: string;
tagClasses: Array<{ __typename?: "VideoTagClass"; name: string }>;
}>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
id: number; id: number;
status: ProcessingStatusEnum; status: ProcessingStatusEnum;
errors: Array<{ __typename?: "VideoProcessingErrorGQL"; message: string }>;
statuses: Array<{
__typename?: "VideoProcessingStatusGQL";
status: ProcessingStatusEnum;
}>;
} | null; } | null;
reactions: Array<{ reactions: Array<{
__typename?: "ReactionGQL"; __typename?: "ReactionGQL";
@@ -4287,15 +4291,11 @@ export type GetVideoFeedQuery = {
id: number; id: number;
name?: string | null; name?: string | null;
screenshotUri?: string | null; screenshotUri?: string | null;
totalShotsMade: number;
totalShots: number; totalShots: number;
makePercentage: number; makePercentage: number;
averageTimeBetweenShots?: number | null; averageTimeBetweenShots?: number | null;
averageDifficulty?: number | null; averageDifficulty?: number | null;
createdAt?: any | null;
updatedAt?: any | null;
startTime?: any | null; startTime?: any | null;
endTime?: any | null;
private: boolean; private: boolean;
elapsedTime?: number | null; elapsedTime?: number | null;
tableSize: number; tableSize: number;
@@ -4310,26 +4310,13 @@ export type GetVideoFeedQuery = {
__typename?: "UploadStreamGQL"; __typename?: "UploadStreamGQL";
id: string; id: string;
lastIntendedSegmentBound?: number | null; lastIntendedSegmentBound?: number | null;
isCompleted: boolean;
streamSegmentType: StreamSegmentTypeEnum; streamSegmentType: StreamSegmentTypeEnum;
} | null; } | null;
tags: Array<{ tags: Array<{ __typename?: "VideoTag"; name: string }>;
__typename?: "VideoTag";
name: string;
tagClasses: Array<{ __typename?: "VideoTagClass"; name: string }>;
}>;
currentProcessing?: { currentProcessing?: {
__typename?: "VideoProcessingGQL"; __typename?: "VideoProcessingGQL";
id: number; id: number;
status: ProcessingStatusEnum; status: ProcessingStatusEnum;
errors: Array<{
__typename?: "VideoProcessingErrorGQL";
message: string;
}>;
statuses: Array<{
__typename?: "VideoProcessingStatusGQL";
status: ProcessingStatusEnum;
}>;
} | null; } | null;
reactions: Array<{ reactions: Array<{
__typename?: "ReactionGQL"; __typename?: "ReactionGQL";
@@ -4724,6 +4711,18 @@ export type CreateSubscriptionMutation = {
}; };
}; };
export type CreateCustomerPortalSessionMutationVariables = Exact<{
returnUrl?: InputMaybe<Scalars["String"]["input"]>;
}>;
export type CreateCustomerPortalSessionMutation = {
__typename?: "Mutation";
createCustomerPortalSession: {
__typename?: "CreateCustomerPortalSessionResultGQL";
portalUrl: string;
};
};
export type GetAvailableSubscriptionOptionsQueryVariables = Exact<{ export type GetAvailableSubscriptionOptionsQueryVariables = Exact<{
[key: string]: never; [key: string]: never;
}>; }>;
@@ -5546,6 +5545,23 @@ export type GetUserTagsQuery = {
}>; }>;
}; };
export type GetGameTypeTagMetricsQueryVariables = Exact<{
input: GameTypeTagMetricsInput;
}>;
export type GetGameTypeTagMetricsQuery = {
__typename?: "Query";
getGameTypeTagMetrics: Array<{
__typename?: "GameTypeTagMetric";
tagName: string;
tagLabel: string;
tableSize?: number | null;
shotCount: number;
madeShots: number;
makeRate: number;
}>;
};
export type FollowUserMutationVariables = Exact<{ export type FollowUserMutationVariables = Exact<{
followedUserId: Scalars["Int"]["input"]; followedUserId: Scalars["Int"]["input"];
}>; }>;
@@ -6477,41 +6493,26 @@ export const VideoCardFieldsFragmentDoc = gql`
} }
name name
screenshotUri screenshotUri
totalShotsMade
totalShots totalShots
makePercentage makePercentage
averageTimeBetweenShots averageTimeBetweenShots
averageDifficulty averageDifficulty
createdAt
updatedAt
startTime startTime
endTime
private private
elapsedTime elapsedTime
screenshotUri
stream { stream {
id id
lastIntendedSegmentBound lastIntendedSegmentBound
isCompleted
streamSegmentType streamSegmentType
} }
tableSize tableSize
pocketSize pocketSize
tags { tags {
tagClasses {
name
}
name name
} }
currentProcessing { currentProcessing {
id id
errors {
message
}
status status
statuses {
status
}
} }
reactions { reactions {
videoId videoId
@@ -9610,6 +9611,57 @@ export type CreateSubscriptionMutationOptions = Apollo.BaseMutationOptions<
CreateSubscriptionMutation, CreateSubscriptionMutation,
CreateSubscriptionMutationVariables CreateSubscriptionMutationVariables
>; >;
export const CreateCustomerPortalSessionDocument = gql`
mutation CreateCustomerPortalSession($returnUrl: String) {
createCustomerPortalSession(returnUrl: $returnUrl) {
portalUrl
}
}
`;
export type CreateCustomerPortalSessionMutationFn = Apollo.MutationFunction<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>;
/**
* __useCreateCustomerPortalSessionMutation__
*
* To run a mutation, you first call `useCreateCustomerPortalSessionMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useCreateCustomerPortalSessionMutation` 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 [createCustomerPortalSessionMutation, { data, loading, error }] = useCreateCustomerPortalSessionMutation({
* variables: {
* returnUrl: // value for 'returnUrl'
* },
* });
*/
export function useCreateCustomerPortalSessionMutation(
baseOptions?: Apollo.MutationHookOptions<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>(CreateCustomerPortalSessionDocument, options);
}
export type CreateCustomerPortalSessionMutationHookResult = ReturnType<
typeof useCreateCustomerPortalSessionMutation
>;
export type CreateCustomerPortalSessionMutationResult =
Apollo.MutationResult<CreateCustomerPortalSessionMutation>;
export type CreateCustomerPortalSessionMutationOptions =
Apollo.BaseMutationOptions<
CreateCustomerPortalSessionMutation,
CreateCustomerPortalSessionMutationVariables
>;
export const GetAvailableSubscriptionOptionsDocument = gql` export const GetAvailableSubscriptionOptionsDocument = gql`
query GetAvailableSubscriptionOptions { query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions { getAvailableSubscriptionOptions {
@@ -11529,6 +11581,84 @@ export type GetUserTagsQueryResult = Apollo.QueryResult<
GetUserTagsQuery, GetUserTagsQuery,
GetUserTagsQueryVariables GetUserTagsQueryVariables
>; >;
export const GetGameTypeTagMetricsDocument = gql`
query GetGameTypeTagMetrics($input: GameTypeTagMetricsInput!) {
getGameTypeTagMetrics(input: $input) {
tagName
tagLabel
tableSize
shotCount
madeShots
makeRate
}
}
`;
/**
* __useGetGameTypeTagMetricsQuery__
*
* To run a query within a React component, call `useGetGameTypeTagMetricsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetGameTypeTagMetricsQuery` 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 } = useGetGameTypeTagMetricsQuery({
* variables: {
* input: // value for 'input'
* },
* });
*/
export function useGetGameTypeTagMetricsQuery(
baseOptions: Apollo.QueryHookOptions<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>(GetGameTypeTagMetricsDocument, options);
}
export function useGetGameTypeTagMetricsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>(GetGameTypeTagMetricsDocument, options);
}
export function useGetGameTypeTagMetricsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>(GetGameTypeTagMetricsDocument, options);
}
export type GetGameTypeTagMetricsQueryHookResult = ReturnType<
typeof useGetGameTypeTagMetricsQuery
>;
export type GetGameTypeTagMetricsLazyQueryHookResult = ReturnType<
typeof useGetGameTypeTagMetricsLazyQuery
>;
export type GetGameTypeTagMetricsSuspenseQueryHookResult = ReturnType<
typeof useGetGameTypeTagMetricsSuspenseQuery
>;
export type GetGameTypeTagMetricsQueryResult = Apollo.QueryResult<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>;
export const FollowUserDocument = gql` export const FollowUserDocument = gql`
mutation followUser($followedUserId: Int!) { mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) { followUser(followedUserId: $followedUserId) {

View File

@@ -31,41 +31,26 @@ fragment VideoCardFields on VideoGQL {
} }
name name
screenshotUri screenshotUri
totalShotsMade
totalShots totalShots
makePercentage makePercentage
averageTimeBetweenShots averageTimeBetweenShots
averageDifficulty averageDifficulty
createdAt
updatedAt
startTime startTime
endTime
private private
elapsedTime elapsedTime
screenshotUri
stream { stream {
id id
lastIntendedSegmentBound lastIntendedSegmentBound
isCompleted
streamSegmentType streamSegmentType
} }
tableSize tableSize
pocketSize pocketSize
tags { tags {
tagClasses {
name
}
name name
} }
currentProcessing { currentProcessing {
id id
errors {
message
}
status status
statuses {
status
}
} }
reactions { reactions {
videoId videoId

View File

@@ -20,6 +20,12 @@ mutation CreateSubscription($priceId: String!) {
} }
} }
mutation CreateCustomerPortalSession($returnUrl: String) {
createCustomerPortalSession(returnUrl: $returnUrl) {
portalUrl
}
}
query GetAvailableSubscriptionOptions { query GetAvailableSubscriptionOptions {
getAvailableSubscriptionOptions { getAvailableSubscriptionOptions {
products { products {

View File

@@ -92,6 +92,17 @@ query GetUserTags {
} }
} }
query GetGameTypeTagMetrics($input: GameTypeTagMetricsInput!) {
getGameTypeTagMetrics(input: $input) {
tagName
tagLabel
tableSize
shotCount
madeShots
makeRate
}
}
mutation followUser($followedUserId: Int!) { mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) { followUser(followedUserId: $followedUserId) {
id id

View File

@@ -28,7 +28,7 @@ type Query {
getLongestRunsLeaderboard( getLongestRunsLeaderboard(
interval: TimeInterval = null interval: TimeInterval = null
when: DateTime = null when: DateTime = null
limit: Int! = 100 limit: Int! = 50
requiredTags: [String!] = null requiredTags: [String!] = null
): RunLeaderboardGQL! ): RunLeaderboardGQL!
getMakesLeaderboard( getMakesLeaderboard(
@@ -106,6 +106,7 @@ type Query {
filters: VideoFilterInput = null filters: VideoFilterInput = null
): VideoHistoryGQL! ): VideoHistoryGQL!
getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]! getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]!
getGameTypeTagMetrics(input: GameTypeTagMetricsInput!): [GameTypeTagMetric!]!
getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL! getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL!
getVideos(videoIds: [Int!]!): [VideoGQL!]! getVideos(videoIds: [Int!]!): [VideoGQL!]!
} }
@@ -1017,6 +1018,25 @@ type TagClassGQL {
name: String! name: String!
} }
type GameTypeTagMetric {
tagName: String!
tagLabel: String!
tableSize: Float
shotCount: Int!
madeShots: Int!
makeRate: Float!
}
input GameTypeTagMetricsInput {
userId: Int!
createdAt: DateRangeFilter = null
maxTags: Int = null
groupByTableSize: Boolean! = true
includeUnknown: Boolean! = true
tagClass: String = "game_type"
includePrivate: IncludePrivateEnum! = MINE
}
""" """
The `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf). The `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).
""" """
@@ -1097,6 +1117,9 @@ type Mutation {
ensureStripeCustomerExists: UserGQL! ensureStripeCustomerExists: UserGQL!
deleteUser: Boolean! deleteUser: Boolean!
createSubscription(priceId: String!): CreateSubscriptionResultGQL! createSubscription(priceId: String!): CreateSubscriptionResultGQL!
createCustomerPortalSession(
returnUrl: String = null
): CreateCustomerPortalSessionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL! cancelSubscription: UserSubscriptionStatusGQL!
grantManualEntitlement( grantManualEntitlement(
userId: Int! userId: Int!
@@ -1236,6 +1259,10 @@ type CreateSubscriptionResultGQL {
sessionId: String! sessionId: String!
} }
type CreateCustomerPortalSessionResultGQL {
portalUrl: String!
}
enum CancellationReasonEnum { enum CancellationReasonEnum {
DONT_PLAY_ENOUGH DONT_PLAY_ENOUGH
TOO_EXPENSIVE TOO_EXPENSIVE