Compare commits

...

2 Commits

Author SHA1 Message Date
8111042936 Add pool hall camera claim schema
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2026-06-16 15:41:16 -07:00
d6fd68c1f6 add quotaEnforcementEnabled to deployed config
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-05-28 14:40:31 -07:00
3 changed files with 268 additions and 0 deletions

View File

@@ -140,6 +140,39 @@ export type BucketSetInputGql = {
feature: Scalars["String"]["input"];
};
export type CameraClaimSession = {
__typename?: "CameraClaimSession";
camera: PoolHallCamera;
cameraId: Scalars["ID"]["output"];
challengeCode: Scalars["String"]["output"];
createdAt: Scalars["DateTime"]["output"];
detectedAt?: Maybe<Scalars["DateTime"]["output"]>;
expiresAt: Scalars["DateTime"]["output"];
failedAt?: Maybe<Scalars["DateTime"]["output"]>;
failureReason?: Maybe<Scalars["String"]["output"]>;
id: Scalars["ID"]["output"];
status: Scalars["String"]["output"];
updatedAt: Scalars["DateTime"]["output"];
userId: Scalars["ID"]["output"];
};
export type CameraLease = {
__typename?: "CameraLease";
camera: PoolHallCamera;
cameraId: Scalars["ID"]["output"];
claimSessionId?: Maybe<Scalars["ID"]["output"]>;
createdAt: Scalars["DateTime"]["output"];
endReason?: Maybe<Scalars["String"]["output"]>;
endedAt?: Maybe<Scalars["DateTime"]["output"]>;
expiresAt?: Maybe<Scalars["DateTime"]["output"]>;
id: Scalars["ID"]["output"];
startedAt: Scalars["DateTime"]["output"];
status: Scalars["String"]["output"];
updatedAt: Scalars["DateTime"]["output"];
userId: Scalars["ID"]["output"];
videoId?: Maybe<Scalars["ID"]["output"]>;
};
export type CancellationFeedbackMetadataInput = {
appVersion?: InputMaybe<Scalars["String"]["input"]>;
gitRevision?: InputMaybe<Scalars["String"]["input"]>;
@@ -235,6 +268,21 @@ export type CreateCustomerPortalSessionResultGql = {
portalUrl: Scalars["String"]["output"];
};
export type CreatePoolHallCameraInput = {
name: Scalars["String"]["input"];
poolHallId: Scalars["ID"]["input"];
streamPath?: InputMaybe<Scalars["String"]["input"]>;
tableLabel?: InputMaybe<Scalars["String"]["input"]>;
};
export type CreatePoolHallInput = {
address?: InputMaybe<Scalars["String"]["input"]>;
latitude?: InputMaybe<Scalars["Float"]["input"]>;
longitude?: InputMaybe<Scalars["Float"]["input"]>;
name: Scalars["String"]["input"];
timezone?: InputMaybe<Scalars["String"]["input"]>;
};
export type CreateSubscriptionResultGql = {
__typename?: "CreateSubscriptionResultGQL";
checkoutUrl: Scalars["String"]["output"];
@@ -290,6 +338,7 @@ export type DeployedConfigGql = {
environment: Scalars["String"]["output"];
firebase: Scalars["Boolean"]["output"];
minimumAllowedAppVersion: Scalars["String"]["output"];
quotaEnforcementEnabled: Scalars["Boolean"]["output"];
subscriptionGatingEnabled: Scalars["Boolean"]["output"];
};
@@ -2386,11 +2435,15 @@ export type Mutation = {
addAnnotationToShot: AddShotAnnotationReturn;
blockContent: Scalars["Boolean"]["output"];
blockUser: Scalars["Boolean"]["output"];
cancelCameraClaimSession: CameraClaimSession;
cancelSubscription: UserSubscriptionStatusGql;
commentOnVideo: Scalars["Boolean"]["output"];
createBucketSet: BucketSetGql;
createCameraClaimSession: CameraClaimSession;
createChallenge: Challenge;
createCustomerPortalSession: CreateCustomerPortalSessionResultGql;
createPoolHall: PoolHall;
createPoolHallCamera: PoolHallCameraStreamCredentials;
createRuleSet: RuleSet;
createSubscription: CreateSubscriptionResultGql;
createUploadStream: CreateUploadStreamReturn;
@@ -2423,6 +2476,7 @@ export type Mutation = {
respondToChallengeInvitation: ChallengeInvitation;
retireTags: Scalars["Boolean"]["output"];
revokeManualEntitlement: UserSubscriptionStatusGql;
rotatePoolHallCameraStreamKey: PoolHallCameraStreamCredentials;
setLoggerLevel: Scalars["Boolean"]["output"];
setSegmentDuration: Scalars["Boolean"]["output"];
startChallenge: ChallengeEntry;
@@ -2430,6 +2484,8 @@ export type Mutation = {
submitChallengeEntry: ChallengeEntry;
undismissChallenge: Scalars["Boolean"]["output"];
unfollowUser: UserGql;
updatePoolHall: PoolHall;
updatePoolHallCamera: PoolHallCamera;
updateShotAnnotations: UpdateShotAnnotationReturn;
};
@@ -2447,6 +2503,10 @@ export type MutationBlockUserArgs = {
userId: Scalars["Int"]["input"];
};
export type MutationCancelCameraClaimSessionArgs = {
claimSessionId: Scalars["ID"]["input"];
};
export type MutationCommentOnVideoArgs = {
message: Scalars["String"]["input"];
parentCommentId?: InputMaybe<Scalars["Int"]["input"]>;
@@ -2457,6 +2517,10 @@ export type MutationCreateBucketSetArgs = {
params: CreateBucketSetInput;
};
export type MutationCreateCameraClaimSessionArgs = {
cameraId: Scalars["ID"]["input"];
};
export type MutationCreateChallengeArgs = {
description?: InputMaybe<Scalars["String"]["input"]>;
endDate: Scalars["DateTime"]["input"];
@@ -2470,6 +2534,14 @@ export type MutationCreateChallengeArgs = {
startDate: Scalars["DateTime"]["input"];
};
export type MutationCreatePoolHallArgs = {
input: CreatePoolHallInput;
};
export type MutationCreatePoolHallCameraArgs = {
input: CreatePoolHallCameraInput;
};
export type MutationCreateRuleSetArgs = {
description?: InputMaybe<Scalars["String"]["input"]>;
name: Scalars["String"]["input"];
@@ -2605,6 +2677,10 @@ export type MutationRevokeManualEntitlementArgs = {
userId: Scalars["Int"]["input"];
};
export type MutationRotatePoolHallCameraStreamKeyArgs = {
cameraId: Scalars["ID"]["input"];
};
export type MutationSetLoggerLevelArgs = {
level: Scalars["String"]["input"];
path: Scalars["String"]["input"];
@@ -2639,6 +2715,14 @@ export type MutationUnfollowUserArgs = {
followedUserId: Scalars["Int"]["input"];
};
export type MutationUpdatePoolHallArgs = {
input: UpdatePoolHallInput;
};
export type MutationUpdatePoolHallCameraArgs = {
input: UpdatePoolHallCameraInput;
};
export type MutationUpdateShotAnnotationsArgs = {
annotations: Array<UpdateAnnotationInputGql>;
shotId: Scalars["Int"]["input"];
@@ -2790,6 +2874,41 @@ export type PocketingIntentionInfoGql = {
pocketId: PocketIdentifier;
};
export type PoolHall = {
__typename?: "PoolHall";
address?: Maybe<Scalars["String"]["output"]>;
createdAt: Scalars["DateTime"]["output"];
id: Scalars["ID"]["output"];
latitude?: Maybe<Scalars["Float"]["output"]>;
longitude?: Maybe<Scalars["Float"]["output"]>;
name: Scalars["String"]["output"];
status: Scalars["String"]["output"];
timezone?: Maybe<Scalars["String"]["output"]>;
updatedAt: Scalars["DateTime"]["output"];
};
export type PoolHallCamera = {
__typename?: "PoolHallCamera";
createdAt: Scalars["DateTime"]["output"];
id: Scalars["ID"]["output"];
lastPublishedAt?: Maybe<Scalars["DateTime"]["output"]>;
lastUnpublishedAt?: Maybe<Scalars["DateTime"]["output"]>;
name: Scalars["String"]["output"];
poolHall: PoolHall;
poolHallId: Scalars["ID"]["output"];
status: Scalars["String"]["output"];
streamPath: Scalars["String"]["output"];
tableLabel?: Maybe<Scalars["String"]["output"]>;
updatedAt: Scalars["DateTime"]["output"];
};
export type PoolHallCameraStreamCredentials = {
__typename?: "PoolHallCameraStreamCredentials";
camera: PoolHallCamera;
rtmpPath: Scalars["String"]["output"];
streamKey: Scalars["String"]["output"];
};
export type ProcessingFailedErr = {
__typename?: "ProcessingFailedErr";
processing: VideoProcessingGql;
@@ -2808,9 +2927,13 @@ export enum ProcessingStatusEnum {
export type Query = {
__typename?: "Query";
activeCameraLease?: Maybe<CameraLease>;
cameraClaimSession?: Maybe<CameraClaimSession>;
challenge?: Maybe<Challenge>;
challengeLeaderboard: Array<ChallengeEntry>;
challenges: Array<Challenge>;
claimableCameras: Array<PoolHallCamera>;
claimablePoolHalls: Array<PoolHall>;
doesUsernameExist: Scalars["Boolean"]["output"];
getAggregatedShotMetrics: Array<AggregateResultGql>;
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGql;
@@ -2846,12 +2969,18 @@ export type Query = {
myChallengeInvitations: Array<ChallengeInvitation>;
myDismissedChallenges: Array<Challenge>;
notifications: NotificationConnection;
poolHallCameras: Array<PoolHallCamera>;
poolHalls: Array<PoolHall>;
ruleSets: Array<RuleSet>;
unreadNotificationCount: Scalars["Int"]["output"];
videoPlayerClusters: Array<PlayerClusterGql>;
waitFor: Scalars["Float"]["output"];
};
export type QueryCameraClaimSessionArgs = {
id: Scalars["ID"]["input"];
};
export type QueryChallengeArgs = {
id: Scalars["ID"]["input"];
};
@@ -2865,6 +2994,10 @@ export type QueryChallengesArgs = {
includeDismissed?: Scalars["Boolean"]["input"];
};
export type QueryClaimableCamerasArgs = {
poolHallId: Scalars["ID"]["input"];
};
export type QueryDoesUsernameExistArgs = {
candidateUsername: Scalars["String"]["input"];
};
@@ -3015,6 +3148,10 @@ export type QueryNotificationsArgs = {
offset?: Scalars["Int"]["input"];
};
export type QueryPoolHallCamerasArgs = {
poolHallId: Scalars["ID"]["input"];
};
export type QueryVideoPlayerClustersArgs = {
videoId: Scalars["Int"]["input"];
};
@@ -3431,6 +3568,23 @@ export type UpdateAnnotationInputGql = {
notes?: InputMaybe<Scalars["String"]["input"]>;
};
export type UpdatePoolHallCameraInput = {
id: Scalars["ID"]["input"];
name?: InputMaybe<Scalars["String"]["input"]>;
status?: InputMaybe<Scalars["String"]["input"]>;
tableLabel?: InputMaybe<Scalars["String"]["input"]>;
};
export type UpdatePoolHallInput = {
address?: InputMaybe<Scalars["String"]["input"]>;
id: Scalars["ID"]["input"];
latitude?: InputMaybe<Scalars["Float"]["input"]>;
longitude?: InputMaybe<Scalars["Float"]["input"]>;
name?: InputMaybe<Scalars["String"]["input"]>;
status?: InputMaybe<Scalars["String"]["input"]>;
timezone?: InputMaybe<Scalars["String"]["input"]>;
};
export type UpdateShotAnnotationReturn = {
__typename?: "UpdateShotAnnotationReturn";
error?: Maybe<DoesNotOwnShotErr>;
@@ -4133,6 +4287,7 @@ export type GetDeployedConfigQuery = {
firebase: boolean;
minimumAllowedAppVersion: string;
subscriptionGatingEnabled: boolean;
quotaEnforcementEnabled: boolean;
defaultAndroidRecordingFormat: StreamSegmentTypeEnum;
bucketUrl: string;
bannerMessages: Array<{
@@ -8591,6 +8746,7 @@ export const GetDeployedConfigDocument = gql`
firebase
minimumAllowedAppVersion
subscriptionGatingEnabled
quotaEnforcementEnabled
bannerMessages {
color
dismissible

View File

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

View File

@@ -42,6 +42,12 @@ type Query {
filters: NotificationFilters = null
): NotificationConnection!
unreadNotificationCount: Int!
poolHalls: [PoolHall!]!
claimablePoolHalls: [PoolHall!]!
poolHallCameras(poolHallId: ID!): [PoolHallCamera!]!
claimableCameras(poolHallId: ID!): [PoolHallCamera!]!
cameraClaimSession(id: ID!): CameraClaimSession
activeCameraLease: CameraLease
getRuns(
filterInput: RunFilterInput!
runIds: [Int!] = null
@@ -688,6 +694,7 @@ type DeployedConfigGQL {
environment: String!
minimumAllowedAppVersion: String!
subscriptionGatingEnabled: Boolean!
quotaEnforcementEnabled: Boolean!
bannerMessages: [BannerGQL!]!
defaultAndroidRecordingFormat: StreamSegmentTypeEnum!
bucketUrl: String!
@@ -839,6 +846,63 @@ input NotificationFilters {
notificationTypes: [NotificationTypeEnum!] = null
}
type PoolHall {
id: ID!
name: String!
address: String
latitude: Float
longitude: Float
timezone: String
status: String!
createdAt: DateTime!
updatedAt: DateTime!
}
type PoolHallCamera {
id: ID!
poolHallId: ID!
name: String!
tableLabel: String
streamPath: String!
status: String!
lastPublishedAt: DateTime
lastUnpublishedAt: DateTime
createdAt: DateTime!
updatedAt: DateTime!
poolHall: PoolHall!
}
type CameraClaimSession {
id: ID!
cameraId: ID!
userId: ID!
challengeCode: String!
status: String!
expiresAt: DateTime!
detectedAt: DateTime
failedAt: DateTime
failureReason: String
createdAt: DateTime!
updatedAt: DateTime!
camera: PoolHallCamera!
}
type CameraLease {
id: ID!
cameraId: ID!
claimSessionId: ID
userId: ID!
videoId: ID
status: String!
startedAt: DateTime!
endedAt: DateTime
expiresAt: DateTime
endReason: String
createdAt: DateTime!
updatedAt: DateTime!
camera: PoolHallCamera!
}
type GetRunsResult {
runs: [RunGQL!]!
count: Int
@@ -1148,6 +1212,15 @@ type Mutation {
markAllNotificationsAsRead: Boolean!
markNotificationsAsRead(notificationIds: [Int!]!): Boolean!
deleteNotification(notificationId: Int!): Boolean!
createPoolHall(input: CreatePoolHallInput!): PoolHall!
updatePoolHall(input: UpdatePoolHallInput!): PoolHall!
createPoolHallCamera(
input: CreatePoolHallCameraInput!
): PoolHallCameraStreamCredentials!
updatePoolHallCamera(input: UpdatePoolHallCameraInput!): PoolHallCamera!
rotatePoolHallCameraStreamKey(cameraId: ID!): PoolHallCameraStreamCredentials!
createCameraClaimSession(cameraId: ID!): CameraClaimSession!
cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession!
finalizePlayerAssignments(
input: FinalizePlayerAssignmentsInput!
): [PlayerClusterGQL!]!
@@ -1222,6 +1295,44 @@ enum ReportReasonEnum {
OTHER
}
input CreatePoolHallInput {
name: String!
address: String = null
latitude: Float = null
longitude: Float = null
timezone: String = null
}
input UpdatePoolHallInput {
id: ID!
name: String = null
address: String = null
latitude: Float = null
longitude: Float = null
timezone: String = null
status: String = null
}
type PoolHallCameraStreamCredentials {
camera: PoolHallCamera!
streamKey: String!
rtmpPath: String!
}
input CreatePoolHallCameraInput {
poolHallId: ID!
name: String!
tableLabel: String = null
streamPath: String = null
}
input UpdatePoolHallCameraInput {
id: ID!
name: String = null
tableLabel: String = null
status: String = null
}
input FinalizePlayerAssignmentsInput {
videoId: Int!
clusterAssignments: [ClusterAssignmentInput!]! = []