Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion UploadData/UploadMe.txt

This file was deleted.

18 changes: 0 additions & 18 deletions handler.js

This file was deleted.

27 changes: 27 additions & 0 deletions lambdas/common/API_Responses.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
const Responses = {
_200(data = {}) {
return {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Methods': '*',
'Access-Control-Allow-Origin': '*',
},
statusCode: 200,
body: JSON.stringify(data),
};
},

_400(data = {}) {
return {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Methods': '*',
'Access-Control-Allow-Origin': '*',
},
statusCode: 400,
body: JSON.stringify(data),
};
},
};

module.exports = Responses;
54 changes: 54 additions & 0 deletions lambdas/common/Dynamo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const AWS = require('aws-sdk');

const documentClient = new AWS.DynamoDB.DocumentClient();

const Dynamo = {
async get(ID, TableName) {
const params = {
TableName,
Key: {
ID,
},
};

const data = await documentClient.get(params).promise();

if (!data || !data.Item) {
throw Error(`There was an error fetching the data for ID of ${ID} from ${TableName}`);
}
console.log(data);

return data.Item;
},

async write(data, TableName) {
if (!data.ID) {
throw Error('no ID on the data');
}

const params = {
TableName,
Item: data,
};

const res = await documentClient.put(params).promise();

if (!res) {
throw Error(`There was an error inserting ID of ${data.ID} in table ${TableName}`);
}

return data;
},

async delete(ID, TableName) {
const params = {
TableName,
Key: {
ID,
},
};

return documentClient.delete(params).promise();
},
};
module.exports = Dynamo;
40 changes: 40 additions & 0 deletions lambdas/common/S3.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
const AWS = require('aws-sdk');

const s3Client = new AWS.S3();

const S3 = {
async get(fileName, bucket) {
const params = {
Bucket: bucket,
Key: fileName,
};

let data = await s3Client.getObject(params).promise();

if (!data) {
throw Error(`Failed to get file ${fileName}, from ${bucket}`);
}

if (fileName.slice(fileName.length - 4, fileName.length) == 'json') {
data = data.Body.toString();
}
return data;
},
async write(data, fileName, bucket) {
const params = {
Bucket: bucket,
Body: JSON.stringify(data),
Key: fileName,
};

const newData = await s3Client.putObject(params).promise();

if (!newData) {
throw Error('there was an error writing the file');
}

return newData;
},
};

module.exports = S3;
24 changes: 24 additions & 0 deletions lambdas/common/websocketMessage.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
const AWS = require('aws-sdk');

const create = (domainName, stage) => {
const endpoint = `${domainName}/${stage}`;
return new AWS.ApiGatewayManagementApi({
apiVersion: '2018-11-29',
endpoint,
});
};

const send = ({ domainName, stage, connectionID, message }) => {
const ws = create(domainName, stage);

const postParams = {
Data: message,
ConnectionId: connectionID,
};

return ws.postToConnection(postParams).promise();
};

module.exports = {
send,
};
22 changes: 22 additions & 0 deletions lambdas/websockets/connect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const Responses = require('../common/API_Responses');
const Dynamo = require('../common/Dynamo');

const tableName = process.env.tableName;

exports.handler = async event => {
console.log('event', event);

const { connectionId: connectionID, domainName, stage } = event.requestContext;

const data = {
ID: connectionID,
date: Date.now(),
messages: [],
domainName,
stage,
};

await Dynamo.write(data, tableName);

return Responses._200({ message: 'connected' });
};
7 changes: 7 additions & 0 deletions lambdas/websockets/default.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
const Responses = require('../common/API_Responses');

exports.handler = async event => {
console.log('event', event);

return Responses._200({ message: 'default' });
};
14 changes: 14 additions & 0 deletions lambdas/websockets/disconnect.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const Responses = require('../common/API_Responses');
const Dynamo = require('../common/Dynamo');

const tableName = process.env.tableName;

exports.handler = async event => {
console.log('event', event);

const { connectionId: connectionID } = event.requestContext;

await Dynamo.delete(connectionID, tableName);

return Responses._200({ message: 'disconnected' });
};
41 changes: 41 additions & 0 deletions lambdas/websockets/message.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
const Responses = require('../common/API_Responses');
const Dynamo = require('../common/Dynamo');
const WebSocket = require('../common/websocketMessage');

const tableName = process.env.tableName;

exports.handler = async event => {
console.log('event', event);

const { connectionId: connectionID } = event.requestContext;

const body = JSON.parse(event.body);

try {
const record = await Dynamo.get(connectionID, tableName);
const { messages, domainName, stage } = record;

messages.push(body.message);

const data = {
...record,
messages,
};

await Dynamo.write(data, tableName);

await WebSocket.send({
domainName,
stage,
connectionID,
message: 'This is a reply to your message',
});
console.log('sent message');

return Responses._200({ message: 'got a message' });
} catch (error) {
return Responses._400({ message: 'message could not be received' });
}

return Responses._200({ message: 'got a message' });
};
Loading