Regenerate schema + client from merged backend
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2036
src/index.tsx
2036
src/index.tsx
File diff suppressed because it is too large
Load Diff
228
src/schema.gql
228
src/schema.gql
@@ -31,6 +31,16 @@ type Query {
|
||||
limit: Int! = 50
|
||||
requiredTags: [String!] = null
|
||||
): 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(
|
||||
interval: TimeInterval = null
|
||||
when: DateTime = null
|
||||
@@ -62,6 +72,12 @@ type Query {
|
||||
tableSize: Float = 100
|
||||
useHomography: HomographyInputGQL = null
|
||||
): TableStateGQL!
|
||||
simulateShot(simulationInput: SimulateShotInputGQL!): ShotProjectionGQL!
|
||||
computePotAim(
|
||||
simulationInput: SimulateShotInputGQL!
|
||||
targetBallId: Int!
|
||||
pocket: PocketIdentifier!
|
||||
): PotAimGQL!
|
||||
getOrderedShots(
|
||||
filterInput: FilterInput!
|
||||
ids: [Int!] = null
|
||||
@@ -104,7 +120,10 @@ type Query {
|
||||
): UserRelationshipsResult!
|
||||
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL!
|
||||
getUserSubscriptionStatus: UserSubscriptionStatusGQL!
|
||||
getResolvedTier: ResolvedTierGQL!
|
||||
getAppleAppAccountToken: String!
|
||||
getQuotaStatus: QuotaStatusGQL!
|
||||
getStorageStatus: StorageStatusGQL
|
||||
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
|
||||
getUserVideos(
|
||||
userId: Int = null
|
||||
@@ -114,6 +133,8 @@ type Query {
|
||||
): VideoHistoryGQL!
|
||||
getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]!
|
||||
getGameTypeTagMetrics(input: GameTypeTagMetricsInput!): [GameTypeTagMetric!]!
|
||||
videoExportJob(jobId: Int!): VideoExportJobGQL
|
||||
myVideoExports(limit: Int! = 30, offset: Int! = 0): [VideoExportJobGQL!]!
|
||||
getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL!
|
||||
getVideos(videoIds: [Int!]!): [VideoGQL!]!
|
||||
}
|
||||
@@ -351,6 +372,7 @@ type UserGQL {
|
||||
activeVideoId: Int
|
||||
stripeCustomerId: String
|
||||
profileImageUri: String
|
||||
bio: String
|
||||
createdAt: DateTime
|
||||
updatedAt: DateTime
|
||||
videosPrivateByDefault: Boolean
|
||||
@@ -524,6 +546,7 @@ type UploadStreamGQL {
|
||||
initPlaylistUploadStatus: InitPlaylistUploadStatusEnum
|
||||
lowestUnuploadedSegmentIndex: Int!
|
||||
uploadCompletionCursor: Int!
|
||||
lastSegmentUploadedAt: DateTime
|
||||
errors: [StreamErrorGQL!]!
|
||||
createdAt: DateTime!
|
||||
updatedAt: DateTime!
|
||||
@@ -683,10 +706,18 @@ type PlayerSummaryGQL {
|
||||
makePercentage: Float!
|
||||
score: Int
|
||||
longestRun: Int!
|
||||
runLengths: [Int!]!
|
||||
spinTypeBreakdown: SpinTypeBreakdownGQL!
|
||||
averageDifficulty: Float
|
||||
averageTimeBetweenShots: Float
|
||||
}
|
||||
|
||||
type SpinTypeBreakdownGQL {
|
||||
draw: Int!
|
||||
center: Int!
|
||||
follow: Int!
|
||||
}
|
||||
|
||||
type DeployedConfigGQL {
|
||||
allowNewUsers: Boolean!
|
||||
firebase: Boolean!
|
||||
@@ -695,6 +726,8 @@ type DeployedConfigGQL {
|
||||
minimumAllowedAppVersion: String!
|
||||
subscriptionGatingEnabled: Boolean!
|
||||
quotaEnforcementEnabled: Boolean!
|
||||
storageLimitEnforcementEnabled: Boolean!
|
||||
capabilityEnforcementEnabled: Boolean!
|
||||
bannerMessages: [BannerGQL!]!
|
||||
defaultAndroidRecordingFormat: StreamSegmentTypeEnum!
|
||||
bucketUrl: String!
|
||||
@@ -719,6 +752,7 @@ type VideoHistoryGQL {
|
||||
videos: [VideoGQL!]!
|
||||
pageInfo: PageInfoGQL!
|
||||
hasFollowing: Boolean!
|
||||
followingCount: Int!
|
||||
}
|
||||
|
||||
type PageInfoGQL {
|
||||
@@ -755,6 +789,13 @@ type RunLeaderboardGQL {
|
||||
entries: [RunGQL!]!
|
||||
}
|
||||
|
||||
type DrillRunLeaderboardGQL {
|
||||
entries: [RunGQL!]!
|
||||
youRun: RunGQL
|
||||
youRank: Int
|
||||
totalPlayers: Int!
|
||||
}
|
||||
|
||||
type CountLeaderboardGQL {
|
||||
entries: [UserShotCountEntry!]!
|
||||
}
|
||||
@@ -839,6 +880,7 @@ enum NotificationTypeEnum {
|
||||
REACTION
|
||||
FOLLOW
|
||||
CHALLENGE_INVITE
|
||||
EXPORT_READY
|
||||
}
|
||||
|
||||
input NotificationFilters {
|
||||
@@ -998,6 +1040,76 @@ input IntPoint2DInput {
|
||||
y: Int!
|
||||
}
|
||||
|
||||
type ShotProjectionGQL {
|
||||
trajectories: [BallTrajectoryGQL!]!
|
||||
events: [SimulationEventGQL!]!
|
||||
finalState: [SimulationBallStateGQL!]!
|
||||
pottedBallIds: [Int!]!
|
||||
}
|
||||
|
||||
type BallTrajectoryGQL {
|
||||
ballId: Int!
|
||||
points: [TrajectoryPointGQL!]!
|
||||
}
|
||||
|
||||
type TrajectoryPointGQL {
|
||||
time: Float!
|
||||
position: [Float!]!
|
||||
}
|
||||
|
||||
type SimulationEventGQL {
|
||||
eventType: SimulationEventType!
|
||||
time: Float!
|
||||
ballIds: [Int!]!
|
||||
position: [Float!]
|
||||
}
|
||||
|
||||
enum SimulationEventType {
|
||||
STICK_BALL
|
||||
BALL_BALL
|
||||
BALL_CUSHION
|
||||
BALL_POCKET
|
||||
BALL_STOP
|
||||
}
|
||||
|
||||
type SimulationBallStateGQL {
|
||||
ballId: Int!
|
||||
position: [Float!]!
|
||||
}
|
||||
|
||||
input SimulateShotInputGQL {
|
||||
cueBallId: Int!
|
||||
strike: CueStrikeInputGQL!
|
||||
balls: [SimulationBallStateInputGQL!] = null
|
||||
b64Image: String = null
|
||||
useHomography: HomographyInputGQL = null
|
||||
tableSize: Float = null
|
||||
}
|
||||
|
||||
input CueStrikeInputGQL {
|
||||
v0: Float!
|
||||
phi: Float!
|
||||
theta: Float! = 0
|
||||
a: Float! = 0
|
||||
b: Float! = 0
|
||||
}
|
||||
|
||||
input SimulationBallStateInputGQL {
|
||||
ballId: Int!
|
||||
position: [Float!]!
|
||||
}
|
||||
|
||||
type PotAimGQL {
|
||||
phi: Float!
|
||||
geometricPhi: Float!
|
||||
cutAngle: Float!
|
||||
requiredPrecision: Float!
|
||||
feasible: Boolean!
|
||||
potted: Boolean!
|
||||
converged: Boolean!
|
||||
occludingBallIds: [Int!]!
|
||||
}
|
||||
|
||||
type GetShotsResult {
|
||||
shots: [ShotGQL!]!
|
||||
count: Int
|
||||
@@ -1046,6 +1158,7 @@ type UserRelationship {
|
||||
type StripeSubscriptionOptionsGQL {
|
||||
products: [StripeProductGQL!]!
|
||||
trialPeriodDays: Int
|
||||
appleIap: AppleIapSubscriptionOptionsGQL!
|
||||
}
|
||||
|
||||
type StripeProductGQL {
|
||||
@@ -1066,6 +1179,12 @@ type StripePriceGQL {
|
||||
active: Boolean!
|
||||
}
|
||||
|
||||
type AppleIapSubscriptionOptionsGQL {
|
||||
enabled: Boolean!
|
||||
proMonthlyProductId: String
|
||||
productIds: [String!]!
|
||||
}
|
||||
|
||||
type UserSubscriptionStatusGQL {
|
||||
hasActiveSubscription: Boolean!
|
||||
entitlementSource: EntitlementSourceTypeEnum
|
||||
@@ -1083,6 +1202,7 @@ enum EntitlementSourceTypeEnum {
|
||||
ADMIN
|
||||
MANUAL
|
||||
STRIPE
|
||||
APPLE
|
||||
ALPHA_LEGACY
|
||||
}
|
||||
|
||||
@@ -1097,6 +1217,17 @@ enum StripeSubscriptionStatusEnum {
|
||||
PAUSED
|
||||
}
|
||||
|
||||
type ResolvedTierGQL {
|
||||
tierName: String!
|
||||
tierDisplayName: String!
|
||||
hasActiveSubscription: Boolean!
|
||||
entitlementSource: EntitlementSourceTypeEnum
|
||||
entitlementStatus: String
|
||||
entitlementStartsAt: DateTime
|
||||
entitlementEndsAt: DateTime
|
||||
capabilities: [String!]!
|
||||
}
|
||||
|
||||
type QuotaStatusGQL {
|
||||
tierName: String!
|
||||
periodStart: DateTime!
|
||||
@@ -1121,6 +1252,27 @@ type QuotaBucketStatusGQL {
|
||||
canUpload: Boolean!
|
||||
}
|
||||
|
||||
type StorageStatusGQL {
|
||||
userId: Int!
|
||||
tierName: String!
|
||||
retainedStorageUsedBytes: BigInt!
|
||||
retainedStorageLimitBytes: BigInt
|
||||
isUnlimited: Boolean!
|
||||
policyConfigured: Boolean!
|
||||
remainingStorageBytes: BigInt
|
||||
storageUsageRatio: Float
|
||||
isNearLimit: Boolean!
|
||||
isOverLimit: Boolean!
|
||||
usageCalculated: Boolean!
|
||||
usageSource: String
|
||||
lastCalculatedAt: DateTime
|
||||
}
|
||||
|
||||
"""
|
||||
Integer value that can exceed GraphQL Int's 32-bit range.
|
||||
"""
|
||||
scalar BigInt
|
||||
|
||||
type UserPlayTimeGQL {
|
||||
totalSeconds: Float!
|
||||
}
|
||||
@@ -1156,6 +1308,36 @@ input GameTypeTagMetricsInput {
|
||||
includePrivate: IncludePrivateEnum! = MINE
|
||||
}
|
||||
|
||||
type VideoExportJobGQL {
|
||||
id: Int!
|
||||
videoId: Int!
|
||||
mode: VideoExportModeEnum!
|
||||
status: VideoExportStatusEnum!
|
||||
videoName: String
|
||||
videoThumbnailUri: String
|
||||
shotIds: [Int!]
|
||||
runId: Int
|
||||
downloadUrl: String
|
||||
fileSizeBytes: Int
|
||||
expiresAt: DateTime
|
||||
createdAt: DateTime
|
||||
}
|
||||
|
||||
enum VideoExportModeEnum {
|
||||
FULL_SESSION
|
||||
SHOTS
|
||||
RUN
|
||||
}
|
||||
|
||||
enum VideoExportStatusEnum {
|
||||
CREATED
|
||||
QUEUED
|
||||
RUNNING
|
||||
SUCCEEDED
|
||||
FAILED
|
||||
EXPIRED
|
||||
}
|
||||
|
||||
"""
|
||||
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).
|
||||
"""
|
||||
@@ -1247,6 +1429,9 @@ type Mutation {
|
||||
retireTags(tagIds: [Int!]!): Boolean!
|
||||
ensureStripeCustomerExists: UserGQL!
|
||||
deleteUser: Boolean!
|
||||
syncAppleSubscription(
|
||||
input: SyncAppleSubscriptionInputGQL!
|
||||
): SyncAppleSubscriptionResultGQL!
|
||||
createSubscription(priceId: String!): CreateSubscriptionResultGQL!
|
||||
createCustomerPortalSession: CreateCustomerPortalSessionResultGQL!
|
||||
cancelSubscription: UserSubscriptionStatusGQL!
|
||||
@@ -1263,6 +1448,8 @@ type Mutation {
|
||||
feedback: String = null
|
||||
metadata: CancellationFeedbackMetadataInput = null
|
||||
): Boolean!
|
||||
requestVideoExport(input: RequestVideoExportInput!): VideoExportJobGQL!
|
||||
dismissVideoExport(jobId: Int!): Boolean!
|
||||
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
|
||||
createUploadStream(
|
||||
videoMetadata: VideoMetadataInput!
|
||||
@@ -1436,6 +1623,27 @@ input EditUserInputGQL {
|
||||
fargoRating: Int = null
|
||||
videosPrivateByDefault: Boolean = null
|
||||
agreesToMarketing: Boolean = null
|
||||
bio: String = 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 {
|
||||
@@ -1462,6 +1670,13 @@ input CancellationFeedbackMetadataInput {
|
||||
platform: String = null
|
||||
}
|
||||
|
||||
input RequestVideoExportInput {
|
||||
videoId: Int!
|
||||
mode: VideoExportModeEnum!
|
||||
shotIds: [Int!] = null
|
||||
runId: Int = null
|
||||
}
|
||||
|
||||
type CreateUploadStreamReturn {
|
||||
videoId: Int!
|
||||
}
|
||||
@@ -1501,10 +1716,10 @@ type GetUploadLinkReturn {
|
||||
union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors
|
||||
|
||||
type GetUploadLinkErrors {
|
||||
error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr!
|
||||
error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErrStorageLimitExceededErr!
|
||||
}
|
||||
|
||||
union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr =
|
||||
union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErrStorageLimitExceededErr =
|
||||
MustHaveSetForUploadLinkErr
|
||||
| SegmentAlreadyUploadedErr
|
||||
| ProcessingFailedErr
|
||||
@@ -1512,6 +1727,7 @@ union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoI
|
||||
| TooManyProfileImageUploadsErr
|
||||
| InitUploadAlreadyCompletedErr
|
||||
| TooManyInitUploadsErr
|
||||
| StorageLimitExceededErr
|
||||
|
||||
type MustHaveSetForUploadLinkErr {
|
||||
resolution: Boolean
|
||||
@@ -1537,3 +1753,11 @@ type InitUploadAlreadyCompletedErr {
|
||||
type TooManyInitUploadsErr {
|
||||
linksRequested: Int!
|
||||
}
|
||||
|
||||
type StorageLimitExceededErr {
|
||||
reason: String!
|
||||
tierName: String!
|
||||
retainedStorageUsedBytes: BigInt!
|
||||
retainedStorageLimitBytes: BigInt
|
||||
remainingStorageBytes: BigInt
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user