Add id to saving request and make both id and url optional

This commit is contained in:
Hongbo Wu
2023-03-17 17:56:38 +08:00
parent cad4afbe8c
commit f348ec7100
6 changed files with 44 additions and 15 deletions

View File

@ -335,13 +335,15 @@ export const getPageByParam = async <K extends keyof ParamSet>(
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,

View File

@ -1752,7 +1752,8 @@ export type QueryArticleArgs = {
export type QueryArticleSavingRequestArgs = {
url: Scalars['String'];
id?: InputMaybe<Scalars['ID']>;
url?: InputMaybe<Scalars['String']>;
};
@ -5079,7 +5080,7 @@ export type ProfileResolvers<ContextType = ResolverContext, ParentType extends R
export type QueryResolvers<ContextType = ResolverContext, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
apiKeys?: Resolver<ResolversTypes['ApiKeysResult'], ParentType, ContextType>;
article?: Resolver<ResolversTypes['ArticleResult'], ParentType, ContextType, RequireFields<QueryArticleArgs, 'slug' | 'username'>>;
articleSavingRequest?: Resolver<ResolversTypes['ArticleSavingRequestResult'], ParentType, ContextType, RequireFields<QueryArticleSavingRequestArgs, 'url'>>;
articleSavingRequest?: Resolver<ResolversTypes['ArticleSavingRequestResult'], ParentType, ContextType, Partial<QueryArticleSavingRequestArgs>>;
articles?: Resolver<ResolversTypes['ArticlesResult'], ParentType, ContextType, Partial<QueryArticlesArgs>>;
deviceTokens?: Resolver<ResolversTypes['DeviceTokensResult'], ParentType, ContextType>;
feedArticles?: Resolver<ResolversTypes['FeedArticlesResult'], ParentType, ContextType, Partial<QueryFeedArticlesArgs>>;

View File

@ -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!

View File

@ -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] }
}

View File

@ -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!

View File

@ -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)