allow setting fetchContent and folder when subscribe to a feed

This commit is contained in:
Hongbo Wu
2023-12-14 16:32:48 +08:00
parent d67b974367
commit f2c468f906
5 changed files with 80 additions and 13 deletions

View File

@ -438,6 +438,12 @@ export enum CreateNewsletterEmailErrorCode {
Unauthorized = 'UNAUTHORIZED'
}
export type CreateNewsletterEmailInput = {
description?: InputMaybe<Scalars['String']>;
folder?: InputMaybe<Scalars['String']>;
name?: InputMaybe<Scalars['String']>;
};
export type CreateNewsletterEmailResult = CreateNewsletterEmailError | CreateNewsletterEmailSuccess;
export type CreateNewsletterEmailSuccess = {
@ -1415,6 +1421,11 @@ export type MutationCreateLabelArgs = {
};
export type MutationCreateNewsletterEmailArgs = {
input?: InputMaybe<CreateNewsletterEmailInput>;
};
export type MutationDeleteAccountArgs = {
userID: Scalars['ID'];
};
@ -1677,7 +1688,10 @@ export type NewsletterEmail = {
address: Scalars['String'];
confirmationCode?: Maybe<Scalars['String']>;
createdAt: Scalars['Date'];
description?: Maybe<Scalars['String']>;
folder: Scalars['String'];
id: Scalars['ID'];
name?: Maybe<Scalars['String']>;
subscriptionCount: Scalars['Int'];
};
@ -2752,6 +2766,8 @@ export enum SubscribeErrorCode {
export type SubscribeInput = {
autoAddToLibrary?: InputMaybe<Scalars['Boolean']>;
fetchContent?: InputMaybe<Scalars['Boolean']>;
folder?: InputMaybe<Scalars['String']>;
isPrivate?: InputMaybe<Scalars['Boolean']>;
subscriptionType?: InputMaybe<SubscriptionType>;
url: Scalars['String'];
@ -2770,6 +2786,8 @@ export type Subscription = {
count: Scalars['Int'];
createdAt: Scalars['Date'];
description?: Maybe<Scalars['String']>;
fetchContent: Scalars['Boolean'];
folder: Scalars['String'];
icon?: Maybe<Scalars['String']>;
id: Scalars['ID'];
isPrivate?: Maybe<Scalars['Boolean']>;
@ -3116,6 +3134,8 @@ export enum UpdateSubscriptionErrorCode {
export type UpdateSubscriptionInput = {
autoAddToLibrary?: InputMaybe<Scalars['Boolean']>;
description?: InputMaybe<Scalars['String']>;
fetchContent?: InputMaybe<Scalars['Boolean']>;
folder?: InputMaybe<Scalars['String']>;
id: Scalars['ID'];
isPrivate?: InputMaybe<Scalars['Boolean']>;
lastFetchedAt?: InputMaybe<Scalars['Date']>;
@ -3526,6 +3546,7 @@ export type ResolversTypes = {
CreateLabelSuccess: ResolverTypeWrapper<CreateLabelSuccess>;
CreateNewsletterEmailError: ResolverTypeWrapper<CreateNewsletterEmailError>;
CreateNewsletterEmailErrorCode: CreateNewsletterEmailErrorCode;
CreateNewsletterEmailInput: CreateNewsletterEmailInput;
CreateNewsletterEmailResult: ResolversTypes['CreateNewsletterEmailError'] | ResolversTypes['CreateNewsletterEmailSuccess'];
CreateNewsletterEmailSuccess: ResolverTypeWrapper<CreateNewsletterEmailSuccess>;
CreateReactionError: ResolverTypeWrapper<CreateReactionError>;
@ -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<ContextType = ResolverContext, ParentType extends
createGroup?: Resolver<ResolversTypes['CreateGroupResult'], ParentType, ContextType, RequireFields<MutationCreateGroupArgs, 'input'>>;
createHighlight?: Resolver<ResolversTypes['CreateHighlightResult'], ParentType, ContextType, RequireFields<MutationCreateHighlightArgs, 'input'>>;
createLabel?: Resolver<ResolversTypes['CreateLabelResult'], ParentType, ContextType, RequireFields<MutationCreateLabelArgs, 'input'>>;
createNewsletterEmail?: Resolver<ResolversTypes['CreateNewsletterEmailResult'], ParentType, ContextType>;
createNewsletterEmail?: Resolver<ResolversTypes['CreateNewsletterEmailResult'], ParentType, ContextType, Partial<MutationCreateNewsletterEmailArgs>>;
deleteAccount?: Resolver<ResolversTypes['DeleteAccountResult'], ParentType, ContextType, RequireFields<MutationDeleteAccountArgs, 'userID'>>;
deleteFilter?: Resolver<ResolversTypes['DeleteFilterResult'], ParentType, ContextType, RequireFields<MutationDeleteFilterArgs, 'id'>>;
deleteHighlight?: Resolver<ResolversTypes['DeleteHighlightResult'], ParentType, ContextType, RequireFields<MutationDeleteHighlightArgs, 'highlightId'>>;
@ -5404,7 +5426,10 @@ export type NewsletterEmailResolvers<ContextType = ResolverContext, ParentType e
address?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
confirmationCode?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
createdAt?: Resolver<ResolversTypes['Date'], ParentType, ContextType>;
description?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
folder?: Resolver<ResolversTypes['String'], ParentType, ContextType>;
id?: Resolver<ResolversTypes['ID'], ParentType, ContextType>;
name?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>;
subscriptionCount?: Resolver<ResolversTypes['Int'], ParentType, ContextType>;
__isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>;
};
@ -6036,6 +6061,8 @@ export type SubscriptionResolvers<ContextType = ResolverContext, ParentType exte
count?: SubscriptionResolver<ResolversTypes['Int'], "count", ParentType, ContextType>;
createdAt?: SubscriptionResolver<ResolversTypes['Date'], "createdAt", ParentType, ContextType>;
description?: SubscriptionResolver<Maybe<ResolversTypes['String']>, "description", ParentType, ContextType>;
fetchContent?: SubscriptionResolver<ResolversTypes['Boolean'], "fetchContent", ParentType, ContextType>;
folder?: SubscriptionResolver<ResolversTypes['String'], "folder", ParentType, ContextType>;
icon?: SubscriptionResolver<Maybe<ResolversTypes['String']>, "icon", ParentType, ContextType>;
id?: SubscriptionResolver<ResolversTypes['ID'], "id", ParentType, ContextType>;
isPrivate?: SubscriptionResolver<Maybe<ResolversTypes['Boolean']>, "isPrivate", ParentType, ContextType>;

View File

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

View File

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

View File

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

View File

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