Compare commits

..

1 Commits

Author SHA1 Message Date
6bcf9a2487 Add upload stream detail fields
All checks were successful
Tests / Tests (pull_request) Successful in 24s
2026-06-09 16:31:50 -07:00
19 changed files with 213 additions and 6050 deletions

View File

@@ -13,7 +13,7 @@ _sym_db = _symbol_database.Default()
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(
b'\n\nshot.proto\x12\x0fserialized_shot"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history"I\n\x0c\x43olorCluster\x12\x11\n\tlightness\x18\x01 \x01(\x02\x12\t\n\x01\x61\x18\x02 \x01(\x02\x12\t\n\x01\x62\x18\x03 \x01(\x02\x12\x10\n\x08\x66raction\x18\x04 \x01(\x02"B\n\x0fTrajectoryColor\x12/\n\x08\x63lusters\x18\x01 \x03(\x0b\x32\x1d.serialized_shot.ColorCluster"\x8e\x01\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path\x12:\n\x10trajectory_color\x18\x03 \x01(\x0b\x32 .serialized_shot.TrajectoryColor"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3' b'\n\nshot.proto\x12\x0fserialized_shot"?\n\x03\x42ox\x12\x0c\n\x04left\x18\x01 \x01(\x02\x12\x0b\n\x03top\x18\x02 \x01(\x02\x12\r\n\x05width\x18\x03 \x01(\x02\x12\x0e\n\x06height\x18\x04 \x01(\x02"\x1d\n\x05Point\x12\t\n\x01x\x18\x01 \x01(\x02\x12\t\n\x01y\x18\x02 \x01(\x02"\x7f\n\rBallDetection\x12.\n\x0eplane_position\x18\x01 \x01(\x0b\x32\x16.serialized_shot.Point\x12(\n\nannotation\x18\x02 \x01(\x0b\x32\x14.serialized_shot.Box\x12\x14\n\x0cinterpolated\x18\x03 \x01(\x08"T\n\x10RLEBallDetection\x12\x31\n\tdetection\x18\x01 \x01(\x0b\x32\x1e.serialized_shot.BallDetection\x12\r\n\x05\x63ount\x18\x02 \x01(\r"L\n\x13RLEDetectionHistory\x12\x35\n\ndetections\x18\x01 \x03(\x0b\x32!.serialized_shot.RLEBallDetection"F\n\x10\x44\x65tectionHistory\x12\x32\n\ndetections\x18\x01 \x03(\x0b\x32\x1e.serialized_shot.BallDetection"\xfc\x01\n\rCollisionInfo\x12\x0e\n\x06source\x18\x01 \x01(\r\x12M\n\x10\x62\x61ll_identifiers\x18\x02 \x03(\x0b\x32\x33.serialized_shot.CollisionInfo.BallIdentifiersEntry\x12\x17\n\x0fwall_identifier\x18\x03 \x01(\r\x12\x13\n\x0b\x66rame_index\x18\x04 \x01(\r\x12\x0e\n\x06static\x18\x05 \x01(\x08\x1aN\n\x14\x42\x61llIdentifiersEntry\x12\x0b\n\x03key\x18\x01 \x01(\r\x12%\n\x05value\x18\x02 \x01(\x0b\x32\x16.serialized_shot.Point:\x02\x38\x01"\xcc\x02\n\x04Path\x12\x13\n\x0bstart_frame\x18\x01 \x01(\r\x12\x11\n\tend_frame\x18\x02 \x01(\r\x12\x37\n\ndetections\x18\x03 \x01(\x0b\x32!.serialized_shot.DetectionHistoryH\x00\x12>\n\x0erle_detections\x18\x04 \x01(\x0b\x32$.serialized_shot.RLEDetectionHistoryH\x00\x12\x15\n\x0bnot_present\x18\x05 \x01(\x08H\x00\x12\x11\n\tis_static\x18\x06 \x01(\x08\x12\x32\n\nstart_info\x18\x07 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfo\x12\x30\n\x08\x65nd_info\x18\x08 \x01(\x0b\x32\x1e.serialized_shot.CollisionInfoB\x13\n\x11\x64\x65tection_history"R\n\x11IdentifierHistory\x12\x17\n\x0f\x62\x61ll_identifier\x18\x01 \x01(\r\x12$\n\x05paths\x18\x02 \x03(\x0b\x32\x15.serialized_shot.Path"\xf4\x01\n\x12KeyBallIdentifiers\x12\x10\n\x08\x63ue_ball\x18\x01 \x01(\r\x12\x13\n\x0bobject_ball\x18\x02 \x01(\r\x12\x13\n\x0btarget_ball\x18\x03 \x01(\r\x12\x18\n\x10\x63ontact_sequence\x18\x04 \x03(\r\x12\x18\n\x0b\x63ue_ball_id\x18\x05 \x01(\rH\x00\x88\x01\x01\x12\x1b\n\x0eobject_ball_id\x18\x06 \x01(\rH\x01\x88\x01\x01\x12\x1b\n\x0etarget_ball_id\x18\x07 \x01(\rH\x02\x88\x01\x01\x42\x0e\n\x0c_cue_ball_idB\x11\n\x0f_object_ball_idB\x11\n\x0f_target_ball_id"\xa8\x01\n\x04Shot\x12@\n\x14identifier_histories\x18\x03 \x03(\x0b\x32".serialized_shot.IdentifierHistory\x12\x36\n\tkey_balls\x18\x04 \x01(\x0b\x32#.serialized_shot.KeyBallIdentifiers\x12\x13\n\x0bstart_index\x18\x05 \x01(\r\x12\x11\n\tend_index\x18\x06 \x01(\rb\x06proto3'
) )
_globals = globals() _globals = globals()
@@ -41,14 +41,10 @@ if _descriptor._USE_C_DESCRIPTORS == False:
_globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_end = 745 _globals["_COLLISIONINFO_BALLIDENTIFIERSENTRY"]._serialized_end = 745
_globals["_PATH"]._serialized_start = 748 _globals["_PATH"]._serialized_start = 748
_globals["_PATH"]._serialized_end = 1080 _globals["_PATH"]._serialized_end = 1080
_globals["_COLORCLUSTER"]._serialized_start = 1082 _globals["_IDENTIFIERHISTORY"]._serialized_start = 1082
_globals["_COLORCLUSTER"]._serialized_end = 1155 _globals["_IDENTIFIERHISTORY"]._serialized_end = 1164
_globals["_TRAJECTORYCOLOR"]._serialized_start = 1157 _globals["_KEYBALLIDENTIFIERS"]._serialized_start = 1167
_globals["_TRAJECTORYCOLOR"]._serialized_end = 1223 _globals["_KEYBALLIDENTIFIERS"]._serialized_end = 1411
_globals["_IDENTIFIERHISTORY"]._serialized_start = 1226 _globals["_SHOT"]._serialized_start = 1414
_globals["_IDENTIFIERHISTORY"]._serialized_end = 1368 _globals["_SHOT"]._serialized_end = 1582
_globals["_KEYBALLIDENTIFIERS"]._serialized_start = 1371
_globals["_KEYBALLIDENTIFIERS"]._serialized_end = 1615
_globals["_SHOT"]._serialized_start = 1618
_globals["_SHOT"]._serialized_end = 1786
# @@protoc_insertion_point(module_scope) # @@protoc_insertion_point(module_scope)

View File

@@ -160,45 +160,16 @@ class Path(_message.Message):
end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ..., end_info: _Optional[_Union[CollisionInfo, _Mapping]] = ...,
) -> None: ... ) -> None: ...
class ColorCluster(_message.Message):
__slots__ = ["lightness", "a", "b", "fraction"]
LIGHTNESS_FIELD_NUMBER: _ClassVar[int]
A_FIELD_NUMBER: _ClassVar[int]
B_FIELD_NUMBER: _ClassVar[int]
FRACTION_FIELD_NUMBER: _ClassVar[int]
lightness: float
a: float
b: float
fraction: float
def __init__(
self,
lightness: _Optional[float] = ...,
a: _Optional[float] = ...,
b: _Optional[float] = ...,
fraction: _Optional[float] = ...,
) -> None: ...
class TrajectoryColor(_message.Message):
__slots__ = ["clusters"]
CLUSTERS_FIELD_NUMBER: _ClassVar[int]
clusters: _containers.RepeatedCompositeFieldContainer[ColorCluster]
def __init__(
self, clusters: _Optional[_Iterable[_Union[ColorCluster, _Mapping]]] = ...
) -> None: ...
class IdentifierHistory(_message.Message): class IdentifierHistory(_message.Message):
__slots__ = ["ball_identifier", "paths", "trajectory_color"] __slots__ = ["ball_identifier", "paths"]
BALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int] BALL_IDENTIFIER_FIELD_NUMBER: _ClassVar[int]
PATHS_FIELD_NUMBER: _ClassVar[int] PATHS_FIELD_NUMBER: _ClassVar[int]
TRAJECTORY_COLOR_FIELD_NUMBER: _ClassVar[int]
ball_identifier: int ball_identifier: int
paths: _containers.RepeatedCompositeFieldContainer[Path] paths: _containers.RepeatedCompositeFieldContainer[Path]
trajectory_color: TrajectoryColor
def __init__( def __init__(
self, self,
ball_identifier: _Optional[int] = ..., ball_identifier: _Optional[int] = ...,
paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ..., paths: _Optional[_Iterable[_Union[Path, _Mapping]]] = ...,
trajectory_color: _Optional[_Union[TrajectoryColor, _Mapping]] = ...,
) -> None: ... ) -> None: ...
class KeyBallIdentifiers(_message.Message): class KeyBallIdentifiers(_message.Message):

View File

@@ -50,21 +50,9 @@ message Path {
CollisionInfo end_info = 8; CollisionInfo end_info = 8;
} }
message ColorCluster {
// LAB in OpenCV's 0-255 uint8 scale (see railbird LABCV2Color).
float lightness = 1;
float a = 2;
float b = 3;
// Share of this ball's accumulated color pixels in this cluster (0-1).
float fraction = 4;
}
message TrajectoryColor { repeated ColorCluster clusters = 1; }
message IdentifierHistory { message IdentifierHistory {
uint32 ball_identifier = 1; uint32 ball_identifier = 1;
repeated Path paths = 2; repeated Path paths = 2;
TrajectoryColor trajectory_color = 3;
} }
message KeyBallIdentifiers { message KeyBallIdentifiers {
uint32 cue_ball = 1; uint32 cue_ball = 1;

View File

@@ -740,158 +740,9 @@ function _decodePath(bb: ByteBuffer): Path {
return message; return message;
} }
export interface ColorCluster {
lightness?: number;
a?: number;
b?: number;
fraction?: number;
}
export function encodeColorCluster(message: ColorCluster): Uint8Array {
let bb = popByteBuffer();
_encodeColorCluster(message, bb);
return toUint8Array(bb);
}
function _encodeColorCluster(message: ColorCluster, bb: ByteBuffer): void {
// optional float lightness = 1;
let $lightness = message.lightness;
if ($lightness !== undefined) {
writeVarint32(bb, 13);
writeFloat(bb, $lightness);
}
// optional float a = 2;
let $a = message.a;
if ($a !== undefined) {
writeVarint32(bb, 21);
writeFloat(bb, $a);
}
// optional float b = 3;
let $b = message.b;
if ($b !== undefined) {
writeVarint32(bb, 29);
writeFloat(bb, $b);
}
// optional float fraction = 4;
let $fraction = message.fraction;
if ($fraction !== undefined) {
writeVarint32(bb, 37);
writeFloat(bb, $fraction);
}
}
export function decodeColorCluster(binary: Uint8Array): ColorCluster {
return _decodeColorCluster(wrapByteBuffer(binary));
}
function _decodeColorCluster(bb: ByteBuffer): ColorCluster {
let message: ColorCluster = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// optional float lightness = 1;
case 1: {
message.lightness = readFloat(bb);
break;
}
// optional float a = 2;
case 2: {
message.a = readFloat(bb);
break;
}
// optional float b = 3;
case 3: {
message.b = readFloat(bb);
break;
}
// optional float fraction = 4;
case 4: {
message.fraction = readFloat(bb);
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface TrajectoryColor {
clusters?: ColorCluster[];
}
export function encodeTrajectoryColor(message: TrajectoryColor): Uint8Array {
let bb = popByteBuffer();
_encodeTrajectoryColor(message, bb);
return toUint8Array(bb);
}
function _encodeTrajectoryColor(
message: TrajectoryColor,
bb: ByteBuffer,
): void {
// repeated ColorCluster clusters = 1;
let array$clusters = message.clusters;
if (array$clusters !== undefined) {
for (let value of array$clusters) {
writeVarint32(bb, 10);
let nested = popByteBuffer();
_encodeColorCluster(value, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
}
}
export function decodeTrajectoryColor(binary: Uint8Array): TrajectoryColor {
return _decodeTrajectoryColor(wrapByteBuffer(binary));
}
function _decodeTrajectoryColor(bb: ByteBuffer): TrajectoryColor {
let message: TrajectoryColor = {} as any;
end_of_message: while (!isAtEnd(bb)) {
let tag = readVarint32(bb);
switch (tag >>> 3) {
case 0:
break end_of_message;
// repeated ColorCluster clusters = 1;
case 1: {
let limit = pushTemporaryLength(bb);
let values = message.clusters || (message.clusters = []);
values.push(_decodeColorCluster(bb));
bb.limit = limit;
break;
}
default:
skipUnknownField(bb, tag & 7);
}
}
return message;
}
export interface IdentifierHistory { export interface IdentifierHistory {
ball_identifier?: number; ball_identifier?: number;
paths?: Path[]; paths?: Path[];
trajectory_color?: TrajectoryColor;
} }
export function encodeIdentifierHistory( export function encodeIdentifierHistory(
@@ -925,17 +776,6 @@ function _encodeIdentifierHistory(
pushByteBuffer(nested); pushByteBuffer(nested);
} }
} }
// optional TrajectoryColor trajectory_color = 3;
let $trajectory_color = message.trajectory_color;
if ($trajectory_color !== undefined) {
writeVarint32(bb, 26);
let nested = popByteBuffer();
_encodeTrajectoryColor($trajectory_color, nested);
writeVarint32(bb, nested.limit);
writeByteBuffer(bb, nested);
pushByteBuffer(nested);
}
} }
export function decodeIdentifierHistory(binary: Uint8Array): IdentifierHistory { export function decodeIdentifierHistory(binary: Uint8Array): IdentifierHistory {
@@ -967,14 +807,6 @@ function _decodeIdentifierHistory(bb: ByteBuffer): IdentifierHistory {
break; break;
} }
// optional TrajectoryColor trajectory_color = 3;
case 3: {
let limit = pushTemporaryLength(bb);
message.trajectory_color = _decodeTrajectoryColor(bb);
bb.limit = limit;
break;
}
default: default:
skipUnknownField(bb, tag & 7); skipUnknownField(bb, tag & 7);
} }

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,6 @@ query getDeployedConfig {
minimumAllowedAppVersion minimumAllowedAppVersion
subscriptionGatingEnabled subscriptionGatingEnabled
quotaEnforcementEnabled quotaEnforcementEnabled
storageLimitEnforcementEnabled
capabilityEnforcementEnabled
bannerMessages { bannerMessages {
color color
dismissible dismissible

View File

@@ -42,9 +42,6 @@ fragment VideoCardFields on VideoGQL {
id id
lastIntendedSegmentBound lastIntendedSegmentBound
streamSegmentType streamSegmentType
isCompleted
lastSegmentUploadedAt
clientUploadStatus
} }
tableSize tableSize
pocketSize pocketSize
@@ -149,6 +146,5 @@ query GetVideoFeed(
endCursor endCursor
} }
hasFollowing hasFollowing
followingCount
} }
} }

View File

@@ -30,57 +30,3 @@ query GetRunsLeaderboard($interval: TimeInterval, $when: DateTime) {
} }
} }
} }
query GetDrillRunLeaderboard(
$drillTag: String!
$interval: TimeInterval
$limit: Int = 50
$tableSizeMin: Float
$tableSizeMax: Float
$pocketSizeMin: Float
$pocketSizeMax: Float
) {
getDrillRunLeaderboard(
drillTag: $drillTag
interval: $interval
limit: $limit
tableSizeMin: $tableSizeMin
tableSizeMax: $tableSizeMax
pocketSizeMin: $pocketSizeMin
pocketSizeMax: $pocketSizeMax
) {
entries {
id
runLength
videoId
video {
tableSize
pocketSize
createdAt
}
user {
id
username
profileImageUri
}
}
youRun {
id
runLength
videoId
}
youRank
totalPlayers
}
}
query GetMyDrillRuns($drillTag: String!, $limit: Int = 50) {
getMyDrillRuns(drillTag: $drillTag, limit: $limit) {
id
runLength
videoId
video {
createdAt
}
}
}

View File

@@ -1,34 +0,0 @@
# Lightweight listing of live (in-progress) streams for pickers like the
# Shot Lab "follow a live stream" flow. Selects only what a picker card
# needs; intentionally avoids the heavy VideoCardFields fragment.
query GetLiveStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: { isStreamCompleted: false, requireCursorCompletion: false }
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
startTime
createdAt
screenshotUri
elapsedTime
owner {
id
username
profileImageUri
}
stream {
id
isCompleted
lastSegmentUploadedAt
}
}
pageInfo {
hasNextPage
endCursor
}
}
}

View File

@@ -44,34 +44,12 @@ query GetAvailableSubscriptionOptions {
active active
} }
} }
appleIap {
enabled
proMonthlyProductId
productIds
}
tierOptions {
tierName
tierDisplayName
billingInterval
platform
isConfigured
isAvailable
stripeProductId
stripePriceId
appleProductId
currency
unitAmount
recurringIntervalCount
}
} }
} }
query GetSubscriptionStatus { query GetSubscriptionStatus {
getUserSubscriptionStatus { getUserSubscriptionStatus {
hasActiveSubscription hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus subscriptionStatus
currentPeriodStart currentPeriodStart
currentPeriodEnd currentPeriodEnd
@@ -81,66 +59,9 @@ query GetSubscriptionStatus {
} }
} }
query GetResolvedTier {
getResolvedTier {
tierName
tierDisplayName
hasActiveSubscription
entitlementSource
entitlementStatus
entitlementStartsAt
entitlementEndsAt
capabilities
}
}
query GetStorageStatus {
getStorageStatus {
userId
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
isUnlimited
policyConfigured
remainingStorageBytes
storageUsageRatio
isNearLimit
isOverLimit
usageCalculated
usageSource
lastCalculatedAt
}
}
query GetAppleAppAccountToken {
getAppleAppAccountToken
}
mutation SyncAppleSubscription($signedTransactionInfo: String!) {
syncAppleSubscription(
input: { signedTransactionInfo: $signedTransactionInfo }
) {
ok
errorCode
errorMessage
hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
appleStatus
originalTransactionId
latestTransactionId
productId
expiresAt
}
}
mutation CancelSubscription { mutation CancelSubscription {
cancelSubscription { cancelSubscription {
hasActiveSubscription hasActiveSubscription
entitlementSource
entitlementStartsAt
entitlementEndsAt
subscriptionStatus subscriptionStatus
currentPeriodStart currentPeriodStart
currentPeriodEnd currentPeriodEnd

View File

@@ -1,187 +0,0 @@
fragment PoolHallFields on PoolHall {
id
name
address
city
state
latitude
longitude
timezone
status
createdAt
updatedAt
}
fragment PoolHallCameraFields on PoolHallCamera {
id
poolHallId
name
tableLabel
streamPath
status
tableSize
pocketSize
allowsPrivateVideos
claimTermsText
claimTermsVersion
inUse
lastPublishedAt
lastUnpublishedAt
createdAt
updatedAt
}
fragment PoolHallCameraWithHallFields on PoolHallCamera {
...PoolHallCameraFields
poolHall {
...PoolHallFields
}
}
fragment PoolHallCameraStreamCredentialsFields on PoolHallCameraStreamCredentials {
streamKey
rtmpPath
camera {
...PoolHallCameraWithHallFields
}
}
fragment CameraClaimSessionFields on CameraClaimSession {
id
cameraId
userId
challengeCode
status
expiresAt
detectedAt
failedAt
failureReason
agreedTermsVersion
createdAt
updatedAt
camera {
...PoolHallCameraWithHallFields
}
}
fragment CameraLeaseFields on CameraLease {
id
cameraId
claimSessionId
userId
videoId
status
startedAt
endedAt
expiresAt
endReason
createdAt
updatedAt
camera {
...PoolHallCameraWithHallFields
}
}
query GetPoolHalls {
poolHalls {
...PoolHallFields
}
}
query GetClaimablePoolHalls {
claimablePoolHalls {
...PoolHallFields
}
}
query GetPoolHallCameras($poolHallId: ID!) {
poolHallCameras(poolHallId: $poolHallId) {
...PoolHallCameraWithHallFields
}
}
query GetClaimableCameras($poolHallId: ID!) {
claimableCameras(poolHallId: $poolHallId) {
...PoolHallCameraWithHallFields
}
}
query GetCameraClaimSession($id: ID!) {
cameraClaimSession(id: $id) {
...CameraClaimSessionFields
}
}
query GetActiveCameraLease {
activeCameraLease {
...CameraLeaseFields
}
}
mutation CreatePoolHall($input: CreatePoolHallInput!) {
createPoolHall(input: $input) {
...PoolHallFields
}
}
mutation UpdatePoolHall($input: UpdatePoolHallInput!) {
updatePoolHall(input: $input) {
...PoolHallFields
}
}
mutation CreatePoolHallCamera($input: CreatePoolHallCameraInput!) {
createPoolHallCamera(input: $input) {
...PoolHallCameraStreamCredentialsFields
}
}
mutation UpdatePoolHallCamera($input: UpdatePoolHallCameraInput!) {
updatePoolHallCamera(input: $input) {
...PoolHallCameraWithHallFields
}
}
mutation RotatePoolHallCameraStreamKey($cameraId: ID!) {
rotatePoolHallCameraStreamKey(cameraId: $cameraId) {
...PoolHallCameraStreamCredentialsFields
}
}
mutation CreateCameraClaimSession(
$cameraId: ID!
$durationMinutes: Int
$videoName: String
$videoPrivate: Boolean
$agreedTermsVersion: Int
$tags: [VideoTagInput!]
) {
createCameraClaimSession(
cameraId: $cameraId
durationMinutes: $durationMinutes
videoName: $videoName
videoPrivate: $videoPrivate
agreedTermsVersion: $agreedTermsVersion
tags: $tags
) {
...CameraClaimSessionFields
}
}
mutation CancelCameraClaimSession($claimSessionId: ID!) {
cancelCameraClaimSession(claimSessionId: $claimSessionId) {
...CameraClaimSessionFields
}
}
mutation EndCameraLease($leaseId: ID!) {
endCameraLease(leaseId: $leaseId) {
...CameraLeaseFields
}
}
mutation ExtendCameraLease($leaseId: ID!, $additionalMinutes: Int! = 60) {
extendCameraLease(leaseId: $leaseId, additionalMinutes: $additionalMinutes) {
...CameraLeaseFields
}
}

View File

@@ -1,62 +0,0 @@
# Lightweight two-step picker data for loading a recorded shot into Shot Lab.
query GetRecordedStreams($limit: Int! = 25) {
getFeedVideos(
limit: $limit
filters: { isStreamCompleted: true, excludeVideosWithNoShots: true }
includePrivate: MINE
feedInput: { allUsers: true }
) {
videos {
id
name
createdAt
screenshotUri
framesPerSecond
totalShots
owner {
id
username
profileImageUri
}
}
}
}
query GetRecordedStreamShots($videoId: Int!, $limit: Int! = 200) {
getOrderedShots(
filterInput: { videoId: [$videoId] }
shotsOrdering: { orderings: [{ startFrame: { descending: false } }] }
limit: $limit
) {
shots {
id
videoId
startFrame
endFrame
serializedShotPaths {
b64EncodedBuffer
}
cueObjectFeatures {
cueObjectDistance
cueObjectAngle
cueBallSpeed
shotDirection
spinType
}
pocketingIntentionFeatures {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
difficulty
}
pocketingIntentionInfo {
ballId
pocketId
pathMetadataIndex
}
}
}
}

View File

@@ -9,12 +9,6 @@ fragment PlayerSummaryFields on PlayerSummaryGQL {
makePercentage makePercentage
score score
longestRun longestRun
runLengths
spinTypeBreakdown {
draw
center
follow
}
averageDifficulty averageDifficulty
averageTimeBetweenShots averageTimeBetweenShots
} }

View File

@@ -1,87 +0,0 @@
query GetTableState(
$b64Image: String!
$tableSize: Float
$useHomography: HomographyInputGQL
) {
getTableState(
b64Image: $b64Image
tableSize: $tableSize
useHomography: $useHomography
) {
identifierToPosition
identifierToColor {
hex
}
}
}
query GetLiveTableState($videoId: Int!) {
getLiveTableState(videoId: $videoId) {
videoId
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
}
}
}
}
query GetShotTableState($shotId: Int!) {
getShotTableState(shotId: $shotId) {
shotId
videoId
frameIndex
tableState {
identifierToPosition
identifierToColor {
hex
}
}
}
}
query SimulateShot($simulationInput: SimulateShotInputGQL!) {
simulateShot(simulationInput: $simulationInput) {
trajectories {
ballId
points {
time
position
}
}
events {
eventType
time
ballIds
position
}
finalState {
ballId
position
}
pottedBallIds
}
}
query ComputePotAim(
$simulationInput: SimulateShotInputGQL!
$targetBallId: Int!
$pocket: PocketIdentifier!
) {
computePotAim(
simulationInput: $simulationInput
targetBallId: $targetBallId
pocket: $pocket
) {
phi
geometricPhi
cutAngle
requiredPrecision
feasible
potted
converged
occludingBallIds
}
}

View File

@@ -1,45 +0,0 @@
query getUsageStats($days: Int! = 30) {
getUsageStats(days: $days) {
funnel {
freemiumEpoch
eraSignups
eraPaying
activationCohort
activationActivated
payingUsers
newPaid7d
newPaid30d
retentionPrevActive
retentionReturned
}
cohorts {
weekStart
signups
activated7d
paid7d
activatedNotPaid7d
}
totalUsers
totalVideos
totalShots
totalRuns
windows {
label
newUsers
activeUsers
sessions
shots
}
daily {
day
newUsers
activeUsers
sessions
shots
}
processingLast24h {
status
count
}
}
}

View File

@@ -177,7 +177,6 @@ mutation editUser(
$fargoRating: Int $fargoRating: Int
$videosPrivateByDefault: Boolean $videosPrivateByDefault: Boolean
$agreesToMarketing: Boolean $agreesToMarketing: Boolean
$bio: String
) { ) {
editUser( editUser(
input: { input: {
@@ -185,7 +184,6 @@ mutation editUser(
fargoRating: $fargoRating fargoRating: $fargoRating
videosPrivateByDefault: $videosPrivateByDefault videosPrivateByDefault: $videosPrivateByDefault
agreesToMarketing: $agreesToMarketing agreesToMarketing: $agreesToMarketing
bio: $bio
} }
) { ) {
id id
@@ -195,7 +193,6 @@ mutation editUser(
updatedAt updatedAt
videosPrivateByDefault videosPrivateByDefault
agreesToMarketing agreesToMarketing
bio
} }
} }
@@ -209,7 +206,6 @@ fragment UserFragment on UserGQL {
username username
isAdmin isAdmin
profileImageUri profileImageUri
bio
fargoRating fargoRating
activeVideoId activeVideoId
createdAt createdAt

View File

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

View File

@@ -37,13 +37,6 @@ mutation GetUploadLink($videoId: Int!, $segmentIndex: Int!) {
} }
} }
} }
... on StorageLimitExceededErr {
reason
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
remainingStorageBytes
}
} }
} }
} }
@@ -74,13 +67,6 @@ mutation GetHlsInitUploadLink($videoId: Int!) {
... on TooManyInitUploadsErr { ... on TooManyInitUploadsErr {
linksRequested linksRequested
} }
... on StorageLimitExceededErr {
reason
tierName
retainedStorageUsedBytes
retainedStorageLimitBytes
remainingStorageBytes
}
} }
} }
} }
@@ -127,8 +113,10 @@ fragment UploadStreamWithDetails on VideoGQL {
name name
startTime startTime
stream { stream {
id
isCompleted isCompleted
lastIntendedSegmentBound lastIntendedSegmentBound
streamSegmentType
uploadCompletionCursor uploadCompletionCursor
uploadsCompleted uploadsCompleted
} }

View File

@@ -1,5 +1,7 @@
type Query { type Query {
getAggregatedShotMetrics(aggregateInput: AggregateInputGQL!): [AggregateResultGQL!]! getAggregatedShotMetrics(
aggregateInput: AggregateInputGQL!
): [AggregateResultGQL!]!
getBucketSet(keyName: String!): BucketSetGQL getBucketSet(keyName: String!): BucketSetGQL
challenges(includeDismissed: Boolean! = false): [Challenge!]! challenges(includeDismissed: Boolean! = false): [Challenge!]!
myDismissedChallenges: [Challenge!]! myDismissedChallenges: [Challenge!]!
@@ -11,52 +13,101 @@ type Query {
myChallengeEntries: [ChallengeEntry!]! myChallengeEntries: [ChallengeEntry!]!
getDeployedConfig: DeployedConfigGQL! getDeployedConfig: DeployedConfigGQL!
waitFor(duration: Float!): Float! waitFor(duration: Float!): Float!
getFeedVideos(limit: Int! = 5, after: String = null, includePrivate: IncludePrivateEnum! = MINE, includeCallersVideos: Boolean = true, filters: VideoFilterInput = null, feedInput: VideoFeedInputGQL = null): VideoHistoryGQL! getFeedVideos(
getVideoMakePercentageIntervals(videoId: ID!, intervalDuration: Int! = 300): [MakePercentageIntervalGQL!]! limit: Int! = 5
getLongestRunsLeaderboard(interval: TimeInterval = null, when: DateTime = null, limit: Int! = 50, requiredTags: [String!] = null): RunLeaderboardGQL! after: String = null
getDrillRunLeaderboard(drillTag: String!, interval: TimeInterval = null, limit: Int! = 50, tableSizeMin: Float = null, tableSizeMax: Float = null, pocketSizeMin: Float = null, pocketSizeMax: Float = null): DrillRunLeaderboardGQL! includePrivate: IncludePrivateEnum! = MINE
getMyDrillRuns(drillTag: String!, limit: Int! = 50): [RunGQL!]! includeCallersVideos: Boolean = true
getMakesLeaderboard(interval: TimeInterval = null, when: DateTime = null): CountLeaderboardGQL! filters: VideoFilterInput = null
feedInput: VideoFeedInputGQL = null
): VideoHistoryGQL!
getVideoMakePercentageIntervals(
videoId: ID!
intervalDuration: Int! = 300
): [MakePercentageIntervalGQL!]!
getLongestRunsLeaderboard(
interval: TimeInterval = null
when: DateTime = null
limit: Int! = 50
requiredTags: [String!] = null
): RunLeaderboardGQL!
getMakesLeaderboard(
interval: TimeInterval = null
when: DateTime = null
): CountLeaderboardGQL!
getMedals(scope: MedalScope!, userId: Int = null): RequestedMedalsGQL! getMedals(scope: MedalScope!, userId: Int = null): RequestedMedalsGQL!
notifications(limit: Int! = 20, offset: Int! = 0, filters: NotificationFilters = null): NotificationConnection! notifications(
limit: Int! = 20
offset: Int! = 0
filters: NotificationFilters = null
): NotificationConnection!
unreadNotificationCount: Int! unreadNotificationCount: Int!
poolHalls: [PoolHall!]! getRuns(
claimablePoolHalls: [PoolHall!]! filterInput: RunFilterInput!
poolHallCameras(poolHallId: ID!): [PoolHallCamera!]! runIds: [Int!] = null
claimableCameras(poolHallId: ID!): [PoolHallCamera!]! runsOrdering: GetRunsOrdering = null
cameraClaimSession(id: ID!): CameraClaimSession limit: Int! = 500
activeCameraLease: CameraLease countRespectsLimit: Boolean! = false
getRuns(filterInput: RunFilterInput!, runIds: [Int!] = null, runsOrdering: GetRunsOrdering = null, limit: Int! = 500, countRespectsLimit: Boolean! = false): GetRunsResult! ): GetRunsResult!
videoPlayerClusters(videoId: Int!): [PlayerClusterGQL!]! videoPlayerClusters(videoId: Int!): [PlayerClusterGQL!]!
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]! getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
getTableState(b64Image: String!, tableSize: Float = 100, useHomography: HomographyInputGQL = null): TableStateGQL! getTableState(
getLiveTableState(videoId: Int!): LiveTableStateGQL! b64Image: String!
getShotTableState(shotId: Int!): ShotTableStateGQL! tableSize: Float = 100
simulateShot(simulationInput: SimulateShotInputGQL!): ShotProjectionGQL! useHomography: HomographyInputGQL = null
computePotAim(simulationInput: SimulateShotInputGQL!, targetBallId: Int!, pocket: PocketIdentifier!): PotAimGQL! ): TableStateGQL!
getOrderedShots(filterInput: FilterInput!, ids: [Int!] = null, shotsOrdering: GetShotsOrdering = null, limit: Int! = 500, countRespectsLimit: Boolean! = false): GetShotsResult! getOrderedShots(
getShotsWithMetadata(filterInput: FilterInput!, ids: [Int!] = null, shotsPagination: GetShotsPagination = null, limit: Int! = 500, countRespectsLimit: Boolean! = false): GetShotsResult! filterInput: FilterInput!
getShots(filterInput: FilterInput!, shotsPagination: GetShotsPagination = null, limit: Int! = 500, countRespectsLimit: Boolean! = false): [ShotGQL!]! ids: [Int!] = null
shotsOrdering: GetShotsOrdering = null
limit: Int! = 500
countRespectsLimit: Boolean! = false
): GetShotsResult!
getShotsWithMetadata(
filterInput: FilterInput!
ids: [Int!] = null
shotsPagination: GetShotsPagination = null
limit: Int! = 500
countRespectsLimit: Boolean! = false
): GetShotsResult!
getShots(
filterInput: FilterInput!
shotsPagination: GetShotsPagination = null
limit: Int! = 500
countRespectsLimit: Boolean! = false
): [ShotGQL!]!
getShotsByIds(ids: [Int!]!): [ShotGQL!]! getShotsByIds(ids: [Int!]!): [ShotGQL!]!
getUsageStats(days: Int! = 30): UsageStatsGQL!
getUser(userId: Int!): UserGQL getUser(userId: Int!): UserGQL
doesUsernameExist(candidateUsername: String!): Boolean! doesUsernameExist(candidateUsername: String!): Boolean!
getLoggedInUser: UserGQL getLoggedInUser: UserGQL
getUsernames(matchString: String = null, limit: Int = null, after: String = null): [String!]! getUsernames(
getUsersMatching(matchString: String = null, limit: Int = null, after: String = null): [UserGQL!]! matchString: String = null
getUserRelationshipsMatching(userId: Int!, matchString: String = null, limit: Int = 100, after: String = null): UserRelationshipsResult! limit: Int = null
after: String = null
): [String!]!
getUsersMatching(
matchString: String = null
limit: Int = null
after: String = null
): [UserGQL!]!
getUserRelationshipsMatching(
userId: Int!
matchString: String = null
limit: Int = 100
after: String = null
): UserRelationshipsResult!
getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL! getAvailableSubscriptionOptions: StripeSubscriptionOptionsGQL!
getUserSubscriptionStatus: UserSubscriptionStatusGQL! getUserSubscriptionStatus: UserSubscriptionStatusGQL!
getResolvedTier: ResolvedTierGQL!
getAppleAppAccountToken: String!
getQuotaStatus: QuotaStatusGQL! getQuotaStatus: QuotaStatusGQL!
getStorageStatus: StorageStatusGQL
getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL! getPlayTime(userId: Int!, filters: VideoFilterInput = null): UserPlayTimeGQL!
getUserVideos(userId: Int = null, limit: Int! = 5, after: String = null, filters: VideoFilterInput = null): VideoHistoryGQL! getUserVideos(
userId: Int = null
limit: Int! = 5
after: String = null
filters: VideoFilterInput = null
): 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!]!
} }
@@ -124,7 +175,9 @@ input DatetimeRangeAggregationInput {
feature: String! = "created_at" feature: String! = "created_at"
} }
"""Date with time (isoformat)""" """
Date with time (isoformat)
"""
scalar DateTime scalar DateTime
input TimeInterval @oneOf { input TimeInterval @oneOf {
@@ -240,7 +293,9 @@ input DateRangeFilter {
greaterThanInclusive: Boolean! = true greaterThanInclusive: Boolean! = true
} }
"""Date (isoformat)""" """
Date (isoformat)
"""
scalar Date scalar Date
type BucketSetGQL { type BucketSetGQL {
@@ -290,7 +345,6 @@ type UserGQL {
activeVideoId: Int activeVideoId: Int
stripeCustomerId: String stripeCustomerId: String
profileImageUri: String profileImageUri: String
bio: String
createdAt: DateTime createdAt: DateTime
updatedAt: DateTime updatedAt: DateTime
videosPrivateByDefault: Boolean videosPrivateByDefault: Boolean
@@ -464,7 +518,6 @@ type UploadStreamGQL {
initPlaylistUploadStatus: InitPlaylistUploadStatusEnum initPlaylistUploadStatus: InitPlaylistUploadStatusEnum
lowestUnuploadedSegmentIndex: Int! lowestUnuploadedSegmentIndex: Int!
uploadCompletionCursor: Int! uploadCompletionCursor: Int!
lastSegmentUploadedAt: DateTime
errors: [StreamErrorGQL!]! errors: [StreamErrorGQL!]!
createdAt: DateTime! createdAt: DateTime!
updatedAt: DateTime! updatedAt: DateTime!
@@ -525,7 +578,7 @@ type VideoTagClass {
} }
type HomographyInfoGQL { type HomographyInfoGQL {
id: Int id: Int!
frameIndex: Int! frameIndex: Int!
crop: BoundingBoxGQL! crop: BoundingBoxGQL!
pockets: [BoundingBoxGQL!]! pockets: [BoundingBoxGQL!]!
@@ -624,18 +677,10 @@ type PlayerSummaryGQL {
makePercentage: Float! makePercentage: Float!
score: Int score: Int
longestRun: Int! longestRun: Int!
runLengths: [Int!]!
spinTypeBreakdown: SpinTypeBreakdownGQL!
averageDifficulty: Float averageDifficulty: Float
averageTimeBetweenShots: Float averageTimeBetweenShots: Float
} }
type SpinTypeBreakdownGQL {
draw: Int!
center: Int!
follow: Int!
}
type DeployedConfigGQL { type DeployedConfigGQL {
allowNewUsers: Boolean! allowNewUsers: Boolean!
firebase: Boolean! firebase: Boolean!
@@ -644,8 +689,6 @@ type DeployedConfigGQL {
minimumAllowedAppVersion: String! minimumAllowedAppVersion: String!
subscriptionGatingEnabled: Boolean! subscriptionGatingEnabled: Boolean!
quotaEnforcementEnabled: Boolean! quotaEnforcementEnabled: Boolean!
storageLimitEnforcementEnabled: Boolean!
capabilityEnforcementEnabled: Boolean!
bannerMessages: [BannerGQL!]! bannerMessages: [BannerGQL!]!
defaultAndroidRecordingFormat: StreamSegmentTypeEnum! defaultAndroidRecordingFormat: StreamSegmentTypeEnum!
bucketUrl: String! bucketUrl: String!
@@ -670,7 +713,6 @@ type VideoHistoryGQL {
videos: [VideoGQL!]! videos: [VideoGQL!]!
pageInfo: PageInfoGQL! pageInfo: PageInfoGQL!
hasFollowing: Boolean! hasFollowing: Boolean!
followingCount: Int!
} }
type PageInfoGQL { type PageInfoGQL {
@@ -707,13 +749,6 @@ type RunLeaderboardGQL {
entries: [RunGQL!]! entries: [RunGQL!]!
} }
type DrillRunLeaderboardGQL {
entries: [RunGQL!]!
youRun: RunGQL
youRank: Int
totalPlayers: Int!
}
type CountLeaderboardGQL { type CountLeaderboardGQL {
entries: [UserShotCountEntry!]! entries: [UserShotCountEntry!]!
} }
@@ -766,7 +801,8 @@ type MedalGQL {
input MedalScope @oneOf { input MedalScope @oneOf {
videoId: Int videoId: Int
interval: TimeInterval @deprecated(reason: "NO LONGER SUPPORTED, USE DATETIME_RANGE") interval: TimeInterval
@deprecated(reason: "NO LONGER SUPPORTED, USE DATETIME_RANGE")
datetimeRange: DatetimeRangeAggregationInput datetimeRange: DatetimeRangeAggregationInput
} }
@@ -797,7 +833,6 @@ enum NotificationTypeEnum {
REACTION REACTION
FOLLOW FOLLOW
CHALLENGE_INVITE CHALLENGE_INVITE
EXPORT_READY
} }
input NotificationFilters { input NotificationFilters {
@@ -805,72 +840,6 @@ input NotificationFilters {
notificationTypes: [NotificationTypeEnum!] = null notificationTypes: [NotificationTypeEnum!] = null
} }
type PoolHall {
id: ID!
name: String!
address: String
city: String
state: String
latitude: Float
longitude: Float
timezone: String
status: String!
createdAt: DateTime!
updatedAt: DateTime!
}
type PoolHallCamera {
id: ID!
poolHallId: ID!
name: String!
tableLabel: String
streamPath: String!
status: String!
tableSize: Float
pocketSize: Float
allowsPrivateVideos: Boolean!
claimTermsText: String
claimTermsVersion: Int
lastPublishedAt: DateTime
lastUnpublishedAt: DateTime
createdAt: DateTime!
updatedAt: DateTime!
inUse: Boolean!
poolHall: PoolHall!
}
type CameraClaimSession {
id: ID!
cameraId: ID!
userId: ID!
challengeCode: String!
status: String!
expiresAt: DateTime!
detectedAt: DateTime
failedAt: DateTime
failureReason: String
agreedTermsVersion: Int
createdAt: DateTime!
updatedAt: DateTime!
camera: PoolHallCamera!
}
type CameraLease {
id: ID!
cameraId: ID!
claimSessionId: ID
userId: ID!
videoId: ID
status: String!
startedAt: DateTime!
endedAt: DateTime
expiresAt: DateTime
endReason: String
createdAt: DateTime!
updatedAt: DateTime!
camera: PoolHallCamera!
}
type GetRunsResult { type GetRunsResult {
runs: [RunGQL!]! runs: [RunGQL!]!
count: Int count: Int
@@ -936,14 +905,6 @@ type PlayerClusterShotGQL {
type TableStateGQL { type TableStateGQL {
identifierToPosition: [[Float!]!]! identifierToPosition: [[Float!]!]!
homography: HomographyInfoGQL homography: HomographyInfoGQL
identifierToColor: [RGBColorGQL]!
}
type RGBColorGQL {
r: Int!
g: Int!
b: Int!
hex: String!
} }
input HomographyInputGQL { input HomographyInputGQL {
@@ -974,89 +935,6 @@ input IntPoint2DInput {
y: Int! y: Int!
} }
type LiveTableStateGQL {
videoId: Int!
frameIndex: Int!
tableState: TableStateGQL!
}
type ShotTableStateGQL {
shotId: Int!
videoId: Int!
frameIndex: Int!
tableState: TableStateGQL!
}
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 { type GetShotsResult {
shots: [ShotGQL!]! shots: [ShotGQL!]!
count: Int count: Int
@@ -1091,60 +969,6 @@ input CreatedAfter @oneOf {
createdAt: DateTime createdAt: DateTime
} }
type UsageStatsGQL {
funnel: FunnelStatsGQL!
totalUsers: Int!
totalVideos: Int!
totalShots: Int!
totalRuns: Int!
cohorts: [CohortStatsGQL!]!
windows: [UsageStatsWindowGQL!]!
daily: [UsageStatsDailyGQL!]!
processingLast24h: [ProcessingStatusCountGQL!]!
}
type FunnelStatsGQL {
freemiumEpoch: Date!
eraSignups: Int!
eraPaying: Int!
activationCohort: Int!
activationActivated: Int!
payingUsers: Int!
newPaid7d: Int!
newPaid30d: Int!
retentionPrevActive: Int!
retentionReturned: Int!
}
type CohortStatsGQL {
weekStart: Date!
signups: Int!
activated7d: Int!
paid7d: Int!
activatedNotPaid7d: Int!
}
type UsageStatsWindowGQL {
label: String!
newUsers: Int!
activeUsers: Int!
sessions: Int!
shots: Int!
}
type UsageStatsDailyGQL {
day: Date!
newUsers: Int!
activeUsers: Int!
sessions: Int!
shots: Int!
}
type ProcessingStatusCountGQL {
status: String!
count: Int!
}
type UserRelationshipsResult { type UserRelationshipsResult {
inquiringUser: UserGQL! inquiringUser: UserGQL!
relationships: [UserRelationship!]! relationships: [UserRelationship!]!
@@ -1159,8 +983,6 @@ type UserRelationship {
type StripeSubscriptionOptionsGQL { type StripeSubscriptionOptionsGQL {
products: [StripeProductGQL!]! products: [StripeProductGQL!]!
trialPeriodDays: Int trialPeriodDays: Int
appleIap: AppleIapSubscriptionOptionsGQL!
tierOptions: [SubscriptionTierPurchaseOptionGQL!]!
} }
type StripeProductGQL { type StripeProductGQL {
@@ -1181,27 +1003,6 @@ type StripePriceGQL {
active: Boolean! active: Boolean!
} }
type AppleIapSubscriptionOptionsGQL {
enabled: Boolean!
proMonthlyProductId: String
productIds: [String!]!
}
type SubscriptionTierPurchaseOptionGQL {
tierName: String!
tierDisplayName: String!
billingInterval: String!
platform: String!
isConfigured: Boolean!
isAvailable: Boolean!
stripeProductId: String
stripePriceId: String
appleProductId: String
currency: String
unitAmount: Int
recurringIntervalCount: Int
}
type UserSubscriptionStatusGQL { type UserSubscriptionStatusGQL {
hasActiveSubscription: Boolean! hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum entitlementSource: EntitlementSourceTypeEnum
@@ -1219,7 +1020,6 @@ enum EntitlementSourceTypeEnum {
ADMIN ADMIN
MANUAL MANUAL
STRIPE STRIPE
APPLE
ALPHA_LEGACY ALPHA_LEGACY
} }
@@ -1234,17 +1034,6 @@ enum StripeSubscriptionStatusEnum {
PAUSED PAUSED
} }
type ResolvedTierGQL {
tierName: String!
tierDisplayName: String!
hasActiveSubscription: Boolean!
entitlementSource: EntitlementSourceTypeEnum
entitlementStatus: String
entitlementStartsAt: DateTime
entitlementEndsAt: DateTime
capabilities: [String!]!
}
type QuotaStatusGQL { type QuotaStatusGQL {
tierName: String! tierName: String!
periodStart: DateTime! periodStart: DateTime!
@@ -1269,25 +1058,6 @@ 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!
} }
@@ -1323,47 +1093,37 @@ input GameTypeTagMetricsInput {
includePrivate: IncludePrivateEnum! = MINE 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). 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).
""" """
scalar JSON @specifiedBy(url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf") scalar JSON
@specifiedBy(
url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf"
)
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!
createChallenge(name: String!, ruleSetId: ID!, minimumShots: Int!, startDate: DateTime!, endDate: DateTime!, description: String = null, requiredTableSize: Float = null, requiredPocketSize: Float = null, isPublic: Boolean! = false, maxAttempts: Int = null): Challenge! createChallenge(
inviteUsersToChallenge(challengeId: ID!, userIds: [ID!]!): [ChallengeInvitation!]! name: String!
respondToChallengeInvitation(invitationId: ID!, accept: Boolean!): ChallengeInvitation! ruleSetId: ID!
minimumShots: Int!
startDate: DateTime!
endDate: DateTime!
description: String = null
requiredTableSize: Float = null
requiredPocketSize: Float = null
isPublic: Boolean! = false
maxAttempts: Int = null
): Challenge!
inviteUsersToChallenge(
challengeId: ID!
userIds: [ID!]!
): [ChallengeInvitation!]!
respondToChallengeInvitation(
invitationId: ID!
accept: Boolean!
): ChallengeInvitation!
startChallenge(challengeId: ID!): ChallengeEntry! startChallenge(challengeId: ID!): ChallengeEntry!
recalculateChallengeEntry(entryId: ID!): ChallengeEntry! recalculateChallengeEntry(entryId: ID!): ChallengeEntry!
submitChallengeEntry(entryId: ID!, videoId: ID!): ChallengeEntry! submitChallengeEntry(entryId: ID!, videoId: ID!): ChallengeEntry!
@@ -1371,30 +1131,43 @@ type Mutation {
undismissChallenge(challengeId: ID!): Boolean! undismissChallenge(challengeId: ID!): Boolean!
setLoggerLevel(path: String!, level: String!): Boolean! setLoggerLevel(path: String!, level: String!): Boolean!
reactToVideo(videoId: Int!, reaction: ReactionEnum): Boolean! reactToVideo(videoId: Int!, reaction: ReactionEnum): Boolean!
commentOnVideo(videoId: Int!, message: String!, parentCommentId: Int): Boolean! commentOnVideo(
videoId: Int!
message: String!
parentCommentId: Int
): Boolean!
editComment(videoId: Int!, commentId: Int!, newMessage: String!): Boolean! editComment(videoId: Int!, commentId: Int!, newMessage: String!): Boolean!
deleteComment(videoId: Int!, commentId: Int!): Boolean! deleteComment(videoId: Int!, commentId: Int!): Boolean!
blockContent(videoId: Int!): Boolean! blockContent(videoId: Int!): Boolean!
blockUser(userId: Int!): Boolean! blockUser(userId: Int!): Boolean!
reportContent(videoId: Int!, reason: ReportReasonEnum!, customReason: String = null): Boolean! reportContent(
videoId: Int!
reason: ReportReasonEnum!
customReason: String = null
): Boolean!
markNotificationAsRead(notificationId: Int!): Boolean! markNotificationAsRead(notificationId: Int!): Boolean!
markAllNotificationsAsRead: Boolean! markAllNotificationsAsRead: Boolean!
markNotificationsAsRead(notificationIds: [Int!]!): Boolean! markNotificationsAsRead(notificationIds: [Int!]!): Boolean!
deleteNotification(notificationId: Int!): Boolean! deleteNotification(notificationId: Int!): Boolean!
createPoolHall(input: CreatePoolHallInput!): PoolHall! finalizePlayerAssignments(
updatePoolHall(input: UpdatePoolHallInput!): PoolHall! input: FinalizePlayerAssignmentsInput!
createPoolHallCamera(input: CreatePoolHallCameraInput!): PoolHallCameraStreamCredentials! ): [PlayerClusterGQL!]!
updatePoolHallCamera(input: UpdatePoolHallCameraInput!): PoolHallCamera! addAnnotationToShot(
rotatePoolHallCameraStreamKey(cameraId: ID!): PoolHallCameraStreamCredentials! shotId: Int!
createCameraClaimSession(cameraId: ID!, durationMinutes: Int = null, videoName: String = null, videoPrivate: Boolean = null, agreedTermsVersion: Int = null, tags: [VideoTagInput!] = null): CameraClaimSession! annotationName: String!
cancelCameraClaimSession(claimSessionId: ID!): CameraClaimSession! notes: String = null
endCameraLease(leaseId: ID!): CameraLease! ): AddShotAnnotationReturn!
extendCameraLease(leaseId: ID!, additionalMinutes: Int! = 60): CameraLease! updateShotAnnotations(
finalizePlayerAssignments(input: FinalizePlayerAssignmentsInput!): [PlayerClusterGQL!]! shotId: Int!
addAnnotationToShot(shotId: Int!, annotationName: String!, notes: String = null): AddShotAnnotationReturn! annotations: [UpdateAnnotationInputGQL!]!
updateShotAnnotations(shotId: Int!, annotations: [UpdateAnnotationInputGQL!]!): UpdateShotAnnotationReturn! ): UpdateShotAnnotationReturn!
editShot(shotId: Int!, fieldsToEdit: EditableShotFieldInputGQL!): EditShotReturn! editShot(
getProfileImageUploadLink(fileExt: String = ".png"): GetProfileUploadLinkReturn! shotId: Int!
fieldsToEdit: EditableShotFieldInputGQL!
): EditShotReturn!
getProfileImageUploadLink(
fileExt: String = ".png"
): GetProfileUploadLinkReturn!
editProfileImageUri(profileImageUri: String!): UserGQL! editProfileImageUri(profileImageUri: String!): UserGQL!
editUser(input: EditUserInputGQL!): UserGQL! editUser(input: EditUserInputGQL!): UserGQL!
followUser(followedUserId: Int!): UserGQL! followUser(followedUserId: Int!): UserGQL!
@@ -1402,20 +1175,34 @@ type Mutation {
retireTags(tagIds: [Int!]!): Boolean! retireTags(tagIds: [Int!]!): Boolean!
ensureStripeCustomerExists: UserGQL! ensureStripeCustomerExists: UserGQL!
deleteUser: Boolean! deleteUser: Boolean!
syncAppleSubscription(input: SyncAppleSubscriptionInputGQL!): SyncAppleSubscriptionResultGQL!
createSubscription(priceId: String!): CreateSubscriptionResultGQL! createSubscription(priceId: String!): CreateSubscriptionResultGQL!
createCustomerPortalSession: CreateCustomerPortalSessionResultGQL! createCustomerPortalSession: CreateCustomerPortalSessionResultGQL!
cancelSubscription: UserSubscriptionStatusGQL! cancelSubscription: UserSubscriptionStatusGQL!
grantManualEntitlement(userId: Int!, tierName: String! = "pro", startsAt: DateTime = null, endsAt: DateTime = null, reason: String = null): UserSubscriptionStatusGQL! grantManualEntitlement(
userId: Int!
tierName: String! = "pro"
startsAt: DateTime = null
endsAt: DateTime = null
reason: String = null
): UserSubscriptionStatusGQL!
revokeManualEntitlement(userId: Int!): UserSubscriptionStatusGQL! revokeManualEntitlement(userId: Int!): UserSubscriptionStatusGQL!
submitCancellationFeedback(reasons: [CancellationReasonEnum!] = null, feedback: String = null, metadata: CancellationFeedbackMetadataInput = null): Boolean! submitCancellationFeedback(
requestVideoExport(input: RequestVideoExportInput!): VideoExportJobGQL! reasons: [CancellationReasonEnum!] = null
dismissVideoExport(jobId: Int!): Boolean! feedback: String = null
metadata: CancellationFeedbackMetadataInput = null
): Boolean!
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
createUploadStream(videoMetadata: VideoMetadataInput!, expectedDurationSeconds: Float = null): CreateUploadStreamReturn! createUploadStream(
videoMetadata: VideoMetadataInput!
expectedDurationSeconds: Float = null
): CreateUploadStreamReturn!
getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn! getUploadLink(videoId: Int!, segmentIndex: Int!): GetUploadLinkReturn!
getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn! getHlsInitUploadLink(videoId: Int!): GetUploadLinkReturn!
setSegmentDuration(videoId: Int!, segmentIndex: Int!, duration: Float!): Boolean! setSegmentDuration(
videoId: Int!
segmentIndex: Int!
duration: Float!
): Boolean!
editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean! editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean!
deleteVideo(videoId: Int!): Boolean! deleteVideo(videoId: Int!): Boolean!
deleteTags(videoId: Int!, tagsToDelete: [VideoTagInput!]!): Boolean! deleteTags(videoId: Int!, tagsToDelete: [VideoTagInput!]!): Boolean!
@@ -1436,56 +1223,6 @@ enum ReportReasonEnum {
OTHER OTHER
} }
input CreatePoolHallInput {
name: String!
address: String = null
city: String = null
state: String = null
latitude: Float = null
longitude: Float = null
timezone: String = null
}
input UpdatePoolHallInput {
id: ID!
name: String = null
address: String = null
city: String = null
state: String = null
latitude: Float = null
longitude: Float = null
timezone: String = null
status: String = null
}
type PoolHallCameraStreamCredentials {
camera: PoolHallCamera!
streamKey: String!
rtmpPath: String!
}
input CreatePoolHallCameraInput {
poolHallId: ID!
name: String!
tableLabel: String = null
streamPath: String = null
tableSize: Float = null
pocketSize: Float = null
allowsPrivateVideos: Boolean = null
claimTermsText: String = null
}
input UpdatePoolHallCameraInput {
id: ID!
name: String = null
tableLabel: String = null
status: String = null
tableSize: Float = null
pocketSize: Float = null
allowsPrivateVideos: Boolean = null
claimTermsText: String = null
}
input FinalizePlayerAssignmentsInput { input FinalizePlayerAssignmentsInput {
videoId: Int! videoId: Int!
clusterAssignments: [ClusterAssignmentInput!]! = [] clusterAssignments: [ClusterAssignmentInput!]! = []
@@ -1507,7 +1244,9 @@ type AddShotAnnotationReturn {
value: SuccessfulAddAddShotAnnotationErrors! value: SuccessfulAddAddShotAnnotationErrors!
} }
union SuccessfulAddAddShotAnnotationErrors = SuccessfulAdd | AddShotAnnotationErrors union SuccessfulAddAddShotAnnotationErrors =
SuccessfulAdd
| AddShotAnnotationErrors
type SuccessfulAdd { type SuccessfulAdd {
value: Boolean! value: Boolean!
@@ -1517,7 +1256,9 @@ type AddShotAnnotationErrors {
error: DoesNotOwnShotErrOtherErrorNeedsNote! error: DoesNotOwnShotErrOtherErrorNeedsNote!
} }
union DoesNotOwnShotErrOtherErrorNeedsNote = DoesNotOwnShotErr | OtherErrorNeedsNote union DoesNotOwnShotErrOtherErrorNeedsNote =
DoesNotOwnShotErr
| OtherErrorNeedsNote
type DoesNotOwnShotErr { type DoesNotOwnShotErr {
shotId: Int! shotId: Int!
@@ -1558,7 +1299,9 @@ type GetProfileUploadLinkReturn {
value: UploadLinkGetProfileUploadLinkErrors! value: UploadLinkGetProfileUploadLinkErrors!
} }
union UploadLinkGetProfileUploadLinkErrors = UploadLink | GetProfileUploadLinkErrors union UploadLinkGetProfileUploadLinkErrors =
UploadLink
| GetProfileUploadLinkErrors
type UploadLink { type UploadLink {
uploadUrl: String! uploadUrl: String!
@@ -1583,27 +1326,6 @@ input EditUserInputGQL {
fargoRating: Int = null fargoRating: Int = null
videosPrivateByDefault: Boolean = null videosPrivateByDefault: Boolean = null
agreesToMarketing: 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 { type CreateSubscriptionResultGQL {
@@ -1630,13 +1352,6 @@ 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!
} }
@@ -1645,9 +1360,12 @@ input VideoMetadataInput {
videoName: String = null videoName: String = null
startTime: DateTime = null startTime: DateTime = null
endTime: DateTime = null endTime: DateTime = null
gameType: String = null @deprecated(reason: "`game_type` is deprecated. Use `tags` instead.") gameType: String = null
@deprecated(reason: "`game_type` is deprecated. Use `tags` instead.")
"""A list of tags associated with the video. Replace `game_type`""" """
A list of tags associated with the video. Replace `game_type`
"""
tags: [VideoTagInput!] = null tags: [VideoTagInput!] = null
tableSize: Float = null tableSize: Float = null
pocketSize: Float = null pocketSize: Float = null
@@ -1673,10 +1391,17 @@ type GetUploadLinkReturn {
union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors union UploadLinkGetUploadLinkErrors = UploadLink | GetUploadLinkErrors
type GetUploadLinkErrors { type GetUploadLinkErrors {
error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErrStorageLimitExceededErr! error: MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr!
} }
union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErrStorageLimitExceededErr = MustHaveSetForUploadLinkErr | SegmentAlreadyUploadedErr | ProcessingFailedErr | NoInitForChunkedUploadErr | TooManyProfileImageUploadsErr | InitUploadAlreadyCompletedErr | TooManyInitUploadsErr | StorageLimitExceededErr union MustHaveSetForUploadLinkErrSegmentAlreadyUploadedErrProcessingFailedErrNoInitForChunkedUploadErrTooManyProfileImageUploadsErrInitUploadAlreadyCompletedErrTooManyInitUploadsErr =
MustHaveSetForUploadLinkErr
| SegmentAlreadyUploadedErr
| ProcessingFailedErr
| NoInitForChunkedUploadErr
| TooManyProfileImageUploadsErr
| InitUploadAlreadyCompletedErr
| TooManyInitUploadsErr
type MustHaveSetForUploadLinkErr { type MustHaveSetForUploadLinkErr {
resolution: Boolean resolution: Boolean
@@ -1702,11 +1427,3 @@ type InitUploadAlreadyCompletedErr {
type TooManyInitUploadsErr { type TooManyInitUploadsErr {
linksRequested: Int! linksRequested: Int!
} }
type StorageLimitExceededErr {
reason: String!
tierName: String!
retainedStorageUsedBytes: BigInt!
retainedStorageLimitBytes: BigInt
remainingStorageBytes: BigInt
}