Compare commits

..

13 Commits

Author SHA1 Message Date
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
dfb0e02630 Add manual entitlement GraphQL schema fields
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-22 11:23:11 -07:00
c4a2e184fb Merge pull request 'Add lowestUnuploadedSegmentIndex to operation' (#230) from loewy/add-lowest-unuploaded-segment-index-to-stream-monitoring-details into master
Reviewed-on: #230
2026-03-20 23:39:50 +00:00
f14cf3b255 add lowestUnuploadedSegmentIndex to operation
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-18 16:43:31 -07:00
c46776d417 Merge pull request 'Upload Quota GQL' (#227) from loewy/upload-quota-limit-gql into master
Reviewed-on: #227
2026-03-18 21:33:26 +00:00
6ab5286a49 add expected durations to operation
All checks were successful
Tests / Tests (pull_request) Successful in 11s
2026-03-17 17:22:19 -07:00
6 changed files with 218 additions and 362 deletions

File diff suppressed because it is too large Load Diff

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

@@ -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

@@ -10,6 +10,7 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
stream { stream {
id id
linksRequested linksRequested
lowestUnuploadedSegmentIndex
uploadsCompleted uploadsCompleted
segmentProcessingCursor segmentProcessingCursor
isCompleted isCompleted

View File

@@ -1,5 +1,11 @@
mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) { mutation CreateUploadStream(
createUploadStream(videoMetadata: $videoMetadataInput) { $videoMetadataInput: VideoMetadataInput!
$expectedDurationSeconds: Float = null
) {
createUploadStream(
videoMetadata: $videoMetadataInput
expectedDurationSeconds: $expectedDurationSeconds
) {
videoId videoId
} }
} }

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(
@@ -61,8 +61,6 @@ type Query {
shotsOrdering: GetShotsOrdering = null shotsOrdering: GetShotsOrdering = null
limit: Int! = 500 limit: Int! = 500
countRespectsLimit: Boolean! = false countRespectsLimit: Boolean! = false
processingId: Int = null
includeExcluded: Boolean! = false
): GetShotsResult! ): GetShotsResult!
getShotsWithMetadata( getShotsWithMetadata(
filterInput: FilterInput! filterInput: FilterInput!
@@ -70,16 +68,12 @@ type Query {
shotsPagination: GetShotsPagination = null shotsPagination: GetShotsPagination = null
limit: Int! = 500 limit: Int! = 500
countRespectsLimit: Boolean! = false countRespectsLimit: Boolean! = false
processingId: Int = null
includeExcluded: Boolean! = false
): GetShotsResult! ): GetShotsResult!
getShots( getShots(
filterInput: FilterInput! filterInput: FilterInput!
shotsPagination: GetShotsPagination = null shotsPagination: GetShotsPagination = null
limit: Int! = 500 limit: Int! = 500
countRespectsLimit: Boolean! = false countRespectsLimit: Boolean! = false
processingId: Int = null
includeExcluded: Boolean! = false
): [ShotGQL!]! ): [ShotGQL!]!
getShotsByIds(ids: [Int!]!): [ShotGQL!]! getShotsByIds(ids: [Int!]!): [ShotGQL!]!
getUser(userId: Int!): UserGQL getUser(userId: Int!): UserGQL
@@ -112,13 +106,9 @@ 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!]!
getVideoProcessings(videoId: Int!): [VideoProcessingGQL!]!
assessVideoProcessing(
processingId: Int!
groundTruthProcessingId: Int = null
): VideoProcessingAssessmentGQL!
} }
type AggregateResultGQL { type AggregateResultGQL {
@@ -220,7 +210,6 @@ input FilterInput @oneOf {
intendedPocketType: [PocketEnum!] intendedPocketType: [PocketEnum!]
shotDirection: [ShotDirectionEnum!] shotDirection: [ShotDirectionEnum!]
videoId: [Int!] videoId: [Int!]
processingId: [Int!]
userId: [Int!] userId: [Int!]
runId: [Int!] runId: [Int!]
username: [String!] username: [String!]
@@ -973,6 +962,9 @@ type StripePriceGQL {
type UserSubscriptionStatusGQL { type UserSubscriptionStatusGQL {
hasActiveSubscription: Boolean! hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum
entitlementStartsAt: DateTime
entitlementEndsAt: DateTime
subscriptionStatus: StripeSubscriptionStatusEnum subscriptionStatus: StripeSubscriptionStatusEnum
currentPeriodStart: DateTime currentPeriodStart: DateTime
currentPeriodEnd: DateTime currentPeriodEnd: DateTime
@@ -981,6 +973,13 @@ type UserSubscriptionStatusGQL {
stripeSubscriptionId: String stripeSubscriptionId: String
} }
enum EntitlementSourceTypeEnum {
ADMIN
MANUAL
STRIPE
ALPHA_LEGACY
}
enum StripeSubscriptionStatusEnum { enum StripeSubscriptionStatusEnum {
INCOMPLETE INCOMPLETE
INCOMPLETE_EXPIRED INCOMPLETE_EXPIRED
@@ -1019,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).
""" """
@@ -1027,37 +1045,6 @@ scalar JSON
url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf" url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf"
) )
type VideoProcessingAssessmentGQL {
processingId: Int!
groundTruthProcessingId: Int!
sourceShotCount: Int!
sourceFalsePositiveCount: Int!
groundTruthShotCount: Int!
groundTruthPositiveShotCount: Int!
groundTruthFalsePositiveCount: Int!
matchedGroundTruthShots: Int!
missedGroundTruthShots: Int!
unexpectedShots: Int!
correctlyFlaggedFalsePositives: Int!
unflaggedFalsePositives: Int!
extraFlaggedFalsePositives: Int!
groundTruthShotsFlaggedFalsePositive: Int!
makeDisagreements: Int!
matchedGroundTruthPairs: [VideoProcessingAssessmentShotPairGQL!]!
missedGroundTruthShotIds: [Int!]!
unexpectedShotIds: [Int!]!
correctlyFlaggedFalsePositivePairs: [VideoProcessingAssessmentShotPairGQL!]!
unflaggedFalsePositivePairs: [VideoProcessingAssessmentShotPairGQL!]!
extraFlaggedFalsePositiveShotIds: [Int!]!
groundTruthShotsFlaggedFalsePositivePairs: [VideoProcessingAssessmentShotPairGQL!]!
makeDisagreementPairs: [VideoProcessingAssessmentShotPairGQL!]!
}
type VideoProcessingAssessmentShotPairGQL {
processingShotId: Int!
groundTruthShotId: Int!
}
type Mutation { type Mutation {
createBucketSet(params: CreateBucketSetInput!): BucketSetGQL! createBucketSet(params: CreateBucketSetInput!): BucketSetGQL!
createRuleSet(name: String!, description: String = null): RuleSet! createRuleSet(name: String!, description: String = null): RuleSet!
@@ -1119,19 +1106,6 @@ type Mutation {
shotId: Int! shotId: Int!
fieldsToEdit: EditableShotFieldInputGQL! fieldsToEdit: EditableShotFieldInputGQL!
): EditShotReturn! ): EditShotReturn!
createGroundTruthShot(input: CreateGroundTruthShotInputGQL!): ShotGQL!
updateGroundTruthShotFrameRange(
shotId: Int!
startFrame: Int = null
endFrame: Int = null
notes: String = null
): ShotGQL!
splitGroundTruthShot(
shotId: Int!
splitFrame: Int!
notes: String = null
): SplitGroundTruthShotReturn!
deleteGroundTruthShot(shotId: Int!): DeleteGroundTruthShotReturn!
getProfileImageUploadLink( getProfileImageUploadLink(
fileExt: String = ".png" fileExt: String = ".png"
): GetProfileUploadLinkReturn! ): GetProfileUploadLinkReturn!
@@ -1144,6 +1118,14 @@ type Mutation {
deleteUser: Boolean! deleteUser: Boolean!
createSubscription(priceId: String!): CreateSubscriptionResultGQL! createSubscription(priceId: String!): CreateSubscriptionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL! cancelSubscription: UserSubscriptionStatusGQL!
grantManualEntitlement(
userId: Int!
tierName: String! = "pro"
startsAt: DateTime = null
endsAt: DateTime = null
reason: String = null
): UserSubscriptionStatusGQL!
revokeManualEntitlement(userId: Int!): UserSubscriptionStatusGQL!
submitCancellationFeedback( submitCancellationFeedback(
reasons: [CancellationReasonEnum!] = null reasons: [CancellationReasonEnum!] = null
feedback: String = null feedback: String = null
@@ -1154,11 +1136,6 @@ type Mutation {
videoMetadata: VideoMetadataInput! videoMetadata: VideoMetadataInput!
expectedDurationSeconds: Float = null expectedDurationSeconds: Float = null
): CreateUploadStreamReturn! ): CreateUploadStreamReturn!
getOrCreateGroundTruthProcessing(
videoId: Int!
sourceProcessingId: Int = null
): VideoProcessingGQL!
promoteGroundTruthProcessing(processingId: Int!): VideoProcessingGQL!
getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn! getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn!
getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn! getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn!
setSegmentDuration( setSegmentDuration(
@@ -1235,32 +1212,12 @@ input EditableShotFieldInputGQL {
shotDirection: ShotDirectionEnum shotDirection: ShotDirectionEnum
spinType: SpinTypeEnum spinType: SpinTypeEnum
targetPocketAngleDirection: ShotDirectionEnum targetPocketAngleDirection: ShotDirectionEnum
intendedBallId: Int
intendedPocketId: PocketIdentifier
pathMetadataIndex: Int
make: Boolean make: Boolean
backcut: Boolean backcut: Boolean
excludeFromStats: Boolean excludeFromStats: Boolean
notes: String notes: String
} }
input CreateGroundTruthShotInputGQL {
processingId: Int!
startFrame: Int!
endFrame: Int!
make: Boolean
notes: String
}
type SplitGroundTruthShotReturn {
originalShot: ShotGQL!
createdShot: ShotGQL!
}
type DeleteGroundTruthShotReturn {
deletedShotId: Int!
}
type GetProfileUploadLinkReturn { type GetProfileUploadLinkReturn {
value: UploadLinkGetProfileUploadLinkErrors! value: UploadLinkGetProfileUploadLinkErrors!
} }