forked from canada-ca/tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathverify-phone-number.js
More file actions
122 lines (110 loc) · 3.29 KB
/
Copy pathverify-phone-number.js
File metadata and controls
122 lines (110 loc) · 3.29 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import { GraphQLNonNull, GraphQLInt } from 'graphql'
import { mutationWithClientMutationId } from 'graphql-relay'
import { t } from '@lingui/macro'
import { verifyPhoneNumberUnion } from '../unions'
export const verifyPhoneNumber = new mutationWithClientMutationId({
name: 'verifyPhoneNumber',
description: 'This mutation allows the user to two factor authenticate.',
inputFields: () => ({
twoFactorCode: {
type: GraphQLNonNull(GraphQLInt),
description: 'The two factor code that was received via text message.',
},
}),
outputFields: () => ({
result: {
type: verifyPhoneNumberUnion,
description:
'`VerifyPhoneNumberUnion` returning either a `VerifyPhoneNumberResult`, or `VerifyPhoneNumberError` object.',
resolve: (payload) => payload,
},
}),
mutateAndGetPayload: async (
args,
{
i18n,
userKey,
query,
collections,
transaction,
auth: { userRequired },
loaders: { loadUserByKey },
},
) => {
// Cleanse Input
const twoFactorCode = args.twoFactorCode
// Get User From DB
const user = await userRequired()
if (twoFactorCode.toString().length !== 6) {
console.warn(
`User: ${user._key} attempted to two factor authenticate, however the code they submitted does not have 6 digits.`,
)
return {
_type: 'error',
code: 400,
description: i18n._(
t`Two factor code length is incorrect. Please try again.`,
),
}
}
// Check that TFA codes match
if (twoFactorCode !== user.tfaCode) {
console.warn(
`User: ${user._key} attempted to two factor authenticate, however the tfa codes do not match.`,
)
return {
_type: 'error',
code: 400,
description: i18n._(t`Two factor code is incorrect. Please try again.`),
}
}
// Generate list of collections names
const collectionStrings = []
for (const property in collections) {
collectionStrings.push(property.toString())
}
// Setup Transaction
const trx = await transaction(collectionStrings)
// Update phoneValidated to be true
try {
await trx.step(
() => query`
WITH users
UPSERT { _key: ${user._key} }
INSERT { phoneValidated: true }
UPDATE { phoneValidated: true }
IN users
`,
)
} catch (err) {
console.error(
`Trx step error occurred when upserting the tfaValidate field for ${user._key}: ${err}`,
)
throw new Error(
i18n._(t`Unable to two factor authenticate. Please try again.`),
)
}
try {
await trx.commit()
} catch (err) {
console.error(
`Trx commit error occurred when upserting the tfaValidate field for ${user._key}: ${err}`,
)
throw new Error(
i18n._(t`Unable to two factor authenticate. Please try again.`),
)
}
await loadUserByKey.clear(userKey)
const updatedUser = await loadUserByKey.load(userKey)
console.info(
`User: ${user._key} successfully two factor authenticated their account.`,
)
return {
_type: 'success',
user: updatedUser,
status: i18n._(
t`Successfully verified phone number, and set TFA send method to text.`,
),
}
},
})