From f348ec71004bf11f1ab9e7f83ddee03998e52d6a Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Fri, 17 Mar 2023 17:56:38 +0800 Subject: [PATCH] Add id to saving request and make both id and url optional --- packages/api/src/elastic/pages.ts | 10 +++--- packages/api/src/generated/graphql.ts | 5 +-- packages/api/src/generated/schema.graphql | 2 +- .../resolvers/article_saving_request/index.ts | 9 ++++-- packages/api/src/schema.ts | 2 +- .../resolvers/article_saving_request.test.ts | 31 ++++++++++++++++--- 6 files changed, 44 insertions(+), 15 deletions(-) diff --git a/packages/api/src/elastic/pages.ts b/packages/api/src/elastic/pages.ts index 2ff88cfe3..0f866b700 100644 --- a/packages/api/src/elastic/pages.ts +++ b/packages/api/src/elastic/pages.ts @@ -335,13 +335,15 @@ export const getPageByParam = async ( const params = { query: { bool: { - filter: Object.keys(param).map((key) => { - return { + filter: Object.keys(param) + .filter( + (key) => param[key as K] !== undefined && param[key as K] !== null + ) // filter out undefined and null values + .map((key) => ({ term: { [key]: param[key as K], }, - } - }), + })), }, }, size: 1, diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index ae279e18a..23c756a50 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1752,7 +1752,8 @@ export type QueryArticleArgs = { export type QueryArticleSavingRequestArgs = { - url: Scalars['String']; + id?: InputMaybe; + url?: InputMaybe; }; @@ -5079,7 +5080,7 @@ export type ProfileResolvers = { apiKeys?: Resolver; article?: Resolver>; - articleSavingRequest?: Resolver>; + articleSavingRequest?: Resolver>; articles?: Resolver>; deviceTokens?: Resolver; feedArticles?: Resolver>; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 895e67713..d4b123d73 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1246,7 +1246,7 @@ type Profile { type Query { apiKeys: ApiKeysResult! article(format: String, slug: String!, username: String!): ArticleResult! - articleSavingRequest(url: String!): ArticleSavingRequestResult! + articleSavingRequest(id: ID, url: String): ArticleSavingRequestResult! articles(after: String, first: Int, includePending: Boolean, query: String, sharedOnly: Boolean, sort: SortParams): ArticlesResult! deviceTokens: DeviceTokensResult! feedArticles(after: String, first: Int, sharedByUser: ID, sort: SortParams): FeedArticlesResult! diff --git a/packages/api/src/resolvers/article_saving_request/index.ts b/packages/api/src/resolvers/article_saving_request/index.ts index 38049bf91..ea7008fe6 100644 --- a/packages/api/src/resolvers/article_saving_request/index.ts +++ b/packages/api/src/resolvers/article_saving_request/index.ts @@ -56,8 +56,13 @@ export const articleSavingRequestResolver = authorized< ArticleSavingRequestSuccess, ArticleSavingRequestError, QueryArticleSavingRequestArgs ->(async (_, { url }, { models, claims }) => { - const page = await getPageByParam({ url, userId: claims.uid }) +>(async (_, { id, url }, { models, claims }) => { + const params = { + _id: id || undefined, + url: url || undefined, + userId: claims.uid, + } + const page = await getPageByParam(params) if (!page) { return { errorCodes: [ArticleSavingRequestErrorCode.NotFound] } } diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 1b6b493a4..22828bbc1 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -2526,7 +2526,7 @@ const schema = gql` getFollowers(userId: ID): GetFollowersResult! getFollowing(userId: ID): GetFollowingResult! getUserPersonalization: GetUserPersonalizationResult! - articleSavingRequest(url: String!): ArticleSavingRequestResult! + articleSavingRequest(id: ID, url: String): ArticleSavingRequestResult! newsletterEmails: NewsletterEmailsResult! reminder(linkId: ID!): ReminderResult! labels: LabelsResult! diff --git a/packages/api/test/resolvers/article_saving_request.test.ts b/packages/api/test/resolvers/article_saving_request.test.ts index 10e533ca8..2d38bf026 100644 --- a/packages/api/test/resolvers/article_saving_request.test.ts +++ b/packages/api/test/resolvers/article_saving_request.test.ts @@ -16,9 +16,17 @@ import * as createTask from '../../src/utils/createTask' import { createTestUser, deleteTestUser } from '../db' import { graphqlRequest, request } from '../util' -const articleSavingRequestQuery = (url: string) => ` +const articleSavingRequestQuery = ({ + id, + url, +}: { + id?: string + url?: string +}) => ` query { - articleSavingRequest(url: "${url}") { + articleSavingRequest(id: ${id ? `"${id}"` : null}, url: ${ + url ? `"${url}"` : null +}) { ... on ArticleSavingRequestSuccess { articleSavingRequest { id @@ -117,19 +125,32 @@ describe('ArticleSavingRequest API', () => { describe('articleSavingRequest', () => { let url: string + let id: string before(async () => { url = 'https://blog.omnivore.app/2' // create article saving request - await graphqlRequest( + const res = await graphqlRequest( createArticleSavingRequestMutation(url), authToken ).expect(200) + id = res.body.data.createArticleSavingRequest.articleSavingRequest.id }) it('returns the article saving request if exists', async () => { const res = await graphqlRequest( - articleSavingRequestQuery(url), + articleSavingRequestQuery({ url }), + authToken + ).expect(200) + + expect( + res.body.data.articleSavingRequest.articleSavingRequest.status + ).to.eql(ArticleSavingRequestStatus.Processing) + }) + + it('returns the article saving request by id', async () => { + const res = await graphqlRequest( + articleSavingRequestQuery({ id }), authToken ).expect(200) @@ -140,7 +161,7 @@ describe('ArticleSavingRequest API', () => { it('returns not_found if not exists', async () => { const res = await graphqlRequest( - articleSavingRequestQuery('invalid-id'), + articleSavingRequestQuery({ id: 'invalid-id' }), authToken ).expect(200)