Compare commits

...

13 Commits

Author SHA1 Message Date
8f663b766e add initPlaylistUploadStatus to UploadStreamWithDetails fragment
All checks were successful
Tests / Tests (pull_request) Successful in 10s
2026-04-14 13:12:17 -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
cd6a33bfed getQuotaStatus, expectedDurationSeconds in createUploadStream
All checks were successful
Tests / Tests (pull_request) Successful in 13s
2026-03-17 11:21:42 -07:00
07bb45942e Merge pull request 'Add video processing labels to generated schema' (#228) from processing-clone-labels into master
Reviewed-on: #228
2026-03-17 18:08:08 +00:00
5 changed files with 245 additions and 4 deletions

View File

@@ -316,6 +316,13 @@ export type EditableShotFieldInputGql = {
targetPocketAngleDirection?: InputMaybe<ShotDirectionEnum>;
};
export enum EntitlementSourceTypeEnum {
Admin = "ADMIN",
AlphaLegacy = "ALPHA_LEGACY",
Manual = "MANUAL",
Stripe = "STRIPE",
}
export type EnumAggregation = {
feature: Scalars["String"]["input"];
};
@@ -2184,6 +2191,26 @@ export type FloatRangeFilter = {
lessThanInclusive?: Scalars["Boolean"]["input"];
};
export type GameTypeTagMetric = {
__typename?: "GameTypeTagMetric";
madeShots: Scalars["Int"]["output"];
makeRate: Scalars["Float"]["output"];
shotCount: Scalars["Int"]["output"];
tableSize?: Maybe<Scalars["Float"]["output"]>;
tagLabel: Scalars["String"]["output"];
tagName: Scalars["String"]["output"];
};
export type GameTypeTagMetricsInput = {
createdAt?: InputMaybe<DateRangeFilter>;
groupByTableSize?: Scalars["Boolean"]["input"];
includePrivate?: IncludePrivateEnum;
includeUnknown?: Scalars["Boolean"]["input"];
maxTags?: InputMaybe<Scalars["Int"]["input"]>;
tagClass?: InputMaybe<Scalars["String"]["input"]>;
userId: Scalars["Int"]["input"];
};
export type GetProfileUploadLinkErrors = {
__typename?: "GetProfileUploadLinkErrors";
error: TooManyProfileImageUploadsErr;
@@ -2366,6 +2393,7 @@ export type Mutation = {
getHlsInitUploadLink: GetUploadLinkReturn;
getProfileImageUploadLink: GetProfileUploadLinkReturn;
getUploadLink: GetUploadLinkReturn;
grantManualEntitlement: UserSubscriptionStatusGql;
inviteUsersToChallenge: Array<ChallengeInvitation>;
markAllNotificationsAsRead: Scalars["Boolean"]["output"];
markNotificationAsRead: Scalars["Boolean"]["output"];
@@ -2375,6 +2403,7 @@ export type Mutation = {
reportContent: Scalars["Boolean"]["output"];
respondToChallengeInvitation: ChallengeInvitation;
retireTags: Scalars["Boolean"]["output"];
revokeManualEntitlement: UserSubscriptionStatusGql;
setLoggerLevel: Scalars["Boolean"]["output"];
setSegmentDuration: Scalars["Boolean"]["output"];
startChallenge: ChallengeEntry;
@@ -2432,6 +2461,7 @@ export type MutationCreateSubscriptionArgs = {
};
export type MutationCreateUploadStreamArgs = {
expectedDurationSeconds?: InputMaybe<Scalars["Float"]["input"]>;
videoMetadata: VideoMetadataInput;
};
@@ -2503,6 +2533,14 @@ export type MutationGetUploadLinkArgs = {
videoId: Scalars["Int"]["input"];
};
export type MutationGrantManualEntitlementArgs = {
endsAt?: InputMaybe<Scalars["DateTime"]["input"]>;
reason?: InputMaybe<Scalars["String"]["input"]>;
startsAt?: InputMaybe<Scalars["DateTime"]["input"]>;
tierName?: Scalars["String"]["input"];
userId: Scalars["Int"]["input"];
};
export type MutationInviteUsersToChallengeArgs = {
challengeId: Scalars["ID"]["input"];
userIds: Array<Scalars["ID"]["input"]>;
@@ -2540,6 +2578,10 @@ export type MutationRetireTagsArgs = {
tagIds: Array<Scalars["Int"]["input"]>;
};
export type MutationRevokeManualEntitlementArgs = {
userId: Scalars["Int"]["input"];
};
export type MutationSetLoggerLevelArgs = {
level: Scalars["String"]["input"];
path: Scalars["String"]["input"];
@@ -2710,12 +2752,14 @@ export type Query = {
getBucketSet?: Maybe<BucketSetGql>;
getDeployedConfig: DeployedConfigGql;
getFeedVideos: VideoHistoryGql;
getGameTypeTagMetrics: Array<GameTypeTagMetric>;
getLoggedInUser?: Maybe<UserGql>;
getLongestRunsLeaderboard: RunLeaderboardGql;
getMakesLeaderboard: CountLeaderboardGql;
getMedals: RequestedMedalsGql;
getOrderedShots: GetShotsResult;
getPlayTime: UserPlayTimeGql;
getQuotaStatus: QuotaStatusGql;
getRuns: GetRunsResult;
getShotAnnotationTypes: Array<ShotAnnotationTypeGql>;
getShots: Array<ShotGql>;
@@ -2776,6 +2820,10 @@ export type QueryGetFeedVideosArgs = {
limit?: Scalars["Int"]["input"];
};
export type QueryGetGameTypeTagMetricsArgs = {
input: GameTypeTagMetricsInput;
};
export type QueryGetLongestRunsLeaderboardArgs = {
interval?: InputMaybe<TimeInterval>;
limit?: Scalars["Int"]["input"];
@@ -2905,6 +2953,18 @@ export type QueryWaitForArgs = {
duration: Scalars["Float"]["input"];
};
export type QuotaStatusGql = {
__typename?: "QuotaStatusGQL";
canUpload: Scalars["Boolean"]["output"];
durationLimitSeconds?: Maybe<Scalars["Int"]["output"]>;
durationRemainingSeconds?: Maybe<Scalars["Float"]["output"]>;
durationUsedSeconds: Scalars["Float"]["output"];
maxVideoDurationSeconds?: Maybe<Scalars["Int"]["output"]>;
periodEnd: Scalars["DateTime"]["output"];
periodStart: Scalars["DateTime"]["output"];
tierName: Scalars["String"]["output"];
};
export enum ReactionEnum {
Bullseye = "BULLSEYE",
Heart = "HEART",
@@ -3381,6 +3441,9 @@ export type UserSubscriptionStatusGql = {
__typename?: "UserSubscriptionStatusGQL";
currentPeriodEnd?: Maybe<Scalars["DateTime"]["output"]>;
currentPeriodStart?: Maybe<Scalars["DateTime"]["output"]>;
entitlementEndsAt?: Maybe<Scalars["DateTime"]["output"]>;
entitlementSource?: Maybe<EntitlementSourceTypeEnum>;
entitlementStartsAt?: Maybe<Scalars["DateTime"]["output"]>;
hasActiveSubscription: Scalars["Boolean"]["output"];
stripePriceId?: Maybe<Scalars["String"]["output"]>;
stripeSubscriptionId?: Maybe<Scalars["String"]["output"]>;
@@ -5508,6 +5571,23 @@ export type GetUserTagsQuery = {
}>;
};
export type GetGameTypeTagMetricsQueryVariables = Exact<{
input: GameTypeTagMetricsInput;
}>;
export type GetGameTypeTagMetricsQuery = {
__typename?: "Query";
getGameTypeTagMetrics: Array<{
__typename?: "GameTypeTagMetric";
tagName: string;
tagLabel: string;
tableSize?: number | null;
shotCount: number;
madeShots: number;
makeRate: number;
}>;
};
export type FollowUserMutationVariables = Exact<{
followedUserId: Scalars["Int"]["input"];
}>;
@@ -5673,6 +5753,7 @@ export type GetStreamMonitoringDetailsQuery = {
__typename?: "UploadStreamGQL";
id: string;
linksRequested: number;
lowestUnuploadedSegmentIndex: number;
uploadsCompleted: number;
segmentProcessingCursor: number;
isCompleted: boolean;
@@ -6235,6 +6316,7 @@ export type HomographyInfoFragment = {
export type CreateUploadStreamMutationVariables = Exact<{
videoMetadataInput: VideoMetadataInput;
expectedDurationSeconds?: InputMaybe<Scalars["Float"]["input"]>;
}>;
export type CreateUploadStreamMutation = {
@@ -6385,6 +6467,7 @@ export type UploadStreamWithDetailsFragment = {
lastIntendedSegmentBound?: number | null;
uploadCompletionCursor: number;
uploadsCompleted: number;
initPlaylistUploadStatus?: InitPlaylistUploadStatusEnum | null;
} | null;
};
@@ -6409,6 +6492,7 @@ export type GetUploadStreamsWithDetailsQuery = {
lastIntendedSegmentBound?: number | null;
uploadCompletionCursor: number;
uploadsCompleted: number;
initPlaylistUploadStatus?: InitPlaylistUploadStatusEnum | null;
} | null;
}>;
pageInfo: {
@@ -6751,6 +6835,7 @@ export const UploadStreamWithDetailsFragmentDoc = gql`
lastIntendedSegmentBound
uploadCompletionCursor
uploadsCompleted
initPlaylistUploadStatus
}
}
`;
@@ -11489,6 +11574,84 @@ export type GetUserTagsQueryResult = Apollo.QueryResult<
GetUserTagsQuery,
GetUserTagsQueryVariables
>;
export const GetGameTypeTagMetricsDocument = gql`
query GetGameTypeTagMetrics($input: GameTypeTagMetricsInput!) {
getGameTypeTagMetrics(input: $input) {
tagName
tagLabel
tableSize
shotCount
madeShots
makeRate
}
}
`;
/**
* __useGetGameTypeTagMetricsQuery__
*
* To run a query within a React component, call `useGetGameTypeTagMetricsQuery` and pass it any options that fit your needs.
* When your component renders, `useGetGameTypeTagMetricsQuery` 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 } = useGetGameTypeTagMetricsQuery({
* variables: {
* input: // value for 'input'
* },
* });
*/
export function useGetGameTypeTagMetricsQuery(
baseOptions: Apollo.QueryHookOptions<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>(GetGameTypeTagMetricsDocument, options);
}
export function useGetGameTypeTagMetricsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>(GetGameTypeTagMetricsDocument, options);
}
export function useGetGameTypeTagMetricsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>(GetGameTypeTagMetricsDocument, options);
}
export type GetGameTypeTagMetricsQueryHookResult = ReturnType<
typeof useGetGameTypeTagMetricsQuery
>;
export type GetGameTypeTagMetricsLazyQueryHookResult = ReturnType<
typeof useGetGameTypeTagMetricsLazyQuery
>;
export type GetGameTypeTagMetricsSuspenseQueryHookResult = ReturnType<
typeof useGetGameTypeTagMetricsSuspenseQuery
>;
export type GetGameTypeTagMetricsQueryResult = Apollo.QueryResult<
GetGameTypeTagMetricsQuery,
GetGameTypeTagMetricsQueryVariables
>;
export const FollowUserDocument = gql`
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
@@ -11954,6 +12117,7 @@ export const GetStreamMonitoringDetailsDocument = gql`
stream {
id
linksRequested
lowestUnuploadedSegmentIndex
uploadsCompleted
segmentProcessingCursor
isCompleted
@@ -13201,8 +13365,14 @@ export type FindPrerecordTableLayoutMutationOptions =
FindPrerecordTableLayoutMutationVariables
>;
export const CreateUploadStreamDocument = gql`
mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) {
createUploadStream(videoMetadata: $videoMetadataInput) {
mutation CreateUploadStream(
$videoMetadataInput: VideoMetadataInput!
$expectedDurationSeconds: Float = null
) {
createUploadStream(
videoMetadata: $videoMetadataInput
expectedDurationSeconds: $expectedDurationSeconds
) {
videoId
}
}
@@ -13226,6 +13396,7 @@ export type CreateUploadStreamMutationFn = Apollo.MutationFunction<
* const [createUploadStreamMutation, { data, loading, error }] = useCreateUploadStreamMutation({
* variables: {
* videoMetadataInput: // value for 'videoMetadataInput'
* expectedDurationSeconds: // value for 'expectedDurationSeconds'
* },
* });
*/

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!) {
followUser(followedUserId: $followedUserId) {
id

View File

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

View File

@@ -1,5 +1,11 @@
mutation CreateUploadStream($videoMetadataInput: VideoMetadataInput!) {
createUploadStream(videoMetadata: $videoMetadataInput) {
mutation CreateUploadStream(
$videoMetadataInput: VideoMetadataInput!
$expectedDurationSeconds: Float = null
) {
createUploadStream(
videoMetadata: $videoMetadataInput
expectedDurationSeconds: $expectedDurationSeconds
) {
videoId
}
}
@@ -111,6 +117,7 @@ fragment UploadStreamWithDetails on VideoGQL {
lastIntendedSegmentBound
uploadCompletionCursor
uploadsCompleted
initPlaylistUploadStatus
}
}

View File

@@ -97,6 +97,7 @@ type Query {
): UserRelationshipsResult!
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL!
getUserSubscriptionStatus: UserSubscriptionStatusGQL!
getQuotaStatus: QuotaStatusGQL!
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
getUserVideos(
userId: Int = null
@@ -105,6 +106,7 @@ type Query {
filters: VideoFilterInput = null
): VideoHistoryGQL!
getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]!
getGameTypeTagMetrics(input: GameTypeTagMetricsInput!): [GameTypeTagMetric!]!
getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL!
getVideos(videoIds: [Int!]!): [VideoGQL!]!
}
@@ -960,6 +962,9 @@ type StripePriceGQL {
type UserSubscriptionStatusGQL {
hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum
entitlementStartsAt: DateTime
entitlementEndsAt: DateTime
subscriptionStatus: StripeSubscriptionStatusEnum
currentPeriodStart: DateTime
currentPeriodEnd: DateTime
@@ -968,6 +973,13 @@ type UserSubscriptionStatusGQL {
stripeSubscriptionId: String
}
enum EntitlementSourceTypeEnum {
ADMIN
MANUAL
STRIPE
ALPHA_LEGACY
}
enum StripeSubscriptionStatusEnum {
INCOMPLETE
INCOMPLETE_EXPIRED
@@ -979,6 +991,17 @@ enum StripeSubscriptionStatusEnum {
PAUSED
}
type QuotaStatusGQL {
tierName: String!
periodStart: DateTime!
periodEnd: DateTime!
durationUsedSeconds: Float!
durationLimitSeconds: Int
maxVideoDurationSeconds: Int
durationRemainingSeconds: Float
canUpload: Boolean!
}
type UserPlayTimeGQL {
totalSeconds: Float!
}
@@ -995,6 +1018,25 @@ type TagClassGQL {
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).
"""
@@ -1076,6 +1118,14 @@ type Mutation {
deleteUser: Boolean!
createSubscription(priceId: String!): CreateSubscriptionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL!
grantManualEntitlement(
userId: Int!
tierName: String! = "pro"
startsAt: DateTime = null
endsAt: DateTime = null
reason: String = null
): UserSubscriptionStatusGQL!
revokeManualEntitlement(userId: Int!): UserSubscriptionStatusGQL!
submitCancellationFeedback(
reasons: [CancellationReasonEnum!] = null
feedback: String = null
@@ -1084,6 +1134,7 @@ type Mutation {
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
createUploadStream(
videoMetadata: VideoMetadataInput!
expectedDurationSeconds: Float = null
): CreateUploadStreamReturn!
getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn!
getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn!