Merge pull request #3260 from omnivore-app/following-folders

change default folder of newsletters
This commit is contained in:
Hongbo Wu
2023-12-18 16:33:33 +08:00
committed by GitHub
9 changed files with 80 additions and 25 deletions

View File

@ -11,6 +11,9 @@ import {
import { User } from './user'
import { Subscription } from './subscription'
export const DEFAULT_NEWSLETTER_FOLDER = 'following'
export const EXISTING_NEWSLETTER_FOLDER = 'inbox'
@Entity({ name: 'newsletter_emails' })
export class NewsletterEmail {
@PrimaryGeneratedColumn('uuid')
@ -36,7 +39,7 @@ export class NewsletterEmail {
subscriptions!: Subscription[]
@Column('text')
folder!: string
folder?: string | null
@Column('text')
name?: string | null

View File

@ -11,6 +11,8 @@ import { SubscriptionStatus, SubscriptionType } from '../generated/graphql'
import { NewsletterEmail } from './newsletter_email'
import { User } from './user'
export const DEFAULT_SUBSCRIPTION_FOLDER = 'following'
@Entity({ name: 'subscriptions' })
export class Subscription {
@PrimaryGeneratedColumn('uuid')
@ -81,5 +83,5 @@ export class Subscription {
fetchContent!: boolean
@Column('text')
folder!: string
folder?: string | null
}

View File

@ -4,7 +4,11 @@
/* eslint-disable @typescript-eslint/no-unsafe-member-access */
/* eslint-disable @typescript-eslint/explicit-module-boundary-types */
import { createHmac } from 'crypto'
import { Subscription } from '../entity/subscription'
import { NewsletterEmail } from '../entity/newsletter_email'
import {
DEFAULT_SUBSCRIPTION_FOLDER,
Subscription,
} from '../entity/subscription'
import { env } from '../env'
import {
Article,
@ -438,6 +442,14 @@ export const functionResolvers = {
subscription.icon && createImageProxyUrl(subscription.icon, 128, 128)
)
},
folder(subscription: { folder?: string | null }) {
return subscription.folder || DEFAULT_SUBSCRIPTION_FOLDER
},
},
NewsletterEmail: {
subscriptionCount(newsletterEmail: NewsletterEmail) {
return newsletterEmail.subscriptions?.length || 0
},
},
...resultResolveTypeResolver('Login'),
...resultResolveTypeResolver('LogOut'),

View File

@ -1,4 +1,7 @@
import { NewsletterEmail } from '../../entity/newsletter_email'
import {
DEFAULT_NEWSLETTER_FOLDER,
NewsletterEmail,
} from '../../entity/newsletter_email'
import { env } from '../../env'
import {
CreateNewsletterEmailError,
@ -20,11 +23,16 @@ import {
getNewsletterEmails,
} from '../../services/newsletters'
import { unsubscribeAll } from '../../services/subscriptions'
import { Merge } from '../../util'
import { analytics } from '../../utils/analytics'
import { authorized } from '../../utils/helpers'
export const createNewsletterEmailResolver = authorized<
export type CreateNewsletterEmailSuccessPartial = Merge<
CreateNewsletterEmailSuccess,
{ newsletterEmail: NewsletterEmail }
>
export const createNewsletterEmailResolver = authorized<
CreateNewsletterEmailSuccessPartial,
CreateNewsletterEmailError,
MutationCreateNewsletterEmailArgs
>(async (_parent, { input }, { claims, log }) => {
@ -41,16 +49,13 @@ export const createNewsletterEmailResolver = authorized<
const newsletterEmail = await createNewsletterEmail(
claims.uid,
undefined,
input?.folder || 'following',
input?.folder || DEFAULT_NEWSLETTER_FOLDER,
input?.name || undefined,
input?.description || undefined
)
return {
newsletterEmail: {
...newsletterEmail,
subscriptionCount: 0,
},
newsletterEmail,
}
} catch (e) {
log.error('createNewsletterEmailResolver', e)
@ -61,18 +66,19 @@ export const createNewsletterEmailResolver = authorized<
}
})
export const newsletterEmailsResolver = authorized<
export type NewsletterEmailsSuccessPartial = Merge<
NewsletterEmailsSuccess,
{ newsletterEmails: NewsletterEmail[] }
>
export const newsletterEmailsResolver = authorized<
NewsletterEmailsSuccessPartial,
NewsletterEmailsError
>(async (_parent, _args, { uid, log }) => {
try {
const newsletterEmails = await getNewsletterEmails(uid)
return {
newsletterEmails: newsletterEmails.map((newsletterEmail) => ({
...newsletterEmail,
subscriptionCount: newsletterEmail.subscriptions.length,
})),
newsletterEmails,
}
} catch (e) {
log.error('newsletterEmailsResolver', e)
@ -83,8 +89,12 @@ export const newsletterEmailsResolver = authorized<
}
})
export const deleteNewsletterEmailResolver = authorized<
export type DeleteNewsletterEmailSuccessPartial = Merge<
DeleteNewsletterEmailSuccess,
{ newsletterEmail: NewsletterEmail }
>
export const deleteNewsletterEmailResolver = authorized<
DeleteNewsletterEmailSuccessPartial,
DeleteNewsletterEmailError,
MutationDeleteNewsletterEmailArgs
>(async (_parent, args, { uid, log }) => {
@ -117,10 +127,7 @@ export const deleteNewsletterEmailResolver = authorized<
const deleted = await deleteNewsletterEmail(args.newsletterEmailId)
if (deleted) {
return {
newsletterEmail: {
...newsletterEmail,
subscriptionCount: newsletterEmail.subscriptions.length,
},
newsletterEmail,
}
} else {
// when user tries to delete other's newsletters emails or email already deleted

View File

@ -1,7 +1,10 @@
import axios from 'axios'
import { parseHTML } from 'linkedom'
import { Brackets } from 'typeorm'
import { Subscription } from '../../entity/subscription'
import {
DEFAULT_SUBSCRIPTION_FOLDER,
Subscription,
} from '../../entity/subscription'
import { env } from '../../env'
import {
FeedEdge,
@ -221,7 +224,7 @@ export const subscribeResolver = authorized<
fetchedDates: [updatedSubscription.lastFetchedAt || null],
checksums: [updatedSubscription.lastFetchedChecksum || null],
fetchContents: [updatedSubscription.fetchContent],
folders: [updatedSubscription.folder],
folders: [updatedSubscription.folder || DEFAULT_SUBSCRIPTION_FOLDER],
})
return {
@ -278,7 +281,7 @@ export const subscribeResolver = authorized<
fetchedDates: [null],
checksums: [null],
fetchContents: [newSubscription.fetchContent],
folders: [newSubscription.folder],
folders: [newSubscription.folder || DEFAULT_SUBSCRIPTION_FOLDER],
})
return {

View File

@ -1,4 +1,7 @@
import { NewsletterEmail } from '../entity/newsletter_email'
import {
EXISTING_NEWSLETTER_FOLDER,
NewsletterEmail,
} from '../entity/newsletter_email'
import { Subscription } from '../entity/subscription'
import { env } from '../env'
import { analytics } from '../utils/analytics'
@ -49,7 +52,10 @@ export const saveNewsletter = async (
}
// subscription's folder takes precedence over newsletter email's folder
const folder = existingSubscription?.folder || newsletterEmail.folder
const folder =
existingSubscription?.folder ||
newsletterEmail.folder ||
EXISTING_NEWSLETTER_FOLDER
const input: SaveEmailInput = {
userId: newsletterEmail.user.id,

View File

@ -8,6 +8,7 @@ import { nanoid } from 'nanoid'
import { DeepPartial } from 'typeorm'
import { ImportItemState } from '../entity/integration'
import { Recommendation } from '../entity/recommendation'
import { DEFAULT_SUBSCRIPTION_FOLDER } from '../entity/subscription'
import { env } from '../env'
import {
ArticleSavingRequestStatus,

View File

@ -0,0 +1,14 @@
-- Type: DO
-- Name: remove_default_folder_in_subscription
-- Description: Remove default value of folder column in subscriptions and newsletter_emails tables
BEGIN;
-- Drop the column first because we can't remove the default value of an existing column
ALTER TABLE omnivore.subscriptions DROP COLUMN folder;
ALTER TABLE omnivore.newsletter_emails DROP COLUMN folder;
ALTER TABLE omnivore.subscriptions ADD COLUMN folder TEXT;
ALTER TABLE omnivore.newsletter_emails ADD COLUMN folder TEXT;
COMMIT;

View File

@ -0,0 +1,7 @@
-- Type: UNDO
-- Name: remove_default_folder_in_subscription
-- Description: Remove default value of folder column in subscriptions and newsletter_emails tables
BEGIN;
COMMIT;