From 906b2d28a0199deff1a0804e5e92c5c626e872f4 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 16:23:36 +0800 Subject: [PATCH 1/9] Add subscribe API schema --- packages/api/src/generated/graphql.ts | 50 +++++++++++++++++++++++ packages/api/src/generated/schema.graphql | 18 ++++++++ packages/api/src/schema.ts | 18 ++++++++ 3 files changed, 86 insertions(+) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 031652ed1..34a676f03 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -817,6 +817,7 @@ export type Mutation = { setShareHighlight: SetShareHighlightResult; setUserPersonalization: SetUserPersonalizationResult; signup: SignupResult; + subscribe: SubscribeResult; unsubscribe: UnsubscribeResult; updateHighlight: UpdateHighlightResult; updateHighlightReply: UpdateHighlightReplyResult; @@ -990,6 +991,11 @@ export type MutationSignupArgs = { }; +export type MutationSubscribeArgs = { + name: Scalars['String']; +}; + + export type MutationUnsubscribeArgs = { name: Scalars['String']; }; @@ -1643,6 +1649,25 @@ export type SortParams = { order?: InputMaybe; }; +export type SubscribeError = { + __typename?: 'SubscribeError'; + errorCodes: Array; +}; + +export enum SubscribeErrorCode { + AlreadySubscribed = 'ALREADY_SUBSCRIBED', + BadRequest = 'BAD_REQUEST', + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' +} + +export type SubscribeResult = SubscribeError | SubscribeSuccess; + +export type SubscribeSuccess = { + __typename?: 'SubscribeSuccess'; + subscription: Subscription; +}; + export type Subscription = { __typename?: 'Subscription'; createdAt: Scalars['Date']; @@ -2293,6 +2318,10 @@ export type ResolversTypes = { SortOrder: SortOrder; SortParams: SortParams; String: ResolverTypeWrapper; + SubscribeError: ResolverTypeWrapper; + SubscribeErrorCode: SubscribeErrorCode; + SubscribeResult: ResolversTypes['SubscribeError'] | ResolversTypes['SubscribeSuccess']; + SubscribeSuccess: ResolverTypeWrapper; Subscription: ResolverTypeWrapper<{}>; SubscriptionsError: ResolverTypeWrapper; SubscriptionsErrorCode: SubscriptionsErrorCode; @@ -2550,6 +2579,9 @@ export type ResolversParentTypes = { SignupSuccess: SignupSuccess; SortParams: SortParams; String: Scalars['String']; + SubscribeError: SubscribeError; + SubscribeResult: ResolversParentTypes['SubscribeError'] | ResolversParentTypes['SubscribeSuccess']; + SubscribeSuccess: SubscribeSuccess; Subscription: {}; SubscriptionsError: SubscriptionsError; SubscriptionsResult: ResolversParentTypes['SubscriptionsError'] | ResolversParentTypes['SubscriptionsSuccess']; @@ -3198,6 +3230,7 @@ export type MutationResolvers>; setUserPersonalization?: Resolver>; signup?: Resolver>; + subscribe?: Resolver>; unsubscribe?: Resolver>; updateHighlight?: Resolver>; updateHighlightReply?: Resolver>; @@ -3548,6 +3581,20 @@ export type SignupSuccessResolvers; }; +export type SubscribeErrorResolvers = { + errorCodes?: Resolver, ParentType, ContextType>; + __isTypeOf?: IsTypeOfResolverFn; +}; + +export type SubscribeResultResolvers = { + __resolveType: TypeResolveFn<'SubscribeError' | 'SubscribeSuccess', ParentType, ContextType>; +}; + +export type SubscribeSuccessResolvers = { + subscription?: Resolver; + __isTypeOf?: IsTypeOfResolverFn; +}; + export type SubscriptionResolvers = { createdAt?: SubscriptionResolver; description?: SubscriptionResolver, "description", ParentType, ContextType>; @@ -3927,6 +3974,9 @@ export type Resolvers = { SignupError?: SignupErrorResolvers; SignupResult?: SignupResultResolvers; SignupSuccess?: SignupSuccessResolvers; + SubscribeError?: SubscribeErrorResolvers; + SubscribeResult?: SubscribeResultResolvers; + SubscribeSuccess?: SubscribeSuccessResolvers; Subscription?: SubscriptionResolvers; SubscriptionsError?: SubscriptionsErrorResolvers; SubscriptionsResult?: SubscriptionsResultResolvers; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 679b986f9..036f6d1ec 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -727,6 +727,7 @@ type Mutation { setShareHighlight(input: SetShareHighlightInput!): SetShareHighlightResult! setUserPersonalization(input: SetUserPersonalizationInput!): SetUserPersonalizationResult! signup(input: SignupInput!): SignupResult! + subscribe(name: String!): SubscribeResult! unsubscribe(name: String!): UnsubscribeResult! updateHighlight(input: UpdateHighlightInput!): UpdateHighlightResult! updateHighlightReply(input: UpdateHighlightReplyInput!): UpdateHighlightReplyResult! @@ -1229,6 +1230,23 @@ input SortParams { order: SortOrder } +type SubscribeError { + errorCodes: [SubscribeErrorCode!]! +} + +enum SubscribeErrorCode { + ALREADY_SUBSCRIBED + BAD_REQUEST + NOT_FOUND + UNAUTHORIZED +} + +union SubscribeResult = SubscribeError | SubscribeSuccess + +type SubscribeSuccess { + subscription: Subscription! +} + type Subscription { createdAt: Date! description: String diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index e6e62eb21..51d49937e 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -1511,6 +1511,23 @@ const schema = gql` UNSUBSCRIBE_METHOD_NOT_FOUND } + union SubscribeResult = SubscribeSuccess | SubscribeError + + type SubscribeSuccess { + subscription: Subscription! + } + + type SubscribeError { + errorCodes: [SubscribeErrorCode!]! + } + + enum SubscribeErrorCode { + UNAUTHORIZED + BAD_REQUEST + NOT_FOUND + ALREADY_SUBSCRIBED + } + # Mutations type Mutation { googleLogin(input: GoogleLoginInput!): LoginResult! @@ -1573,6 +1590,7 @@ const schema = gql` setLabels(input: SetLabelsInput!): SetLabelsResult! generateApiKey(input: GenerateApiKeyInput!): GenerateApiKeyResult! unsubscribe(name: String!): UnsubscribeResult! + subscribe(name: String!): SubscribeResult! } # FIXME: remove sort from feedArticles after all cached tabs are closed From c30ef093b8524c57d900a9b138351334eb16e3c0 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 16:47:34 +0800 Subject: [PATCH 2/9] Update unsubscribe api --- .../api/src/resolvers/subscriptions/index.ts | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index 7936b25e5..ab2c1dff5 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -70,12 +70,16 @@ export const unsubscribeResolver = authorized< log.info('unsubscribeResolver') try { - const subscription = await getRepository(Subscription).findOne({ - where: { - name, - user: { id: uid }, - }, - relations: ['user'], + const user = await getRepository(User).findOneBy({ id: uid }) + if (!user) { + return { + errorCodes: [UnsubscribeErrorCode.Unauthorized], + } + } + + const subscription = await getRepository(Subscription).findOneBy({ + name, + user: { id: uid }, }) if (!subscription) { return { @@ -102,7 +106,18 @@ export const unsubscribeResolver = authorized< } } - return { subscription: await unsubscribe(subscription) } + const unsubscribed = await unsubscribe(subscription) + + analytics.track({ + userId: uid, + event: 'unsubscribed', + properties: { + name, + env: env.server.apiEnv, + }, + }) + + return { subscription: unsubscribed } } catch (error) { log.error('failed to unsubscribe', error) return { From 51dd9a5733501b5eec36f8b575c4520f4def0312 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 18:45:52 +0800 Subject: [PATCH 3/9] Return a list of subscriptions --- packages/api/src/generated/graphql.ts | 4 ++-- packages/api/src/generated/schema.graphql | 2 +- packages/api/src/schema.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 34a676f03..fd414ea98 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -1665,7 +1665,7 @@ export type SubscribeResult = SubscribeError | SubscribeSuccess; export type SubscribeSuccess = { __typename?: 'SubscribeSuccess'; - subscription: Subscription; + subscriptions: Array; }; export type Subscription = { @@ -3591,7 +3591,7 @@ export type SubscribeResultResolvers = { - subscription?: Resolver; + subscriptions?: Resolver, ParentType, ContextType>; __isTypeOf?: IsTypeOfResolverFn; }; diff --git a/packages/api/src/generated/schema.graphql b/packages/api/src/generated/schema.graphql index 036f6d1ec..a399f9dbd 100644 --- a/packages/api/src/generated/schema.graphql +++ b/packages/api/src/generated/schema.graphql @@ -1244,7 +1244,7 @@ enum SubscribeErrorCode { union SubscribeResult = SubscribeError | SubscribeSuccess type SubscribeSuccess { - subscription: Subscription! + subscriptions: [Subscription!]! } type Subscription { diff --git a/packages/api/src/schema.ts b/packages/api/src/schema.ts index 51d49937e..f910324de 100755 --- a/packages/api/src/schema.ts +++ b/packages/api/src/schema.ts @@ -1514,7 +1514,7 @@ const schema = gql` union SubscribeResult = SubscribeSuccess | SubscribeError type SubscribeSuccess { - subscription: Subscription! + subscriptions: [Subscription!]! } type SubscribeError { From 1da8b75c819a5715b38846664bcd8454ee43d6ae Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 18:46:44 +0800 Subject: [PATCH 4/9] Add a subscribeHandler --- packages/api/src/services/subscriptions.ts | 69 ++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/packages/api/src/services/subscriptions.ts b/packages/api/src/services/subscriptions.ts index 20d74b0f3..88ef81b2e 100644 --- a/packages/api/src/services/subscriptions.ts +++ b/packages/api/src/services/subscriptions.ts @@ -3,6 +3,8 @@ import { getRepository } from '../entity/utils' import { SubscriptionStatus } from '../generated/graphql' import { sendEmail } from '../utils/sendEmail' import axios from 'axios' +import { NewsletterEmail } from '../entity/newsletter_email' +import { createNewsletterEmail } from './newsletters' const sendUnsubscribeEmail = async ( unsubscribeMailTo: string, @@ -105,3 +107,70 @@ export const unsubscribeAll = async ( console.log('Failed to unsubscribe all', error) } } + +export const getSubscribeHandler = (name: string): SubscribeHandler | null => { + switch (name.toLowerCase()) { + case 'axios_essentials': + return new AxiosEssentialsHandler() + default: + return null + } +} + +export class SubscribeHandler { + async handleSubscribe( + userId: string, + name: string + ): Promise { + try { + const newsletterEmail = + (await getRepository(NewsletterEmail).findOneBy({ + user: { id: userId }, + })) || (await createNewsletterEmail(userId)) + + // subscribe to newsletter service + const subscribedNames = await this._subscribe( + newsletterEmail.address, + name + ) + if (subscribedNames.length === 0) { + console.log('Failed to get subscribe response', name) + return null + } + + // create new subscriptions in db + const newSubscriptions = subscribedNames.map( + (name: string): Promise => { + return getRepository(Subscription).save({ + name, + newsletterEmail: newsletterEmail.address, + user: { id: userId }, + status: SubscriptionStatus.Active, + }) + } + ) + + return Promise.all(newSubscriptions) + } catch (error) { + console.log('Failed to handleSubscribe', error) + return null + } + } + + async _subscribe(email: string, name: string): Promise { + return Promise.all([]) + } +} + +class AxiosEssentialsHandler extends SubscribeHandler { + async _subscribe(email: string): Promise { + await axios.post('https://api.axios.com/api/render/readers/unauth-sub/', { + headers: { + 'content-type': 'application/json', + }, + body: `{"lists":["newsletter_axiosam","newsletter_axiospm","newsletter_axiosfinishline"],"user_vars":{"source":"axios","medium":null,"campaign":null,"term":null,"content":null,"page":"webflow-newsletters-all"},"email":"${email}"`, + }) + + return ['Axios AM', 'Axios PM', 'Axios Finish Line'] + } +} From 4699458457bd25c851e1491a737fe33226881add Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 18:46:57 +0800 Subject: [PATCH 5/9] Implement subscribe api --- .../api/src/resolvers/subscriptions/index.ts | 73 +++++++++++++++++-- 1 file changed, 66 insertions(+), 7 deletions(-) diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index ab2c1dff5..b59ea7123 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -1,9 +1,13 @@ import { authorized } from '../../utils/helpers' import { + MutationSubscribeArgs, MutationUnsubscribeArgs, QuerySubscriptionsArgs, SortBy, SortOrder, + SubscribeError, + SubscribeErrorCode, + SubscribeSuccess, SubscriptionsError, SubscriptionsErrorCode, SubscriptionsSuccess, @@ -17,7 +21,8 @@ import { env } from '../../env' import { getRepository } from '../../entity/utils' import { User } from '../../entity/user' import { Subscription } from '../../entity/subscription' -import { unsubscribe } from '../../services/subscriptions' +import { getSubscribeHandler, unsubscribe } from '../../services/subscriptions' +import { ILike } from 'typeorm' export const subscriptionsResolver = authorized< SubscriptionsSuccess, @@ -87,12 +92,6 @@ export const unsubscribeResolver = authorized< } } - if (subscription.user.id !== uid) { - return { - errorCodes: [UnsubscribeErrorCode.Unauthorized], - } - } - // if subscription is already unsubscribed, throw error if (subscription.status === SubscriptionStatus.Unsubscribed) { return { @@ -125,3 +124,63 @@ export const unsubscribeResolver = authorized< } } }) + +export const subscribeResolver = authorized< + SubscribeSuccess, + SubscribeError, + MutationSubscribeArgs +>(async (_, { name }, { claims: { uid }, log }) => { + log.info('subscribeResolver') + + try { + const user = await getRepository(User).findOneBy({ id: uid }) + if (!user) { + return { + errorCodes: [SubscribeErrorCode.Unauthorized], + } + } + + const subscription = await getRepository(Subscription).findOneBy({ + name: ILike(name), + user: { id: uid }, + status: SubscriptionStatus.Active, + }) + if (subscription) { + return { + errorCodes: [SubscribeErrorCode.AlreadySubscribed], + } + } + + const subscribeHandler = getSubscribeHandler(name) + if (!subscribeHandler) { + return { + errorCodes: [SubscribeErrorCode.NotFound], + } + } + + const newSubscriptions = await subscribeHandler.handleSubscribe(uid, name) + if (!newSubscriptions) { + return { + errorCodes: [SubscribeErrorCode.BadRequest], + } + } + + analytics.track({ + userId: uid, + event: 'subscribed', + properties: { + name, + env: env.server.apiEnv, + }, + }) + + return { + subscriptions: newSubscriptions, + } + } catch (error) { + log.error('failed to subscribe', error) + return { + errorCodes: [SubscribeErrorCode.BadRequest], + } + } +}) From 568472cc3c6977af4677427bf46115e13c9f7820 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 21:15:25 +0800 Subject: [PATCH 6/9] Calling HTTP requests to subscribe to these newsletters --- packages/api/src/services/subscriptions.ts | 57 ++++++++++++++++++++-- 1 file changed, 52 insertions(+), 5 deletions(-) diff --git a/packages/api/src/services/subscriptions.ts b/packages/api/src/services/subscriptions.ts index 88ef81b2e..acdb225a6 100644 --- a/packages/api/src/services/subscriptions.ts +++ b/packages/api/src/services/subscriptions.ts @@ -112,6 +112,12 @@ export const getSubscribeHandler = (name: string): SubscribeHandler | null => { switch (name.toLowerCase()) { case 'axios_essentials': return new AxiosEssentialsHandler() + case 'morning_brew': + return new MorningBrewHandler() + case 'milk_road': + return new MilkRoadHandler() + case 'money_stuff': + return new MoneyStuffHandler() default: return null } @@ -129,10 +135,7 @@ export class SubscribeHandler { })) || (await createNewsletterEmail(userId)) // subscribe to newsletter service - const subscribedNames = await this._subscribe( - newsletterEmail.address, - name - ) + const subscribedNames = await this._subscribe(newsletterEmail.address) if (subscribedNames.length === 0) { console.log('Failed to get subscribe response', name) return null @@ -157,7 +160,7 @@ export class SubscribeHandler { } } - async _subscribe(email: string, name: string): Promise { + async _subscribe(email: string): Promise { return Promise.all([]) } } @@ -174,3 +177,47 @@ class AxiosEssentialsHandler extends SubscribeHandler { return ['Axios AM', 'Axios PM', 'Axios Finish Line'] } } + +class MorningBrewHandler extends SubscribeHandler { + async _subscribe(email: string): Promise { + await axios.post('https://singularity.morningbrew.com/graphql', { + headers: { + 'content-type': 'application/json', + }, + body: `{"operationName":"CreateUserSubscription","variables":{"signupCreateInput":{"email":"${email}","kid":null,"gclid":null,"utmCampaign":"mb","utmMedium":"website","utmSource":"hero-module","utmContent":null,"utmTerm":null,"requestPath":"https://www.morningbrew.com/daily","uiModule":"hero-module"},"signupCreateVerticalSlug":"daily"},"query":"mutation CreateUserSubscription($signupCreateInput: SignupCreateInput!, $signupCreateVerticalSlug: String!) {\\n signupCreate(input: $signupCreateInput, verticalSlug: $signupCreateVerticalSlug) {\\n user {\\n accessToken\\n email\\n hasSeenOnboarding\\n referralCode\\n verticalSubscriptions {\\n isActive\\n vertical {\\n slug\\n __typename\\n }\\n __typename\\n }\\n __typename\\n }\\n isNewSubscription\\n fromAffiliate\\n subscriptionId\\n __typename\\n }\\n}\\n"}`, + }) + + return ['Morning Brew'] + } +} + +class MilkRoadHandler extends SubscribeHandler { + async _subscribe(email: string): Promise { + await axios.post('https://www.milkroad.com/subscriptions', { + headers: { + 'content-type': 'application/x-www-form-urlencoded', + }, + body: `query_parameters=%7B%7D&email=${encodeURIComponent( + email + )}&commit=Subscribe`, + }) + + return ['Milk Road'] + } +} + +class MoneyStuffHandler extends SubscribeHandler { + async _subscribe(email: string): Promise { + await axios.post( + 'https://login.bloomberg.com/api/engagements/follow-author', + { + headers: { + 'content-type': 'application/json', + }, + body: `{"email":"${email}","optIn":false,"topic":"18273090","authorId":"18273090","authorName":"Matt Levine"}`, + } + ) + + return ['Money Stuff'] + } +} From 13453e7b7f276eb1752a453190f3c2c7ffbc0cfa Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 21:26:46 +0800 Subject: [PATCH 7/9] Register subscribe resolver --- packages/api/src/resolvers/function_resolvers.ts | 3 +++ packages/api/src/resolvers/subscriptions/index.ts | 2 +- .../api/src/services/save_newsletter_email.ts | 15 ++++++--------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/api/src/resolvers/function_resolvers.ts b/packages/api/src/resolvers/function_resolvers.ts index 6bd83fe61..a5b52fe1c 100644 --- a/packages/api/src/resolvers/function_resolvers.ts +++ b/packages/api/src/resolvers/function_resolvers.ts @@ -65,6 +65,7 @@ import { setShareHighlightResolver, setUserPersonalizationResolver, signupResolver, + subscribeResolver, subscriptionsResolver, unsubscribeResolver, updateHighlightResolver, @@ -145,6 +146,7 @@ export const functionResolvers = { setLabels: setLabelsResolver, generateApiKey: generateApiKeyResolver, unsubscribe: unsubscribeResolver, + subscribe: subscribeResolver, }, Query: { me: getMeUserResolver, @@ -554,4 +556,5 @@ export const functionResolvers = { ...resultResolveTypeResolver('Subscriptions'), ...resultResolveTypeResolver('Unsubscribe'), ...resultResolveTypeResolver('UpdateLabel'), + ...resultResolveTypeResolver('Subscribe'), } diff --git a/packages/api/src/resolvers/subscriptions/index.ts b/packages/api/src/resolvers/subscriptions/index.ts index b59ea7123..6ee982f6d 100644 --- a/packages/api/src/resolvers/subscriptions/index.ts +++ b/packages/api/src/resolvers/subscriptions/index.ts @@ -83,7 +83,7 @@ export const unsubscribeResolver = authorized< } const subscription = await getRepository(Subscription).findOneBy({ - name, + name: ILike(name), user: { id: uid }, }) if (!subscription) { diff --git a/packages/api/src/services/save_newsletter_email.ts b/packages/api/src/services/save_newsletter_email.ts index 3fd01b841..ec06d6a9e 100644 --- a/packages/api/src/services/save_newsletter_email.ts +++ b/packages/api/src/services/save_newsletter_email.ts @@ -86,20 +86,17 @@ export const saveNewsletterEmail = async ( // sends push notification const deviceTokens = await getDeviceTokensByUserId(newsletterEmail.user.id) - if (!deviceTokens) { console.log('Device tokens not set:', newsletterEmail.user.id) return true } - if (deviceTokens.length) { - const multicastMessage = messageForLink(page, deviceTokens) - await sendMulticastPushNotifications( - newsletterEmail.user.id, - multicastMessage, - 'newsletter' - ) - } + const multicastMessage = messageForLink(page, deviceTokens) + await sendMulticastPushNotifications( + newsletterEmail.user.id, + multicastMessage, + 'newsletter' + ) return true } From 5b36f9270eee9895cb22216aaee18ef947148518 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Tue, 17 May 2022 22:43:00 +0800 Subject: [PATCH 8/9] Update milk road query params --- packages/api/src/services/subscriptions.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/api/src/services/subscriptions.ts b/packages/api/src/services/subscriptions.ts index acdb225a6..483520378 100644 --- a/packages/api/src/services/subscriptions.ts +++ b/packages/api/src/services/subscriptions.ts @@ -197,9 +197,7 @@ class MilkRoadHandler extends SubscribeHandler { headers: { 'content-type': 'application/x-www-form-urlencoded', }, - body: `query_parameters=%7B%7D&email=${encodeURIComponent( - email - )}&commit=Subscribe`, + body: `email=${encodeURIComponent(email)}&commit=Subscribe`, }) return ['Milk Road'] From d9d4deb14ced5d49151e0e3f5d580051d5740a18 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Wed, 18 May 2022 11:50:43 +0800 Subject: [PATCH 9/9] Update Money Stuff sign up url --- packages/api/src/services/subscriptions.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/api/src/services/subscriptions.ts b/packages/api/src/services/subscriptions.ts index 483520378..f0d7997ac 100644 --- a/packages/api/src/services/subscriptions.ts +++ b/packages/api/src/services/subscriptions.ts @@ -206,13 +206,15 @@ class MilkRoadHandler extends SubscribeHandler { class MoneyStuffHandler extends SubscribeHandler { async _subscribe(email: string): Promise { - await axios.post( - 'https://login.bloomberg.com/api/engagements/follow-author', + await axios.put( + `https://login.bloomberg.com/api/newsletters/update?email=${encodeURIComponent( + email + )}&source=¬ify=true&optIn=false`, { headers: { 'content-type': 'application/json', }, - body: `{"email":"${email}","optIn":false,"topic":"18273090","authorId":"18273090","authorName":"Matt Levine"}`, + body: '{"Money Stuff":true}', } )