diff --git a/packages/api/src/resolvers/newsletters/index.ts b/packages/api/src/resolvers/newsletters/index.ts index d8d34a7ce..964541a2f 100644 --- a/packages/api/src/resolvers/newsletters/index.ts +++ b/packages/api/src/resolvers/newsletters/index.ts @@ -21,6 +21,7 @@ import { analytics } from '../../utils/analytics' import { env } from '../../env' import { AppDataSource } from '../../server' import { User } from '../../entity/user' +import { unsubscribeAll } from '../../services/subscriptions' export const createNewsletterEmailResolver = authorized< CreateNewsletterEmailSuccess, @@ -116,6 +117,9 @@ export const deleteNewsletterEmailResolver = authorized< } } + // unsubscribe all before deleting + await unsubscribeAll(newsletterEmail.user.id, newsletterEmail.address) + const deleted = await deleteNewsletterEmail(args.newsletterEmailId) if (deleted) { return { diff --git a/packages/api/src/services/subscriptions.ts b/packages/api/src/services/subscriptions.ts index 7a3136932..20d74b0f3 100644 --- a/packages/api/src/services/subscriptions.ts +++ b/packages/api/src/services/subscriptions.ts @@ -2,6 +2,31 @@ import { Subscription } from '../entity/subscription' import { getRepository } from '../entity/utils' import { SubscriptionStatus } from '../generated/graphql' import { sendEmail } from '../utils/sendEmail' +import axios from 'axios' + +const sendUnsubscribeEmail = async ( + unsubscribeMailTo: string, + newsletterEmail: string +): Promise => { + const sent = await sendEmail({ + to: unsubscribeMailTo, + subject: 'Unsubscribe', + text: `This message was automatically generated by Omnivore.`, + from: newsletterEmail, + }) + + if (!sent) { + throw new Error(`Failed to unsubscribe, email: ${unsubscribeMailTo}`) + } +} + +const sendUnsubscribeHttpRequest = async (url: string): Promise => { + const response = await axios.get(url) + + if (response.status !== 200) { + throw new Error(`Failed to unsubscribe, response: ${response.statusText}`) + } +} export const saveSubscription = async ( userId: string, @@ -12,13 +37,13 @@ export const saveSubscription = async ( ): Promise => { const subscription = await getRepository(Subscription).findOneBy({ name, - newsletterEmail, user: { id: userId }, }) if (subscription) { // if subscription already exists, updates updatedAt subscription.status = SubscriptionStatus.Active + subscription.newsletterEmail = newsletterEmail unsubscribeMailTo && (subscription.unsubscribeMailTo = unsubscribeMailTo) unsubscribeHttpUrl && (subscription.unsubscribeHttpUrl = unsubscribeHttpUrl) return getRepository(Subscription).save(subscription) @@ -56,28 +81,27 @@ export const unsubscribe = async ( return getRepository(Subscription).save(subscription) } -const sendUnsubscribeEmail = async ( - unsubscribeMailTo: string, +export const unsubscribeAll = async ( + userId: string, newsletterEmail: string ): Promise => { - const sent = await sendEmail({ - to: unsubscribeMailTo, - subject: 'Unsubscribe', - text: `This message was automatically generated by Omnivore.`, - from: newsletterEmail, - }) + try { + const subscriptions = await getRepository(Subscription).find({ + where: { + user: { id: userId }, + status: SubscriptionStatus.Active, + newsletterEmail, + }, + }) - if (!sent) { - throw new Error(`Failed to unsubscribe, email: ${unsubscribeMailTo}`) - } -} - -const sendUnsubscribeHttpRequest = async (url: string): Promise => { - const response = await fetch(url, { - method: 'GET', - }) - - if (!response.ok) { - throw new Error(`Failed to unsubscribe, response: ${response.statusText}`) + for (const subscription of subscriptions) { + try { + await unsubscribe(subscription) + } catch (error) { + console.log('Failed to unsubscribe', error) + } + } + } catch (error) { + console.log('Failed to unsubscribe all', error) } }