From 0892d9e7e6fa7cf53bf9365e68bb3b679d504738 Mon Sep 17 00:00:00 2001 From: Jackson Harper Date: Tue, 6 Dec 2022 17:44:53 +0800 Subject: [PATCH] Add user and note to Recommendation type --- packages/api/src/elastic/types.ts | 9 ++++ packages/api/src/generated/graphql.ts | 24 +++++++++++ packages/api/src/generated/schema.graphql | 10 +++++ .../src/resolvers/recommendations/index.ts | 13 +++++- packages/api/src/schema.ts | 10 +++++ .../db/elastic_migrations/index_settings.json | 36 ++++++++++++++-- .../queries/useGetLibraryItemsQuery.tsx | 42 ++++++++++++++++--- 7 files changed, 132 insertions(+), 12 deletions(-) diff --git a/packages/api/src/elastic/types.ts b/packages/api/src/elastic/types.ts index de2a0dd58..ade5f5f1f 100644 --- a/packages/api/src/elastic/types.ts +++ b/packages/api/src/elastic/types.ts @@ -198,9 +198,18 @@ export interface Highlight { highlightPositionAnchorIndex?: number | null } +export interface RecommendingUser { + userId: string + name: string + username: string + profileImageURL: string | null +} + export interface Recommendation { id: string name: string + note: string | null + user: RecommendingUser recommendedAt: Date } diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index d254c1547..c68407531 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1787,6 +1787,7 @@ export enum RecommendErrorCode { export type RecommendInput = { groupIds: Array; + note?: InputMaybe; pageId: Scalars['ID']; }; @@ -1801,7 +1802,9 @@ export type Recommendation = { __typename?: 'Recommendation'; id: Scalars['ID']; name: Scalars['String']; + note?: Maybe; recommendedAt: Scalars['Date']; + user: RecommendingUser; }; export type RecommendationGroup = { @@ -1815,6 +1818,14 @@ export type RecommendationGroup = { updatedAt: Scalars['Date']; }; +export type RecommendingUser = { + __typename?: 'RecommendingUser'; + name: Scalars['String']; + profileImageURL?: Maybe; + userId: Scalars['String']; + username: Scalars['String']; +}; + export type Reminder = { __typename?: 'Reminder'; archiveUntil: Scalars['Boolean']; @@ -3230,6 +3241,7 @@ export type ResolversTypes = { RecommendSuccess: ResolverTypeWrapper; Recommendation: ResolverTypeWrapper; RecommendationGroup: ResolverTypeWrapper; + RecommendingUser: ResolverTypeWrapper; Reminder: ResolverTypeWrapper; ReminderError: ResolverTypeWrapper; ReminderErrorCode: ReminderErrorCode; @@ -3631,6 +3643,7 @@ export type ResolversParentTypes = { RecommendSuccess: RecommendSuccess; Recommendation: Recommendation; RecommendationGroup: RecommendationGroup; + RecommendingUser: RecommendingUser; Reminder: Reminder; ReminderError: ReminderError; ReminderResult: ResolversParentTypes['ReminderError'] | ResolversParentTypes['ReminderSuccess']; @@ -4836,7 +4849,9 @@ export type RecommendSuccessResolvers = { id?: Resolver; name?: Resolver; + note?: Resolver, ParentType, ContextType>; recommendedAt?: Resolver; + user?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }; @@ -4851,6 +4866,14 @@ export type RecommendationGroupResolvers; }; +export type RecommendingUserResolvers = { + name?: Resolver; + profileImageURL?: Resolver, ParentType, ContextType>; + userId?: Resolver; + username?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type ReminderResolvers = { archiveUntil?: Resolver; id?: Resolver; @@ -5718,6 +5741,7 @@ export type Resolvers = { RecommendSuccess?: RecommendSuccessResolvers; Recommendation?: RecommendationResolvers; RecommendationGroup?: RecommendationGroupResolvers; + RecommendingUser?: RecommendingUserResolvers; Reminder?: ReminderResolvers; ReminderError?: ReminderErrorResolvers; ReminderResult?: ReminderResultResolvers; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 00e4a1c98..7178aa080 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1250,6 +1250,7 @@ enum RecommendErrorCode { input RecommendInput { groupIds: [ID!]! + note: String pageId: ID! } @@ -1262,7 +1263,9 @@ type RecommendSuccess { type Recommendation { id: ID! name: String! + note: String recommendedAt: Date! + user: RecommendingUser! } type RecommendationGroup { @@ -1275,6 +1278,13 @@ type RecommendationGroup { updatedAt: Date! } +type RecommendingUser { + name: String! + profileImageURL: String + userId: String! + username: String! +} + type Reminder { archiveUntil: Boolean! id: ID! diff --git a/packages/api/src/resolvers/recommendations/index.ts b/packages/api/src/resolvers/recommendations/index.ts index b9083844c..d86d45bde 100644 --- a/packages/api/src/resolvers/recommendations/index.ts +++ b/packages/api/src/resolvers/recommendations/index.ts @@ -146,8 +146,9 @@ export const recommendResolver = authorized< }) try { - const user = await getRepository(User).findOneBy({ - id: uid, + const user = await getRepository(User).findOne({ + where: { id: uid }, + relations: ['profile'], }) if (!user) { return { @@ -185,6 +186,13 @@ export const recommendResolver = authorized< page.id, { ...group, + note: input.note ?? null, + user: { + userId: user.id, + name: user.name, + username: user.profile.username, + profileImageURL: user.profile.pictureUrl, + }, recommendedAt: new Date(), }, auth @@ -198,6 +206,7 @@ export const recommendResolver = authorized< taskNames, } } catch (error) { + console.log('Error recommending: ', error) log.error('Error recommending', { error, labels: { diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index fc1267142..a281a70de 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -329,10 +329,19 @@ const schema = gql` updatedAt: Date! } + type RecommendingUser { + userId: String! + name: String! + username: String! + profileImageURL: String + } + type Recommendation { id: ID! name: String! + user: RecommendingUser recommendedAt: Date! + note: String } type Article { @@ -2194,6 +2203,7 @@ const schema = gql` input RecommendInput { pageId: ID! groupIds: [ID!]! + note: String } union RecommendResult = RecommendSuccess | RecommendError diff --git a/packages/db/elastic_migrations/index_settings.json b/packages/db/elastic_migrations/index_settings.json index 5d4018d4b..8cd30e7dc 100644 --- a/packages/db/elastic_migrations/index_settings.json +++ b/packages/db/elastic_migrations/index_settings.json @@ -7,13 +7,19 @@ "analyzer": { "strip_html_analyzer": { "tokenizer": "standard", - "char_filter": ["html_strip"], - "filter": ["lowercase"] + "char_filter": [ + "html_strip" + ], + "filter": [ + "lowercase" + ] } }, "normalizer": { "lowercase_normalizer": { - "filter": ["lowercase"] + "filter": [ + "lowercase" + ] } } } @@ -173,9 +179,31 @@ }, "recommendedAt": { "type": "date" + }, + "note": { + "type": "keyword" + }, + "user": { + "type": "nested", + "properties": { + "userID": { + "type": "keyword" + }, + "name": { + "type": "keyword", + "normalizer": "lowercase_normalizer" + }, + "username": { + "type": "keyword", + "normalizer": "lowercase_normalizer" + }, + "profileImageURL": { + "type": "keyword" + } + } } } } } } -} +} \ No newline at end of file diff --git a/packages/web/lib/networking/queries/useGetLibraryItemsQuery.tsx b/packages/web/lib/networking/queries/useGetLibraryItemsQuery.tsx index 001842abe..287ee1a43 100644 --- a/packages/web/lib/networking/queries/useGetLibraryItemsQuery.tsx +++ b/packages/web/lib/networking/queries/useGetLibraryItemsQuery.tsx @@ -80,8 +80,24 @@ export type LibraryItemNode = { state: State pageType: PageType siteName?: string - subscription?: string, + subscription?: string readAt?: string + recommendedBy?: Recommendation[] +} + +export type Recommendation = { + id: string + name: string + note?: string + user?: RecommendingUser + recommendedAt: Date +} + +export type RecommendingUser = { + userId: string + name: string + username: string + profileImageURL?: string } export type PageInfo = { @@ -135,6 +151,18 @@ export function useGetLibraryItemsQuery({ siteName subscription readAt + recommendedBy { + id + name + note + user { + userId + name + username + profileImageURL + } + recommendedAt + } } } pageInfo { @@ -198,7 +226,7 @@ export function useGetLibraryItemsQuery({ } const getIndexOf = (page: LibraryItems, item: LibraryItem) => { - return page.edges.findIndex(i => i.node.id === item.node.id) + return page.edges.findIndex((i) => i.node.id === item.node.id) } const performActionOnItem = async ( @@ -329,7 +357,9 @@ export function useGetLibraryItemsQuery({ }) unsubscribeMutation(item.node.subscription).then((res) => { if (res) { - showSuccessToast('Unsubscribed successfully', { position: 'bottom-right' }) + showSuccessToast('Unsubscribed successfully', { + position: 'bottom-right', + }) } else { showErrorToast('Error unsubscribing', { position: 'bottom-right', @@ -337,8 +367,8 @@ export function useGetLibraryItemsQuery({ } }) } - case 'update-item': - updateData(item) + case 'update-item': + updateData(item) break case 'refresh': await mutate() @@ -353,6 +383,6 @@ export function useGetLibraryItemsQuery({ performActionOnItem, size, setSize, - mutate + mutate, } }