From f2c468f906f2f769d4e9abf32ea56f0f49e12948 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 14 Dec 2023 16:32:48 +0800 Subject: [PATCH] allow setting fetchContent and folder when subscribe to a feed --- packages/api/src/generated/graphql.ts | 29 ++++++++++++++++++- packages/api/src/generated/schema.graphql | 17 ++++++++++- .../api/src/resolvers/subscriptions/index.ts | 22 +++++++++----- packages/api/src/schema.ts | 19 +++++++++++- packages/api/src/utils/createTask.ts | 6 ++-- 5 files changed, 80 insertions(+), 13 deletions(-) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index a3d814b9f..aed124467 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -438,6 +438,12 @@ export enum CreateNewsletterEmailErrorCode { Unauthorized = 'UNAUTHORIZED' } +export type CreateNewsletterEmailInput = { + description?: InputMaybe; + folder?: InputMaybe; + name?: InputMaybe; +}; + export type CreateNewsletterEmailResult = CreateNewsletterEmailError | CreateNewsletterEmailSuccess; export type CreateNewsletterEmailSuccess = { @@ -1415,6 +1421,11 @@ export type MutationCreateLabelArgs = { }; +export type MutationCreateNewsletterEmailArgs = { + input?: InputMaybe; +}; + + export type MutationDeleteAccountArgs = { userID: Scalars['ID']; }; @@ -1677,7 +1688,10 @@ export type NewsletterEmail = { address: Scalars['String']; confirmationCode?: Maybe; createdAt: Scalars['Date']; + description?: Maybe; + folder: Scalars['String']; id: Scalars['ID']; + name?: Maybe; subscriptionCount: Scalars['Int']; }; @@ -2752,6 +2766,8 @@ export enum SubscribeErrorCode { export type SubscribeInput = { autoAddToLibrary?: InputMaybe; + fetchContent?: InputMaybe; + folder?: InputMaybe; isPrivate?: InputMaybe; subscriptionType?: InputMaybe; url: Scalars['String']; @@ -2770,6 +2786,8 @@ export type Subscription = { count: Scalars['Int']; createdAt: Scalars['Date']; description?: Maybe; + fetchContent: Scalars['Boolean']; + folder: Scalars['String']; icon?: Maybe; id: Scalars['ID']; isPrivate?: Maybe; @@ -3116,6 +3134,8 @@ export enum UpdateSubscriptionErrorCode { export type UpdateSubscriptionInput = { autoAddToLibrary?: InputMaybe; description?: InputMaybe; + fetchContent?: InputMaybe; + folder?: InputMaybe; id: Scalars['ID']; isPrivate?: InputMaybe; lastFetchedAt?: InputMaybe; @@ -3526,6 +3546,7 @@ export type ResolversTypes = { CreateLabelSuccess: ResolverTypeWrapper; CreateNewsletterEmailError: ResolverTypeWrapper; CreateNewsletterEmailErrorCode: CreateNewsletterEmailErrorCode; + CreateNewsletterEmailInput: CreateNewsletterEmailInput; CreateNewsletterEmailResult: ResolversTypes['CreateNewsletterEmailError'] | ResolversTypes['CreateNewsletterEmailSuccess']; CreateNewsletterEmailSuccess: ResolverTypeWrapper; CreateReactionError: ResolverTypeWrapper; @@ -4036,6 +4057,7 @@ export type ResolversParentTypes = { CreateLabelResult: ResolversParentTypes['CreateLabelError'] | ResolversParentTypes['CreateLabelSuccess']; CreateLabelSuccess: CreateLabelSuccess; CreateNewsletterEmailError: CreateNewsletterEmailError; + CreateNewsletterEmailInput: CreateNewsletterEmailInput; CreateNewsletterEmailResult: ResolversParentTypes['CreateNewsletterEmailError'] | ResolversParentTypes['CreateNewsletterEmailSuccess']; CreateNewsletterEmailSuccess: CreateNewsletterEmailSuccess; CreateReactionError: CreateReactionError; @@ -5345,7 +5367,7 @@ export type MutationResolvers>; createHighlight?: Resolver>; createLabel?: Resolver>; - createNewsletterEmail?: Resolver; + createNewsletterEmail?: Resolver>; deleteAccount?: Resolver>; deleteFilter?: Resolver>; deleteHighlight?: Resolver>; @@ -5404,7 +5426,10 @@ export type NewsletterEmailResolvers; confirmationCode?: Resolver, ParentType, ContextType>; createdAt?: Resolver; + description?: Resolver, ParentType, ContextType>; + folder?: Resolver; id?: Resolver; + name?: Resolver, ParentType, ContextType>; subscriptionCount?: Resolver; __isTypeOf?: IsTypeOfResolverFn; }; @@ -6036,6 +6061,8 @@ export type SubscriptionResolvers; createdAt?: SubscriptionResolver; description?: SubscriptionResolver, "description", ParentType, ContextType>; + fetchContent?: SubscriptionResolver; + folder?: SubscriptionResolver; icon?: SubscriptionResolver, "icon", ParentType, ContextType>; id?: SubscriptionResolver; isPrivate?: SubscriptionResolver, "isPrivate", ParentType, ContextType>; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index e57928d48..44f35d093 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -383,6 +383,12 @@ enum CreateNewsletterEmailErrorCode { UNAUTHORIZED } +input CreateNewsletterEmailInput { + description: String + folder: String + name: String +} + union CreateNewsletterEmailResult = CreateNewsletterEmailError | CreateNewsletterEmailSuccess type CreateNewsletterEmailSuccess { @@ -1182,7 +1188,7 @@ type Mutation { createGroup(input: CreateGroupInput!): CreateGroupResult! createHighlight(input: CreateHighlightInput!): CreateHighlightResult! createLabel(input: CreateLabelInput!): CreateLabelResult! - createNewsletterEmail: CreateNewsletterEmailResult! + createNewsletterEmail(input: CreateNewsletterEmailInput): CreateNewsletterEmailResult! deleteAccount(userID: ID!): DeleteAccountResult! deleteFilter(id: ID!): DeleteFilterResult! deleteHighlight(highlightId: ID!): DeleteHighlightResult! @@ -1241,7 +1247,10 @@ type NewsletterEmail { address: String! confirmationCode: String createdAt: Date! + description: String + folder: String! id: ID! + name: String subscriptionCount: Int! } @@ -2169,6 +2178,8 @@ enum SubscribeErrorCode { input SubscribeInput { autoAddToLibrary: Boolean + fetchContent: Boolean + folder: String isPrivate: Boolean subscriptionType: SubscriptionType url: String! @@ -2185,6 +2196,8 @@ type Subscription { count: Int! createdAt: Date! description: String + fetchContent: Boolean! + folder: String! icon: String id: ID! isPrivate: Boolean @@ -2504,6 +2517,8 @@ enum UpdateSubscriptionErrorCode { input UpdateSubscriptionInput { autoAddToLibrary: Boolean description: String + fetchContent: Boolean + folder: String id: ID! isPrivate: Boolean lastFetchedAt: Date diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index d6cc7b34d..018ed0c9c 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -206,6 +206,9 @@ export const subscribeResolver = authorized< // re-subscribe const updatedSubscription = await getRepository(Subscription).save({ ...existingSubscription, + fetchContent: input.fetchContent ?? undefined, + folder: input.folder ?? undefined, + isPrivate: input.isPrivate, status: SubscriptionStatus.Active, }) @@ -217,7 +220,8 @@ export const subscribeResolver = authorized< scheduledDates: [new Date()], // fetch immediately fetchedDates: [updatedSubscription.lastFetchedAt || null], checksums: [updatedSubscription.lastFetchedChecksum || null], - addToLibraryFlags: [!!updatedSubscription.autoAddToLibrary], + fetchContents: [updatedSubscription.fetchContent], + folders: [updatedSubscription.folder], }) return { @@ -238,19 +242,20 @@ export const subscribeResolver = authorized< // limit number of rss subscriptions to max const results = (await getRepository(Subscription).query( `insert into omnivore.subscriptions (name, url, description, type, user_id, icon, auto_add_to_library, is_private) - select $1, $2, $3, $4, $5, $6, $7, $8 from omnivore.subscriptions + select $1, $2, $3, $4, $5, $6, $7, $8, $9 from omnivore.subscriptions where user_id = $5 and type = 'RSS' and status = 'ACTIVE' - having count(*) < $9 + having count(*) < $10 returning *;`, [ feed.title, feed.url, - feed.description || null, + feed.description, SubscriptionType.Rss, uid, - feed.thumbnail || null, - input.autoAddToLibrary ?? null, - input.isPrivate ?? null, + feed.thumbnail, + input.isPrivate, + input.fetchContent, + input.folder, MAX_RSS_SUBSCRIPTIONS, ] )) as any[] @@ -272,7 +277,8 @@ export const subscribeResolver = authorized< scheduledDates: [new Date()], // fetch immediately fetchedDates: [null], checksums: [null], - addToLibraryFlags: [!!newSubscription.autoAddToLibrary], + fetchContents: [newSubscription.fetchContent], + folders: [newSubscription.folder], }) return { diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index fc6828362..74b4b3658 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -1254,6 +1254,9 @@ const schema = gql` confirmationCode: String createdAt: Date! subscriptionCount: Int! + folder: String! + name: String + description: String } type NewsletterEmailsSuccess { @@ -1266,6 +1269,12 @@ const schema = gql` union NewsletterEmailsResult = NewsletterEmailsSuccess | NewsletterEmailsError + input CreateNewsletterEmailInput { + name: String + description: String + folder: String + } + # Mutation: CreateNewsletterEmail enum CreateNewsletterEmailErrorCode { UNAUTHORIZED @@ -1674,6 +1683,8 @@ const schema = gql` updatedAt: Date isPrivate: Boolean autoAddToLibrary: Boolean + fetchContent: Boolean! + folder: String! } enum SubscriptionStatus { @@ -2577,6 +2588,8 @@ const schema = gql` subscriptionType: SubscriptionType isPrivate: Boolean autoAddToLibrary: Boolean + fetchContent: Boolean + folder: String } input UpdateSubscriptionInput { @@ -2589,6 +2602,8 @@ const schema = gql` scheduledAt: Date isPrivate: Boolean autoAddToLibrary: Boolean + fetchContent: Boolean + folder: String } union UpdateSubscriptionResult = @@ -2753,7 +2768,9 @@ const schema = gql` # input: UpdateLinkShareInfoInput! # ): UpdateLinkShareInfoResult! setLinkArchived(input: ArchiveLinkInput!): ArchiveLinkResult! - createNewsletterEmail: CreateNewsletterEmailResult! + createNewsletterEmail( + input: CreateNewsletterEmailInput + ): CreateNewsletterEmailResult! deleteNewsletterEmail(newsletterEmailId: ID!): DeleteNewsletterEmailResult! saveUrl(input: SaveUrlInput!): SaveResult! savePage(input: SavePageInput!): SaveResult! diff --git a/packages/api/src/utils/createTask.ts b/packages/api/src/utils/createTask.ts index cad757348..bbf901e2e 100644 --- a/packages/api/src/utils/createTask.ts +++ b/packages/api/src/utils/createTask.ts @@ -625,7 +625,8 @@ export interface RssSubscriptionGroup { fetchedDates: (Date | null)[] scheduledDates: Date[] checksums: (string | null)[] - addToLibraryFlags: boolean[] + fetchContents: boolean[] + folders: string[] } export const enqueueRssFeedFetch = async ( @@ -643,7 +644,8 @@ export const enqueueRssFeedFetch = async ( timestamp.getTime() ), // unix timestamp in milliseconds userIds: subscriptionGroup.userIds, - addToLibraryFlags: subscriptionGroup.addToLibraryFlags, + fetchContents: subscriptionGroup.fetchContents, + folders: subscriptionGroup.folders, } // If there is no Google Cloud Project Id exposed, it means that we are in local environment