From de0bd51eaf61f751035df69a1e2608cd2651bb21 Mon Sep 17 00:00:00 2001 From: NMerz Date: Sat, 26 Sep 2020 16:53:44 -0400 Subject: [PATCH] Basic ListAdd Lambda Create a basic list adding Lambda. NOTE: This does not include the following which are still needed: 1) Permanent DB Setup 2) Better RDS access control with security groups 3) Proper input parameters for the List add Lambda --- .gitignore | 2 ++ Lambdas/Lists/pom.xml | 5 ++++ Lambdas/Lists/src/main/java/DBConnector.java | 27 ++++++++++++++++--- Lambdas/Lists/src/main/java/InputUtils.java | 14 +++++++++- Lambdas/Lists/src/main/java/ListAdder.java | 23 ++++++++++++++++ Lambdas/Lists/src/main/java/ListsPOST.java | 14 +++++++--- .../Lists/target/classes/dbProperties.json | 5 ---- Tooling/EndpointSetup.sh | 26 ++++-------------- Tooling/LambdaUpdate.sh | 17 ++++++++++++ Tooling/VarSetup.sh | 26 ++++++++++++++++++ 10 files changed, 125 insertions(+), 34 deletions(-) delete mode 100644 Lambdas/Lists/target/classes/dbProperties.json create mode 100644 Tooling/LambdaUpdate.sh create mode 100644 Tooling/VarSetup.sh diff --git a/.gitignore b/.gitignore index 2fc6ec6..33561d7 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,5 @@ lint/outputs/ lint/tmp/ # lint/reports/ Lambdas/Lists/src/main/resources/dbProperties.json +Lambdas/Lists/target/classes/dbProperties.json +Lambdas/Lists/target/classes/META-INF/Lists.kotlin_module diff --git a/Lambdas/Lists/pom.xml b/Lambdas/Lists/pom.xml index 9442b49..8d77579 100644 --- a/Lambdas/Lists/pom.xml +++ b/Lambdas/Lists/pom.xml @@ -34,6 +34,11 @@ maven-compiler-plugin 3.8.1 + + org.mariadb.jdbc + mariadb-java-client + 2.7.0 + 1.11 diff --git a/Lambdas/Lists/src/main/java/DBConnector.java b/Lambdas/Lists/src/main/java/DBConnector.java index c4f85b9..074f4de 100644 --- a/Lambdas/Lists/src/main/java/DBConnector.java +++ b/Lambdas/Lists/src/main/java/DBConnector.java @@ -12,14 +12,28 @@ public class DBConnector { Connection connection; - DBConnector() throws IOException, SQLException { + DBConnector() throws IOException, SQLException, ClassNotFoundException { this(loadProperties("dbProperties.json")); } - DBConnector(Properties dbProperties) throws SQLException { + DBConnector(Properties dbProperties) throws SQLException, ClassNotFoundException { + Class.forName("org.mariadb.jdbc.Driver"); System.out.println(dbProperties); - connection = DriverManager.getConnection(dbProperties.get("url").toString(), dbProperties); + System.out.println(DBConnector.buildURL(dbProperties)); + connection = DriverManager.getConnection(dbProperties.get("url").toString(), dbProperties.get("user").toString(), dbProperties.get("password").toString()); + System.out.println(connection); + } + public void close() { + try { + connection.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public Connection getConnection() { + return connection; } public static Properties loadProperties(String path) throws IOException { @@ -29,4 +43,11 @@ public class DBConnector { propertiesJSON.keys().forEachRemaining(key -> toReturn.setProperty(key, propertiesJSON.get(key).toString())); return toReturn; } + + public static String buildURL(Properties dbProperties) { + String dbURL = dbProperties.get("url").toString(); + dbURL += "?user=" + dbProperties.get("user").toString(); + dbURL += "&password=" + dbProperties.get("password").toString(); + return dbURL; + } } diff --git a/Lambdas/Lists/src/main/java/InputUtils.java b/Lambdas/Lists/src/main/java/InputUtils.java index 0457585..46a0694 100644 --- a/Lambdas/Lists/src/main/java/InputUtils.java +++ b/Lambdas/Lists/src/main/java/InputUtils.java @@ -8,9 +8,21 @@ public class InputUtils { if ((inputMap.get("context") != null) && (inputMap.get("context") instanceof Map)) { contextMap = ((Map) inputMap.get("context")); } else { - throw new IllegalArgumentException("The key \"Context\" must exist and be a map"); + throw new IllegalArgumentException("The key \"context\" must exist and be a map"); } System.out.println(inputMap.get("context")); System.out.println(contextMap.get("sub")); + return contextMap.get("sub").toString(); + } + + public static Map getBody(Map inputMap) { + return getMap(inputMap, "body"); + } + + public static Map getMap(Map parentMap, String childKey) { + if ((parentMap.get(childKey) != null) && (parentMap.get(childKey) instanceof Map)) { + return ((Map) parentMap.get(childKey)); + } + throw new IllegalArgumentException("The key \"" + childKey + "\" must exist and be a map"); } } diff --git a/Lambdas/Lists/src/main/java/ListAdder.java b/Lambdas/Lists/src/main/java/ListAdder.java index 413b7db..54745c5 100644 --- a/Lambdas/Lists/src/main/java/ListAdder.java +++ b/Lambdas/Lists/src/main/java/ListAdder.java @@ -1,4 +1,27 @@ +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.Map; + public class ListAdder { + private DBConnector connector; + private String cognitoID; + private final String LIST_CREATE = "INSERT INTO Lists (Name, Owner) VALUES (?, ?)"; + + ListAdder(DBConnector connector, String cognitoID) { + this.connector = connector; + this.cognitoID = cognitoID; + } + + public void add(Map bodyMap) throws SQLException { + Connection connection = connector.getConnection(); + PreparedStatement statement = connection.prepareStatement(LIST_CREATE); + statement.setString(1, bodyMap.get("Name").toString()); + statement.setString(2, cognitoID); + System.out.println(statement); + statement.executeUpdate(); + connection.commit(); + } } diff --git a/Lambdas/Lists/src/main/java/ListsPOST.java b/Lambdas/Lists/src/main/java/ListsPOST.java index a4588a0..4068a4f 100644 --- a/Lambdas/Lists/src/main/java/ListsPOST.java +++ b/Lambdas/Lists/src/main/java/ListsPOST.java @@ -11,11 +11,17 @@ public class ListsPOST implements RequestHandler, String>{ public String handleRequest(Map inputMap, Context unfilled) { String cognitoID = InputUtils.getCognitoIDFromBody(inputMap); try { - System.out.println(new DBConnector()); - } catch (IOException e) { - e.printStackTrace(); - } catch (SQLException e) { + DBConnector connector = new DBConnector(); + try { + new ListAdder(connector, cognitoID).add(InputUtils.getBody(inputMap)); + } catch (SQLException e) { + e.printStackTrace(); + } finally { + connector.close(); + } + } catch (IOException|SQLException|ClassNotFoundException e) { e.printStackTrace(); + throw new RuntimeException(e.getMessage()); } return null; } diff --git a/Lambdas/Lists/target/classes/dbProperties.json b/Lambdas/Lists/target/classes/dbProperties.json deleted file mode 100644 index ba1352b..0000000 --- a/Lambdas/Lists/target/classes/dbProperties.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "url": "http://aws.com/something", - "user": "aUser", - "password": "aPassword" -} \ No newline at end of file diff --git a/Tooling/EndpointSetup.sh b/Tooling/EndpointSetup.sh index 6f2bf00..a7ef691 100644 --- a/Tooling/EndpointSetup.sh +++ b/Tooling/EndpointSetup.sh @@ -2,33 +2,17 @@ #Base script from: https://github.com/NMerz/DoctorsNote/blob/master/AWS%20Setup/Lambda-GatewayInitialization.sh #NOTE: This has been tested and works; however, the apigateway does not properly show as a trigger in AWS's web UI -#NOTE2: This assumes that the root Gateway and Lambda role have been set up previously (one-time setup) and their values are stored in the constants below +#NOTE2: This assumes that the root Gateway and Lambda role have been set up previously (one-time setup) and their values are set in VarSetup.sh -#constants -APIID=datoh7woc9 #rest-api-id is tied to the apigateway while resource-id seems tied to the specific url extension -ROOTRESOURCEID=6xrzhzidxh #gateway root should have a consistent resource id which will serve as parent for many apis -LAMBDAROLE=arn:aws:iam::569815541706:role/LambdaBasic -LANGUAGE=java11 -DEPLOYSTAGE=Development +echo "Creating a Gateway/Lambda pair." -DEBUGFILE=/dev/null +REL_SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}") -echo -n "Please enter function/endpoint name: " -read functionName -echo -n "Please enter method(GET, POST, etc.): " -read method +source ${REL_SCRIPT_DIR}/VarSetup.sh -jarPath=$(find .. -name "${functionName}.jar") -if [[ "$jarPath" == "" ]]; then - echo "Unable to find file ${functionName}.jar" >&2 - exit 1 -fi -functionPath=${jarPath%/${functionName}.jar} -zipPath=${functionPath}.zip -zip ${zipPath} ${jarPath} +RAWLAMBDA=$(aws lambda create-function --function-name ${functionName}${method} --zip-file fileb://${zipPath} --runtime ${LANGUAGE} --role ${LAMBDAROLE} --handler ${functionName}${method} 2>${DEBUGFILE}) -RAWLAMBDA=$(aws lambda create-function --function-name ${functionName}${method} --zip-file fileb://${zipPath} --runtime ${LANGUAGE} --role ${LAMBDAROLE} --handler ${functionName}${method}.lambda_handler 2>${DEBUGFILE}) if [[ $? -ne 0 ]]; then echo "Unable to create Lamba" >&2 diff --git a/Tooling/LambdaUpdate.sh b/Tooling/LambdaUpdate.sh new file mode 100644 index 0000000..0f49b9b --- /dev/null +++ b/Tooling/LambdaUpdate.sh @@ -0,0 +1,17 @@ +#!/bin/bash +echo "Updating a Lambda." + +REL_SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}") + +source ${REL_SCRIPT_DIR}/VarSetup.sh + + +aws lambda update-function-code --function-name ${functionName}${method} --zip-file fileb://${jarPath} 1>${DEBUGFILE} 2>${DEBUGFILE} + +if [[ $? -ne 0 ]]; then + echo "Unable to update Lamba" >&2 + exit 1 +fi + +echo "Update successful." +exit 0 diff --git a/Tooling/VarSetup.sh b/Tooling/VarSetup.sh new file mode 100644 index 0000000..4ff07fb --- /dev/null +++ b/Tooling/VarSetup.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Meant to be source'd from other scripts that need these vars. + +#constants +APIID=datoh7woc9 #rest-api-id is tied to the apigateway while resource-id seems tied to the specific url extension +ROOTRESOURCEID=6xrzhzidxh #gateway root should have a consistent resource id which will serve as parent for many apis +LAMBDAROLE=arn:aws:iam::569815541706:role/LambdaBasic +LANGUAGE=java11 +DEPLOYSTAGE=Development + +DEBUGFILE=/dev/null + +REL_SCRIPT_DIR=$(dirname "${BASH_SOURCE[0]}") + +echo -n "Please enter base function name: " +read functionName +echo -n "Please enter method(GET, POST, etc.): " +read method + +jarPath=$(find ${REL_SCRIPT_DIR}/.. -name "${functionName}.jar") +if [[ "$jarPath" == "" ]]; then + echo "Unable to find file ${functionName}.jar" >&2 + exit 1 +fi +functionPath=${jarPath%/${functionName}.jar} \ No newline at end of file