forked from canada-ca/tracker
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdismiss-message.js
More file actions
79 lines (72 loc) · 2.57 KB
/
Copy pathdismiss-message.js
File metadata and controls
79 lines (72 loc) · 2.57 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
import { GraphQLString } from 'graphql'
import { mutationWithClientMutationId } from 'graphql-relay'
import { t } from '@lingui/macro'
import { dismissMessageUnion } from '../unions'
export const dismissMessage = new mutationWithClientMutationId({
name: 'DismissMessage',
description:
'This mutation allows users to dismiss a message that is displayed to them when they log in. This mutation will update the user object in the database to reflect that the message has been dismissed.',
inputFields: () => ({
messageId: {
type: GraphQLString,
description: 'The id of the message that the user is dismissing.',
},
}),
outputFields: () => ({
result: {
type: dismissMessageUnion,
description: '`DismissMessageUnion` returning either a `DismissMessageResult`, or `DismissMessageError` object.',
resolve: (payload) => payload,
},
}),
mutateAndGetPayload: async (
args,
{ i18n, query, auth: { userRequired }, loaders: { loadUserByKey }, validators: { cleanseInput } },
) => {
// Cleanse Input
const messageId = cleanseInput(args.messageId)
// Get user info from DB
const user = await userRequired()
if (!messageId) {
console.warn(`User: ${user._key} did not provide a message id when attempting to dismiss a message.`)
return {
_type: 'error',
code: 400,
description: i18n._(t`Unable to dismiss message. Please try again.`),
}
}
// Dismiss message
try {
const dismissMessageCursor = await query`
LET userDismissedMessages = FIRST(
FOR user IN users
FILTER user._key == ${user._key}
LIMIT 1
RETURN user.dismissedMessages
)
UPDATE { _key: ${user._key} }
WITH {
dismissedMessages: APPEND(
userDismissedMessages[* FILTER CURRENT.messageId != ${messageId}],
{ messageId: ${messageId}, dismissedAt: DATE_ISO8601(DATE_NOW()) }
)
}
IN users
`
await dismissMessageCursor.next()
} catch (err) {
console.error(
`Database error occurred when user: ${user._key} attempted to dismiss message: ${messageId}: ${err}`,
)
throw new Error(i18n._(t`Unable to dismiss message. Please try again.`))
}
await loadUserByKey.clear(user._key)
const returnUser = await loadUserByKey.load(user._key)
console.info(`User: ${user._key} successfully dismissed message: ${messageId}`)
return {
_type: 'success',
status: i18n._(t`Message dismissed successfully`),
user: returnUser,
}
},
})