Procházet zdrojové kódy

propagate latest orion changes

Klaudiusz Dembler před 4 roky
rodič
revize
2f2e4e5154

+ 3 - 3
src/api/client/resolvers.ts

@@ -1,7 +1,7 @@
 import { GraphQLSchema } from 'graphql'
 import { delegateToSchema } from '@graphql-tools/delegate'
 import type { IResolvers, ISchemaLevelResolver } from '@graphql-tools/utils'
-import { TransformOrionViewsField, ORION_VIEWS_FIELD_NAME, RemoveQueryNodeViewsField } from './transforms'
+import { TransformOrionViewsField, ORION_VIEWS_QUERY_NAME, RemoveQueryNodeViewsField } from './transforms'
 
 const createResolverWithoutVideoViewsField = (
   schema: GraphQLSchema,
@@ -39,9 +39,9 @@ export const queryNodeStitchingResolvers = (
         return await delegateToSchema({
           schema: orionSchema,
           operation: 'query',
-          fieldName: ORION_VIEWS_FIELD_NAME,
+          fieldName: ORION_VIEWS_QUERY_NAME,
           args: {
-            videoID: parent.id,
+            videoId: parent.id,
           },
           context,
           info,

+ 1 - 1
src/api/client/transforms/index.ts

@@ -1,2 +1,2 @@
-export { ORION_VIEWS_FIELD_NAME, TransformOrionViewsField } from './orionViews'
+export { ORION_VIEWS_QUERY_NAME, TransformOrionViewsField } from './orionViews'
 export { RemoveQueryNodeViewsField } from './queryNodeViews'

+ 3 - 3
src/api/client/transforms/orionViews.ts

@@ -30,7 +30,7 @@ const VIDEO_INFO_SELECTION_SET: SelectionSetNode = {
   ],
 }
 
-export const ORION_VIEWS_FIELD_NAME = 'videoViews'
+export const ORION_VIEWS_QUERY_NAME = 'videoViews'
 
 // Transform a request to expect VideoViewsInfo return type instead of an Int
 export const TransformOrionViewsField: Transform = {
@@ -44,7 +44,7 @@ export const TransformOrionViewsField: Transform = {
             selectionSet: {
               ...definition.selectionSet,
               selections: definition.selectionSet.selections.map((selection) => {
-                if (selection.kind === 'Field' && selection.name.value === ORION_VIEWS_FIELD_NAME) {
+                if (selection.kind === 'Field' && selection.name.value === ORION_VIEWS_QUERY_NAME) {
                   return {
                     ...selection,
                     selectionSet: VIDEO_INFO_SELECTION_SET,
@@ -66,7 +66,7 @@ export const TransformOrionViewsField: Transform = {
       throw new OrionError(result.errors)
     }
 
-    const views = result?.data?.[ORION_VIEWS_FIELD_NAME]?.views || 0
+    const views = result?.data?.[ORION_VIEWS_QUERY_NAME]?.views || 0
     const data = {
       videoViews: views,
     }

+ 3 - 2
src/api/queries/__generated__/AddVideoView.ts

@@ -8,7 +8,7 @@
 // ====================================================
 
 export interface AddVideoView_addVideoView {
-  __typename: "VideoViewsInfo";
+  __typename: "EntityViewsInfo";
   id: string;
   views: number;
 }
@@ -18,5 +18,6 @@ export interface AddVideoView {
 }
 
 export interface AddVideoViewVariables {
-  id: string;
+  videoId: string;
+  channelId: string;
 }

+ 1 - 1
src/api/queries/__generated__/GetFeaturedVideos.ts

@@ -27,7 +27,7 @@ export type GetFeaturedVideos_featuredVideos_video_media_location = GetFeaturedV
 export interface GetFeaturedVideos_featuredVideos_video_media {
   __typename: "VideoMedia";
   id: string;
-  pixelHeight: number | null;
+  pixelHeight: number;
   pixelWidth: number;
   location: GetFeaturedVideos_featuredVideos_video_media_location;
 }

+ 1 - 1
src/api/queries/__generated__/GetNewestVideos.ts

@@ -27,7 +27,7 @@ export type GetNewestVideos_videosConnection_edges_node_media_location = GetNewe
 export interface GetNewestVideos_videosConnection_edges_node_media {
   __typename: "VideoMedia";
   id: string;
-  pixelHeight: number | null;
+  pixelHeight: number;
   pixelWidth: number;
   location: GetNewestVideos_videosConnection_edges_node_media_location;
 }

+ 1 - 1
src/api/queries/__generated__/GetVideo.ts

@@ -27,7 +27,7 @@ export type GetVideo_video_media_location = GetVideo_video_media_location_HttpMe
 export interface GetVideo_video_media {
   __typename: "VideoMedia";
   id: string;
-  pixelHeight: number | null;
+  pixelHeight: number;
   pixelWidth: number;
   location: GetVideo_video_media_location;
 }

+ 1 - 1
src/api/queries/__generated__/Search.ts

@@ -27,7 +27,7 @@ export type Search_search_item_Video_media_location = Search_search_item_Video_m
 export interface Search_search_item_Video_media {
   __typename: "VideoMedia";
   id: string;
-  pixelHeight: number | null;
+  pixelHeight: number;
   pixelWidth: number;
   location: Search_search_item_Video_media_location;
 }

+ 1 - 1
src/api/queries/__generated__/VideoFields.ts

@@ -27,7 +27,7 @@ export type VideoFields_media_location = VideoFields_media_location_HttpMediaLoc
 export interface VideoFields_media {
   __typename: "VideoMedia";
   id: string;
-  pixelHeight: number | null;
+  pixelHeight: number;
   pixelWidth: number;
   location: VideoFields_media_location;
 }

+ 1 - 1
src/api/queries/__generated__/VideoMediaFields.ts

@@ -22,7 +22,7 @@ export type VideoMediaFields_location = VideoMediaFields_location_HttpMediaLocat
 export interface VideoMediaFields {
   __typename: "VideoMedia";
   id: string;
-  pixelHeight: number | null;
+  pixelHeight: number;
   pixelWidth: number;
   location: VideoMediaFields_location;
 }

+ 2 - 2
src/api/queries/videos.ts

@@ -108,8 +108,8 @@ export const GET_VIDEO = gql`
 `
 
 export const ADD_VIDEO_VIEW = gql`
-  mutation AddVideoView($id: ID!) {
-    addVideoView(videoID: $id) {
+  mutation AddVideoView($videoId: ID!, $channelId: ID!) {
+    addVideoView(videoId: $videoId, channelId: $channelId) {
       id
       views
     }

+ 11 - 2
src/api/schemas/extendedQueryNode.graphql

@@ -228,7 +228,12 @@ enum FeaturedVideoOrderByInput {
   createdAt_DESC
 }
 
-type VideoViewsInfo {
+type ChannelFollowsInfo {
+  follows: Int!
+  id: ID!
+}
+
+type EntityViewsInfo {
   id: ID!
   views: Int!
 }
@@ -265,5 +270,9 @@ type Query {
 }
 
 type Mutation {
-  addVideoView(videoID: ID!): VideoViewsInfo!
+  addVideoView(channelId: ID!, videoId: ID!): EntityViewsInfo!
+
+  followChannel(channelId: ID!): ChannelFollowsInfo!
+
+  unfollowChannel(channelId: ID!): ChannelFollowsInfo!
 }

+ 43 - 8
src/api/schemas/orion.graphql

@@ -3,26 +3,61 @@
 # !!!   DO NOT MODIFY THIS FILE BY YOURSELF   !!!
 # -----------------------------------------------
 
+type ChannelFollowsInfo {
+  follows: Int!
+  id: ID!
+}
+
+type EntityViewsInfo {
+  id: ID!
+  views: Int!
+}
+
 type Mutation {
   """
   Add a single view to the target video's count
   """
-  addVideoView(videoID: ID!): VideoViewsInfo!
+  addVideoView(channelId: ID!, videoId: ID!): EntityViewsInfo!
+
+  """
+  Add a single follow to the target channel
+  """
+  followChannel(channelId: ID!): ChannelFollowsInfo!
+
+  """
+  Remove a single follow from the target channel
+  """
+  unfollowChannel(channelId: ID!): ChannelFollowsInfo!
 }
 
 type Query {
+  """
+  Get follows counts for a list of channels
+  """
+  batchedChannelFollows(channelIdList: [ID!]!): [ChannelFollowsInfo]!
+
+  """
+  Get views counts for a list of channels
+  """
+  batchedChannelsViews(channelIdList: [ID!]!): [EntityViewsInfo]!
+
   """
   Get views counts for a list of videos
   """
-  batchedVideoViews(videoIDList: [ID!]!): [VideoViewsInfo]!
+  batchedVideoViews(videoIdList: [ID!]!): [EntityViewsInfo]!
 
   """
-  Get views count for a single video
+  Get follows count for a single channel
   """
-  videoViews(videoID: ID!): VideoViewsInfo
-}
+  channelFollows(channelId: ID!): ChannelFollowsInfo
 
-type VideoViewsInfo {
-  id: ID!
-  views: Int!
+  """
+  Get views count for a single channel
+  """
+  channelViews(channelId: ID!): EntityViewsInfo
+
+  """
+  Get views count for a single video
+  """
+  videoViews(videoId: ID!): EntityViewsInfo
 }

+ 2 - 2
src/mocking/server/data.ts

@@ -66,7 +66,7 @@ export const createMockData = (server: MirageJSServer) => {
       license: licenseEntities[idx % licenseEntities.length],
     })
 
-    server.create('VideoViewsInfo', {
+    server.create('EntityViewsInfo', {
       id: video.id,
       views: video.views,
     })
@@ -109,7 +109,7 @@ const createCoverVideoData = (server: MirageJSServer, categories: unknown[]) =>
     license: licenseEntity,
   })
 
-  server.create('VideoViewsInfo', {
+  server.create('EntityViewsInfo', {
     id: video.id,
     views: video.views,
   })

+ 6 - 5
src/views/VideoView/VideoView.tsx

@@ -30,7 +30,8 @@ const VideoView: React.FC<RouteComponentProps> = () => {
   })
   const [addVideoView] = useMutation<AddVideoView, AddVideoViewVariables>(ADD_VIDEO_VIEW)
 
-  const videoID = data?.video?.id
+  const videoId = data?.video?.id
+  const channelId = data?.video?.channel.id
 
   const [playing, setPlaying] = useState<boolean>(true)
   const handleUserKeyPress = useCallback((event: Event) => {
@@ -50,16 +51,16 @@ const VideoView: React.FC<RouteComponentProps> = () => {
   }, [handleUserKeyPress])
 
   useEffect(() => {
-    if (!videoID) {
+    if (!videoId || !channelId) {
       return
     }
     addVideoView({
-      variables: { id: videoID },
+      variables: { videoId, channelId },
       update: (cache, mutationResult) => {
         cache.modify({
           id: cache.identify({
             __typename: 'Video',
-            id: videoID,
+            id: videoId,
           }),
           fields: {
             views: () => mutationResult.data?.addVideoView.views,
@@ -69,7 +70,7 @@ const VideoView: React.FC<RouteComponentProps> = () => {
     }).catch((error) => {
       console.warn('Failed to increase video views', { error })
     })
-  }, [addVideoView, videoID])
+  }, [addVideoView, videoId, channelId])
 
   if (error) {
     throw error