Compare commits

..

No commits in common. "master" and "kat/named-fragment-mini-video" have entirely different histories.

9 changed files with 194 additions and 1231 deletions

View File

@ -1,16 +1,9 @@
# see: https://www.apollographql.com/docs/react/local-state/managing-state-with-field-policies/
directive @client on FIELD
type SegmentInfo {
index: Int!
time: Float!
}
extend type ShotGQL {
startTime: Float!
endTime: Float!
startSegment: SegmentInfo!
endSegment: SegmentInfo!
}
extend type UploadStreamGQL {

File diff suppressed because it is too large Load Diff

View File

@ -27,8 +27,6 @@ fragment VideoCardFields on VideoGQL {
totalShotsMade
totalShots
makePercentage
averageTimeBetweenShots
averageDifficulty
createdAt
updatedAt
startTime
@ -40,7 +38,6 @@ fragment VideoCardFields on VideoGQL {
id
lastIntendedSegmentBound
isCompleted
streamSegmentType
}
tableSize
tags {
@ -59,20 +56,6 @@ fragment VideoCardFields on VideoGQL {
status
}
}
reactions {
videoId
user {
id
username
profileImageUri
followers {
id
username
profileImageUri
}
}
reaction
}
}
query GetVideoFeed(

View File

@ -1,3 +0,0 @@
mutation ReactToVideo($videoId: Int!, $reaction: ReactionEnum) {
reactToVideo(videoId: $videoId, reaction: $reaction)
}

View File

@ -1,67 +0,0 @@
query GetRunsForHighlights(
$filterInput: RunFilterInput!
$runIds: [Int!] = null
$runsOrdering: GetRunsOrdering
$limit: Int! = 500
$countRespectsLimit: Boolean! = false
) {
getRuns(
filterInput: $filterInput
runIds: $runIds
runsOrdering: $runsOrdering
limit: $limit
countRespectsLimit: $countRespectsLimit
) {
count
runs {
id
runLength
userId
videoId
shots {
videoId
id
}
}
runIds
}
}
fragment PocketingIntentionFragment on PocketingIntentionFeaturesGQL {
make
targetPocketDistance
targetPocketAngle
targetPocketAngleDirection
marginOfErrorInDegrees
intendedPocketType
difficulty
}
query GetRunsWithTimestamps(
$filterInput: RunFilterInput!
$runIds: [Int!] = null
$runsOrdering: GetRunsOrdering
) {
getRuns(
filterInput: $filterInput
runIds: $runIds
runsOrdering: $runsOrdering
) {
count
runs {
id
runLength
userId
videoId
shots {
videoId
id
createdAt
pocketingIntentionFeatures {
...PocketingIntentionFragment
}
}
}
runIds
}
}

View File

@ -139,14 +139,6 @@ fragment ShotWithAllFeatures on ShotGQL {
endFrame
startTime @client
endTime @client
startSegment @client {
index
time
}
endSegment @client {
index
time
}
user {
id
}
@ -185,13 +177,6 @@ fragment ShotWithAllFeatures on ShotGQL {
}
notes
}
video {
id
stream {
id
streamSegmentType
}
}
}
mutation EditShot($shotId: Int!, $fieldsToEdit: EditableShotFieldInputGQL!) {

View File

@ -1,7 +0,0 @@
mutation RetireTags($tagIds: [Int!]!) {
retireTags(tagIds: $tagIds)
}
mutation DeleteTags($videoId: Int!, $tagsToDelete: [VideoTagInput!]!) {
deleteTags(videoId: $videoId, tagsToDelete: $tagsToDelete)
}

View File

@ -79,10 +79,6 @@ query GetUserTags {
getUserTags {
id
name
tagClasses {
id
name
}
}
}

View File

@ -5,28 +5,10 @@ type Query {
getBucketSet(keyName: String!): BucketSetGQL
getDeployedConfig: DeployedConfigGQL!
waitFor(duration: Float!): Float!
getFeedVideos(
limit: Int! = 5
after: String = null
includePrivate: IncludePrivateEnum! = MINE
includeCallersVideos: Boolean = true
filters: VideoFilterInput = null
feedInput: VideoFeedInputGQL = null
): VideoHistoryGQL!
getVideoMakePercentageIntervals(
videoId: ID!
intervalDuration: Int! = 300
): [MakePercentageIntervalGQL!]!
getLongestRunsLeaderboard(
interval: TimeInterval = null
when: DateTime = null
limit: Int! = 100
requiredTags: [String!] = null
): RunLeaderboardGQL!
getMakesLeaderboard(
interval: TimeInterval = null
when: DateTime = null
): CountLeaderboardGQL!
getMedals(scope: MedalScope!, userId: Int = null): RequestedMedalsGQL!
getRuns(
filterInput: RunFilterInput!
@ -35,12 +17,6 @@ type Query {
limit: Int! = 500
countRespectsLimit: Boolean! = false
): GetRunsResult!
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
getTableState(
b64Image: String!
tableSize: Float = 100
useHomography: HomographyInputGQL = null
): TableStateGQL!
getOrderedShots(
filterInput: FilterInput!
ids: [Int!] = null
@ -62,6 +38,7 @@ type Query {
countRespectsLimit: Boolean! = false
): [ShotGQL!]!
getShotsByIds(ids: [Int!]!): [ShotGQL!]!
getShotAnnotationTypes(errorTypes: Boolean = false): [ShotAnnotationTypeGQL!]!
getUser(userId: Int!): UserGQL
doesUsernameExist(candidateUsername: String!): Boolean!
getLoggedInUser: UserGQL
@ -83,9 +60,27 @@ type Query {
after: String = null
filters: VideoFilterInput = null
): VideoHistoryGQL!
getUserTags(includeRetiredTags: Boolean = false): [TagGQL!]!
getUserTags: [TagGQL!]!
getVideo(videoId: Int!, debuggingJson: JSON = null): VideoGQL!
getVideos(videoIds: [Int!]!): [VideoGQL!]!
getFeedVideos(
limit: Int! = 5
after: String = null
includePrivate: IncludePrivateEnum! = MINE
includeCallersVideos: Boolean = true
filters: VideoFilterInput = null
feedInput: VideoFeedInputGQL = null
): VideoHistoryGQL!
getLongestRunsLeaderboard(
interval: TimeInterval = null
when: DateTime = null
limit: Int! = 100
requiredTags: [String!] = null
): RunLeaderboardGQL!
getMakesLeaderboard(
interval: TimeInterval = null
when: DateTime = null
): CountLeaderboardGQL!
}
type AggregateResultGQL {
@ -200,7 +195,6 @@ input FilterInput @oneOf {
isLeftMiss: [Boolean!]
isRightMiss: [Boolean!]
isDirect: [Boolean!]
isBreakHeuristic: [Boolean!]
tableSize: FloatRangeFilter
bankAngle: FloatRangeFilter
bankDistance: FloatRangeFilter
@ -293,54 +287,70 @@ type DeployedConfigGQL {
minimumAllowedAppVersion: String!
}
type VideoHistoryGQL {
videos: [VideoGQL!]!
pageInfo: PageInfoGQL!
}
type VideoGQL {
id: Int!
owner: UserGQL
name: String
screenshotUri: String
totalShotsMade: Int!
totalShots: Int!
type MakePercentageIntervalGQL {
makePercentage: Float!
medianRun: Float
averageTimeBetweenShots: Float
averageDifficulty: Float
createdAt: DateTime
updatedAt: DateTime
shots: [ShotGQL!]!
startTime: DateTime
endTime: DateTime
elapsedTime: Float
framesPerSecond: Float!
tableSize: Float!
private: Boolean!
stream: UploadStreamGQL
playlist: HLSPlaylistGQL
tags: [VideoTag!]!
currentHomography: HomographyInfoGQL
homographyHistory: [HomographyInfoGQL!]!
currentProcessing: VideoProcessingGQL
reactions: [ReactionGQL!]!
comments: [CommentGQL!]!
elapsedTime: Float!
}
type UserGQL {
type RequestedMedalsGQL {
distanceOver66: MedalGQL
distanceOver78: MedalGQL
distanceOver90: MedalGQL
runLength3: MedalGQL
runLength5: MedalGQL
runLength8: MedalGQL
runLength10: MedalGQL
runLength15: MedalGQL
runLength20: MedalGQL
runLength25: MedalGQL
runLength30: MedalGQL
runLength40: MedalGQL
runLength50: MedalGQL
totalMakes25: MedalGQL @deprecated(reason: "no longer supported")
totalMakes50: MedalGQL @deprecated(reason: "no longer supported")
totalMakes75: MedalGQL @deprecated(reason: "no longer supported")
totalMakes200: MedalGQL @deprecated(reason: "no longer supported")
totalMakes300: MedalGQL @deprecated(reason: "no longer supported")
totalMakes400: MedalGQL @deprecated(reason: "no longer supported")
totalMakes750: MedalGQL @deprecated(reason: "no longer supported")
totalMakes100: MedalGQL
totalMakes500: MedalGQL
totalMakes1000: MedalGQL
totalMakes5000: MedalGQL
totalMakes10000: MedalGQL
dailyMakes50: MedalGQL
dailyMakes100: MedalGQL
dailyMakes150: MedalGQL
dailyMakes200: MedalGQL
dailyMakes250: MedalGQL
}
type MedalGQL {
count: Int!
nickname: String
}
input MedalScope @oneOf {
videoId: Int
interval: TimeInterval
@deprecated(reason: "NO LONGER SUPPORTED, USE DATETIME_RANGE")
datetimeRange: DatetimeRangeAggregationInput
}
type GetRunsResult {
runs: [RunGQL!]!
count: Int
runIds: [Int!]!
}
type RunGQL {
id: Int!
firebaseUid: String
username: String!
isAdmin: Boolean
fargoRating: Int
activeVideoId: Int
profileImageUri: String
createdAt: DateTime
updatedAt: DateTime
videosPrivateByDefault: Boolean
following: [UserGQL!]
followers: [UserGQL!]
runLength: Int!
videoId: Int!
userId: Int!
shots: [ShotGQL!]!
video: VideoGQL!
user: UserGQL!
}
type ShotGQL {
@ -412,6 +422,21 @@ type SerializedShotPathsGQL {
b64EncodedBuffer: String
}
type UserGQL {
id: Int!
firebaseUid: String
username: String!
isAdmin: Boolean
fargoRating: Int
activeVideoId: Int
profileImageUri: String
createdAt: DateTime
updatedAt: DateTime
videosPrivateByDefault: Boolean
following: [UserGQL!]
followers: [UserGQL!]
}
type ShotAnnotationGQL {
shotId: Int!
type: ShotAnnotationTypeGQL!
@ -427,19 +452,31 @@ type ShotAnnotationTypeGQL {
name: String!
}
type RunGQL {
type VideoGQL {
id: Int!
runLength: Int!
videoId: Int!
userId: Int!
owner: UserGQL
name: String
screenshotUri: String
totalShotsMade: Int!
totalShots: Int!
makePercentage: Float!
medianRun: Float
averageTimeBetweenShots: Float
createdAt: DateTime
updatedAt: DateTime
shots: [ShotGQL!]!
video: VideoGQL!
user: UserGQL!
}
type RunFeaturesGQL {
runId: Int!
indexInRun: Int!
startTime: DateTime
endTime: DateTime
elapsedTime: Float
framesPerSecond: Float!
tableSize: Float!
private: Boolean!
stream: UploadStreamGQL
playlist: HLSPlaylistGQL
tags: [VideoTag!]!
currentHomography: HomographyInfoGQL
homographyHistory: [HomographyInfoGQL!]!
currentProcessing: VideoProcessingGQL
}
type UploadStreamGQL {
@ -573,122 +610,9 @@ type VideoProcessingStatusGQL {
updatedAt: DateTime
}
type ReactionGQL {
videoId: Int!
user: UserGQL!
reaction: ReactionEnum!
createdAt: DateTime
updatedAt: DateTime
}
enum ReactionEnum {
LIKE
HEART
BULLSEYE
HUNDRED
}
type CommentGQL {
id: Int!
user: UserGQL!
message: String!
replies: [CommentGQL!]!
}
type PageInfoGQL {
hasNextPage: Boolean!
endCursor: String
}
enum IncludePrivateEnum {
ALL
MINE
NONE
}
input VideoFilterInput {
isStreamCompleted: Boolean = null
requireCursorCompletion: Boolean! = true
createdAt: DateRangeFilter = null
excludeVideosWithNoShots: Boolean = null
}
input VideoFeedInputGQL @oneOf {
followedByUserId: Int
userId: Int
allUsers: Boolean
}
type MakePercentageIntervalGQL {
makePercentage: Float!
elapsedTime: Float!
}
type RunLeaderboardGQL {
entries: [RunGQL!]!
}
type CountLeaderboardGQL {
entries: [UserShotCountEntry!]!
}
type UserShotCountEntry {
user: UserGQL!
value: Int!
total: Int!
proportionMade: Float!
videos: Int!
}
type RequestedMedalsGQL {
distanceOver66: MedalGQL
distanceOver78: MedalGQL
distanceOver90: MedalGQL
runLength3: MedalGQL
runLength5: MedalGQL
runLength8: MedalGQL
runLength10: MedalGQL
runLength15: MedalGQL
runLength20: MedalGQL
runLength25: MedalGQL
runLength30: MedalGQL
runLength40: MedalGQL
runLength50: MedalGQL
totalMakes25: MedalGQL @deprecated(reason: "no longer supported")
totalMakes50: MedalGQL @deprecated(reason: "no longer supported")
totalMakes75: MedalGQL @deprecated(reason: "no longer supported")
totalMakes200: MedalGQL @deprecated(reason: "no longer supported")
totalMakes300: MedalGQL @deprecated(reason: "no longer supported")
totalMakes400: MedalGQL @deprecated(reason: "no longer supported")
totalMakes750: MedalGQL @deprecated(reason: "no longer supported")
totalMakes100: MedalGQL
totalMakes500: MedalGQL
totalMakes1000: MedalGQL
totalMakes5000: MedalGQL
totalMakes10000: MedalGQL
dailyMakes50: MedalGQL
dailyMakes100: MedalGQL
dailyMakes150: MedalGQL
dailyMakes200: MedalGQL
dailyMakes250: MedalGQL
}
type MedalGQL {
count: Int!
nickname: String
}
input MedalScope @oneOf {
videoId: Int
interval: TimeInterval
@deprecated(reason: "NO LONGER SUPPORTED, USE DATETIME_RANGE")
datetimeRange: DatetimeRangeAggregationInput
}
type GetRunsResult {
runs: [RunGQL!]!
count: Int
runIds: [Int!]!
type RunFeaturesGQL {
runId: Int!
indexInRun: Int!
}
input RunFilterInput {
@ -723,39 +647,6 @@ input DatetimeOrdering {
startingAt: DateTime = null
}
type TableStateGQL {
identifierToPosition: [[Float!]!]!
homography: HomographyInfoGQL
}
input HomographyInputGQL {
crop: BoundingBoxInputGQL!
pockets: [BoundingBoxInputGQL!]!
sourcePoints: PocketPointsInputGQL!
destPoints: PocketPointsInputGQL!
}
input BoundingBoxInputGQL {
left: Float!
top: Float!
width: Float!
height: Float!
}
input PocketPointsInputGQL {
topLeft: IntPoint2DInput!
topSide: IntPoint2DInput!
topRight: IntPoint2DInput!
bottomLeft: IntPoint2DInput!
bottomSide: IntPoint2DInput!
bottomRight: IntPoint2DInput!
}
input IntPoint2DInput {
x: Int!
y: Int!
}
type GetShotsResult {
shots: [ShotGQL!]!
count: Int
@ -805,16 +696,27 @@ type UserPlayTimeGQL {
totalSeconds: Float!
}
type TagGQL {
id: Int!
name: String!
tagClasses: [TagClassGQL!]
retired: Boolean!
input VideoFilterInput {
isStreamCompleted: Boolean = null
requireCursorCompletion: Boolean! = true
createdAt: DateRangeFilter = null
excludeVideosWithNoShots: Boolean = null
}
type TagClassGQL {
id: Int!
type VideoHistoryGQL {
videos: [VideoGQL!]!
pageInfo: PageInfoGQL!
}
type PageInfoGQL {
hasNextPage: Boolean!
endCursor: String
}
type TagGQL {
name: String!
id: Int!
group: String
}
"""
@ -825,17 +727,41 @@ scalar JSON
url: "https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf"
)
enum IncludePrivateEnum {
ALL
MINE
NONE
}
input VideoFeedInputGQL @oneOf {
followedByUserId: Int
userId: Int
allUsers: Boolean
}
type RunLeaderboardGQL {
entries: [RunGQL!]!
}
type CountLeaderboardGQL {
entries: [UserShotCountEntry!]!
}
type UserShotCountEntry {
user: UserGQL!
value: Int!
total: Int!
proportionMade: Float!
videos: Int!
}
type Mutation {
createBucketSet(params: CreateBucketSetInput!): BucketSetGQL!
setLoggerLevel(path: String!, level: String!): Boolean!
reactToVideo(videoId: Int!, reaction: ReactionEnum): Boolean!
commentOnVideo(
videoId: Int!
message: String!
parentCommentId: Int
): Boolean!
editComment(videoId: Int!, commentId: Int!, newMessage: String!): Boolean!
deleteComment(videoId: Int!, commentId: Int!): Boolean!
editShot(
shotId: Int!
fieldsToEdit: EditableShotFieldInputGQL!
): EditShotReturn!
addAnnotationToShot(
shotId: Int!
annotationName: String!
@ -845,10 +771,6 @@ type Mutation {
shotId: Int!
annotations: [UpdateAnnotationInputGQL!]!
): UpdateShotAnnotationReturn!
editShot(
shotId: Int!
fieldsToEdit: EditableShotFieldInputGQL!
): EditShotReturn!
getProfileImageUploadLink(
fileExt: String = ".png"
): GetProfileUploadLinkReturn!
@ -856,7 +778,6 @@ type Mutation {
editUser(input: EditUserInputGQL!): UserGQL!
followUser(followedUserId: Int!): UserGQL!
unfollowUser(followedUserId: Int!): UserGQL!
retireTags(tagIds: [Int!]!): Boolean!
findPrerecordTableLayout(b64Image: String!, videoId: Int!): HomographyInfoGQL
createUploadStream(
videoMetadata: VideoMetadataInput!
@ -870,7 +791,6 @@ type Mutation {
): Boolean!
editUploadStream(videoId: Int!, videoMetadata: VideoMetadataInput!): Boolean!
deleteVideo(videoId: Int!): Boolean!
deleteTags(videoId: Int!, tagsToDelete: [VideoTagInput!]!): Boolean!
}
input CreateBucketSetInput {
@ -879,6 +799,27 @@ input CreateBucketSetInput {
buckets: [BucketInputGQL!]!
}
type EditShotReturn {
shot: ShotGQL
error: DoesNotOwnShotErr
}
type DoesNotOwnShotErr {
shotId: Int!
msg: String
}
input EditableShotFieldInputGQL {
intendedPocketType: PocketEnum
shotDirection: ShotDirectionEnum
spinType: SpinTypeEnum
targetPocketAngleDirection: ShotDirectionEnum
make: Boolean
backcut: Boolean
excludeFromStats: Boolean
notes: String
}
type AddShotAnnotationReturn {
value: SuccessfulAddAddShotAnnotationErrors!
}
@ -899,11 +840,6 @@ union DoesNotOwnShotErrOtherErrorNeedsNote =
DoesNotOwnShotErr
| OtherErrorNeedsNote
type DoesNotOwnShotErr {
shotId: Int!
msg: String
}
type OtherErrorNeedsNote {
msg: String
}
@ -918,22 +854,6 @@ input UpdateAnnotationInputGQL {
notes: String = null
}
type EditShotReturn {
shot: ShotGQL
error: DoesNotOwnShotErr
}
input EditableShotFieldInputGQL {
intendedPocketType: PocketEnum
shotDirection: ShotDirectionEnum
spinType: SpinTypeEnum
targetPocketAngleDirection: ShotDirectionEnum
make: Boolean
backcut: Boolean
excludeFromStats: Boolean
notes: String
}
type GetProfileUploadLinkReturn {
value: UploadLinkGetProfileUploadLinkErrors!
}
@ -975,12 +895,6 @@ input VideoMetadataInput {
startTime: DateTime = null
endTime: DateTime = null
gameType: String = null
@deprecated(reason: "`game_type` is deprecated. Use `tags` instead.")
"""
A list of tags associated with the video. Replace `game_type`
"""
tags: [VideoTagInput!] = null
tableSize: Float = null
lastIntendedSegmentBound: Int = null
streamSegmentType: StreamSegmentTypeEnum = null