diff --git a/api/src/email/sendgrid.js b/api/src/email/sendgrid.js deleted file mode 100644 index 22133d892..000000000 --- a/api/src/email/sendgrid.js +++ /dev/null @@ -1,145 +0,0 @@ -var jwt = require('jsonwebtoken') -var axios = require('axios') - -import { logger } from '../logger' - -const sendTeamMemberInvite = function(email, team) { - logger.info(`sendTeamMemberInvite email|team: ${email} | ${team}`) - const API_KEY = process.env.SG_APIKEY - const token = jwt.sign({ email: email, team: team.slug }, API_KEY, { expiresIn: '7d' }) - let origin = process.env.SG_ORIGIN - const params = '/activate-team-membership/' - - const headers = { - 'Content-Type': 'application/json', - 'Access-Control-Allow-Origin' : origin, - 'Access-Control-Allow-Credentials': 'true' - }; - - const data = JSON.stringify({ - "personalizations": [ - { - "to": [ - { - "email": email - } - ], - dynamic_template_data: { - "aateaminvitelink": origin + params + token, - "aateamname": team.name, - "subject": "INVITATION: Join team " + team.name - }, - "subject": "INVITATION: Join team " + team.name - } - ], - "from": { - "email": "noreply@advancedalgos.net", - "name": "Advanced Algos Teams" - }, - "reply_to": { - "email": "feedback@advancedalgos.net", - "name": "Advanced Algos Teams" - }, - "template_id": process.env.SG_INVITE_EMAILID - }) - - let sendVerify = 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) { - if (response.status >= 200 && response.status < 300) { - return 'Success' - } else { - throw response.data.errors[0].message - } - }) - .catch(function (error) { - return `${error.status}-${error.response.data.errors[0].message}` - }) - return sendVerify -} - -const sendTeamCreateConfirmation = function(email, teamName, botName) { - logger.info(`sendTeamCreateConfirmation email|teamName|botName: ${email} | ${teamName} | ${botName}`) - const API_KEY = process.env.SG_APIKEY - let origin = process.env.SG_ORIGIN - - const headers = { - 'Content-Type': 'application/json', - 'Access-Control-Allow-Origin' : origin, - 'Access-Control-Allow-Credentials': 'true' - }; - - const data = JSON.stringify({ - "personalizations": [ - { - "to": [ - { - "email": email - } - ], - dynamic_template_data: { - "aadeveloplink": process.env.SG_PLATFORM_URL, - "aateamname": teamName, - "aabotname": botName, - "subject": "Team " + teamName + " has been created!" - }, - "subject": "Team " + teamName + " has been created!" - } - ], - "from": { - "email": "noreply@advancedalgos.net", - "name": "Advanced Algos Teams" - }, - "reply_to": { - "email": "feedback@advancedalgos.net", - "name": "Advanced Algos Teams" - }, - "template_id": process.env.SG_TEAMCREATE_EMAILID - }) - - let sendTeamCreation = 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) { - if (response.status >= 200 && response.status < 300) { - return 'Success' - } else { - throw response.data.errors[0].message - } - }) - .catch(function (error) { - return `${error.status}-${error.response.data.errors[0].message}` - }) - return sendTeamCreation -} - -const verifyInviteToken = async function(token) { - const API_KEY = process.env.SG_APIKEY - let verifiedToken - try { - verifiedToken = await jwt.verify(token, API_KEY, {maxAge: '7d'}) - } catch(err) { - if (err.name === "TokenExpiredError"){ - throw new Error ("Error: Token Expired. Please request new invitation or apply to the team again") - } else { - throw new Error (`Error: Token error - ${err.message}`) - } - } - logger.info(`verifyInviteToken: ${verifiedToken}`) - return verifiedToken -} - -module.exports = { sendTeamMemberInvite, sendTeamCreateConfirmation, verifyInviteToken } diff --git a/api/src/graphql/resolvers/Mutation/index.js b/api/src/graphql/resolvers/Mutation/index.js index e24e9653d..8e8e5cfeb 100644 --- a/api/src/graphql/resolvers/Mutation/index.js +++ b/api/src/graphql/resolvers/Mutation/index.js @@ -3,7 +3,7 @@ import { ApolloError } from 'apollo-server-express' import { getUser } from '../../../middleware/getMember' -import { sendTeamMemberInvite, sendTeamCreateConfirmation, verifyInviteToken } from '../../../email/sendgrid' +import { notifications_sendTeamCreateConfirmation, notifications_sendTeamMemberInvite, notifications_VerifyTeamMemberInviteToken } from '../notifications/sendgrid' import TEAMS_CONNECTIONS_FRAGMENT from '../../fragments/TeamsConnectionsFragment' import TEAMS_FRAGMENT from '../../fragments/TeamsFragment' @@ -20,14 +20,14 @@ export const resolvers = { create:{role:'MEMBER', email:email, team: {connect: {id: teamId}}, status:{create:{status: 'INVITED', reason: `Invited by ${team.members[0].member.alias}`}}}, update:{role: 'MEMBER', email: email, team: {connect: {id: teamId}}, status:{create:{status: 'INVITED', reason: `Invite resent by ${team.members[0].member.alias}`}}}}, `{ id }`) - const sendInvite = await sendTeamMemberInvite(email, team) + const sendInvite = await notifications_sendTeamMemberInvite(email, team) return sendInvite }, async verifyTeamInvite(parent, { token }, ctx, info) { let verifiedToken = null let team = null try { - verifiedToken = await verifyInviteToken(token) + verifiedToken = await notifications_VerifyTeamMemberInviteToken(token) team = { email: verifiedToken.email, team: { @@ -111,7 +111,7 @@ export const resolvers = { }) } - sendTeamCreateConfirmation(email, name, botName) + notifications_sendTeamCreateConfirmation(email, name, botName) return createTeam }, diff --git a/api/src/graphql/resolvers/notifications/sendgrid.js b/api/src/graphql/resolvers/notifications/sendgrid.js new file mode 100644 index 000000000..c6dc4d5cb --- /dev/null +++ b/api/src/graphql/resolvers/notifications/sendgrid.js @@ -0,0 +1,127 @@ +var jwt = require('jsonwebtoken') +var axios = require('axios') + +import { logger } from '../logger' + +export const notifications_sendTeamMemberInvite = (email, team) => { + logger.info('notifications_sendTeamMemberInvite') + logger.info(email) + logger.info(teamName) + return new Promise((resolve, reject) => { + try { + return axios.post(process.env.PLATFORM_API_URL, { + query: `mutation notifications_Teams_SendTeamMemberInvite($email:String!, $teamName:String!){ + notifications_Teams_SendTeamMemberInvite(email:$email, teamName:$teamName) + }`, + variables: { + email: email, + teamName: team.name + } + }, { + headers: { + 'Content-Type': 'application/json' + } + }) + .then(res => { + logger.info('sendTeamMemberInvite result') + logger.info(res.data) + resolve(res.data) + }) + .catch(err => { + logger.info('sendTeamMemberInvite err') + logger.info(err) + reject(err) + }) + } catch (error) { + reject(error) + } + }) +} + +export const notifications_sendTeamCreateConfirmation = (email, teamName, botName) => { + logger.info('notifications_sendTeamCreateConfirmation') + logger.info(email) + logger.info(teamName) + logger.info(botName) + return new Promise((resolve, reject) => { + try { + return axios.post(process.env.PLATFORM_API_URL, { + query: `mutation notifications_sendTeamCreateConfirmation($email: String!, $teamName: String!, $botName: String!){ + notifications_Teams_SendTeamCreateConfirmation(email: $email, teamName: $teamName, botName: $botName) + }`, + variables: { + email: email, + teamName: teamName, + botName: botName + } + }, { + headers: { + 'Content-Type': 'application/json' + } + }) + .then(res => { + logger.info('sendTeamCreateConfirmation result') + logger.info(res.data) + resolve(res.data) + }) + .catch(err => { + logger.info('sendTeamCreateConfirmation err') + logger.info(err) + reject(err) + }) + } catch (error) { + reject(error) + } + }) +} + +export const notifications_VerifyTeamMemberInviteToken = (token) => { + logger.info('notifications_VerifyTeamMemberInviteToken') + logger.info(token) + return new Promise((resolve, reject) => { + try { + return axios.post(process.env.PLATFORM_API_URL, { + query: `mutation notifications_VerifyTeamMemberInviteToken($token: String!){ + notifications_Teams_VerifyTeamMemberInviteToken(token: $token) + }`, + variables: { + token: token + } + }, { + headers: { + 'Content-Type': 'application/json' + } + }) + .then(res => { + logger.info('VerifyTeamMemberInviteToken result') + logger.info(res.data) + resolve(res.data) + }) + .catch(err => { + logger.info('VerifyTeamMemberInviteToken err') + logger.info(err) + reject(err) + }) + } catch (error) { + reject(error) + } + }) +} + +const verifyInviteToken = async function(token) { + const API_KEY = process.env.SG_APIKEY + let verifiedToken + try { + verifiedToken = await jwt.verify(token, API_KEY, {maxAge: '7d'}) + } catch(err) { + if (err.name === "TokenExpiredError"){ + throw new Error ("Error: Token Expired. Please request new invitation or apply to the team again") + } else { + throw new Error (`Error: Token error - ${err.message}`) + } + } + logger.info(`verifyInviteToken: ${verifiedToken}`) + return verifiedToken +} + +module.exports = { sendTeamMemberInvite, sendTeamCreateConfirmation, verifyInviteToken } diff --git a/client/package.json b/client/package.json index f9152d456..4624ee655 100644 --- a/client/package.json +++ b/client/package.json @@ -69,7 +69,7 @@ "workbox-cli": "^3.6.2" }, "dependencies": { - "@advancedalgos/web-components": "0.0.17", + "@advancedalgos/web-components": "0.0.18", "@azure/storage-blob": "^10.0.0-preview", "apollo-cache-inmemory": "^1.3.5", "apollo-client": "^2.4.2", @@ -98,7 +98,7 @@ "subscriptions-transport-ws": "^0.9.15" }, "peerDependencies": { - "@material-ui/core": "^3.2.2", + "@material-ui/core": "^3.6.2", "@material-ui/icons": "^3.0.1" }, "standard": {