Integrate SendGrid Mutations

This commit is contained in:
Barry Low committed 2018-11-09 04:05:13 -08:00
1 parent f70d092852
commit 9c19c9bdf1
8 files changed
+170 -138

No files matched your search

+1
View File
@@ -18,5 +18,6 @@ AACLOUD_ID=aacloud-id
RECAPTCHA=<RECAPTCHA_KEY>
SG_APIKEY=<SENDGRID_API_KEY>
SG_APIKEY_CONTACTS=<SENDGRID_API_KEY_CONTACTS>
SG_SIGNUP_EMAILID=<SENDGRID_SIGNUP_EMAILID>
SG_CONTACT_EMAILID=<SENDGRID_CONTACT_EMAILID>
+5
View File
@@ -3862,6 +3862,11 @@
"resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
"integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
},
"lodash.merge": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz",
"integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ=="
},
"lodash.once": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+1
View File
@@ -36,6 +36,7 @@
"graphql": "^14.0.2",
"graphql-tools": "^4.0.0",
"jwks-rsa": "^1.3.0",
"lodash.merge": "^4.6.1",
"node-fetch": "^2.2.0",
"winston": "^3.1.0"
}
+3 -1
View File
@@ -10,6 +10,7 @@ import axios from 'axios'
import { createTransformedRemoteSchema } from './createRemoteSchema'
import { teams, events } from './links'
import { typeDef as masterSchema } from './schema'
import masterResolvers from './resolvers'
import logger from './logger'
async function getUserId (authId) {
@@ -61,6 +62,7 @@ async function run () {
var schemas = [masterSchema]
var resolvers = {}
resolvers = Object.assign(resolvers, masterResolvers)
if (transformedTeamsSchema) {
schemas.push(transformedTeamsSchema)
@@ -155,7 +157,7 @@ async function run () {
schema,
context,
formatError: error => {
logger.error('An error ocurred inside a module: ' + error)
logger.error(`An error ocurred inside a module: ${JSON.stringify(error)}`)
return error
},
formatResponse: response => {
+10 -1
View File
@@ -1 +1,10 @@
export { default as Mutation } from './mutations'
import merge from 'lodash.merge'
import { SendgridMutations } from './mutation'
const resolvers = {
Mutation: {
...SendgridMutations
}
}
export default resolvers
+3 -2
View File
@@ -1,2 +1,3 @@
import { mergeDirectoryModules } from '../../utils'
export default mergeDirectoryModules(__dirname)
import SendgridMutations from './sendgrid'
export { SendgridMutations }
+144 -131
View File
@@ -1,10 +1,11 @@
import axios from 'axios'
import jwt from 'jsonwebtoken')
import jwt from 'jsonwebtoken'
import { ApolloError } from 'apollo-server-express'
import logger from '../../logger'
const API_KEY = process.env.SG_APIKEY
const API_KEY_CONTACTS = process.env.SG_APIKEY_CONTACTS
const dev = process.env.NODE_ENV === 'development' ? true : false
let origin = 'https://app.advancedalgos.net'
@@ -13,7 +14,7 @@ if (dev){
}
export default {
async sendgrid_NewsletterSignup(parent, { email }, ctx, info) {
async master_NewsletterSignup(parent, { email }, ctx, info) {
const token = jwt.sign({ email: email }, API_KEY, { expiresIn: '1d' })
let origin = 'https://advancedalgos.net'
const params = '/email-verification?token='
@@ -21,13 +22,13 @@ export default {
origin = 'http://localhost:4100'
}
var headers = {
const headers = {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin' : origin,
'Access-Control-Allow-Credentials': 'true'
};
}
var data = JSON.stringify({
const data = JSON.stringify({
"personalizations": [
{
"to": [
@@ -50,36 +51,35 @@ export default {
"email": "feedback@advancedalgos.net",
"name": "Advanced Algos Team"
},
"template_id": process.env.SG_EMAILID
"template_id": process.env.SG_SIGNUP_EMAILID
})
const sendVerify = axios({
method: 'post',
url: 'https://api.sendgrid.com/v3/mail/send',
data: data,
headers:{
'content-type': 'application/json',
'authorization': 'Bearer ' + API_KEY
}
method: 'post',
url: 'https://api.sendgrid.com/v3/mail/send',
data: data,
headers:{
'content-type': 'application/json',
'authorization': 'Bearer ' + API_KEY
}
})
.then(function (response) {
if (response.status >= 200 && response.status < 300) {
context.res = {
status: response.status,
body: "Email verification sent \n",
headers
}
return context
} else {
throw response.data.errors[0].message
}
logger.info('Sendgrid sendVerify response:')
logger.info(response)
if (response.status >= 200 && response.status < 300) {
return 'SUCCESS'
} else {
throw response.data.errors[0].message
}
})
.catch(function (error) {
throw new ApolloError(error.response.data.errors[0].message, 404)
logger.error('Sendgrid sendVerify Error:')
logger.error(error)
throw new ApolloError(`Sendgrid sendVerify Error: ${error.response.data.errors[0].message}`, 404)
})
return sendVerify
},
async sendgrid_NewsletterSignupVerify(parent, { token }, ctx, info){
async master_NewsletterSignupVerify(parent, { token }, ctx, info){
let origin = 'https://app.advancedalgos.net'
if (dev){
origin = 'http://localhost:4100'
@@ -90,16 +90,20 @@ export default {
'Access-Control-Allow-Credentials': 'true'
}
let token;
let verifiedToken
try {
verifiedToken = jwt.verify(token, API_KEY, {maxAge: '1d'})
verifiedToken = jwt.verify(token, API_KEY, {maxAge: '1d'})
} catch(err) {
if (err.name === 'TokenExpiredError'){
throw new ApolloError('Error: Token Expired. Please resubmit email address.', 400)
} else {
throw new ApolloError(`Error: ${err.message}`, 400)
}
logger.error('Sendgrid verifiedToken Error:')
logger.error(err)
if (err.name === 'TokenExpiredError'){
throw new ApolloError('Error: Token Expired. Please resubmit email address.', 400)
} else {
throw new ApolloError(`Error: ${err.message}`, 400)
}
}
logger.info('Sendgrid verifySignup verifiedToken: ')
logger.info(verifiedToken)
const email = verifiedToken.email
@@ -109,46 +113,53 @@ export default {
data: [{"email": email}],
headers:{
'content-type': 'application/json',
'authorization': 'Bearer ' + API_KEY
'authorization': 'Bearer ' + API_KEY_CONTACTS
}
})
.then(response => {
const recipients = response.data.persisted_recipients
if (recipients.length > 0 ){
const addToList = axios({
method: 'post',
url: 'https://api.sendgrid.com/v3/contactdb/lists/4068018/recipients/' + recipients[0],
headers:{
'content-type': 'application/json',
'authorization': 'Bearer ' + API_KEY
}
})
.then(response => {
if (response.status >= 200 && response.status < 300) {
return { email }
} else {
throw response.data.errors[0].message
}
})
.catch(error => {
throw `Email SignUp Error: ${error}`
})
return addToList;
} else{
return response.data.errors[0].message
}
logger.info('Sendgrid verifySignup subscribe: ')
logger.info(response)
const recipients = response.data.persisted_recipients
if (recipients.length > 0 ){
const addToList = axios({
method: 'post',
url: 'https://api.sendgrid.com/v3/contactdb/lists/4068018/recipients/' + recipients[0],
headers:{
'content-type': 'application/json',
'authorization': 'Bearer ' + API_KEY_CONTACTS
}
})
.then(response => {
logger.info('Sendgrid verifySignup addToList: ')
logger.info(response)
if (response.status >= 200 && response.status < 300) {
return 'SUCCESS'
} else {
throw response.data.errors[0].message
}
})
.catch(error => {
logger.error('Sendgrid verifySignUp subscribe Error:')
logger.error(error)
throw `Email SignUp Error: ${error}`
})
return addToList
} else{
return response.data.errors[0].message
}
})
.then(response => {
return `Success: Added ${response.email} to General List`
return response
})
.catch(error => {
throw new ApolloError(error.response.data.errors[0].message, 404)
logger.error('Sendgrid verifySubscribe Error:')
logger.error(error)
throw new ApolloError(`Sendgrid verifySubscribe Error: ${error.response.data.errors[0].message}`, 404)
})
return subscribe
},
async sendgrid_Contact(parent, { email, subject, message, recaptcha }, ctx, info) {
async master_Contact(parent, { email, subject, message, recaptcha }, ctx, info) {
let origin = 'https://advancedalgos.net'
if (dev){
origin = 'http://localhost:4000'
@@ -162,77 +173,79 @@ export default {
const toEmail = 'feedback@advancedalgos.net'
const data = JSON.stringify({
"personalizations": [
{
"to": [
{
"email": email
}
],
dynamic_template_data: {
"aacontactname": name,
"aacontactemail": email,
"aacontactbody": message
},
"subject": `AA Corporate Site Contact - Message from ${name}`
}
],
"from": {
"email": email,
"name": name
},
"reply_to": {
"email": email,
"name": name
},
"template_id": process.env.SG_CONTACT_EMAILID
})
const checkCaptcha = axios({
method: 'post',
url: 'https://www.google.com/recaptcha/api/siteverify',
params: {
secret: process.env.RECAPTCHA,
response: recaptcha
}
})
.then(function (response) {
logger.info(response.data)
if (response.status >= 200 && response.status < 300 && response.data.success) {
context.log('presend SendGrid');
return axios({
method: 'post',
url: 'https://api.sendgrid.com/v3/mail/send',
data: data,
headers:{
'content-type': 'application/json',
'authorization': 'Bearer ' + API_KEY
"personalizations": [
{
"to": [
{
"email": email
}
})
.then(function (response) {
context.log('sendgrid response: ', response)
if (response.status >= 200 && response.status < 300) {
return `Contact email sent`
} else {
throw response.data.errors[0].message
}
})
.catch(function (error) {
logger.error(`sendgrid Error: ${JSON.stringify(error)}`)
throw `Contact email send error: ${error.response.data.errors[0].message}`
})
}else{
throw response.data
],
dynamic_template_data: {
"aacontactname": name,
"aacontactemail": email,
"aacontactbody": message
},
"subject": `AA Corporate Site Contact - Message from ${name}`
}
})
.then(function(response){
return response
})
.catch(function (error) {
context.log('function error: ', error, JSON.stringify(error.Error))
throw new ApolloError(JSON.stringify(error.response), 404)
})
}
return
],
"from": {
"email": email,
"name": name
},
"reply_to": {
"email": email,
"name": name
},
"template_id": process.env.SG_CONTACT_EMAILID
})
const checkCaptcha = axios({
method: 'post',
url: 'https://www.google.com/recaptcha/api/siteverify',
params: {
secret: process.env.RECAPTCHA,
response: recaptcha
}
})
.then(function (response) {
logger.info(response.data)
if (response.status >= 200 && response.status < 300 && response.data.success) {
context.log('presend SendGrid')
return axios({
method: 'post',
url: 'https://api.sendgrid.com/v3/mail/send',
data: data,
headers:{
'content-type': 'application/json',
'authorization': 'Bearer ' + API_KEY
}
})
.then(function (response) {
logger.info('Sendgrid Contact response: ')
logger.info(response)
if (response.status >= 200 && response.status < 300) {
return `Contact email sent`
} else {
throw response.data.errors[0].message
}
})
.catch(function (error) {
logger.error(`sendgrid Error: ${JSON.stringify(error)}`)
throw `Contact email send error: ${error.response.data.errors[0].message}`
})
}else{
throw response.data
}
})
.then(function(response){
return response
})
.catch(function (error) {
logger.error('Sendgrid Contact RECAPTCHA Error:')
logger.error(error)
throw new ApolloError(`Sendgrid Contact RECAPTCHA Error: ${error.response.data.errors[0].message}`, 404)
})
return checkCaptcha
}
}
+3 -3
View File
@@ -1,8 +1,8 @@
export const typeDef = `
type Mutation {
sendgrid_NewsletterSignup(email: String!): String
sendgrid_NewsletterSignupVerify(email: String!): String
sendgrid_Contact(email: String!, subject: String!, Message: String!, recaptcha: String!): String
master_NewsletterSignup(email: String!): String
master_NewsletterSignupVerify(token: String!): String
master_Contact(email: String!, subject: String!, Message: String!, recaptcha: String!): String
}
schema {