diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 073ef4242..304aeacdb 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1354,6 +1354,7 @@ export type QuerySubscriptionsArgs = { export type QueryTypeaheadArgs = { query: Scalars['String']; + size?: InputMaybe; }; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index f5fdbb0c7..6b405eb34 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -924,7 +924,7 @@ type Query { sendInstallInstructions: SendInstallInstructionsResult! sharedArticle(selectedHighlightId: String, slug: String!, username: String!): SharedArticleResult! subscriptions(sort: SortParams): SubscriptionsResult! - typeahead(query: String!): TypeaheadResult! + typeahead(query: String!, size: Int): TypeaheadResult! user(userId: ID, username: String): UserResult! users: UsersResult! validateUsername(username: String!): Boolean! diff --git a/packages/api/src/resolvers/article/index.ts b/packages/api/src/resolvers/article/index.ts index 679757f33..beacdd026 100644 --- a/packages/api/src/resolvers/article/index.ts +++ b/packages/api/src/resolvers/article/index.ts @@ -22,6 +22,7 @@ import { QueryArticleArgs, QueryArticlesArgs, QuerySearchArgs, + QueryTypeaheadArgs, ResolverFn, SaveArticleReadingProgressError, SaveArticleReadingProgressErrorCode, @@ -35,6 +36,9 @@ import { SetShareArticleError, SetShareArticleErrorCode, SetShareArticleSuccess, + TypeaheadError, + TypeaheadErrorCode, + TypeaheadSuccess, } from '../../generated/graphql' /* eslint-disable @typescript-eslint/no-explicit-any */ import { Merge } from '../../util' @@ -82,6 +86,7 @@ import { deletePage, getPageById, getPageByParam, + searchAsYouType, searchPages, updatePage, } from '../../elastic/pages' @@ -889,3 +894,25 @@ export const searchResolver = authorized< }, } }) + +export const typeaheadResolver = authorized< + TypeaheadSuccess, + TypeaheadError, + QueryTypeaheadArgs +>(async (_obj, { query, size }, { claims }) => { + if (!claims?.uid) { + return { errorCodes: [TypeaheadErrorCode.Unauthorized] } + } + + analytics.track({ + userId: claims.uid, + event: 'typeahead', + properties: { + env: env.server.apiEnv, + query, + size, + }, + }) + + return { items: await searchAsYouType(claims.uid, query, size || undefined) } +}) diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index f0aea7a44..73c938da4 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -76,6 +76,7 @@ import { signupResolver, subscribeResolver, subscriptionsResolver, + typeaheadResolver, unsubscribeResolver, updateHighlightResolver, updateLabelResolver, @@ -188,6 +189,7 @@ export const functionResolvers = { webhooks: webhooksResolver, webhook: webhookResolver, apiKeys: apiKeysResolver, + typeahead: typeaheadResolver, }, User: { async sharedArticles( @@ -589,4 +591,5 @@ export const functionResolvers = { ...resultResolveTypeResolver('ApiKeys'), ...resultResolveTypeResolver('RevokeApiKey'), ...resultResolveTypeResolver('DeleteAccount'), + ...resultResolveTypeResolver('Typeahead'), } diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index def1f34a9..8afdee59a 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -1896,7 +1896,7 @@ const schema = gql` webhooks: WebhooksResult! webhook(id: ID!): WebhookResult! apiKeys: ApiKeysResult! - typeahead(query: String!): TypeaheadResult! + typeahead(query: String!, size: Int): TypeaheadResult! } `