This repository was archived by the owner on Mar 15, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathupdateEmail.js
90 lines (81 loc) · 2.55 KB
/
updateEmail.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
const Roles = require('../../../lib/Roles')
const logger = require('../../../lib/logger')
const ensureSignedIn = require('../../../lib/ensureSignedIn')
const sendMailTemplate = require('../../../lib/sendMailTemplate')
const isEmail = require('email-validator').validate
const querystring = require('querystring')
const updateUserOnMailchimp = require('../../../lib/updateUserOnMailchimp')
const unsubscribeFromMailchimp = require('../../../lib/unsubscribeFromMailchimp')
module.exports = async (_, args, {pgdb, req, t}) => {
ensureSignedIn(req, t)
const {email} = args
if (!isEmail(email)) {
logger.info('invalid email', { req: req._log(), email })
throw new Error(t('api/email/invalid'))
}
if (await pgdb.public.users.findFirst({email})) {
logger.error('updateEmail email exists', { req: req._log() })
throw new Error(t('api/email/change/exists'))
}
if (args.userId && args.userId !== req.userId) {
Roles.ensureUserHasRole(req.user, 'supporter')
}
const user = args.userId
? await pgdb.public.users.findOne({id: args.userId})
: req.user
if (!user) {
logger.error('user not found', { req: req._log() })
throw new Error(t('api/users/404'))
}
if (user.email === email) {
return user
}
const transaction = await pgdb.transactionBegin()
try {
await transaction.public.sessions.delete({'sess @>': {
passport: {user: user.id}
}})
await transaction.public.users.updateAndGetOne({id: user.id}, {
email,
verified: false
})
await transaction.transactionCommit()
} catch (e) {
await transaction.transactionRollback()
logger.info('transaction rollback', { req: req._log(), args, error: e })
throw e
}
await sendMailTemplate({
to: user.email,
fromEmail: process.env.DEFAULT_MAIL_FROM_ADDRESS,
subject: t('api/email/change/confirmation/subject'),
templateName: 'cf_email_change_old_address',
globalMergeVars: [
{ name: 'EMAIL',
content: email
}
]
})
const loginLink = (process.env.FRONTEND_BASE_URL || 'http://' + req.headers.host) +
'/merci?' +
querystring.stringify({email})
await sendMailTemplate({
to: email,
fromEmail: process.env.DEFAULT_MAIL_FROM_ADDRESS,
subject: t('api/email/change/confirmation/subject'),
templateName: 'cf_email_change_new_address',
globalMergeVars: [
{ name: 'LOGIN_LINK',
content: loginLink
}
]
})
unsubscribeFromMailchimp({
email: user.email
})
updateUserOnMailchimp({
userId: user.id,
pgdb
})
return pgdb.public.users.findOne({email})
}