Merge pull request #7742 from overleaf/ta-email-preferences-page

Create Email Preferences Page

GitOrigin-RevId: 371a62e8423e5cbebff83e61bf35a8b3b638c398
This commit is contained in:
Timothée Alby
2022-04-28 08:03:12 +00:00
committed by Copybot
parent b9d060ca34
commit f0ac0f3e7a
15 changed files with 236 additions and 14 deletions
@@ -476,7 +476,7 @@ templates.userOnboardingEmail = NoCTAEmailTemplate({
)
const userSettingsLink = EmailMessageHelper.displayLink(
'here',
`${settings.siteUrl}/user/settings`,
`${settings.siteUrl}/user/email-preferences`,
isPlainText
)
const onboardingSurveyLink = EmailMessageHelper.displayLink(
@@ -8,6 +8,7 @@ const OError = require('@overleaf/o-error')
const provider = getProvider()
module.exports = {
subscribed: callbackify(provider.subscribed),
subscribe: callbackify(provider.subscribe),
unsubscribe: callbackify(provider.unsubscribe),
changeEmail: callbackify(provider.changeEmail),
@@ -39,11 +40,27 @@ function makeMailchimpProvider() {
const MAILCHIMP_LIST_ID = Settings.mailchimp.list_id
return {
subscribed,
subscribe,
unsubscribe,
changeEmail,
}
async function subscribed(user) {
try {
const path = getSubscriberPath(user.email)
const result = await mailchimp.get(path)
return result?.status === 'subscribed'
} catch (err) {
if (err.status === 404) {
return false
}
throw OError.tag(err, 'error getting newsletter subscriptions status', {
userId: user._id,
})
}
}
async function subscribe(user) {
try {
const path = getSubscriberPath(user.email)
@@ -194,11 +211,20 @@ function makeMailchimpProvider() {
function makeNullProvider() {
return {
subscribed,
subscribe,
unsubscribe,
changeEmail,
}
async function subscribed(user) {
logger.info(
{ user },
'Not checking user because no newsletter provider is configured'
)
return false
}
async function subscribe(user) {
logger.info(
{ user },
@@ -98,7 +98,7 @@ EmailBuilder.templates.trialOnboarding = EmailBuilder.NoCTAEmailTemplate({
const unsubscribe = EmailMessageHelper.displayLink(
'here',
`${settings.siteUrl}/user/settings`,
`${settings.siteUrl}/user/email-preferences`,
isPlainText
)
@@ -261,6 +261,24 @@ const UserController = {
)
},
subscribe(req, res, next) {
const userId = SessionManager.getLoggedInUserId(req.session)
UserGetter.getUser(userId, (err, user) => {
if (err != null) {
return next(err)
}
NewsletterManager.subscribe(user, err => {
if (err != null) {
OError.tag(err, 'error subscribing to newsletter')
return next(err)
}
return res.json({
message: req.i18n.translate('thanks_settings_updated'),
})
})
})
},
unsubscribe(req, res, next) {
const userId = SessionManager.getLoggedInUserId(req.session)
UserGetter.getUser(userId, (err, user) => {
@@ -269,12 +287,12 @@ const UserController = {
}
NewsletterManager.unsubscribe(user, err => {
if (err != null) {
logger.warn(
{ err, user },
'Failed to unsubscribe user from newsletter'
)
OError.tag(err, 'error unsubscribing to newsletter')
return next(err)
}
res.sendStatus(200)
return res.json({
message: req.i18n.translate('thanks_settings_updated'),
})
})
})
},
@@ -5,6 +5,7 @@ const logger = require('@overleaf/logger')
const Settings = require('@overleaf/settings')
const AuthenticationController = require('../Authentication/AuthenticationController')
const SessionManager = require('../Authentication/SessionManager')
const NewsletterManager = require('../Newsletter/NewsletterManager')
const _ = require('lodash')
const { expressify } = require('../../util/promises')
const SplitTestHandler = require('../SplitTests/SplitTestHandler')
@@ -211,6 +212,25 @@ const UserPagesController = {
)
},
emailPreferencesPage(req, res, next) {
const userId = SessionManager.getLoggedInUserId(req.session)
UserGetter.getUser(userId, (err, user) => {
if (err != null) {
return next(err)
}
NewsletterManager.subscribed(user, (err, subscribed) => {
if (err != null) {
OError.tag(err, 'error getting newsletter subscription status')
return next(err)
}
res.render('user/email-preferences', {
title: 'newsletter_info_title',
subscribed,
})
})
})
},
_restructureThirdPartyIds(user) {
// 3rd party identifiers are an array of objects
// this turn them into a single object, which
+20
View File
@@ -264,11 +264,31 @@ function initialize(webRouter, privateApiRouter, publicApiRouter) {
UserController.clearSessions
)
// deprecated
webRouter.delete(
'/user/newsletter/unsubscribe',
AuthenticationController.requireLogin(),
UserController.unsubscribe
)
webRouter.post(
'/user/newsletter/unsubscribe',
AuthenticationController.requireLogin(),
UserController.unsubscribe
)
webRouter.post(
'/user/newsletter/subscribe',
AuthenticationController.requireLogin(),
UserController.subscribe
)
webRouter.get(
'/user/email-preferences',
AuthenticationController.requireLogin(),
UserPagesController.emailPreferencesPage
)
webRouter.post(
'/user/delete',
RateLimiterMiddleware.rateLimit({