Skip to content

Commit

Permalink
Added Cognito router to handle auth validation/emails, worked on routes
Browse files Browse the repository at this point in the history
  • Loading branch information
heythisischris committed May 2, 2024
1 parent 338512f commit 90f91b3
Show file tree
Hide file tree
Showing 17 changed files with 146 additions and 17 deletions.
5 changes: 3 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,13 @@ Our API is stateless and is intended to run ephemerally on serverless environmen

## Important Links

[Postman Collection](https://documenter.getpostman.com/view/26880150/2sA3BoarvB)
[GitBook Documentation](https://docs.equalify.dev/)

Production environment: https://api.equalify.dev
Staging environment: https://api-staging.equalify.dev
Local environment: http://localhost:3000

Postman collection: https://documenter.getpostman.com/view/26880150/2sA3BoarvB

## Setup

1. Clone the repository!
Expand Down
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
"start:prod": "esbuild --format=esm src/**/*.ts --outdir=dist && nodemon --env-file=.env.production dist/app.js",
"start:staging": "esbuild --format=esm src/**/*.ts --outdir=dist && nodemon --env-file=.env.staging dist/app.js",
"build:prod": "esbuild src/*.ts --bundle --platform=node --outdir=dist --external:@aws-sdk && cd dist && zip -r lambda.zip * > /dev/null && aws --profile equalify lambda update-function-code --function-name equalify-api --zip-file \"fileb://lambda.zip\" > /dev/null && rm -rf lambda.zip",
"build:staging": "esbuild src/*.ts --bundle --platform=node --outdir=dist --external:@aws-sdk && cd dist && zip -r lambda.zip * > /dev/null && aws --profile equalify lambda update-function-code --function-name equalify-api-staging --zip-file \"fileb://lambda.zip\" > /dev/null && rm -rf lambda.zip"
"build:staging": "esbuild src/*.ts --bundle --platform=node --outdir=dist --external:@aws-sdk && cd dist && zip -r lambda.zip * > /dev/null && aws --profile equalify lambda update-function-code --function-name equalify-api-staging --zip-file \"fileb://lambda.zip\" > /dev/null && rm -rf lambda.zip",
"build": "yarn build:staging && yarn build:prod"
},
"type": "module",
"dependencies": {},
Expand Down
28 changes: 28 additions & 0 deletions src/cognito.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { postConfirmationConfirmSignUp, postConfirmationConfirmForgotPassword, customMessageSignUp, customMessageResendCode, customMessageForgotPassword, customMessageVerifyUserAttribute, customMessageUpdateUserAttribute } from 'cognito/index.js';

export const cognito = async (event) => {
if (event.triggerSource === 'PostConfirmation_ConfirmSignUp') {
return postConfirmationConfirmSignUp(event);
}
else if (event.triggerSource === 'PostConfirmation_ConfirmForgotPassword') {
return postConfirmationConfirmForgotPassword(event);
}
else if (event.triggerSource === 'CustomMessage_SignUp') {
return customMessageSignUp(event);
}
else if (event.triggerSource === 'CustomMessage_ResendCode') {
return customMessageResendCode(event);
}
else if (event.triggerSource === 'CustomMessage_ForgotPassword') {
return customMessageForgotPassword(event);
}
else if (event.triggerSource === 'CustomMessage_VerifyUserAttribute') {
return customMessageVerifyUserAttribute(event);
}
else if (event.triggerSource === 'CustomMessage_UpdateUserAttribute') {
return customMessageUpdateUserAttribute(event);
}
else {
return event;
}
}
7 changes: 7 additions & 0 deletions src/cognito/customMessageForgotPassword.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { formatEmail } from "../utils";

export const customMessageForgotPassword = async (event) => {
event.response.emailSubject = `Please reset your password`;
event.response.emailMessage = formatEmail({ body: `<p>${event.request.userAttributes['name']},</p><p>Please reset your password by <a href="https://${process.env.STAGING ? 'staging.' : ''}equalify.dev/reset?username=${event.userName}&code=${event.request.codeParameter}">clicking here</a>.<p>Thank you,<br/>Equalify<div style="display:none"><a>${event.request.codeParameter}</a><a>${event.request.codeParameter}</a></div>` });
return event;
}
7 changes: 7 additions & 0 deletions src/cognito/customMessageResendCode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { formatEmail } from "../utils";

export const customMessageResendCode = async (event) => {
event.response.emailSubject = `Confirm your registration to Equalify`;
event.response.emailMessage = formatEmail({ body: `<p>${event.request.userAttributes['name']},</p><p>Please confirm your registration by <a href="https://${process.env.STAGING ? 'staging.' : ''}equalify.dev/login?username=${event.userName}&code=${event.request.codeParameter}&email=${event.request.userAttributes.email}">clicking here</a>.<p>Thank you,<br/>Equalify<div style="display:none"><a>${event.request.codeParameter}</a><a>${event.request.codeParameter}</a></div>` });
return event;
}
3 changes: 3 additions & 0 deletions src/cognito/customMessageSignUp.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const customMessageSignUp = async (event) => {
return event;
}
8 changes: 8 additions & 0 deletions src/cognito/customMessageUpdateUserAttribute.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { formatEmail } from "../utils";

export const customMessageUpdateUserAttribute = async (event) => {
event.response.emailSubject = `Please confirm your new email address`;
event.response.emailMessage = formatEmail({ body: `<p>${event.request.userAttributes['name']},</p><p>Please confirm your new email address by <a href="https://${process.env.STAGING ? 'staging.' : ''}equalify.dev/verify?type=email&code=${event.request.codeParameter}">clicking here</a>.<p>Thank you,<br/>Equalify<div style="display:none"><a>${event.request.codeParameter}</a><a>${event.request.codeParameter}</a></div>` });

return event;
}
5 changes: 5 additions & 0 deletions src/cognito/customMessageVerifyUserAttribute.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export const customMessageVerifyUserAttribute = async (event) => {
event.response.smsMessage = `Equalify: Verify your phone number by visting "https://${process.env.STAGING ? 'staging.' : ''}equalify.dev/verify?type=phone_number&code=${event.request.codeParameter}"`;

return event;
}
7 changes: 7 additions & 0 deletions src/cognito/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export * from './postConfirmationConfirmSignUp.js'
export * from './postConfirmationConfirmForgotPassword.js'
export * from './customMessageSignUp.js'
export * from './customMessageVerifyUserAttribute.js'
export * from './customMessageUpdateUserAttribute.js'
export * from './customMessageResendCode.js'
export * from './customMessageForgotPassword.js'
3 changes: 3 additions & 0 deletions src/cognito/postConfirmationConfirmForgotPassword.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const postConfirmationConfirmForgotPassword = async (event) => {
return event;
}
11 changes: 11 additions & 0 deletions src/cognito/postConfirmationConfirmSignUp.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { pgClient } from "../utils/index.js";

export const postConfirmationConfirmSignUp = async (event) => {
const { sub, email, name } = event.request.userAttributes;
await pgClient.connect();
await pgClient.query(`
INSERT INTO "users" ("id", "email", "name") VALUES ($1, $2, $3)
`, [sub, email, name]);
await pgClient.clean();
return event;
}
4 changes: 4 additions & 0 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import awsLambdaFastify from "@fastify/aws-lambda";
import { fastify } from "./app.js";
import { cognito } from './cognito.js';
const proxy = awsLambdaFastify(fastify);

export async function handler(event: any, context: any) {
if (event.triggerSource) {
return await cognito(event);
}
return await proxy(event, context);
}
6 changes: 3 additions & 3 deletions src/routes/getReports.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ export const getReports = async ({ request, reply }) => {
const response = (await graphqlQuery({
query: `query($first: Int, $offset: Int){
reports(first: $first, offset: $offset, ${(request.query.reportIds) ? `filter: { id: {in: [
${request.query.reportIds.split(',').map(obj => `"${obj}"`).join()}
]}}` : ''}
) {
${request.query.reportIds.split(',').map(obj => `"${obj}"`).join()}
]}}` : ''}
) {
nodes {
id
name
Expand Down
29 changes: 24 additions & 5 deletions src/routes/getScans.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,27 @@
import { jwtClaims } from '../app.js';
import { pgClient } from '../utils/index.js';
import { graphqlQuery } from '../utils/index.js';

export const getScans = async ({ request, reply }) => {
await pgClient.connect();
await pgClient.clean();
return;
const response = (await graphqlQuery({
query: `query($first: Int, $offset: Int){
scans(first: $first, offset: $offset, ${(request.query.scanIds) ? `filter: { id: {in: [
${request.query.scanIds.split(',').map(obj => `"${obj}"`).join()}
]}}` : ''}
) {
nodes {
id
}
totalCount
}
}`,
variables: {
first: parseInt(request.query.first ?? 100),
offset: parseInt(request.query.offset ?? 0),
},
}))?.data;

return {
status: 'success',
result: response?.scans?.nodes,
total: response?.scans?.totalCount,
};
}
31 changes: 26 additions & 5 deletions src/routes/getUpdates.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,29 @@
import { jwtClaims } from '../app.js';
import { pgClient } from '../utils/index.js';
import { graphqlQuery } from '../utils/index.js';

export const getUpdates = async ({ request, reply }) => {
await pgClient.connect();
await pgClient.clean();
return;
const response = (await graphqlQuery({
query: `query($first: Int, $offset: Int){
updates(first: $first, offset: $offset, ${(request.query.startDate && request.query.endDate) ? `filter: {
created_at: { greaterThan: "${request.query.startDate}" },
created_at: { lessThan: "${request.query.endDate}" }
}` : ''}
) {
nodes {
id
created_at
}
totalCount
}
}`,
variables: {
first: parseInt(request.query.first ?? 100),
offset: parseInt(request.query.offset ?? 0),
},
}))?.data;

return {
status: 'success',
result: response?.updates?.nodes,
total: response?.updates?.totalCount,
};
}
3 changes: 3 additions & 0 deletions src/utils/formatEmail.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export const formatEmail = ({ body }) => {
return `<p><img style="width:300px" src="https://equalify.dev/social.jpg"/></p>${body}`;
};
3 changes: 2 additions & 1 deletion src/utils/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ export * from './openai.js'
export * from './validateUuid.js'
export * from './validateUrl.js'
export * from './validateDiscovery.js'
export * from './formatId.js'
export * from './formatId.js'
export * from './formatEmail.js'

0 comments on commit 90f91b3

Please sign in to comment.