Add player cluster + labeling mutation types
All checks were successful
Tests / Tests (pull_request) Successful in 10s
All checks were successful
Tests / Tests (pull_request) Successful in 10s
Schema additions for the per-video player labeling UI:
* `PlayerClusterGQL` / `PlayerClusterShotGQL` — read shape.
* `FinalizePlayerAssignmentsInput` + `ClusterAssignmentInput` +
`ShotMoveInput` — write shape.
* Query: `videoPlayerClusters(videoId)`.
* Mutation: `finalizePlayerAssignments(input)`.
Generated by `just gql` from the backend type definitions in
`railbird/datatypes/gql/shooter.py` and resolvers in
`railbird/server/resolvers/shooter.py`.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -49,6 +49,7 @@ type Query {
|
||||
limit: Int! = 500
|
||||
countRespectsLimit: Boolean! = false
|
||||
): GetRunsResult!
|
||||
videoPlayerClusters(videoId: Int!): [PlayerClusterGQL!]!
|
||||
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
|
||||
getTableState(
|
||||
b64Image: String!
|
||||
@@ -860,6 +861,27 @@ input DatetimeOrdering {
|
||||
startingAt: DateTime = null
|
||||
}
|
||||
|
||||
type PlayerClusterGQL {
|
||||
videoId: Int!
|
||||
clusterId: Int!
|
||||
nShots: Int!
|
||||
userId: Int
|
||||
confirmed: Boolean!
|
||||
shots: [PlayerClusterShotGQL!]!
|
||||
}
|
||||
|
||||
type PlayerClusterShotGQL {
|
||||
shotId: Int!
|
||||
bboxX1: Int!
|
||||
bboxY1: Int!
|
||||
bboxX2: Int!
|
||||
bboxY2: Int!
|
||||
confidence: Float!
|
||||
isConfirmed: Boolean!
|
||||
cropUrl: String
|
||||
fullFrameUrl: String
|
||||
}
|
||||
|
||||
type TableStateGQL {
|
||||
identifierToPosition: [[Float!]!]!
|
||||
homography: HomographyInfoGQL
|
||||
@@ -940,6 +962,7 @@ type UserRelationship {
|
||||
|
||||
type StripeSubscriptionOptionsGQL {
|
||||
products: [StripeProductGQL!]!
|
||||
trialPeriodDays: Int
|
||||
}
|
||||
|
||||
type StripeProductGQL {
|
||||
@@ -1093,6 +1116,9 @@ type Mutation {
|
||||
markAllNotificationsAsRead: Boolean!
|
||||
markNotificationsAsRead(notificationIds: [Int!]!): Boolean!
|
||||
deleteNotification(notificationId: Int!): Boolean!
|
||||
finalizePlayerAssignments(
|
||||
input: FinalizePlayerAssignmentsInput!
|
||||
): [PlayerClusterGQL!]!
|
||||
addAnnotationToShot(
|
||||
shotId: Int!
|
||||
annotationName: String!
|
||||
@@ -1117,6 +1143,7 @@ type Mutation {
|
||||
ensureStripeCustomerExists: UserGQL!
|
||||
deleteUser: Boolean!
|
||||
createSubscription(priceId: String!): CreateSubscriptionResultGQL!
|
||||
createCustomerPortalSession: CreateCustomerPortalSessionResultGQL!
|
||||
cancelSubscription: UserSubscriptionStatusGQL!
|
||||
grantManualEntitlement(
|
||||
userId: Int!
|
||||
@@ -1163,6 +1190,22 @@ enum ReportReasonEnum {
|
||||
OTHER
|
||||
}
|
||||
|
||||
input FinalizePlayerAssignmentsInput {
|
||||
videoId: Int!
|
||||
clusterAssignments: [ClusterAssignmentInput!]! = []
|
||||
shotMoves: [ShotMoveInput!]! = []
|
||||
}
|
||||
|
||||
input ClusterAssignmentInput {
|
||||
clusterId: Int!
|
||||
userId: Int = null
|
||||
}
|
||||
|
||||
input ShotMoveInput {
|
||||
shotId: Int!
|
||||
newClusterId: Int!
|
||||
}
|
||||
|
||||
type AddShotAnnotationReturn {
|
||||
value: SuccessfulAddAddShotAnnotationErrors!
|
||||
}
|
||||
@@ -1256,6 +1299,10 @@ type CreateSubscriptionResultGQL {
|
||||
sessionId: String!
|
||||
}
|
||||
|
||||
type CreateCustomerPortalSessionResultGQL {
|
||||
portalUrl: String!
|
||||
}
|
||||
|
||||
enum CancellationReasonEnum {
|
||||
DONT_PLAY_ENOUGH
|
||||
TOO_EXPENSIVE
|
||||
|
||||
Reference in New Issue
Block a user