Compare commits

...

11 Commits

Author SHA1 Message Date
428286fa5a Merge pull request 'dean/video-export-gql' (#273) from dean/video-export-gql into master
Reviewed-on: #273
2026-06-30 22:48:02 +00:00
Dean Wenstrand
8771350115 Echo shotIds/runId on VideoExportJobGQL for re-export
All checks were successful
Tests / Tests (pull_request) Successful in 13s
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 14:00:04 -07:00
Dean Wenstrand
f1594b8492 Video export client operations + myVideoExports list query
RequestVideoExport mutation, VideoExportJob + MyVideoExports queries (with the
VideoExportJobFields fragment) for the mobile fire-and-list flow.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 13:54:29 -07:00
Dean Wenstrand
3ec3e3d081 Add EXPORT_READY notification type (video export Phase 1b)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 12:51:39 -07:00
Dean Wenstrand
d2c697e4cb Add video export schema: VideoExportJob + request/query + mode/status enums
Generated from the backend video export resolvers (Phase 1a).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-30 12:35:34 -07:00
3484af9dde Merge pull request 'Add storage usage readiness fields' (#272) from storage-usage-readiness into master
Reviewed-on: #272
2026-06-30 17:12:00 +00:00
bc62cb5e39 Add storage usage readiness fields
All checks were successful
Tests / Tests (pull_request) Successful in 27s
2026-06-29 10:56:33 -07:00
bc52145a9e Merge pull request 'Add storage status schema' (#270) from pr8-storage-status into master
Reviewed-on: #270
2026-06-26 15:33:19 +00:00
5c286f2bcf Add storage status schema
All checks were successful
Tests / Tests (pull_request) Successful in 24s
2026-06-25 17:34:19 -07:00
d636c298f8 Merge pull request 'Add resolved tier capabilities schema' (#269) from tier-capabilities-schema into master
Reviewed-on: #269
2026-06-24 03:37:17 +00:00
681320c62d Add resolved tier capabilities schema
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2026-06-23 15:51:21 -07:00
3 changed files with 458 additions and 0 deletions

View File

@@ -28,6 +28,8 @@ export type Scalars = {
Boolean: { input: boolean; output: boolean }; Boolean: { input: boolean; output: boolean };
Int: { input: number; output: number }; Int: { input: number; output: number };
Float: { input: number; output: number }; Float: { input: number; output: number };
/** Integer value that can exceed GraphQL Int's 32-bit range. */
BigInt: { input: any; output: any };
/** Date (isoformat) */ /** Date (isoformat) */
Date: { input: any; output: any }; Date: { input: any; output: any };
/** Date with time (isoformat) */ /** Date with time (isoformat) */
@@ -2438,6 +2440,7 @@ export type Mutation = {
reactToVideo: Scalars["Boolean"]["output"]; reactToVideo: Scalars["Boolean"]["output"];
recalculateChallengeEntry: ChallengeEntry; recalculateChallengeEntry: ChallengeEntry;
reportContent: Scalars["Boolean"]["output"]; reportContent: Scalars["Boolean"]["output"];
requestVideoExport: VideoExportJobGql;
respondToChallengeInvitation: ChallengeInvitation; respondToChallengeInvitation: ChallengeInvitation;
retireTags: Scalars["Boolean"]["output"]; retireTags: Scalars["Boolean"]["output"];
revokeManualEntitlement: UserSubscriptionStatusGql; revokeManualEntitlement: UserSubscriptionStatusGql;
@@ -2611,6 +2614,10 @@ export type MutationReportContentArgs = {
videoId: Scalars["Int"]["input"]; videoId: Scalars["Int"]["input"];
}; };
export type MutationRequestVideoExportArgs = {
input: RequestVideoExportInput;
};
export type MutationRespondToChallengeInvitationArgs = { export type MutationRespondToChallengeInvitationArgs = {
accept: Scalars["Boolean"]["input"]; accept: Scalars["Boolean"]["input"];
invitationId: Scalars["ID"]["input"]; invitationId: Scalars["ID"]["input"];
@@ -2704,6 +2711,7 @@ export enum NotificationTypeEnum {
ChallengeInvite = "CHALLENGE_INVITE", ChallengeInvite = "CHALLENGE_INVITE",
Comment = "COMMENT", Comment = "COMMENT",
CommentReply = "COMMENT_REPLY", CommentReply = "COMMENT_REPLY",
ExportReady = "EXPORT_READY",
Follow = "FOLLOW", Follow = "FOLLOW",
Reaction = "REACTION", Reaction = "REACTION",
} }
@@ -2859,6 +2867,7 @@ export type Query = {
getShots: Array<ShotGql>; getShots: Array<ShotGql>;
getShotsByIds: Array<ShotGql>; getShotsByIds: Array<ShotGql>;
getShotsWithMetadata: GetShotsResult; getShotsWithMetadata: GetShotsResult;
getStorageStatus?: Maybe<StorageStatusGql>;
getTableState: TableStateGql; getTableState: TableStateGql;
getUser?: Maybe<UserGql>; getUser?: Maybe<UserGql>;
getUserRelationshipsMatching: UserRelationshipsResult; getUserRelationshipsMatching: UserRelationshipsResult;
@@ -2874,9 +2883,11 @@ export type Query = {
myChallengeEntries: Array<ChallengeEntry>; myChallengeEntries: Array<ChallengeEntry>;
myChallengeInvitations: Array<ChallengeInvitation>; myChallengeInvitations: Array<ChallengeInvitation>;
myDismissedChallenges: Array<Challenge>; myDismissedChallenges: Array<Challenge>;
myVideoExports: Array<VideoExportJobGql>;
notifications: NotificationConnection; notifications: NotificationConnection;
ruleSets: Array<RuleSet>; ruleSets: Array<RuleSet>;
unreadNotificationCount: Scalars["Int"]["output"]; unreadNotificationCount: Scalars["Int"]["output"];
videoExportJob?: Maybe<VideoExportJobGql>;
videoPlayerClusters: Array<PlayerClusterGql>; videoPlayerClusters: Array<PlayerClusterGql>;
waitFor: Scalars["Float"]["output"]; waitFor: Scalars["Float"]["output"];
}; };
@@ -3053,12 +3064,21 @@ export type QueryIsChallengeDismissedArgs = {
challengeId: Scalars["ID"]["input"]; challengeId: Scalars["ID"]["input"];
}; };
export type QueryMyVideoExportsArgs = {
limit?: Scalars["Int"]["input"];
offset?: Scalars["Int"]["input"];
};
export type QueryNotificationsArgs = { export type QueryNotificationsArgs = {
filters?: InputMaybe<NotificationFilters>; filters?: InputMaybe<NotificationFilters>;
limit?: Scalars["Int"]["input"]; limit?: Scalars["Int"]["input"];
offset?: Scalars["Int"]["input"]; offset?: Scalars["Int"]["input"];
}; };
export type QueryVideoExportJobArgs = {
jobId: Scalars["Int"]["input"];
};
export type QueryVideoPlayerClustersArgs = { export type QueryVideoPlayerClustersArgs = {
videoId: Scalars["Int"]["input"]; videoId: Scalars["Int"]["input"];
}; };
@@ -3118,6 +3138,13 @@ export enum ReportReasonEnum {
Violence = "VIOLENCE", Violence = "VIOLENCE",
} }
export type RequestVideoExportInput = {
mode: VideoExportModeEnum;
runId?: InputMaybe<Scalars["Int"]["input"]>;
shotIds?: InputMaybe<Array<Scalars["Int"]["input"]>>;
videoId: Scalars["Int"]["input"];
};
export type RequestedMedalsGql = { export type RequestedMedalsGql = {
__typename?: "RequestedMedalsGQL"; __typename?: "RequestedMedalsGQL";
dailyMakes50?: Maybe<MedalGql>; dailyMakes50?: Maybe<MedalGql>;
@@ -3161,6 +3188,7 @@ export type RequestedMedalsGql = {
export type ResolvedTierGql = { export type ResolvedTierGql = {
__typename?: "ResolvedTierGQL"; __typename?: "ResolvedTierGQL";
capabilities: Array<Scalars["String"]["output"]>;
entitlementEndsAt?: Maybe<Scalars["DateTime"]["output"]>; entitlementEndsAt?: Maybe<Scalars["DateTime"]["output"]>;
entitlementSource?: Maybe<EntitlementSourceTypeEnum>; entitlementSource?: Maybe<EntitlementSourceTypeEnum>;
entitlementStartsAt?: Maybe<Scalars["DateTime"]["output"]>; entitlementStartsAt?: Maybe<Scalars["DateTime"]["output"]>;
@@ -3382,6 +3410,23 @@ export enum SpinTypeEnum {
Unknown = "UNKNOWN", Unknown = "UNKNOWN",
} }
export type StorageStatusGql = {
__typename?: "StorageStatusGQL";
isNearLimit: Scalars["Boolean"]["output"];
isOverLimit: Scalars["Boolean"]["output"];
isUnlimited: Scalars["Boolean"]["output"];
lastCalculatedAt?: Maybe<Scalars["DateTime"]["output"]>;
policyConfigured: Scalars["Boolean"]["output"];
remainingStorageBytes?: Maybe<Scalars["BigInt"]["output"]>;
retainedStorageLimitBytes?: Maybe<Scalars["BigInt"]["output"]>;
retainedStorageUsedBytes: Scalars["BigInt"]["output"];
storageUsageRatio?: Maybe<Scalars["Float"]["output"]>;
tierName: Scalars["String"]["output"];
usageCalculated: Scalars["Boolean"]["output"];
usageSource?: Maybe<Scalars["String"]["output"]>;
userId: Scalars["Int"]["output"];
};
export type StreamErrorGql = { export type StreamErrorGql = {
__typename?: "StreamErrorGQL"; __typename?: "StreamErrorGQL";
message: Scalars["String"]["output"]; message: Scalars["String"]["output"];
@@ -3627,6 +3672,35 @@ export type UserSubscriptionStatusGql = {
validUntil?: Maybe<Scalars["DateTime"]["output"]>; validUntil?: Maybe<Scalars["DateTime"]["output"]>;
}; };
export type VideoExportJobGql = {
__typename?: "VideoExportJobGQL";
createdAt?: Maybe<Scalars["DateTime"]["output"]>;
downloadUrl?: Maybe<Scalars["String"]["output"]>;
expiresAt?: Maybe<Scalars["DateTime"]["output"]>;
fileSizeBytes?: Maybe<Scalars["Int"]["output"]>;
id: Scalars["Int"]["output"];
mode: VideoExportModeEnum;
runId?: Maybe<Scalars["Int"]["output"]>;
shotIds?: Maybe<Array<Scalars["Int"]["output"]>>;
status: VideoExportStatusEnum;
videoId: Scalars["Int"]["output"];
};
export enum VideoExportModeEnum {
FullSession = "FULL_SESSION",
Run = "RUN",
Shots = "SHOTS",
}
export enum VideoExportStatusEnum {
Created = "CREATED",
Expired = "EXPIRED",
Failed = "FAILED",
Queued = "QUEUED",
Running = "RUNNING",
Succeeded = "SUCCEEDED",
}
export type VideoFeedInputGql = export type VideoFeedInputGql =
| { | {
allUsers: Scalars["Boolean"]["input"]; allUsers: Scalars["Boolean"]["input"];
@@ -6994,6 +7068,84 @@ export type HomographyInfoFragment = {
}; };
}; };
export type VideoExportJobFieldsFragment = {
__typename?: "VideoExportJobGQL";
id: number;
videoId: number;
mode: VideoExportModeEnum;
status: VideoExportStatusEnum;
shotIds?: Array<number> | null;
runId?: number | null;
downloadUrl?: string | null;
fileSizeBytes?: number | null;
expiresAt?: any | null;
createdAt?: any | null;
};
export type RequestVideoExportMutationVariables = Exact<{
input: RequestVideoExportInput;
}>;
export type RequestVideoExportMutation = {
__typename?: "Mutation";
requestVideoExport: {
__typename?: "VideoExportJobGQL";
id: number;
videoId: number;
mode: VideoExportModeEnum;
status: VideoExportStatusEnum;
shotIds?: Array<number> | null;
runId?: number | null;
downloadUrl?: string | null;
fileSizeBytes?: number | null;
expiresAt?: any | null;
createdAt?: any | null;
};
};
export type VideoExportJobQueryVariables = Exact<{
jobId: Scalars["Int"]["input"];
}>;
export type VideoExportJobQuery = {
__typename?: "Query";
videoExportJob?: {
__typename?: "VideoExportJobGQL";
id: number;
videoId: number;
mode: VideoExportModeEnum;
status: VideoExportStatusEnum;
shotIds?: Array<number> | null;
runId?: number | null;
downloadUrl?: string | null;
fileSizeBytes?: number | null;
expiresAt?: any | null;
createdAt?: any | null;
} | null;
};
export type MyVideoExportsQueryVariables = Exact<{
limit?: InputMaybe<Scalars["Int"]["input"]>;
offset?: InputMaybe<Scalars["Int"]["input"]>;
}>;
export type MyVideoExportsQuery = {
__typename?: "Query";
myVideoExports: Array<{
__typename?: "VideoExportJobGQL";
id: number;
videoId: number;
mode: VideoExportModeEnum;
status: VideoExportStatusEnum;
shotIds?: Array<number> | null;
runId?: number | null;
downloadUrl?: string | null;
fileSizeBytes?: number | null;
expiresAt?: any | null;
createdAt?: any | null;
}>;
};
export type CreateUploadStreamMutationVariables = Exact<{ export type CreateUploadStreamMutationVariables = Exact<{
videoMetadataInput: VideoMetadataInput; videoMetadataInput: VideoMetadataInput;
expectedDurationSeconds?: InputMaybe<Scalars["Float"]["input"]>; expectedDurationSeconds?: InputMaybe<Scalars["Float"]["input"]>;
@@ -7559,6 +7711,20 @@ export const HomographyInfoFragmentDoc = gql`
} }
} }
`; `;
export const VideoExportJobFieldsFragmentDoc = gql`
fragment VideoExportJobFields on VideoExportJobGQL {
id
videoId
mode
status
shotIds
runId
downloadUrl
fileSizeBytes
expiresAt
createdAt
}
`;
export const UploadStreamWithDetailsFragmentDoc = gql` export const UploadStreamWithDetailsFragmentDoc = gql`
fragment UploadStreamWithDetails on VideoGQL { fragment UploadStreamWithDetails on VideoGQL {
id id
@@ -14970,6 +15136,206 @@ export type FindPrerecordTableLayoutMutationOptions =
FindPrerecordTableLayoutMutation, FindPrerecordTableLayoutMutation,
FindPrerecordTableLayoutMutationVariables FindPrerecordTableLayoutMutationVariables
>; >;
export const RequestVideoExportDocument = gql`
mutation RequestVideoExport($input: RequestVideoExportInput!) {
requestVideoExport(input: $input) {
...VideoExportJobFields
}
}
${VideoExportJobFieldsFragmentDoc}
`;
export type RequestVideoExportMutationFn = Apollo.MutationFunction<
RequestVideoExportMutation,
RequestVideoExportMutationVariables
>;
/**
* __useRequestVideoExportMutation__
*
* To run a mutation, you first call `useRequestVideoExportMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useRequestVideoExportMutation` returns a tuple that includes:
* - A mutate function that you can call at any time to execute the mutation
* - An object with fields that represent the current status of the mutation's execution
*
* @param baseOptions options that will be passed into the mutation, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options-2;
*
* @example
* const [requestVideoExportMutation, { data, loading, error }] = useRequestVideoExportMutation({
* variables: {
* input: // value for 'input'
* },
* });
*/
export function useRequestVideoExportMutation(
baseOptions?: Apollo.MutationHookOptions<
RequestVideoExportMutation,
RequestVideoExportMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
RequestVideoExportMutation,
RequestVideoExportMutationVariables
>(RequestVideoExportDocument, options);
}
export type RequestVideoExportMutationHookResult = ReturnType<
typeof useRequestVideoExportMutation
>;
export type RequestVideoExportMutationResult =
Apollo.MutationResult<RequestVideoExportMutation>;
export type RequestVideoExportMutationOptions = Apollo.BaseMutationOptions<
RequestVideoExportMutation,
RequestVideoExportMutationVariables
>;
export const VideoExportJobDocument = gql`
query VideoExportJob($jobId: Int!) {
videoExportJob(jobId: $jobId) {
...VideoExportJobFields
}
}
${VideoExportJobFieldsFragmentDoc}
`;
/**
* __useVideoExportJobQuery__
*
* To run a query within a React component, call `useVideoExportJobQuery` and pass it any options that fit your needs.
* When your component renders, `useVideoExportJobQuery` 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 } = useVideoExportJobQuery({
* variables: {
* jobId: // value for 'jobId'
* },
* });
*/
export function useVideoExportJobQuery(
baseOptions: Apollo.QueryHookOptions<
VideoExportJobQuery,
VideoExportJobQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<VideoExportJobQuery, VideoExportJobQueryVariables>(
VideoExportJobDocument,
options,
);
}
export function useVideoExportJobLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
VideoExportJobQuery,
VideoExportJobQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<VideoExportJobQuery, VideoExportJobQueryVariables>(
VideoExportJobDocument,
options,
);
}
export function useVideoExportJobSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
VideoExportJobQuery,
VideoExportJobQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
VideoExportJobQuery,
VideoExportJobQueryVariables
>(VideoExportJobDocument, options);
}
export type VideoExportJobQueryHookResult = ReturnType<
typeof useVideoExportJobQuery
>;
export type VideoExportJobLazyQueryHookResult = ReturnType<
typeof useVideoExportJobLazyQuery
>;
export type VideoExportJobSuspenseQueryHookResult = ReturnType<
typeof useVideoExportJobSuspenseQuery
>;
export type VideoExportJobQueryResult = Apollo.QueryResult<
VideoExportJobQuery,
VideoExportJobQueryVariables
>;
export const MyVideoExportsDocument = gql`
query MyVideoExports($limit: Int = 30, $offset: Int = 0) {
myVideoExports(limit: $limit, offset: $offset) {
...VideoExportJobFields
}
}
${VideoExportJobFieldsFragmentDoc}
`;
/**
* __useMyVideoExportsQuery__
*
* To run a query within a React component, call `useMyVideoExportsQuery` and pass it any options that fit your needs.
* When your component renders, `useMyVideoExportsQuery` 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 } = useMyVideoExportsQuery({
* variables: {
* limit: // value for 'limit'
* offset: // value for 'offset'
* },
* });
*/
export function useMyVideoExportsQuery(
baseOptions?: Apollo.QueryHookOptions<
MyVideoExportsQuery,
MyVideoExportsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<MyVideoExportsQuery, MyVideoExportsQueryVariables>(
MyVideoExportsDocument,
options,
);
}
export function useMyVideoExportsLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
MyVideoExportsQuery,
MyVideoExportsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<MyVideoExportsQuery, MyVideoExportsQueryVariables>(
MyVideoExportsDocument,
options,
);
}
export function useMyVideoExportsSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
MyVideoExportsQuery,
MyVideoExportsQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
MyVideoExportsQuery,
MyVideoExportsQueryVariables
>(MyVideoExportsDocument, options);
}
export type MyVideoExportsQueryHookResult = ReturnType<
typeof useMyVideoExportsQuery
>;
export type MyVideoExportsLazyQueryHookResult = ReturnType<
typeof useMyVideoExportsLazyQuery
>;
export type MyVideoExportsSuspenseQueryHookResult = ReturnType<
typeof useMyVideoExportsSuspenseQuery
>;
export type MyVideoExportsQueryResult = Apollo.QueryResult<
MyVideoExportsQuery,
MyVideoExportsQueryVariables
>;
export const CreateUploadStreamDocument = gql` export const CreateUploadStreamDocument = gql`
mutation CreateUploadStream( mutation CreateUploadStream(
$videoMetadataInput: VideoMetadataInput! $videoMetadataInput: VideoMetadataInput!

View File

@@ -0,0 +1,30 @@
fragment VideoExportJobFields on VideoExportJobGQL {
id
videoId
mode
status
shotIds
runId
downloadUrl
fileSizeBytes
expiresAt
createdAt
}
mutation RequestVideoExport($input: RequestVideoExportInput!) {
requestVideoExport(input: $input) {
...VideoExportJobFields
}
}
query VideoExportJob($jobId: Int!) {
videoExportJob(jobId: $jobId) {
...VideoExportJobFields
}
}
query MyVideoExports($limit: Int = 30, $offset: Int = 0) {
myVideoExports(limit: $limit, offset: $offset) {
...VideoExportJobFields
}
}

View File

@@ -111,6 +111,7 @@ type Query {
getResolvedTier: ResolvedTierGQL! getResolvedTier: ResolvedTierGQL!
getAppleAppAccountToken: String! getAppleAppAccountToken: String!
getQuotaStatus: QuotaStatusGQL! getQuotaStatus: QuotaStatusGQL!
getStorageStatus: StorageStatusGQL
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL! getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
getUserVideos( getUserVideos(
userId: Int = null userId: Int = null
@@ -120,6 +121,8 @@ type Query {
): VideoHistoryGQL! ): VideoHistoryGQL!
getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]! getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]!
getGameTypeTagMetrics(input: GameTypeTagMetricsInput!): [GameTypeTagMetric!]! getGameTypeTagMetrics(input: GameTypeTagMetricsInput!): [GameTypeTagMetric!]!
videoExportJob(jobId: Int!): VideoExportJobGQL
myVideoExports(limit: Int! = 30, offset: Int! = 0): [VideoExportJobGQL!]!
getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL! getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL!
getVideos(videoIds: [Int!]!): [VideoGQL!]! getVideos(videoIds: [Int!]!): [VideoGQL!]!
} }
@@ -863,6 +866,7 @@ enum NotificationTypeEnum {
REACTION REACTION
FOLLOW FOLLOW
CHALLENGE_INVITE CHALLENGE_INVITE
EXPORT_READY
} }
input NotificationFilters { input NotificationFilters {
@@ -1080,6 +1084,7 @@ type ResolvedTierGQL {
entitlementStatus: String entitlementStatus: String
entitlementStartsAt: DateTime entitlementStartsAt: DateTime
entitlementEndsAt: DateTime entitlementEndsAt: DateTime
capabilities: [String!]!
} }
type QuotaStatusGQL { type QuotaStatusGQL {
@@ -1106,6 +1111,27 @@ type QuotaBucketStatusGQL {
canUpload: Boolean! 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 { type UserPlayTimeGQL {
totalSeconds: Float! totalSeconds: Float!
} }
@@ -1141,6 +1167,34 @@ input GameTypeTagMetricsInput {
includePrivate: IncludePrivateEnum! = MINE includePrivate: IncludePrivateEnum! = MINE
} }
type VideoExportJobGQL {
id: Int!
videoId: Int!
mode: VideoExportModeEnum!
status: VideoExportStatusEnum!
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). 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).
""" """
@@ -1242,6 +1296,7 @@ type Mutation {
feedback: String = null feedback: String = null
metadata: CancellationFeedbackMetadataInput = null metadata: CancellationFeedbackMetadataInput = null
): Boolean! ): Boolean!
requestVideoExport(input: RequestVideoExportInput!): VideoExportJobGQL!
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
createUploadStream( createUploadStream(
videoMetadata: VideoMetadataInput! videoMetadata: VideoMetadataInput!
@@ -1424,6 +1479,13 @@ input CancellationFeedbackMetadataInput {
platform: String = null platform: String = null
} }
input RequestVideoExportInput {
videoId: Int!
mode: VideoExportModeEnum!
shotIds: [Int!] = null
runId: Int = null
}
type CreateUploadStreamReturn { type CreateUploadStreamReturn {
videoId: Int! videoId: Int!
} }