From 76c1dfa915341972146a278b2e998a5b5e15d772 Mon Sep 17 00:00:00 2001 From: KrishnaSolo Date: Sat, 20 Feb 2021 19:47:48 -0500 Subject: [PATCH] added controller to get weeks for a user --- takeNotes-src/getWeeks/.prettierignore | 106 ++++++++++++++++++++++ takeNotes-src/getWeeks/app.js | 65 ++++++++++++++ takeNotes-src/getWeeks/package-lock.json | 109 +++++++++++++++++++++++ takeNotes-src/getWeeks/package.json | 16 ++++ template.yaml | 26 ++++++ 5 files changed, 322 insertions(+) create mode 100644 takeNotes-src/getWeeks/.prettierignore create mode 100644 takeNotes-src/getWeeks/app.js create mode 100644 takeNotes-src/getWeeks/package-lock.json create mode 100644 takeNotes-src/getWeeks/package.json diff --git a/takeNotes-src/getWeeks/.prettierignore b/takeNotes-src/getWeeks/.prettierignore new file mode 100644 index 0000000..195a343 --- /dev/null +++ b/takeNotes-src/getWeeks/.prettierignore @@ -0,0 +1,106 @@ +*.DS_Store +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +*.json + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port \ No newline at end of file diff --git a/takeNotes-src/getWeeks/app.js b/takeNotes-src/getWeeks/app.js new file mode 100644 index 0000000..f6df5fd --- /dev/null +++ b/takeNotes-src/getWeeks/app.js @@ -0,0 +1,65 @@ +// default imports +const AWS = require("aws-sdk"); +const DDB = new AWS.DynamoDB({ apiVersion: "2012-10-08" }); + +// environment variables +const { TABLE_NAME, ENDPOINT_OVERRIDE, REGION } = process.env; +const options = { region: REGION }; +AWS.config.update({ region: REGION }); + +if (ENDPOINT_OVERRIDE !== "") { + options.endpoint = ENDPOINT_OVERRIDE; +} + +const docClient = new AWS.DynamoDB.DocumentClient(options); + +// response helper +const response = (statusCode, body) => ({ + statusCode, + body: JSON.stringify(body), + headers: { + "Content-Type": "application/json", + "Access-Control-Allow-Origin": "*", + }, +}); + +//valid request check +function isValidRequest(context, event) { + return ( + event !== null && + event.pathParameters !== null && + event.pathParameters.id !== null + ); +} + +//get item for db and return only weeks property +function getRecordById(recordId) { + console.log("setting up params..."); + let params = { + TableName: TABLE_NAME, + Key: { + id: recordId, + }, + ProjectionExpression: "docBody.journal.weeks", + }; + console.log("params: " + params); + return docClient.get(params); +} + +// Lambda Handler +exports.getWeeks = async (event, context, callback) => { + if (!isValidRequest(context, event)) { + return response(400, { message: "Error: Invalid request" }); + } + + try { + console.log("id: " + event.pathParameters.id); + let data = await getRecordById(event.pathParameters.id).promise(); + if (data === null || data === undefined) { + return response(404, { message: "Record not found" }); + } + return response(200, data); + } catch (err) { + return response(400, { message: err.message }); + } +}; diff --git a/takeNotes-src/getWeeks/package-lock.json b/takeNotes-src/getWeeks/package-lock.json new file mode 100644 index 0000000..f8e0d21 --- /dev/null +++ b/takeNotes-src/getWeeks/package-lock.json @@ -0,0 +1,109 @@ +{ + "name": "get", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "aws-sdk": { + "version": "2.848.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.848.0.tgz", + "integrity": "sha512-c/e5kaEFl+9aYkrYDkmu5mSZlL+EfP6DnBOMD06fH12gIsaFSMBGtbsDTHABhvSu++LxeI1dJAD148O17MuZvg==", + "requires": { + "buffer": "4.9.2", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" + }, + "ieee754": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" + }, + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" + }, + "sax": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", + "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" + }, + "url": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + }, + "xml2js": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" + } + }, + "xmlbuilder": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" + } + } +} diff --git a/takeNotes-src/getWeeks/package.json b/takeNotes-src/getWeeks/package.json new file mode 100644 index 0000000..561c73a --- /dev/null +++ b/takeNotes-src/getWeeks/package.json @@ -0,0 +1,16 @@ +{ + "name": "get", + "version": "1.0.0", + "description": "GET handler for TakeNotes users API", + "main": "src/app.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1", + "style": "npx prettier --write ." + }, + "author": "", + "license": "ISC", + "dependencies": { + "aws-sdk": "^2.834.0", + "uuid": "^8.3.2" + } +} diff --git a/template.yaml b/template.yaml index 34e66a4..4d53517 100644 --- a/template.yaml +++ b/template.yaml @@ -99,6 +99,32 @@ Resources: RestApiId: !Ref TakeNotesApi Auth: Authorizer: CognitoAuthorizer + GetTakeNotesUserWeeks: + Type: AWS::Serverless::Function + Properties: + CodeUri: takeNotes-src/getWeeks + Handler: app.getWeeks + Tracing: Active + Policies: + - DynamoDBReadPolicy: + TableName: !Ref TakeNotesTable + - CloudWatchPutMetricPolicy: {} + Environment: + Variables: + TABLE_NAME: !Ref TakeNotesTable + AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1" + USE_DYNAMODB_LOCAL: "0" + DYNAMODB_LOCAL_URI: "" + REGION: !Ref AWS::Region + Events: + GetUser: + Type: Api + Properties: + Path: /users/{id}/weeks + Method: get + RestApiId: !Ref TakeNotesApi + Auth: + Authorizer: CognitoAuthorizer PostTakeNotesUser: Type: AWS::Serverless::Function Properties: