Compare commits

...

23 Commits

Author SHA1 Message Date
f3ea44755c Follow, unfollow mutation
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-27 12:22:22 -06:00
9b6559559c Use clearer names in the fields of GetUserRelationshipsMatching 2024-10-25 16:58:21 -06:00
2398216bf2 Replace GetUsernamesAndRelationships with GetUserRelationshipsMatching 2024-10-25 02:45:07 -06:00
d942b91d17 Merge pull request 'Update get user and following response' (#94) from kat/update-gql-v2 into master
Reviewed-on: #94
2024-10-25 01:28:03 -06:00
24d9b9225e Update get user and following response
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-25 01:27:14 -06:00
f6f6404302 Merge pull request 'Delete user with ids' (#92) from kat/remove-user-ids into master
Reviewed-on: #92
2024-10-25 01:08:04 -06:00
4609af726b Delete user with ids
All checks were successful
Tests / Tests (pull_request) Successful in 9s
2024-10-25 01:07:23 -06:00
c5919c90d0 User UserGQL in response 2024-10-25 00:31:29 -06:00
605adc3293 Merge pull request 'Update get usernames ids' (#90) from kat/update-get-username-ids into master
Reviewed-on: #90
2024-10-25 00:18:19 -06:00
b40554d38d Update get usernames ids
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-25 00:16:59 -06:00
194d7c66a0 Merge pull request 'Add subfields to usernames and following' (#89) from kat/usernames-following-response into master
Reviewed-on: #89
2024-10-24 23:50:28 -06:00
3adc301935 Add subfields to usernames and following
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-24 23:49:47 -06:00
9232c673e8 Merge pull request 'Return usernamesAndIds' (#88) from kat/update-usernames-and-following into master
Reviewed-on: #88
2024-10-24 23:46:27 -06:00
c2cb411469 Return usernamesAndIds
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-24 23:41:52 -06:00
44ddc732a1 Fix cache merge (#87)
Co-authored-by: Kat Huang <kkathuang@gmail.com>
Reviewed-on: #87
Co-authored-by: Volodymyr Smolianinov <voidozzer@gmail.com>
Co-committed-by: Volodymyr Smolianinov <voidozzer@gmail.com>
2024-10-24 13:50:52 -06:00
d6ef3e0487 Merge pull request 'Remove error default from operation' (#86) from loewy/remove-error-default into master
Reviewed-on: #86
2024-10-24 12:28:39 -06:00
8c191bdb90 Remove error default from operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-24 11:27:40 -07:00
8246699915 Merge pull request 'Return ShotGQL w/ updateShotAnnotations' (#84) from loewy/annotations-return into master
Reviewed-on: #84
Reviewed-by: Ivan Malison <ivanmalison@gmail.com>
2024-10-24 10:54:05 -06:00
de9d47c289 Merge branch 'master' into loewy/annotations-return
All checks were successful
Tests / Tests (pull_request) Successful in 8s
2024-10-24 10:53:02 -06:00
39b1808cab Merge pull request 'Create get usernames and followers operation' (#85) from kat/add-get-usernames-following-operation into master
Reviewed-on: #85
2024-10-24 09:19:38 -06:00
a78f9e7b9d return shot gql with an annotation update
All checks were successful
Tests / Tests (pull_request) Successful in 16s
2024-10-23 16:39:16 -07:00
f573026853 Create get usernames and followers operation
All checks were successful
Tests / Tests (pull_request) Successful in 15s
2024-10-23 17:04:25 -06:00
f98c98ecdd Merge pull request 'Add get usernames and following response' (#83) from kat/add-usernames-response into master
Reviewed-on: #83
2024-10-23 16:53:50 -06:00
6 changed files with 380 additions and 84 deletions

View File

@@ -2166,10 +2166,10 @@ export type Query = {
getShotsByIds: Array<ShotGql>;
getShotsWithMetadata: GetShotsResult;
getUser?: Maybe<UserGql>;
getUserRelationshipsMatching: UserRelationshipsResult;
getUserTags: Array<TagGql>;
getUserVideos: VideoHistoryGql;
getUsernames: Array<Scalars["String"]["output"]>;
getUsernamesAndFollowing: UsernamesAndFollowingResponse;
getVideo: VideoGql;
getVideoMakePercentageIntervals: Array<MakePercentageIntervalGql>;
getVideos: Array<VideoGql>;
@@ -2226,6 +2226,13 @@ export type QueryGetUserArgs = {
userId: Scalars["Int"]["input"];
};
export type QueryGetUserRelationshipsMatchingArgs = {
after?: InputMaybe<Scalars["String"]["input"]>;
limit?: InputMaybe<Scalars["Int"]["input"]>;
matchString?: InputMaybe<Scalars["String"]["input"]>;
userId: Scalars["Int"]["input"];
};
export type QueryGetUserVideosArgs = {
after?: InputMaybe<Scalars["String"]["input"]>;
filters?: InputMaybe<VideoFilterInput>;
@@ -2239,13 +2246,6 @@ export type QueryGetUsernamesArgs = {
matchString?: InputMaybe<Scalars["String"]["input"]>;
};
export type QueryGetUsernamesAndFollowingArgs = {
after?: InputMaybe<Scalars["String"]["input"]>;
limit?: InputMaybe<Scalars["Int"]["input"]>;
matchString?: InputMaybe<Scalars["String"]["input"]>;
userId: Scalars["Int"]["input"];
};
export type QueryGetVideoArgs = {
debuggingJson?: InputMaybe<Scalars["JSON"]["input"]>;
videoId: Scalars["Int"]["input"];
@@ -2412,15 +2412,6 @@ export type SuccessfulAddAddShotAnnotationErrors =
| AddShotAnnotationErrors
| SuccessfulAdd;
export type SuccessfulUpdate = {
__typename?: "SuccessfulUpdate";
value: Scalars["Boolean"]["output"];
};
export type SuccessfulUpdateUpdateShotAnnotationErrors =
| SuccessfulUpdate
| UpdateShotAnnotationErrors;
export type TagGql = {
__typename?: "TagGQL";
group?: Maybe<Scalars["String"]["output"]>;
@@ -2463,14 +2454,10 @@ export type UpdateAnnotationInputGql = {
notes?: InputMaybe<Scalars["String"]["input"]>;
};
export type UpdateShotAnnotationErrors = {
__typename?: "UpdateShotAnnotationErrors";
error?: Maybe<DoesNotOwnShotErr>;
};
export type UpdateShotAnnotationReturn = {
__typename?: "UpdateShotAnnotationReturn";
value: SuccessfulUpdateUpdateShotAnnotationErrors;
error?: Maybe<DoesNotOwnShotErr>;
shot?: Maybe<ShotGql>;
};
export type UploadLink = {
@@ -2521,11 +2508,11 @@ export type UserGql = {
activeVideoId?: Maybe<Scalars["Int"]["output"]>;
createdAt?: Maybe<Scalars["DateTime"]["output"]>;
fargoRating?: Maybe<Scalars["Int"]["output"]>;
firebaseUid: Scalars["String"]["output"];
followers?: Maybe<Array<Scalars["Int"]["output"]>>;
following?: Maybe<Array<Scalars["Int"]["output"]>>;
firebaseUid?: Maybe<Scalars["String"]["output"]>;
followers?: Maybe<Array<UserGql>>;
following?: Maybe<Array<UserGql>>;
id: Scalars["Int"]["output"];
isAdmin: Scalars["Boolean"]["output"];
isAdmin?: Maybe<Scalars["Boolean"]["output"]>;
profileImageUri?: Maybe<Scalars["String"]["output"]>;
updatedAt?: Maybe<Scalars["DateTime"]["output"]>;
username: Scalars["String"]["output"];
@@ -2536,11 +2523,17 @@ export type UserPlayTimeGql = {
totalSeconds: Scalars["Float"]["output"];
};
export type UsernamesAndFollowingResponse = {
__typename?: "UsernamesAndFollowingResponse";
followers: Array<Scalars["Int"]["output"]>;
following: Array<Scalars["Int"]["output"]>;
usernames: Array<Scalars["String"]["output"]>;
export type UserRelationship = {
__typename?: "UserRelationship";
toUser: UserGql;
toUserFollows: Scalars["Boolean"]["output"];
toUserIsFollowedBy: Scalars["Boolean"]["output"];
};
export type UserRelationshipsResult = {
__typename?: "UserRelationshipsResult";
inquiringUser: UserGql;
relationships: Array<UserRelationship>;
};
export type VideoFilterInput = {
@@ -2713,7 +2706,11 @@ export type GetFeedQuery = {
elapsedTime?: number | null;
tableSize: number;
owner?: { __typename?: "UserGQL"; username: string } | null;
stream?: { __typename?: "UploadStreamGQL"; isCompleted: boolean } | null;
stream?: {
__typename?: "UploadStreamGQL";
id: string;
isCompleted: boolean;
} | null;
tags: Array<{
__typename?: "VideoTag";
name: string;
@@ -2783,16 +2780,25 @@ export type UpdateShotAnnotationsMutation = {
__typename?: "Mutation";
updateShotAnnotations: {
__typename?: "UpdateShotAnnotationReturn";
value:
| { __typename?: "SuccessfulUpdate"; value: boolean }
| {
__typename?: "UpdateShotAnnotationErrors";
error?: {
__typename?: "DoesNotOwnShotErr";
shotId: number;
msg?: string | null;
} | null;
shot?: {
__typename?: "ShotGQL";
id: number;
annotations: Array<{
__typename?: "ShotAnnotationGQL";
shotId: number;
notes: string;
type: {
__typename?: "ShotAnnotationTypeGQL";
id: number;
name: string;
};
}>;
} | null;
error?: {
__typename?: "DoesNotOwnShotErr";
shotId: number;
msg?: string | null;
} | null;
};
};
@@ -3089,7 +3095,7 @@ export type EditProfileImageUriMutation = {
editProfileImageUri: {
__typename?: "UserGQL";
id: number;
firebaseUid: string;
firebaseUid?: string | null;
username: string;
profileImageUri?: string | null;
createdAt?: any | null;
@@ -3104,9 +3110,9 @@ export type GetLoggedInUserQuery = {
getLoggedInUser?: {
__typename?: "UserGQL";
id: number;
firebaseUid: string;
firebaseUid?: string | null;
username: string;
isAdmin: boolean;
isAdmin?: boolean | null;
profileImageUri?: string | null;
activeVideoId?: number | null;
createdAt?: any | null;
@@ -3134,6 +3140,26 @@ export type GetUsernamesQuery = {
getUsernames: Array<string>;
};
export type GetUserRelationshipsMatchingQueryVariables = Exact<{
userId: Scalars["Int"]["input"];
matchString: Scalars["String"]["input"];
limit?: InputMaybe<Scalars["Int"]["input"]>;
after?: InputMaybe<Scalars["String"]["input"]>;
}>;
export type GetUserRelationshipsMatchingQuery = {
__typename?: "Query";
getUserRelationshipsMatching: {
__typename?: "UserRelationshipsResult";
relationships: Array<{
__typename?: "UserRelationship";
toUserFollows: boolean;
toUserIsFollowedBy: boolean;
toUser: { __typename?: "UserGQL"; username: string; id: number };
}>;
};
};
export type GetUserTagsQueryVariables = Exact<{ [key: string]: never }>;
export type GetUserTagsQuery = {
@@ -3141,6 +3167,30 @@ export type GetUserTagsQuery = {
getUserTags: Array<{ __typename?: "TagGQL"; id: number; name: string }>;
};
export type FollowUserMutationVariables = Exact<{
followedUserId: Scalars["Int"]["input"];
}>;
export type FollowUserMutation = {
__typename?: "Mutation";
followUser: {
__typename?: "UserGQL";
followers?: Array<{ __typename?: "UserGQL"; username: string }> | null;
};
};
export type UnfollowUserMutationVariables = Exact<{
followedUserId: Scalars["Int"]["input"];
}>;
export type UnfollowUserMutation = {
__typename?: "Mutation";
unfollowUser: {
__typename?: "UserGQL";
followers?: Array<{ __typename?: "UserGQL"; username: string }> | null;
};
};
export type GetStreamMonitoringDetailsQueryVariables = Exact<{
videoId: Scalars["Int"]["input"];
debuggingJson?: InputMaybe<Scalars["JSON"]["input"]>;
@@ -3182,6 +3232,7 @@ export type GetStreamMonitoringDetailsQuery = {
} | null;
stream?: {
__typename?: "UploadStreamGQL";
id: string;
linksRequested: number;
uploadsCompleted: number;
segmentProcessingCursor: number;
@@ -3258,7 +3309,7 @@ export type GetVideoDetailsQuery = {
owner?: {
__typename?: "UserGQL";
id: number;
firebaseUid: string;
firebaseUid?: string | null;
username: string;
profileImageUri?: string | null;
} | null;
@@ -3395,6 +3446,7 @@ export type GetVideoQuery = {
}>;
stream?: {
__typename?: "UploadStreamGQL";
id: string;
streamSegmentType: StreamSegmentTypeEnum;
segments: Array<{
__typename?: "UploadSegmentGQL";
@@ -4038,6 +4090,7 @@ export const GetFeedDocument = gql`
elapsedTime
screenshotUri
stream {
id
isCompleted
}
tableSize
@@ -4355,17 +4408,21 @@ export const UpdateShotAnnotationsDocument = gql`
$annotations: [UpdateAnnotationInputGQL!]!
) {
updateShotAnnotations(shotId: $shotId, annotations: $annotations) {
value {
... on SuccessfulUpdate {
value
}
... on UpdateShotAnnotationErrors {
error {
shotId
msg
shot {
id
annotations {
shotId
type {
id
name
}
notes
}
}
error {
shotId
msg
}
}
}
`;
@@ -5100,6 +5157,99 @@ export type GetUsernamesQueryResult = Apollo.QueryResult<
GetUsernamesQuery,
GetUsernamesQueryVariables
>;
export const GetUserRelationshipsMatchingDocument = gql`
query getUserRelationshipsMatching(
$userId: Int!
$matchString: String!
$limit: Int = null
$after: String = null
) {
getUserRelationshipsMatching(
userId: $userId
matchString: $matchString
limit: $limit
after: $after
) {
relationships {
toUser {
username
id
}
toUserFollows
toUserIsFollowedBy
}
}
}
`;
/**
* __useGetUserRelationshipsMatchingQuery__
*
* To run a query within a React component, call `useGetUserRelationshipsMatchingQuery` and pass it any options that fit your needs.
* When your component renders, `useGetUserRelationshipsMatchingQuery` 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 } = useGetUserRelationshipsMatchingQuery({
* variables: {
* userId: // value for 'userId'
* matchString: // value for 'matchString'
* limit: // value for 'limit'
* after: // value for 'after'
* },
* });
*/
export function useGetUserRelationshipsMatchingQuery(
baseOptions: Apollo.QueryHookOptions<
GetUserRelationshipsMatchingQuery,
GetUserRelationshipsMatchingQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useQuery<
GetUserRelationshipsMatchingQuery,
GetUserRelationshipsMatchingQueryVariables
>(GetUserRelationshipsMatchingDocument, options);
}
export function useGetUserRelationshipsMatchingLazyQuery(
baseOptions?: Apollo.LazyQueryHookOptions<
GetUserRelationshipsMatchingQuery,
GetUserRelationshipsMatchingQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useLazyQuery<
GetUserRelationshipsMatchingQuery,
GetUserRelationshipsMatchingQueryVariables
>(GetUserRelationshipsMatchingDocument, options);
}
export function useGetUserRelationshipsMatchingSuspenseQuery(
baseOptions?: Apollo.SuspenseQueryHookOptions<
GetUserRelationshipsMatchingQuery,
GetUserRelationshipsMatchingQueryVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useSuspenseQuery<
GetUserRelationshipsMatchingQuery,
GetUserRelationshipsMatchingQueryVariables
>(GetUserRelationshipsMatchingDocument, options);
}
export type GetUserRelationshipsMatchingQueryHookResult = ReturnType<
typeof useGetUserRelationshipsMatchingQuery
>;
export type GetUserRelationshipsMatchingLazyQueryHookResult = ReturnType<
typeof useGetUserRelationshipsMatchingLazyQuery
>;
export type GetUserRelationshipsMatchingSuspenseQueryHookResult = ReturnType<
typeof useGetUserRelationshipsMatchingSuspenseQuery
>;
export type GetUserRelationshipsMatchingQueryResult = Apollo.QueryResult<
GetUserRelationshipsMatchingQuery,
GetUserRelationshipsMatchingQueryVariables
>;
export const GetUserTagsDocument = gql`
query GetUserTags {
getUserTags {
@@ -5171,6 +5321,110 @@ export type GetUserTagsQueryResult = Apollo.QueryResult<
GetUserTagsQuery,
GetUserTagsQueryVariables
>;
export const FollowUserDocument = gql`
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
followers {
username
}
}
}
`;
export type FollowUserMutationFn = Apollo.MutationFunction<
FollowUserMutation,
FollowUserMutationVariables
>;
/**
* __useFollowUserMutation__
*
* To run a mutation, you first call `useFollowUserMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useFollowUserMutation` 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 [followUserMutation, { data, loading, error }] = useFollowUserMutation({
* variables: {
* followedUserId: // value for 'followedUserId'
* },
* });
*/
export function useFollowUserMutation(
baseOptions?: Apollo.MutationHookOptions<
FollowUserMutation,
FollowUserMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<FollowUserMutation, FollowUserMutationVariables>(
FollowUserDocument,
options,
);
}
export type FollowUserMutationHookResult = ReturnType<
typeof useFollowUserMutation
>;
export type FollowUserMutationResult =
Apollo.MutationResult<FollowUserMutation>;
export type FollowUserMutationOptions = Apollo.BaseMutationOptions<
FollowUserMutation,
FollowUserMutationVariables
>;
export const UnfollowUserDocument = gql`
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
followers {
username
}
}
}
`;
export type UnfollowUserMutationFn = Apollo.MutationFunction<
UnfollowUserMutation,
UnfollowUserMutationVariables
>;
/**
* __useUnfollowUserMutation__
*
* To run a mutation, you first call `useUnfollowUserMutation` within a React component and pass it any options that fit your needs.
* When your component renders, `useUnfollowUserMutation` 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 [unfollowUserMutation, { data, loading, error }] = useUnfollowUserMutation({
* variables: {
* followedUserId: // value for 'followedUserId'
* },
* });
*/
export function useUnfollowUserMutation(
baseOptions?: Apollo.MutationHookOptions<
UnfollowUserMutation,
UnfollowUserMutationVariables
>,
) {
const options = { ...defaultOptions, ...baseOptions };
return Apollo.useMutation<
UnfollowUserMutation,
UnfollowUserMutationVariables
>(UnfollowUserDocument, options);
}
export type UnfollowUserMutationHookResult = ReturnType<
typeof useUnfollowUserMutation
>;
export type UnfollowUserMutationResult =
Apollo.MutationResult<UnfollowUserMutation>;
export type UnfollowUserMutationOptions = Apollo.BaseMutationOptions<
UnfollowUserMutation,
UnfollowUserMutationVariables
>;
export const GetStreamMonitoringDetailsDocument = gql`
query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
getVideo(videoId: $videoId, debuggingJson: $debuggingJson) {
@@ -5219,6 +5473,7 @@ export const GetStreamMonitoringDetailsDocument = gql`
}
}
stream {
id
linksRequested
uploadsCompleted
segmentProcessingCursor
@@ -5726,6 +5981,7 @@ export const GetVideoDocument = gql`
}
}
stream {
id
streamSegmentType
segments {
segmentIndex

View File

@@ -21,6 +21,7 @@ query GetFeed(
elapsedTime
screenshotUri
stream {
id
isCompleted
}
tableSize

View File

@@ -22,17 +22,21 @@ mutation UpdateShotAnnotations(
$annotations: [UpdateAnnotationInputGQL!]!
) {
updateShotAnnotations(shotId: $shotId, annotations: $annotations) {
value {
... on SuccessfulUpdate {
value
}
... on UpdateShotAnnotationErrors {
error {
shotId
msg
shot {
id
annotations {
shotId
type {
id
name
}
notes
}
}
error {
shotId
msg
}
}
}

View File

@@ -57,9 +57,48 @@ query getUsernames(
getUsernames(matchString: $matchString, limit: $limit, after: $after)
}
query getUserRelationshipsMatching(
$userId: Int!
$matchString: String!
$limit: Int = null
$after: String = null
) {
getUserRelationshipsMatching(
userId: $userId
matchString: $matchString
limit: $limit
after: $after
) {
relationships {
toUser {
username
id
}
toUserFollows
toUserIsFollowedBy
}
}
}
query GetUserTags {
getUserTags {
id
name
}
}
mutation followUser($followedUserId: Int!) {
followUser(followedUserId: $followedUserId) {
followers {
username
}
}
}
mutation unfollowUser($followedUserId: Int!) {
unfollowUser(followedUserId: $followedUserId) {
followers {
username
}
}
}

View File

@@ -45,6 +45,7 @@ query GetStreamMonitoringDetails($videoId: Int!, $debuggingJson: JSON) {
}
}
stream {
id
linksRequested
uploadsCompleted
segmentProcessingCursor
@@ -194,6 +195,7 @@ query GetVideo($videoId: Int!) {
}
}
stream {
id
streamSegmentType
segments {
segmentIndex

View File

@@ -35,12 +35,12 @@ type Query {
limit: Int = null
after: String = null
): [String!]!
getUsernamesAndFollowing(
getUserRelationshipsMatching(
userId: Int!
matchString: String = null
limit: Int = 100
after: String = null
): UsernamesAndFollowingResponse!
): UserRelationshipsResult!
getPlayTime(userId: Int!): UserPlayTimeGQL!
getUserVideos(
userId: Int = null
@@ -341,16 +341,16 @@ type SerializedShotPathsGQL {
type UserGQL {
id: Int!
firebaseUid: String!
firebaseUid: String
username: String!
isAdmin: Boolean!
isAdmin: Boolean
fargoRating: Int
activeVideoId: Int
profileImageUri: String
createdAt: DateTime
updatedAt: DateTime
following: [Int!]
followers: [Int!]
following: [UserGQL!]
followers: [UserGQL!]
}
type ShotAnnotationGQL {
@@ -554,10 +554,15 @@ input CreatedAfter @oneOf {
createdAt: DateTime
}
type UsernamesAndFollowingResponse {
usernames: [String!]!
following: [Int!]!
followers: [Int!]!
type UserRelationshipsResult {
inquiringUser: UserGQL!
relationships: [UserRelationship!]!
}
type UserRelationship {
toUser: UserGQL!
toUserFollows: Boolean!
toUserIsFollowedBy: Boolean!
}
type UserPlayTimeGQL {
@@ -662,18 +667,7 @@ type OtherErrorNeedsNote {
}
type UpdateShotAnnotationReturn {
value: SuccessfulUpdateUpdateShotAnnotationErrors!
}
union SuccessfulUpdateUpdateShotAnnotationErrors =
SuccessfulUpdate
| UpdateShotAnnotationErrors
type SuccessfulUpdate {
value: Boolean!
}
type UpdateShotAnnotationErrors {
shot: ShotGQL
error: DoesNotOwnShotErr
}