Merge pull request #7742 from overleaf/ta-email-preferences-page
Create Email Preferences Page GitOrigin-RevId: 371a62e8423e5cbebff83e61bf35a8b3b638c398
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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({
|
||||
|
||||
Reference in New Issue
Block a user