Compare commits

..

1 Commits

Author SHA1 Message Date
Dean Wenstrand
d4f4a539f5 Add camera-claim schema: venues, cameras, claim lifecycle
New query/mutation surface for the camera-claim flow: getVenues (with
per-camera availability), getActiveClaim, claimCamera, endClaim,
extendClaim, plus VenueGQL / VenueCameraGQL / CameraClaimGQL /
ClaimStatusEnum types.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-09 14:44:33 -07:00
3 changed files with 111 additions and 400 deletions

View File

@@ -140,6 +140,18 @@ export type BucketSetInputGql = {
feature: Scalars["String"]["input"]; feature: Scalars["String"]["input"];
}; };
export type CameraClaimGql = {
__typename?: "CameraClaimGQL";
cameraId: Scalars["Int"]["output"];
createdAt: Scalars["DateTime"]["output"];
endedAt?: Maybe<Scalars["DateTime"]["output"]>;
expiresAt?: Maybe<Scalars["DateTime"]["output"]>;
id: Scalars["Int"]["output"];
status: ClaimStatusEnum;
userId: Scalars["Int"]["output"];
videoId?: Maybe<Scalars["Int"]["output"]>;
};
export type CancellationFeedbackMetadataInput = { export type CancellationFeedbackMetadataInput = {
appVersion?: InputMaybe<Scalars["String"]["input"]>; appVersion?: InputMaybe<Scalars["String"]["input"]>;
gitRevision?: InputMaybe<Scalars["String"]["input"]>; gitRevision?: InputMaybe<Scalars["String"]["input"]>;
@@ -200,6 +212,21 @@ export type ChallengeInvitation = {
status: Scalars["String"]["output"]; status: Scalars["String"]["output"];
}; };
export enum ClaimStatusEnum {
Active = "ACTIVE",
CodeExpired = "CODE_EXPIRED",
CodeIssued = "CODE_ISSUED",
EndedByUser = "ENDED_BY_USER",
Expired = "EXPIRED",
Ingesting = "INGESTING",
ReleasedInactive = "RELEASED_INACTIVE",
Requested = "REQUESTED",
Scanning = "SCANNING",
ScanConfirmed = "SCAN_CONFIRMED",
StreamLost = "STREAM_LOST",
StreamUnreachable = "STREAM_UNREACHABLE",
}
export enum ClientUploadStatusEnum { export enum ClientUploadStatusEnum {
UploadDisabled = "UPLOAD_DISABLED", UploadDisabled = "UPLOAD_DISABLED",
UploadEnabled = "UPLOAD_ENABLED", UploadEnabled = "UPLOAD_ENABLED",
@@ -304,14 +331,6 @@ export type DoesNotOwnShotErrOtherErrorNeedsNote =
| DoesNotOwnShotErr | DoesNotOwnShotErr
| OtherErrorNeedsNote; | OtherErrorNeedsNote;
export type DrillRunLeaderboardGql = {
__typename?: "DrillRunLeaderboardGQL";
entries: Array<RunGql>;
totalPlayers: Scalars["Int"]["output"];
youRank?: Maybe<Scalars["Int"]["output"]>;
youRun?: Maybe<RunGql>;
};
export type EditShotReturn = { export type EditShotReturn = {
__typename?: "EditShotReturn"; __typename?: "EditShotReturn";
error?: Maybe<DoesNotOwnShotErr>; error?: Maybe<DoesNotOwnShotErr>;
@@ -339,7 +358,6 @@ export type EditableShotFieldInputGql = {
export enum EntitlementSourceTypeEnum { export enum EntitlementSourceTypeEnum {
Admin = "ADMIN", Admin = "ADMIN",
AlphaLegacy = "ALPHA_LEGACY", AlphaLegacy = "ALPHA_LEGACY",
Apple = "APPLE",
Manual = "MANUAL", Manual = "MANUAL",
Stripe = "STRIPE", Stripe = "STRIPE",
} }
@@ -2397,6 +2415,7 @@ export type Mutation = {
blockContent: Scalars["Boolean"]["output"]; blockContent: Scalars["Boolean"]["output"];
blockUser: Scalars["Boolean"]["output"]; blockUser: Scalars["Boolean"]["output"];
cancelSubscription: UserSubscriptionStatusGql; cancelSubscription: UserSubscriptionStatusGql;
claimCamera: CameraClaimGql;
commentOnVideo: Scalars["Boolean"]["output"]; commentOnVideo: Scalars["Boolean"]["output"];
createBucketSet: BucketSetGql; createBucketSet: BucketSetGql;
createChallenge: Challenge; createChallenge: Challenge;
@@ -2415,7 +2434,9 @@ export type Mutation = {
editShot: EditShotReturn; editShot: EditShotReturn;
editUploadStream: Scalars["Boolean"]["output"]; editUploadStream: Scalars["Boolean"]["output"];
editUser: UserGql; editUser: UserGql;
endClaim: CameraClaimGql;
ensureStripeCustomerExists: UserGql; ensureStripeCustomerExists: UserGql;
extendClaim: CameraClaimGql;
finalizePlayerAssignments: Array<PlayerClusterGql>; finalizePlayerAssignments: Array<PlayerClusterGql>;
findPrerecordTableLayout?: Maybe<HomographyInfoGql>; findPrerecordTableLayout?: Maybe<HomographyInfoGql>;
followUser: UserGql; followUser: UserGql;
@@ -2438,7 +2459,6 @@ export type Mutation = {
startChallenge: ChallengeEntry; startChallenge: ChallengeEntry;
submitCancellationFeedback: Scalars["Boolean"]["output"]; submitCancellationFeedback: Scalars["Boolean"]["output"];
submitChallengeEntry: ChallengeEntry; submitChallengeEntry: ChallengeEntry;
syncAppleSubscription: SyncAppleSubscriptionResultGql;
undismissChallenge: Scalars["Boolean"]["output"]; undismissChallenge: Scalars["Boolean"]["output"];
unfollowUser: UserGql; unfollowUser: UserGql;
updateShotAnnotations: UpdateShotAnnotationReturn; updateShotAnnotations: UpdateShotAnnotationReturn;
@@ -2458,6 +2478,11 @@ export type MutationBlockUserArgs = {
userId: Scalars["Int"]["input"]; userId: Scalars["Int"]["input"];
}; };
export type MutationClaimCameraArgs = {
cameraId: Scalars["Int"]["input"];
durationMinutes?: Scalars["Int"]["input"];
};
export type MutationCommentOnVideoArgs = { export type MutationCommentOnVideoArgs = {
message: Scalars["String"]["input"]; message: Scalars["String"]["input"];
parentCommentId?: InputMaybe<Scalars["Int"]["input"]>; parentCommentId?: InputMaybe<Scalars["Int"]["input"]>;
@@ -2541,6 +2566,15 @@ export type MutationEditUserArgs = {
input: EditUserInputGql; input: EditUserInputGql;
}; };
export type MutationEndClaimArgs = {
claimId: Scalars["Int"]["input"];
};
export type MutationExtendClaimArgs = {
additionalMinutes?: Scalars["Int"]["input"];
claimId: Scalars["Int"]["input"];
};
export type MutationFinalizePlayerAssignmentsArgs = { export type MutationFinalizePlayerAssignmentsArgs = {
input: FinalizePlayerAssignmentsInput; input: FinalizePlayerAssignmentsInput;
}; };
@@ -2642,10 +2676,6 @@ export type MutationSubmitChallengeEntryArgs = {
videoId: Scalars["ID"]["input"]; videoId: Scalars["ID"]["input"];
}; };
export type MutationSyncAppleSubscriptionArgs = {
input: SyncAppleSubscriptionInputGql;
};
export type MutationUndismissChallengeArgs = { export type MutationUndismissChallengeArgs = {
challengeId: Scalars["ID"]["input"]; challengeId: Scalars["ID"]["input"];
}; };
@@ -2827,19 +2857,17 @@ export type Query = {
challengeLeaderboard: Array<ChallengeEntry>; challengeLeaderboard: Array<ChallengeEntry>;
challenges: Array<Challenge>; challenges: Array<Challenge>;
doesUsernameExist: Scalars["Boolean"]["output"]; doesUsernameExist: Scalars["Boolean"]["output"];
getActiveClaim?: Maybe<CameraClaimGql>;
getAggregatedShotMetrics: Array<AggregateResultGql>; getAggregatedShotMetrics: Array<AggregateResultGql>;
getAppleAppAccountToken: Scalars["String"]["output"];
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGql; getAvailableSubscriptionOptions: StripeSubscriptionOptionsGql;
getBucketSet?: Maybe<BucketSetGql>; getBucketSet?: Maybe<BucketSetGql>;
getDeployedConfig: DeployedConfigGql; getDeployedConfig: DeployedConfigGql;
getDrillRunLeaderboard: DrillRunLeaderboardGql;
getFeedVideos: VideoHistoryGql; getFeedVideos: VideoHistoryGql;
getGameTypeTagMetrics: Array<GameTypeTagMetric>; getGameTypeTagMetrics: Array<GameTypeTagMetric>;
getLoggedInUser?: Maybe<UserGql>; getLoggedInUser?: Maybe<UserGql>;
getLongestRunsLeaderboard: RunLeaderboardGql; getLongestRunsLeaderboard: RunLeaderboardGql;
getMakesLeaderboard: CountLeaderboardGql; getMakesLeaderboard: CountLeaderboardGql;
getMedals: RequestedMedalsGql; getMedals: RequestedMedalsGql;
getMyDrillRuns: Array<RunGql>;
getOrderedShots: GetShotsResult; getOrderedShots: GetShotsResult;
getPlayTime: UserPlayTimeGql; getPlayTime: UserPlayTimeGql;
getQuotaStatus: QuotaStatusGql; getQuotaStatus: QuotaStatusGql;
@@ -2856,6 +2884,7 @@ export type Query = {
getUserVideos: VideoHistoryGql; getUserVideos: VideoHistoryGql;
getUsernames: Array<Scalars["String"]["output"]>; getUsernames: Array<Scalars["String"]["output"]>;
getUsersMatching: Array<UserGql>; getUsersMatching: Array<UserGql>;
getVenues: Array<VenueGql>;
getVideo: VideoGql; getVideo: VideoGql;
getVideoMakePercentageIntervals: Array<MakePercentageIntervalGql>; getVideoMakePercentageIntervals: Array<MakePercentageIntervalGql>;
getVideos: Array<VideoGql>; getVideos: Array<VideoGql>;
@@ -2895,16 +2924,6 @@ export type QueryGetBucketSetArgs = {
keyName: Scalars["String"]["input"]; keyName: Scalars["String"]["input"];
}; };
export type QueryGetDrillRunLeaderboardArgs = {
drillTag: Scalars["String"]["input"];
interval?: InputMaybe<TimeInterval>;
limit?: Scalars["Int"]["input"];
pocketSizeMax?: InputMaybe<Scalars["Float"]["input"]>;
pocketSizeMin?: InputMaybe<Scalars["Float"]["input"]>;
tableSizeMax?: InputMaybe<Scalars["Float"]["input"]>;
tableSizeMin?: InputMaybe<Scalars["Float"]["input"]>;
};
export type QueryGetFeedVideosArgs = { export type QueryGetFeedVideosArgs = {
after?: InputMaybe<Scalars["String"]["input"]>; after?: InputMaybe<Scalars["String"]["input"]>;
feedInput?: InputMaybe<VideoFeedInputGql>; feedInput?: InputMaybe<VideoFeedInputGql>;
@@ -2935,11 +2954,6 @@ export type QueryGetMedalsArgs = {
userId?: InputMaybe<Scalars["Int"]["input"]>; userId?: InputMaybe<Scalars["Int"]["input"]>;
}; };
export type QueryGetMyDrillRunsArgs = {
drillTag: Scalars["String"]["input"];
limit?: Scalars["Int"]["input"];
};
export type QueryGetOrderedShotsArgs = { export type QueryGetOrderedShotsArgs = {
countRespectsLimit?: Scalars["Boolean"]["input"]; countRespectsLimit?: Scalars["Boolean"]["input"];
filterInput: FilterInput; filterInput: FilterInput;
@@ -3409,27 +3423,6 @@ export type SuccessfulAddAddShotAnnotationErrors =
| AddShotAnnotationErrors | AddShotAnnotationErrors
| SuccessfulAdd; | 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 = { export type TableStateGql = {
__typename?: "TableStateGQL"; __typename?: "TableStateGQL";
homography?: Maybe<HomographyInfoGql>; homography?: Maybe<HomographyInfoGql>;
@@ -3595,6 +3588,24 @@ export type UserSubscriptionStatusGql = {
validUntil?: Maybe<Scalars["DateTime"]["output"]>; validUntil?: Maybe<Scalars["DateTime"]["output"]>;
}; };
export type VenueCameraGql = {
__typename?: "VenueCameraGQL";
enabled: Scalars["Boolean"]["output"];
id: Scalars["Int"]["output"];
isAvailable: Scalars["Boolean"]["output"];
tableLabel: Scalars["String"]["output"];
venueId: Scalars["Int"]["output"];
};
export type VenueGql = {
__typename?: "VenueGQL";
cameras: Array<VenueCameraGql>;
id: Scalars["Int"]["output"];
latitude?: Maybe<Scalars["Float"]["output"]>;
longitude?: Maybe<Scalars["Float"]["output"]>;
name: Scalars["String"]["output"];
};
export type VideoFeedInputGql = export type VideoFeedInputGql =
| { | {
allUsers: Scalars["Boolean"]["input"]; allUsers: Scalars["Boolean"]["input"];
@@ -4626,64 +4637,6 @@ export type GetRunsLeaderboardQuery = {
}; };
}; };
export type GetDrillRunLeaderboardQueryVariables = Exact<{
drillTag: Scalars["String"]["input"];
interval?: InputMaybe<TimeInterval>;
limit?: InputMaybe<Scalars["Int"]["input"]>;
tableSizeMin?: InputMaybe<Scalars["Float"]["input"]>;
tableSizeMax?: InputMaybe<Scalars["Float"]["input"]>;
pocketSizeMin?: InputMaybe<Scalars["Float"]["input"]>;
pocketSizeMax?: InputMaybe<Scalars["Float"]["input"]>;
}>;
export type GetDrillRunLeaderboardQuery = {
__typename?: "Query";
getDrillRunLeaderboard: {
__typename?: "DrillRunLeaderboardGQL";
youRank?: number | null;
totalPlayers: number;
entries: Array<{
__typename?: "RunGQL";
id: number;
runLength: number;
videoId: number;
video: {
__typename?: "VideoGQL";
tableSize: number;
pocketSize?: number | null;
};
user: {
__typename?: "UserGQL";
id: number;
username: string;
profileImageUri?: string | null;
};
}>;
youRun?: {
__typename?: "RunGQL";
id: number;
runLength: number;
videoId: number;
} | null;
};
};
export type GetMyDrillRunsQueryVariables = Exact<{
drillTag: Scalars["String"]["input"];
limit?: InputMaybe<Scalars["Int"]["input"]>;
}>;
export type GetMyDrillRunsQuery = {
__typename?: "Query";
getMyDrillRuns: Array<{
__typename?: "RunGQL";
id: number;
runLength: number;
videoId: number;
video: { __typename?: "VideoGQL"; createdAt?: any | null };
}>;
};
export type GetVideoMakePercentageIntervalsQueryVariables = Exact<{ export type GetVideoMakePercentageIntervalsQueryVariables = Exact<{
videoId: Scalars["ID"]["input"]; videoId: Scalars["ID"]["input"];
intervalDuration: Scalars["Int"]["input"]; intervalDuration: Scalars["Int"]["input"];
@@ -9658,200 +9611,6 @@ export type GetRunsLeaderboardQueryResult = Apollo.QueryResult<
GetRunsLeaderboardQuery, GetRunsLeaderboardQuery,
GetRunsLeaderboardQueryVariables GetRunsLeaderboardQueryVariables
>; >;
export const GetDrillRunLeaderboardDocument = gql`
query GetDrillRunLeaderboard(
$drillTag: String!
$interval: TimeInterval
$limit: Int = 50
$tableSizeMin: Float
$tableSizeMax: Float
$pocketSizeMin: Float
$pocketSizeMax: Float
) {
getDrillRunLeaderboard(
drillTag: $drillTag
interval: $interval
limit: $limit
tableSizeMin: $tableSizeMin
tableSizeMax: $tableSizeMax
pocketSizeMin: $pocketSizeMin
pocketSizeMax: $pocketSizeMax
) {
entries {
id
runLength
videoId
video {
tableSize
pocketSize
}
user {
id
username
profileImageUri
}
}
youRun {
id
runLength
videoId
}
youRank
totalPlayers
}
}
`;
/**
* __useGetDrillRunLeaderboardQuery__
*
* To run a query within a React component, call `useGetDrillRunLeaderboardQuery` and pass it any options that fit your needs.
* When your component renders, `useGetDrillRunLeaderboardQuery` 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 } = useGetDrillRunLeaderboardQuery({
* variables: {
* drillTag: // value for 'drillTag'
* interval: // value for 'interval'
* limit: // value for 'limit'
* tableSizeMin: // value for 'tableSizeMin'
* tableSizeMax: // value for 'tableSizeMax'
* pocketSizeMin: // value for 'pocketSizeMin'
* pocketSizeMax: // value for 'pocketSizeMax'
* },
* });
*/
export function useGetDrillRunLeaderboardQuery(
baseOptions: Apollo.QueryHookOptions<
GetDrillRunLeaderboardQuery,
GetDrillRunLeaderboardQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetDrillRunLeaderboardQuery,
GetDrillRunLeaderboardQueryVariables
>(GetDrillRunLeaderboardDocument, options);
}
export function useGetDrillRunLeaderboardLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetDrillRunLeaderboardQuery,
GetDrillRunLeaderboardQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetDrillRunLeaderboardQuery,
GetDrillRunLeaderboardQueryVariables
>(GetDrillRunLeaderboardDocument, options);
}
export function useGetDrillRunLeaderboardSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetDrillRunLeaderboardQuery,
GetDrillRunLeaderboardQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetDrillRunLeaderboardQuery,
GetDrillRunLeaderboardQueryVariables
>(GetDrillRunLeaderboardDocument, options);
}
export type GetDrillRunLeaderboardQueryHookResult = ReturnType<
typeof useGetDrillRunLeaderboardQuery
>;
export type GetDrillRunLeaderboardLazyQueryHookResult = ReturnType<
typeof useGetDrillRunLeaderboardLazyQuery
>;
export type GetDrillRunLeaderboardSuspenseQueryHookResult = ReturnType<
typeof useGetDrillRunLeaderboardSuspenseQuery
>;
export type GetDrillRunLeaderboardQueryResult = Apollo.QueryResult<
GetDrillRunLeaderboardQuery,
GetDrillRunLeaderboardQueryVariables
>;
export const GetMyDrillRunsDocument = gql`
query GetMyDrillRuns($drillTag: String!, $limit: Int = 50) {
getMyDrillRuns(drillTag: $drillTag, limit: $limit) {
id
runLength
videoId
video {
createdAt
}
}
}
`;
/**
* __useGetMyDrillRunsQuery__
*
* To run a query within a React component, call `useGetMyDrillRunsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetMyDrillRunsQuery` 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 } = useGetMyDrillRunsQuery({
* variables: {
* drillTag: // value for 'drillTag'
* limit: // value for 'limit'
* },
* });
*/
export function useGetMyDrillRunsQuery(
baseOptions: Apollo.QueryHookOptions<
GetMyDrillRunsQuery,
GetMyDrillRunsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<GetMyDrillRunsQuery, GetMyDrillRunsQueryVariables>(
GetMyDrillRunsDocument,
options,
);
}
export function useGetMyDrillRunsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetMyDrillRunsQuery,
GetMyDrillRunsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<GetMyDrillRunsQuery, GetMyDrillRunsQueryVariables>(
GetMyDrillRunsDocument,
options,
);
}
export function useGetMyDrillRunsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetMyDrillRunsQuery,
GetMyDrillRunsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetMyDrillRunsQuery,
GetMyDrillRunsQueryVariables
>(GetMyDrillRunsDocument, options);
}
export type GetMyDrillRunsQueryHookResult = ReturnType<
typeof useGetMyDrillRunsQuery
>;
export type GetMyDrillRunsLazyQueryHookResult = ReturnType<
typeof useGetMyDrillRunsLazyQuery
>;
export type GetMyDrillRunsSuspenseQueryHookResult = ReturnType<
typeof useGetMyDrillRunsSuspenseQuery
>;
export type GetMyDrillRunsQueryResult = Apollo.QueryResult<
GetMyDrillRunsQuery,
GetMyDrillRunsQueryVariables
>;
export const GetVideoMakePercentageIntervalsDocument = gql` export const GetVideoMakePercentageIntervalsDocument = gql`
query GetVideoMakePercentageIntervals( query GetVideoMakePercentageIntervals(
$videoId: ID! $videoId: ID!

View File

@@ -30,56 +30,3 @@ query GetRunsLeaderboard($interval: TimeInterval, $when: DateTime) {
} }
} }
} }
query GetDrillRunLeaderboard(
$drillTag: String!
$interval: TimeInterval
$limit: Int = 50
$tableSizeMin: Float
$tableSizeMax: Float
$pocketSizeMin: Float
$pocketSizeMax: Float
) {
getDrillRunLeaderboard(
drillTag: $drillTag
interval: $interval
limit: $limit
tableSizeMin: $tableSizeMin
tableSizeMax: $tableSizeMax
pocketSizeMin: $pocketSizeMin
pocketSizeMax: $pocketSizeMax
) {
entries {
id
runLength
videoId
video {
tableSize
pocketSize
}
user {
id
username
profileImageUri
}
}
youRun {
id
runLength
videoId
}
youRank
totalPlayers
}
}
query GetMyDrillRuns($drillTag: String!, $limit: Int = 50) {
getMyDrillRuns(drillTag: $drillTag, limit: $limit) {
id
runLength
videoId
video {
createdAt
}
}
}

View File

@@ -11,6 +11,8 @@ type Query {
myChallengeInvitations: [ChallengeInvitation!]! myChallengeInvitations: [ChallengeInvitation!]!
ruleSets: [RuleSet!]! ruleSets: [RuleSet!]!
myChallengeEntries: [ChallengeEntry!]! myChallengeEntries: [ChallengeEntry!]!
getVenues: [VenueGQL!]!
getActiveClaim: CameraClaimGQL
getDeployedConfig: DeployedConfigGQL! getDeployedConfig: DeployedConfigGQL!
waitFor(duration: Float!): Float! waitFor(duration: Float!): Float!
getFeedVideos( getFeedVideos(
@@ -31,16 +33,6 @@ type Query {
limit: Int! = 50 limit: Int! = 50
requiredTags: [String!] = null requiredTags: [String!] = null
): RunLeaderboardGQL! ): RunLeaderboardGQL!
getDrillRunLeaderboard(
drillTag: String!
interval: TimeInterval = null
limit: Int! = 50
tableSizeMin: Float = null
tableSizeMax: Float = null
pocketSizeMin: Float = null
pocketSizeMax: Float = null
): DrillRunLeaderboardGQL!
getMyDrillRuns(drillTag: String!, limit: Int! = 50): [RunGQL!]!
getMakesLeaderboard( getMakesLeaderboard(
interval: TimeInterval = null interval: TimeInterval = null
when: DateTime = null when: DateTime = null
@@ -108,7 +100,6 @@ type Query {
): UserRelationshipsResult! ): UserRelationshipsResult!
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL! getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL!
getUserSubscriptionStatus: UserSubscriptionStatusGQL! getUserSubscriptionStatus: UserSubscriptionStatusGQL!
getAppleAppAccountToken: String!
getQuotaStatus: QuotaStatusGQL! getQuotaStatus: QuotaStatusGQL!
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL! getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
getUserVideos( getUserVideos(
@@ -692,6 +683,48 @@ type PlayerSummaryGQL {
averageTimeBetweenShots: Float averageTimeBetweenShots: Float
} }
type VenueGQL {
id: Int!
name: String!
latitude: Float
longitude: Float
cameras: [VenueCameraGQL!]!
}
type VenueCameraGQL {
id: Int!
venueId: Int!
tableLabel: String!
enabled: Boolean!
isAvailable: Boolean!
}
type CameraClaimGQL {
id: Int!
cameraId: Int!
userId: Int!
videoId: Int
status: ClaimStatusEnum!
expiresAt: DateTime
endedAt: DateTime
createdAt: DateTime!
}
enum ClaimStatusEnum {
REQUESTED
CODE_ISSUED
SCANNING
SCAN_CONFIRMED
INGESTING
ACTIVE
ENDED_BY_USER
EXPIRED
STREAM_LOST
STREAM_UNREACHABLE
CODE_EXPIRED
RELEASED_INACTIVE
}
type DeployedConfigGQL { type DeployedConfigGQL {
allowNewUsers: Boolean! allowNewUsers: Boolean!
firebase: Boolean! firebase: Boolean!
@@ -760,13 +793,6 @@ type RunLeaderboardGQL {
entries: [RunGQL!]! entries: [RunGQL!]!
} }
type DrillRunLeaderboardGQL {
entries: [RunGQL!]!
youRun: RunGQL
youRank: Int
totalPlayers: Int!
}
type CountLeaderboardGQL { type CountLeaderboardGQL {
entries: [UserShotCountEntry!]! entries: [UserShotCountEntry!]!
} }
@@ -1038,7 +1064,6 @@ enum EntitlementSourceTypeEnum {
ADMIN ADMIN
MANUAL MANUAL
STRIPE STRIPE
APPLE
ALPHA_LEGACY ALPHA_LEGACY
} }
@@ -1148,6 +1173,9 @@ type Mutation {
submitChallengeEntry(entryId: ID!, videoId: ID!): ChallengeEntry! submitChallengeEntry(entryId: ID!, videoId: ID!): ChallengeEntry!
dismissChallenge(challengeId: ID!): Boolean! dismissChallenge(challengeId: ID!): Boolean!
undismissChallenge(challengeId: ID!): Boolean! undismissChallenge(challengeId: ID!): Boolean!
claimCamera(cameraId: Int!, durationMinutes: Int! = 60): CameraClaimGQL!
endClaim(claimId: Int!): CameraClaimGQL!
extendClaim(claimId: Int!, additionalMinutes: Int! = 60): CameraClaimGQL!
setLoggerLevel(path: String!, level: String!): Boolean! setLoggerLevel(path: String!, level: String!): Boolean!
reactToVideo(videoId: Int!, reaction: ReactionEnum): Boolean! reactToVideo(videoId: Int!, reaction: ReactionEnum): Boolean!
commentOnVideo( commentOnVideo(
@@ -1194,9 +1222,6 @@ type Mutation {
retireTags(tagIds: [Int!]!): Boolean! retireTags(tagIds: [Int!]!): Boolean!
ensureStripeCustomerExists: UserGQL! ensureStripeCustomerExists: UserGQL!
deleteUser: Boolean! deleteUser: Boolean!
syncAppleSubscription(
input: SyncAppleSubscriptionInputGQL!
): SyncAppleSubscriptionResultGQL!
createSubscription(priceId: String!): CreateSubscriptionResultGQL! createSubscription(priceId: String!): CreateSubscriptionResultGQL!
createCustomerPortalSession: CreateCustomerPortalSessionResultGQL! createCustomerPortalSession: CreateCustomerPortalSessionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL! cancelSubscription: UserSubscriptionStatusGQL!
@@ -1350,26 +1375,6 @@ input EditUserInputGQL {
agreesToMarketing: Boolean = null 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 { type CreateSubscriptionResultGQL {
checkoutUrl: String! checkoutUrl: String!
sessionId: String! sessionId: String!