From 60eef61c0886099e0669d2bb98e907122ea971a5 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Wed, 27 Mar 2024 00:29:09 -0230 Subject: [PATCH 01/15] Initial backend-lambda code upload .gitignore updated --- .gitignore | 2 +- backend-lambda/getUserVehicles.js | 52 +++++++++++++++++++++++++++++++ backend/src/app.js | 11 +------ 3 files changed, 54 insertions(+), 11 deletions(-) create mode 100644 backend-lambda/getUserVehicles.js diff --git a/.gitignore b/.gitignore index 68c4343..4d5804a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ # ignoring modules node_modules backend/.env -.env \ No newline at end of file +.env diff --git a/backend-lambda/getUserVehicles.js b/backend-lambda/getUserVehicles.js new file mode 100644 index 0000000..7c2576e --- /dev/null +++ b/backend-lambda/getUserVehicles.js @@ -0,0 +1,52 @@ +import {MongoClient, ServerApiVersion} from "mongodb"; +import 'dotenv/config' + +export const handler = async (event) => { + + const uri = process.env.MONGO_URI; + +// Create a MongoClient with a MongoClientOptions object to set the Stable API version + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + + try { + const database = client.db("vehicleDB"); + const garage = database.collection("user_garage"); + + return await garage.aggregate([ + { + $match: { + user_id: 'dheffer' + } + }, + { + $lookup: { + from: 'configurations', + localField: 'vehicle_config_ids', + foreignField: 'config_id', + as: 'configurations' + } + }, + { + $unwind: '$configurations' + }, + { + $project: { + _id: 0, + configurations: 1 + } + } + ]).toArray(); + + } + finally { + // Ensures that the client will close when you finish/error + await client.close(); + } +} \ No newline at end of file diff --git a/backend/src/app.js b/backend/src/app.js index 3ae8c20..dc96cd6 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -166,7 +166,7 @@ const getVehicleConfig = async (config_id) => { } /*** - * This route is used to get the user's vehicles from the database + * This route is used to get a user's vehicles from the database */ app.get('/api/get-user-vehicles', async (req, res) => { const database = client.db("vehicleDB"); @@ -196,15 +196,6 @@ app.get('/api/get-user-vehicles', async (req, res) => { } } ]).toArray(); - - /* - for (let vehicle of vehicles) { - let v = vehicle.configurations - console.log(`Year: ${v.year}\t Make: ${v.make}\t Model: ${v.model}`); - } - */ - - res.send(vehicles); }); From 86a06470f16a78b26c0fb6c7669b141695a8cd72 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Wed, 3 Apr 2024 14:49:54 -0230 Subject: [PATCH 02/15] Added lambda files based on api calls in backend/src/app.js --- .github/workflows/deploy-to-s3.yml | 2 +- backend-lambda/deleteMaintenanceHistory.js | 0 backend-lambda/deleteUserVehicle.js | 0 backend-lambda/getAPIUrl.js | 0 backend-lambda/getConfigId.js | 0 backend-lambda/getEngines.js | 0 backend-lambda/getMaintenance.js | 0 backend-lambda/getMakes.js | 0 backend-lambda/getModels.js | 0 backend-lambda/getOAuthCallback.js | 0 backend-lambda/getOAuthUrl.js | 0 backend-lambda/getTransmissions.js | 0 backend-lambda/getUser.js | 0 backend-lambda/getVehicleHistory.js | 0 backend-lambda/getVehicleInfo.js | 0 backend-lambda/getYears.js | 0 backend-lambda/postMaintenanceHistory.js | 0 backend-lambda/postUserVehicle.js | 0 18 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 backend-lambda/deleteMaintenanceHistory.js create mode 100644 backend-lambda/deleteUserVehicle.js create mode 100644 backend-lambda/getAPIUrl.js create mode 100644 backend-lambda/getConfigId.js create mode 100644 backend-lambda/getEngines.js create mode 100644 backend-lambda/getMaintenance.js create mode 100644 backend-lambda/getMakes.js create mode 100644 backend-lambda/getModels.js create mode 100644 backend-lambda/getOAuthCallback.js create mode 100644 backend-lambda/getOAuthUrl.js create mode 100644 backend-lambda/getTransmissions.js create mode 100644 backend-lambda/getUser.js create mode 100644 backend-lambda/getVehicleHistory.js create mode 100644 backend-lambda/getVehicleInfo.js create mode 100644 backend-lambda/getYears.js create mode 100644 backend-lambda/postMaintenanceHistory.js create mode 100644 backend-lambda/postUserVehicle.js diff --git a/.github/workflows/deploy-to-s3.yml b/.github/workflows/deploy-to-s3.yml index ffcfaac..5ed8e94 100644 --- a/.github/workflows/deploy-to-s3.yml +++ b/.github/workflows/deploy-to-s3.yml @@ -30,4 +30,4 @@ jobs: AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - SOURCE_DIR: "./frontend/build" \ No newline at end of file + SOURCE_DIR: "./frontend/build" diff --git a/backend-lambda/deleteMaintenanceHistory.js b/backend-lambda/deleteMaintenanceHistory.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/deleteUserVehicle.js b/backend-lambda/deleteUserVehicle.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getAPIUrl.js b/backend-lambda/getAPIUrl.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getConfigId.js b/backend-lambda/getConfigId.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getEngines.js b/backend-lambda/getEngines.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getMaintenance.js b/backend-lambda/getMaintenance.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getMakes.js b/backend-lambda/getMakes.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getModels.js b/backend-lambda/getModels.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getOAuthCallback.js b/backend-lambda/getOAuthCallback.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getOAuthUrl.js b/backend-lambda/getOAuthUrl.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getTransmissions.js b/backend-lambda/getTransmissions.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getUser.js b/backend-lambda/getUser.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getVehicleHistory.js b/backend-lambda/getVehicleHistory.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getVehicleInfo.js b/backend-lambda/getVehicleInfo.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getYears.js b/backend-lambda/getYears.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/postMaintenanceHistory.js b/backend-lambda/postMaintenanceHistory.js new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/postUserVehicle.js b/backend-lambda/postUserVehicle.js new file mode 100644 index 0000000..e69de29 From effecad4cfa744985ac3d883889c4b01ab88308a Mon Sep 17 00:00:00 2001 From: Delaney H Date: Sun, 7 Apr 2024 18:22:23 -0230 Subject: [PATCH 03/15] . --- backend/src/app.js | 16 ++++++++-------- frontend/src/pages/garage/AddVehicle.js | 2 -- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/backend/src/app.js b/backend/src/app.js index 5c13a58..956805f 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -281,13 +281,17 @@ app.get('/api/get-user-vehicles', async (req, res) => { }); app.delete('/api/delete-user-vehicle', async (req, res) => { const garage = DATABASE.collection("user_garage"); + const vehicInfo = DATABASE.collection("user_vehicle_info"); const { config_id } = req.body; const deletion = await garage.updateOne( {email: EMAIL}, {$pull: { vehicle_config_ids: config_id } } ); - return res.json(deletion.modifiedCount); + const deletionTwo = await vehicInfo.deleteOne( + {email: EMAIL, config_id: config_id} + ); + return res.json(deletion.modifiedCount+deletionTwo.deletedCount); }); @@ -426,27 +430,23 @@ app.get('/api/get-transmissions', async (req, res) => { app.post('/api/add-vehicle', async (req, res) => { console.log("ADD: Hit add vehicle route"); - const email = req.body.email; - console.log("ADD: Users email: "+email); - const config_id = req.body.config_id; - console.log("ADD: Config_id: "+config_id); const database = client.db("vehicleDB"); const garage = database.collection("user_garage"); try{ - const exist = await garage.findOne({email}); + const exist = await garage.findOne({EMAIL}); if(exist) { const result = await garage.updateOne( - { email }, + { email: EMAIL }, { $addToSet: { vehicle_config_ids: config_id } } ); return res.json(result); } else { const result = await garage.insertOne( - { email, vehicle_config_ids: [config_id] } + { email: EMAIL, vehicle_config_ids: [config_id] } ); return res.json(result); } diff --git a/frontend/src/pages/garage/AddVehicle.js b/frontend/src/pages/garage/AddVehicle.js index fba10f6..7f7d5a3 100644 --- a/frontend/src/pages/garage/AddVehicle.js +++ b/frontend/src/pages/garage/AddVehicle.js @@ -71,7 +71,6 @@ function AddVehicle() { } const addVehicleToUser = async () => { - console.log("CONFIG ID in ADD vehicle: " + configId); try{ const response = await fetch('/api/add-vehicle', { method: 'POST', @@ -79,7 +78,6 @@ function AddVehicle() { 'Content-Type': 'application/json' }, body: JSON.stringify({ - email: "johnson@gmail,com", config_id: configId }) }); From 7ae943176c07844054b68982be989f680fcd3bdd Mon Sep 17 00:00:00 2001 From: Delaney H Date: Tue, 9 Apr 2024 14:41:34 -0230 Subject: [PATCH 04/15] Updated getYears lambda, and deploy-to-lambda.yml --- .github/workflows/deploy-to-lambda.yml | 39 +++++++++++++++++++++++++ backend-lambda/getYears.js | 40 ++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 .github/workflows/deploy-to-lambda.yml diff --git a/.github/workflows/deploy-to-lambda.yml b/.github/workflows/deploy-to-lambda.yml new file mode 100644 index 0000000..970c53a --- /dev/null +++ b/.github/workflows/deploy-to-lambda.yml @@ -0,0 +1,39 @@ +name: Deploy to AWS Lambda +on: + release: + types: [published] + +defaults: + run: + working-directory: ./backend-lambda +jobs: + deploy_source: + name: Build and deploy + strategy: + matrix: + node-version: [21.x] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: Use node.js ${{ matrix.node-version }} + uses: actions/setup-node@v2 + with: + node-version: ${{ matrix.node-version }} + - name: npm install and build + run: | + npm ci + npm run build --if-present + env: + CI: false + - name: zip + uses: montudor/action-zip@v0.1.0 + with: + args: zip -qq -r ./bundle.zip ./ + - name: default deploy + uses: appleboy/lambda-action@master + with: + aws_access_key_id: ${{ secrets.AWS_ACCESS_KEY_ID }} + aws_secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + aws_region: eu-west-1 + function_name: my-function + zip_file: bundle.zip \ No newline at end of file diff --git a/backend-lambda/getYears.js b/backend-lambda/getYears.js index e69de29..2018777 100644 --- a/backend-lambda/getYears.js +++ b/backend-lambda/getYears.js @@ -0,0 +1,40 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config' + +const uri = process.env.MONGO_URI; +const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } +); + +exports.handler = (event, context) => { + return client.connect() + .then(() => { + const database = client.db("vehicleDB"); + const configurations = database.collection("configurations"); + + return configurations.aggregate([ + { $group: { _id: "$year", years: { $addToSet: "$year" } }} + ]).toArray(); + }) + .then(years => { + console.log("years ", years); + + return { + statusCode: 200, + body: JSON.stringify(years) + }; + }) + .catch(err => { + console.error("Error occurred:", err); + return { + statusCode: 500, + body: JSON.stringify({ message: "Internal Server Error" }) + }; + }) + .finally(() => client.close()); +}; \ No newline at end of file From e5fb6510a1dbcc068f6d4d1d615b85959216ffcb Mon Sep 17 00:00:00 2001 From: Delaney H Date: Tue, 9 Apr 2024 21:33:51 -0230 Subject: [PATCH 05/15] Complete restructure of backend-lambda folder Added .zip files to .gitignore --- .gitignore | 5 +++- .../index.mjs} | 0 .../index.mjs} | 0 .../{getAPIUrl.js => getAPIUrl/index.mjs} | 0 .../{getConfigId.js => getConfigId/index.mjs} | 0 .../{getEngines.js => getEngines/index.mjs} | 0 .../index.mjs} | 0 .../{getMakes.js => getMakes/index.mjs} | 0 .../{getModels.js => getModels/index.mjs} | 0 .../index.mjs} | 0 .../{getOAuthUrl.js => getOAuthUrl/index.mjs} | 0 .../index.mjs} | 0 .../{getUser.js => getUser/index.mjs} | 0 .../index.mjs} | 0 .../index.mjs} | 0 .../index.mjs} | 0 .../{getYears.js => getYears/index.mjs} | 24 +++++++++---------- .../index.mjs} | 0 .../index.mjs} | 0 backend/src/app.js | 6 +---- frontend/src/pages/garage/Vehicle.js | 4 +++- 21 files changed, 19 insertions(+), 20 deletions(-) rename backend-lambda/{deleteMaintenanceHistory.js => deleteMaintenanceHistory/index.mjs} (100%) rename backend-lambda/{deleteUserVehicle.js => deleteUserVehicle/index.mjs} (100%) rename backend-lambda/{getAPIUrl.js => getAPIUrl/index.mjs} (100%) rename backend-lambda/{getConfigId.js => getConfigId/index.mjs} (100%) rename backend-lambda/{getEngines.js => getEngines/index.mjs} (100%) rename backend-lambda/{getMaintenance.js => getMaintenance/index.mjs} (100%) rename backend-lambda/{getMakes.js => getMakes/index.mjs} (100%) rename backend-lambda/{getModels.js => getModels/index.mjs} (100%) rename backend-lambda/{getOAuthCallback.js => getOAuthCallback/index.mjs} (100%) rename backend-lambda/{getOAuthUrl.js => getOAuthUrl/index.mjs} (100%) rename backend-lambda/{getTransmissions.js => getTransmissions/index.mjs} (100%) rename backend-lambda/{getUser.js => getUser/index.mjs} (100%) rename backend-lambda/{getUserVehicles.js => getUserVehicles/index.mjs} (100%) rename backend-lambda/{getVehicleHistory.js => getVehicleHistory/index.mjs} (100%) rename backend-lambda/{getVehicleInfo.js => getVehicleInfo/index.mjs} (100%) rename backend-lambda/{getYears.js => getYears/index.mjs} (66%) rename backend-lambda/{postMaintenanceHistory.js => postMaintenanceHistory/index.mjs} (100%) rename backend-lambda/{postUserVehicle.js => postUserVehicle/index.mjs} (100%) diff --git a/.gitignore b/.gitignore index dd0329e..aa264d4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,7 @@ node_modules backend/.env .env Project_Default.xml -package-lock.json \ No newline at end of file +package-lock.json + +# ignore any zip files +.zip \ No newline at end of file diff --git a/backend-lambda/deleteMaintenanceHistory.js b/backend-lambda/deleteMaintenanceHistory/index.mjs similarity index 100% rename from backend-lambda/deleteMaintenanceHistory.js rename to backend-lambda/deleteMaintenanceHistory/index.mjs diff --git a/backend-lambda/deleteUserVehicle.js b/backend-lambda/deleteUserVehicle/index.mjs similarity index 100% rename from backend-lambda/deleteUserVehicle.js rename to backend-lambda/deleteUserVehicle/index.mjs diff --git a/backend-lambda/getAPIUrl.js b/backend-lambda/getAPIUrl/index.mjs similarity index 100% rename from backend-lambda/getAPIUrl.js rename to backend-lambda/getAPIUrl/index.mjs diff --git a/backend-lambda/getConfigId.js b/backend-lambda/getConfigId/index.mjs similarity index 100% rename from backend-lambda/getConfigId.js rename to backend-lambda/getConfigId/index.mjs diff --git a/backend-lambda/getEngines.js b/backend-lambda/getEngines/index.mjs similarity index 100% rename from backend-lambda/getEngines.js rename to backend-lambda/getEngines/index.mjs diff --git a/backend-lambda/getMaintenance.js b/backend-lambda/getMaintenance/index.mjs similarity index 100% rename from backend-lambda/getMaintenance.js rename to backend-lambda/getMaintenance/index.mjs diff --git a/backend-lambda/getMakes.js b/backend-lambda/getMakes/index.mjs similarity index 100% rename from backend-lambda/getMakes.js rename to backend-lambda/getMakes/index.mjs diff --git a/backend-lambda/getModels.js b/backend-lambda/getModels/index.mjs similarity index 100% rename from backend-lambda/getModels.js rename to backend-lambda/getModels/index.mjs diff --git a/backend-lambda/getOAuthCallback.js b/backend-lambda/getOAuthCallback/index.mjs similarity index 100% rename from backend-lambda/getOAuthCallback.js rename to backend-lambda/getOAuthCallback/index.mjs diff --git a/backend-lambda/getOAuthUrl.js b/backend-lambda/getOAuthUrl/index.mjs similarity index 100% rename from backend-lambda/getOAuthUrl.js rename to backend-lambda/getOAuthUrl/index.mjs diff --git a/backend-lambda/getTransmissions.js b/backend-lambda/getTransmissions/index.mjs similarity index 100% rename from backend-lambda/getTransmissions.js rename to backend-lambda/getTransmissions/index.mjs diff --git a/backend-lambda/getUser.js b/backend-lambda/getUser/index.mjs similarity index 100% rename from backend-lambda/getUser.js rename to backend-lambda/getUser/index.mjs diff --git a/backend-lambda/getUserVehicles.js b/backend-lambda/getUserVehicles/index.mjs similarity index 100% rename from backend-lambda/getUserVehicles.js rename to backend-lambda/getUserVehicles/index.mjs diff --git a/backend-lambda/getVehicleHistory.js b/backend-lambda/getVehicleHistory/index.mjs similarity index 100% rename from backend-lambda/getVehicleHistory.js rename to backend-lambda/getVehicleHistory/index.mjs diff --git a/backend-lambda/getVehicleInfo.js b/backend-lambda/getVehicleInfo/index.mjs similarity index 100% rename from backend-lambda/getVehicleInfo.js rename to backend-lambda/getVehicleInfo/index.mjs diff --git a/backend-lambda/getYears.js b/backend-lambda/getYears/index.mjs similarity index 66% rename from backend-lambda/getYears.js rename to backend-lambda/getYears/index.mjs index 2018777..78f7831 100644 --- a/backend-lambda/getYears.js +++ b/backend-lambda/getYears/index.mjs @@ -1,17 +1,18 @@ import { MongoClient, ServerApiVersion } from "mongodb"; import 'dotenv/config' -const uri = process.env.MONGO_URI; -const client = new MongoClient(uri, { - serverApi: { - version: ServerApiVersion.v1, - strict: true, - deprecationErrors: true, +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } } - } -); + ); -exports.handler = (event, context) => { return client.connect() .then(() => { const database = client.db("vehicleDB"); @@ -22,15 +23,12 @@ exports.handler = (event, context) => { ]).toArray(); }) .then(years => { - console.log("years ", years); - return { statusCode: 200, - body: JSON.stringify(years) + body: years }; }) .catch(err => { - console.error("Error occurred:", err); return { statusCode: 500, body: JSON.stringify({ message: "Internal Server Error" }) diff --git a/backend-lambda/postMaintenanceHistory.js b/backend-lambda/postMaintenanceHistory/index.mjs similarity index 100% rename from backend-lambda/postMaintenanceHistory.js rename to backend-lambda/postMaintenanceHistory/index.mjs diff --git a/backend-lambda/postUserVehicle.js b/backend-lambda/postUserVehicle/index.mjs similarity index 100% rename from backend-lambda/postUserVehicle.js rename to backend-lambda/postUserVehicle/index.mjs diff --git a/backend/src/app.js b/backend/src/app.js index 51cd6cf..ea6bdd1 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -7,9 +7,6 @@ import { getGoogleOauthURL } from './OauthClient.js'; import { oauthClient } from './OauthClient.js'; import 'dotenv/config'; import client from "./mongo.js"; -import mongo from "./mongo.js" -import e from 'express'; -import {parse} from "dotenv"; const userEmail = ""; const CLIENT_ID = process.env.GOOGLE_CLIENT_ID; @@ -286,12 +283,11 @@ app.delete('/api/delete-maintenance-history', async (req, res) => { */ app.get('/api/get-user-vehicles', async (req, res) => { const garage = DATABASE.collection("user_garage"); - const brandon = "johnson9713@gmail.com" const vehicles = await garage.aggregate([ { $match: { - email: brandon + email: EMAIL } }, { diff --git a/frontend/src/pages/garage/Vehicle.js b/frontend/src/pages/garage/Vehicle.js index 5c7a507..e61eef2 100644 --- a/frontend/src/pages/garage/Vehicle.js +++ b/frontend/src/pages/garage/Vehicle.js @@ -7,6 +7,8 @@ function Vehicle(props) { const [odometerValue, setOdometerValue] = useState(0); const [odometerReading, setOdometerReading] = useState([]); + const EMAIL = process.env.EMAIL; + useEffect(() => { fetchReadings(); }, []); @@ -39,7 +41,7 @@ function Vehicle(props) { }, body: JSON.stringify({ vehicle_config_ids : v.configurations.config_id, - email: "johnson9713@gmail.com", + email: EMAIL, odometer: odometerValue }) }); From 458e8d0d72190a7c06b75c9d055aeb3f0a3f767d Mon Sep 17 00:00:00 2001 From: Delaney H Date: Wed, 10 Apr 2024 12:33:06 -0230 Subject: [PATCH 06/15] getYears and getMakes lambda created & functional --- backend-lambda/getMakes/index.mjs | 36 +++++++++++++++++++++++++++++++ backend-lambda/getYears/index.mjs | 11 ++++------ 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/backend-lambda/getMakes/index.mjs b/backend-lambda/getMakes/index.mjs index e69de29..22630a4 100644 --- a/backend-lambda/getMakes/index.mjs +++ b/backend-lambda/getMakes/index.mjs @@ -0,0 +1,36 @@ +import {MongoClient, ServerApiVersion} from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, content) => { + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true + } + }); + const carYear = event['carYear']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const configurations = database.collection("configurations"); + const makes = await configurations.aggregate([ + {$match: {year: parseInt(carYear)}}, + {$group: {_id: "$make", makes: {$addToSet: "$make"}}}, + {$sort: {_id: 1}} + ]).toArray(); + return makes.map(make => make._id); + }).then(makes => { + return { + statusCode: 200, + body: JSON.stringify(makes) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/getYears/index.mjs b/backend-lambda/getYears/index.mjs index 78f7831..c2ef5a5 100644 --- a/backend-lambda/getYears/index.mjs +++ b/backend-lambda/getYears/index.mjs @@ -1,5 +1,5 @@ import { MongoClient, ServerApiVersion } from "mongodb"; -import 'dotenv/config' +import 'dotenv/config'; export const handler = async (event, context) => { @@ -21,18 +21,15 @@ export const handler = async (event, context) => { return configurations.aggregate([ { $group: { _id: "$year", years: { $addToSet: "$year" } }} ]).toArray(); - }) - .then(years => { + }).then(years => { return { statusCode: 200, body: years }; - }) - .catch(err => { + }).catch(err => { return { statusCode: 500, body: JSON.stringify({ message: "Internal Server Error" }) }; - }) - .finally(() => client.close()); + }).finally(() => client.close()); }; \ No newline at end of file From c774f221dc6723d11d69f8ba0e940ce2f28d7192 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Wed, 10 Apr 2024 13:37:55 -0230 Subject: [PATCH 07/15] getModels created --- backend-lambda/getMakes/index.mjs | 20 +++++++-------- backend-lambda/getModels/index.mjs | 41 ++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/backend-lambda/getMakes/index.mjs b/backend-lambda/getMakes/index.mjs index 22630a4..7a238a0 100644 --- a/backend-lambda/getMakes/index.mjs +++ b/backend-lambda/getMakes/index.mjs @@ -23,14 +23,14 @@ export const handler = async (event, content) => { ]).toArray(); return makes.map(make => make._id); }).then(makes => { - return { - statusCode: 200, - body: JSON.stringify(makes) - }; - }).catch(err => { - return { - statusCode: 500, - body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) - }; - }).finally(() => client.close()); + return { + statusCode: 200, + body: JSON.stringify(makes) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); }; \ No newline at end of file diff --git a/backend-lambda/getModels/index.mjs b/backend-lambda/getModels/index.mjs index e69de29..ad5278e 100644 --- a/backend-lambda/getModels/index.mjs +++ b/backend-lambda/getModels/index.mjs @@ -0,0 +1,41 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; +import client from "../../backend/src/mongo.js"; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const year = event['carYear']; + const make = event['carMake']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const configurations = database.collection("configurations"); + + const models = await configurations.aggregate([ + {$match: {year: parseInt(year), make: make}}, + {$group: {_id: "$model", models: {$addToSet: "$model"}}}, + {$sort: {_id: 1}} + ]).toArray(); + return models.map(model => model._id); + }).then(models => { + return { + statusCode: 200, + body: JSON.stringify(models) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file From c5050ed18e3be7e8ba840ab391048f742f8408d0 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Wed, 10 Apr 2024 18:29:43 -0230 Subject: [PATCH 08/15] Fixed gitignore --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index aa264d4..cd944b4 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ Project_Default.xml package-lock.json # ignore any zip files -.zip \ No newline at end of file +*.zip \ No newline at end of file From 84950cb0b5034d83786e870d277f68e4ece686a4 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Wed, 10 Apr 2024 22:08:08 -0230 Subject: [PATCH 09/15] getMakes, getModels, getTransmissions, getYears completed --- .github/workflows/deploy-to-lambda.yml | 9 +- backend-lambda/getConfigId/index.mjs | 44 +++++++++ backend-lambda/getEngines/index.mjs | 40 ++++++++ backend-lambda/getMakes/index.mjs | 2 +- backend-lambda/getModels/index.mjs | 5 +- backend-lambda/getOAuthCallback/index.mjs | 0 backend-lambda/getOAuthUrl/index.mjs | 0 backend-lambda/getTransmissions/index.mjs | 41 +++++++++ backend-lambda/getYears/index.mjs | 2 +- backend-lambda/oauth-processing/index.mjs | 106 ++++++++++++++++++++++ 10 files changed, 239 insertions(+), 10 deletions(-) delete mode 100644 backend-lambda/getOAuthCallback/index.mjs delete mode 100644 backend-lambda/getOAuthUrl/index.mjs create mode 100644 backend-lambda/oauth-processing/index.mjs diff --git a/.github/workflows/deploy-to-lambda.yml b/.github/workflows/deploy-to-lambda.yml index 970c53a..1a141e9 100644 --- a/.github/workflows/deploy-to-lambda.yml +++ b/.github/workflows/deploy-to-lambda.yml @@ -19,12 +19,11 @@ jobs: uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - - name: npm install and build + + - name: npm install run: | - npm ci - npm run build --if-present - env: - CI: false + cd deleteMaintenanceHistory + npm install - name: zip uses: montudor/action-zip@v0.1.0 with: diff --git a/backend-lambda/getConfigId/index.mjs b/backend-lambda/getConfigId/index.mjs index e69de29..14d4ca1 100644 --- a/backend-lambda/getConfigId/index.mjs +++ b/backend-lambda/getConfigId/index.mjs @@ -0,0 +1,44 @@ +import {MongoClient, ServerApiVersion} from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const year = event['year']; + const make = event['make']; + const model = event['model']; + const engine = event['engine']; + const transmission = event['transmission']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const config = database.collection("configurations"); + const vehicle_config = await config.findOne({ + year: parseInt(year), + make: make, + model: model, + engine: engine, + transmission: transmission + }); + return vehicle_config.map(config => config.config_id); + }).then(config => { + return { + statusCode: 200, + body: JSON.stringify(config) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/getEngines/index.mjs b/backend-lambda/getEngines/index.mjs index e69de29..4d5c7c4 100644 --- a/backend-lambda/getEngines/index.mjs +++ b/backend-lambda/getEngines/index.mjs @@ -0,0 +1,40 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const year = event['year']; + const make = event['make']; + const model = event['model']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const configurations = database.collection("configurations"); + const engines = await configurations.aggregate([ + { $match: { year: parseInt(year), make: make, model: model }}, + { $group: { _id: "$engine", engines: { $addToSet: "$engine" } }}, + { $sort: { _id: 1 }} + ]).toArray(); + return engines.map(engine => engine._id); + }).then(engines => { + return { + statusCode: 200, + body: JSON.stringify(engines) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/getMakes/index.mjs b/backend-lambda/getMakes/index.mjs index 7a238a0..84745d4 100644 --- a/backend-lambda/getMakes/index.mjs +++ b/backend-lambda/getMakes/index.mjs @@ -10,7 +10,7 @@ export const handler = async (event, content) => { deprecationErrors: true } }); - const carYear = event['carYear']; + const carYear = event['year']; return client.connect() .then(async () => { diff --git a/backend-lambda/getModels/index.mjs b/backend-lambda/getModels/index.mjs index ad5278e..ed79c60 100644 --- a/backend-lambda/getModels/index.mjs +++ b/backend-lambda/getModels/index.mjs @@ -1,6 +1,5 @@ import { MongoClient, ServerApiVersion } from "mongodb"; import 'dotenv/config'; -import client from "../../backend/src/mongo.js"; export const handler = async (event, context) => { @@ -13,8 +12,8 @@ export const handler = async (event, context) => { } } ); - const year = event['carYear']; - const make = event['carMake']; + const year = event['year']; + const make = event['make']; return client.connect() .then(async () => { diff --git a/backend-lambda/getOAuthCallback/index.mjs b/backend-lambda/getOAuthCallback/index.mjs deleted file mode 100644 index e69de29..0000000 diff --git a/backend-lambda/getOAuthUrl/index.mjs b/backend-lambda/getOAuthUrl/index.mjs deleted file mode 100644 index e69de29..0000000 diff --git a/backend-lambda/getTransmissions/index.mjs b/backend-lambda/getTransmissions/index.mjs index e69de29..c8b305d 100644 --- a/backend-lambda/getTransmissions/index.mjs +++ b/backend-lambda/getTransmissions/index.mjs @@ -0,0 +1,41 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const year = event['year']; + const make = event['make']; + const model = event['model']; + const engine = event['engine']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const configurations = database.collection("configurations"); + const transmissions = await configurations.aggregate([ + { $match: { year: parseInt(year), make: make, model: model, engine: engine }}, + { $group: { _id: "$transmission", transmissions: { $addToSet: "$transmission" } }}, + { $sort: { _id: 1 }} + ]).toArray(); + return transmissions.map(transmission => transmission._id); + }).then(transmissions => { + return { + statusCode: 200, + body: JSON.stringify(transmissions) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/getYears/index.mjs b/backend-lambda/getYears/index.mjs index c2ef5a5..41afb77 100644 --- a/backend-lambda/getYears/index.mjs +++ b/backend-lambda/getYears/index.mjs @@ -24,7 +24,7 @@ export const handler = async (event, context) => { }).then(years => { return { statusCode: 200, - body: years + body: JSON.stringify(years) }; }).catch(err => { return { diff --git a/backend-lambda/oauth-processing/index.mjs b/backend-lambda/oauth-processing/index.mjs new file mode 100644 index 0000000..672dba5 --- /dev/null +++ b/backend-lambda/oauth-processing/index.mjs @@ -0,0 +1,106 @@ +import { google} from 'googleapis'; +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; +import jwt from 'jsonwebtoken'; + +export const handler = async (event, context) => { + const JWTSecret = 'test123' + const authClient = new google.auth.OAuth2( + process.env.GOOGLE_CLIENT_ID, + process.env.GOOGLE_CLIENT_SECRET, + process.env.OAUTH_CALLBACK_URL + ); + const { code } = event.queryStringParameters; + const { tokens } = await authClient.getToken(code); + + const url = getAccessAndBearerTokenUrl(tokens.access_token); + const myHeaders = new Headers(); + const bearer = `Bearer ${tokens.id_token}`; + myHeaders.append("Authorization", bearer); + const reqOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + + fetch(url, reqOptions) + .then(res => res.json()) + .then(res => { + updateOrCreateUserFromOauth(res) + }) + .then(user => { + jwt.sign( {"name":user.name, "email":user.email}, JWTSecret, {expiresIn: '2d'}, (err, token) => { + if(err) { + return { + statusCode: 500, + body: JSON.stringify({message: "Internal Server Error"}) + } + } + return { + statusCode: 302, + headers: { + "Location": `${process.env.APP_URL}/login?token=${token}`, + }, + } + }) + }) + .catch(err => { + return { + statusCode: 500, + body: JSON.stringify({message: `Internal Server Error: ${err.message}`}) + } + }); + + /* + const token = authorization.split(" ")[1]; + console.log(token+ ": TOKEN"); + jwt.verify(token, JWTSecret, async (err, decoded) => { + if(err) { + res.status(401).json({message: "Invalid Token"}); + } + + console.log("Decoded: "+decoded); + + const DATABASE = client.db("vehicleDB"); + const users = DATABASE.collection("users"); + + const user = await users.findOne({email: decoded.email}); + console.log("AUTHORIZ USER: "+user); + + if(!user) { + res.status(404).json({message: "User not found"}); + } + res.json(user); + }); + */ +}; + +const updateOrCreateUserFromOauth = async (oauthUserInfo) => { + const { + name, + email, + } = oauthUserInfo; + + console.log(name); + console.log(email); + + const users = DATABASE.collection("users"); + + const existingUser = await users.findOne({email}) + + if( existingUser ) { + const result = await users.findOneAndUpdate({email}, + { $set: {name, email}}, + { returnDocument: "after"} + ); + return result; + } + else { + const result = await users.insertOne( {email, name}); + return { email, name, _id: result.insertedId }; + } +} + +const getAccessAndBearerTokenUrl = (access_token) => { + return `https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=${access_token}`; +} \ No newline at end of file From ddaa9cae95032d489ef163c38058a1ee0001842d Mon Sep 17 00:00:00 2001 From: Delaney H Date: Thu, 11 Apr 2024 14:24:57 -0230 Subject: [PATCH 10/15] postUserVehicle & getConfigId functioning in Lambda. --- .gitignore | 2 +- backend-lambda/getConfigId/package.json | 6 +++ backend-lambda/getEngines/package.json | 6 +++ backend-lambda/getMakes/package.json | 6 +++ backend-lambda/getModels/package.json | 6 +++ backend-lambda/getTransmissions/package.json | 6 +++ .../getUserVehicleOdometers/index.mjs | 0 backend-lambda/getYears/package.json | 8 +++ backend-lambda/postUserVehicle/index.mjs | 54 +++++++++++++++++++ backend-lambda/postUserVehicle/package.json | 6 +++ .../updateMaintenanceHistory/index.mjs | 0 backend-lambda/updateOdometer/index.mjs | 0 12 files changed, 99 insertions(+), 1 deletion(-) create mode 100644 backend-lambda/getConfigId/package.json create mode 100644 backend-lambda/getEngines/package.json create mode 100644 backend-lambda/getMakes/package.json create mode 100644 backend-lambda/getModels/package.json create mode 100644 backend-lambda/getTransmissions/package.json create mode 100644 backend-lambda/getUserVehicleOdometers/index.mjs create mode 100644 backend-lambda/getYears/package.json create mode 100644 backend-lambda/postUserVehicle/package.json create mode 100644 backend-lambda/updateMaintenanceHistory/index.mjs create mode 100644 backend-lambda/updateOdometer/index.mjs diff --git a/.gitignore b/.gitignore index cd944b4..fa6a1a3 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,4 @@ Project_Default.xml package-lock.json # ignore any zip files -*.zip \ No newline at end of file +*.zip diff --git a/backend-lambda/getConfigId/package.json b/backend-lambda/getConfigId/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getConfigId/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getEngines/package.json b/backend-lambda/getEngines/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getEngines/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getMakes/package.json b/backend-lambda/getMakes/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getMakes/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getModels/package.json b/backend-lambda/getModels/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getModels/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getTransmissions/package.json b/backend-lambda/getTransmissions/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getTransmissions/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getUserVehicleOdometers/index.mjs b/backend-lambda/getUserVehicleOdometers/index.mjs new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/getYears/package.json b/backend-lambda/getYears/package.json new file mode 100644 index 0000000..c621d05 --- /dev/null +++ b/backend-lambda/getYears/package.json @@ -0,0 +1,8 @@ +{ + "name": "get-years", + "main": "index.mjs", + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/postUserVehicle/index.mjs b/backend-lambda/postUserVehicle/index.mjs index e69de29..6727e33 100644 --- a/backend-lambda/postUserVehicle/index.mjs +++ b/backend-lambda/postUserVehicle/index.mjs @@ -0,0 +1,54 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const config_id = event['config_id']; + const email = event['email']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const garage = database.collection("user_garage"); + const userVehicle = database.collection("user_vehicle_info"); + + const exist = await garage.findOne({email: email}); + if (exist) { + await garage.updateOne( + { email: email }, + { $addToSet: { vehicle_config_ids: config_id } } + ); + await userVehicle.insertOne( + { email: email, config_id: config_id, odometer: 0, upcoming_maintenance: [], completed_maintenance: [] }) + return { + statusCode: 200, + body: JSON.stringify({message: `Vehicle with config ${config_id} updated in garage`}) + }; + } + else { + await garage.insertOne( + { email: email, vehicle_config_ids: [config_id] } + ) + await userVehicle.insertOne( + { email: email, config_id: config_id, odometer: 0, upcoming_maintenance: [], completed_maintenance: [] }) + return { + statusCode: 200, + body: JSON.stringify({message: "Vehicle with config ${config_id} added to garage"}) + }; + } + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/postUserVehicle/package.json b/backend-lambda/postUserVehicle/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/postUserVehicle/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/updateMaintenanceHistory/index.mjs b/backend-lambda/updateMaintenanceHistory/index.mjs new file mode 100644 index 0000000..e69de29 diff --git a/backend-lambda/updateOdometer/index.mjs b/backend-lambda/updateOdometer/index.mjs new file mode 100644 index 0000000..e69de29 From aed9c987852ce3feb862c73c07f26467e4bf6242 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Thu, 11 Apr 2024 21:51:24 -0230 Subject: [PATCH 11/15] getMaintenance, getUserVehicles, getVehicleHistory, getVehicleInfo, postMaintenanceHistory, and updateMaintenanceHistory all successfully converted to lambda functions & uploaded to Lambda --- backend-lambda/getMaintenance/index.mjs | 43 +++++++++++ backend-lambda/getUserVehicles/index.mjs | 74 ++++++++++--------- backend-lambda/getUserVehicles/package.json | 6 ++ backend-lambda/getVehicleHistory/index.mjs | 48 ++++++++++++ backend-lambda/getVehicleHistory/package.json | 6 ++ backend-lambda/getVehicleInfo/index.mjs | 32 ++++++++ backend-lambda/getVehicleInfo/package.json | 6 ++ .../postMaintenanceHistory/index.mjs | 43 +++++++++++ .../postMaintenanceHistory/package.json | 6 ++ .../updateMaintenanceHistory/index.mjs | 62 ++++++++++++++++ .../updateMaintenanceHistory/package.json | 6 ++ 11 files changed, 297 insertions(+), 35 deletions(-) create mode 100644 backend-lambda/getUserVehicles/package.json create mode 100644 backend-lambda/getVehicleHistory/package.json create mode 100644 backend-lambda/getVehicleInfo/package.json create mode 100644 backend-lambda/postMaintenanceHistory/package.json create mode 100644 backend-lambda/updateMaintenanceHistory/package.json diff --git a/backend-lambda/getMaintenance/index.mjs b/backend-lambda/getMaintenance/index.mjs index e69de29..8d8ead5 100644 --- a/backend-lambda/getMaintenance/index.mjs +++ b/backend-lambda/getMaintenance/index.mjs @@ -0,0 +1,43 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const config_id = event['config_id']; + const odometer = event['odometer']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const collection = database.collection("maintenance"); + const docObject = await collection.findOne({config_id: config_id}); + + if(docObject && docObject.schedules){ + for (const schedule of docObject.schedules) { + const mileage = parseInt(schedule.service_schedule_mileage.replace(',', '')); + + if (mileage > odometer) { + return schedule; + } + } + } + }).then(maintenance => { + return { + statusCode: 200, + body: JSON.stringify(maintenance) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/getUserVehicles/index.mjs b/backend-lambda/getUserVehicles/index.mjs index 7c2576e..54b7fb8 100644 --- a/backend-lambda/getUserVehicles/index.mjs +++ b/backend-lambda/getUserVehicles/index.mjs @@ -4,8 +4,6 @@ import 'dotenv/config' export const handler = async (event) => { const uri = process.env.MONGO_URI; - -// Create a MongoClient with a MongoClientOptions object to set the Stable API version const client = new MongoClient(uri, { serverApi: { version: ServerApiVersion.v1, @@ -14,39 +12,45 @@ export const handler = async (event) => { } } ); + const email = event['email']; - try { - const database = client.db("vehicleDB"); - const garage = database.collection("user_garage"); - - return await garage.aggregate([ - { - $match: { - user_id: 'dheffer' - } - }, - { - $lookup: { - from: 'configurations', - localField: 'vehicle_config_ids', - foreignField: 'config_id', - as: 'configurations' + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const garage = database.collection("user_garage"); + return await garage.aggregate([ + { + $match: { + email: email + } + }, + { + $lookup: { + from: 'configurations', + localField: 'vehicle_config_ids', + foreignField: 'config_id', + as: 'configurations' + } + }, + { + $unwind: '$configurations' + }, + { + $project: { + _id: 0, + configurations: 1 + } } - }, - { - $unwind: '$configurations' - }, - { - $project: { - _id: 0, - configurations: 1 - } - } - ]).toArray(); - - } - finally { - // Ensures that the client will close when you finish/error - await client.close(); - } + ]).toArray(); + }).then(vehicles => { + return { + statusCode: 200, + body: JSON.stringify(vehicles) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); } \ No newline at end of file diff --git a/backend-lambda/getUserVehicles/package.json b/backend-lambda/getUserVehicles/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getUserVehicles/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getVehicleHistory/index.mjs b/backend-lambda/getVehicleHistory/index.mjs index e69de29..f79b11f 100644 --- a/backend-lambda/getVehicleHistory/index.mjs +++ b/backend-lambda/getVehicleHistory/index.mjs @@ -0,0 +1,48 @@ +import {MongoClient, ServerApiVersion} from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const config_id = event['config_id']; + const email = event['email']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const info = database.collection("user_vehicle_info"); + const history = await info.aggregate([ + { + $match: { + config_id: parseInt(config_id), + email: email + } + }, + { + $project: { + _id: 0, + completed_maintenance: 1 + } + } + ]).toArray(); + return history.map(info => info.completed_maintenance) + }).then(history => { + return { + statusCode: 200, + body: JSON.stringify(history) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/getVehicleHistory/package.json b/backend-lambda/getVehicleHistory/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getVehicleHistory/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getVehicleInfo/index.mjs b/backend-lambda/getVehicleInfo/index.mjs index e69de29..255b6a1 100644 --- a/backend-lambda/getVehicleInfo/index.mjs +++ b/backend-lambda/getVehicleInfo/index.mjs @@ -0,0 +1,32 @@ +import {MongoClient, ServerApiVersion} from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const config_id = event['config_id']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const vehicle = database.collection("configurations") + return await vehicle.findOne({config_id: parseInt(config_id)}); + }).then(config => { + return { + statusCode: 200, + body: JSON.stringify({message: config}) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/getVehicleInfo/package.json b/backend-lambda/getVehicleInfo/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getVehicleInfo/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/postMaintenanceHistory/index.mjs b/backend-lambda/postMaintenanceHistory/index.mjs index e69de29..5790bef 100644 --- a/backend-lambda/postMaintenanceHistory/index.mjs +++ b/backend-lambda/postMaintenanceHistory/index.mjs @@ -0,0 +1,43 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const config_id = event['config_id']; + const email = event['email']; + const maintenance = { + type: event.body.type, + date: event.body.date, + maintenance: event.body.maintenance, + cost: parseInt(event.body.cost) + } + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const garage = database.collection("user_vehicle_info"); + + const add = await garage.updateOne( + { email: email, config_id: parseInt(config_id) }, + { $push: { completed_maintenance: maintenance } } + ); + return { + statusCode: 200, + body: JSON.stringify({message: `Maintenance history added to vehicle with config ${config_id}`}) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/postMaintenanceHistory/package.json b/backend-lambda/postMaintenanceHistory/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/postMaintenanceHistory/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/updateMaintenanceHistory/index.mjs b/backend-lambda/updateMaintenanceHistory/index.mjs index e69de29..9c369e3 100644 --- a/backend-lambda/updateMaintenanceHistory/index.mjs +++ b/backend-lambda/updateMaintenanceHistory/index.mjs @@ -0,0 +1,62 @@ +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const config_id = event['config_id']; + const email = event['email']; + const { + old_type, old_date, old_maintenance, old_cost, + new_type, new_date, new_maintenance, new_cost + } = event.body; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const garage = database.collection("user_vehicle_info"); + const update = await garage.updateOne( + { + email: email, + config_id: parseInt(config_id), + "completed_maintenance.type": old_type, + "completed_maintenance.date": old_date, + "completed_maintenance.maintenance": old_maintenance, + "completed_maintenance.cost": parseInt(old_cost) + }, + { + $set: { + "completed_maintenance.$.type": new_type, + "completed_maintenance.$.date": new_date, + "completed_maintenance.$.maintenance": new_maintenance, + "completed_maintenance.$.cost": parseInt(new_cost) + } + }); + if (update.modifiedCount === 1) { + return { + statusCode: 200, + body: JSON.stringify({message: `Maintenance history updated for vehicle with config ${config_id}`}) + }; + } + else { + return { + statusCode: 400, + body: JSON.stringify({message: `Maintenance history not updated for vehicle with config ${config_id}`}) + }; + } + + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/updateMaintenanceHistory/package.json b/backend-lambda/updateMaintenanceHistory/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/updateMaintenanceHistory/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} From 3e7297cb4cf22b4248f8cb5f5d83a9bce13b1195 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Fri, 12 Apr 2024 15:51:28 -0230 Subject: [PATCH 12/15] OAuth file setup --- backend-lambda/OAuthGetUrl/index.mjs | 23 +++++ backend-lambda/OAuthGetUrl/package.json | 5 + backend-lambda/OAuthProcessing/index.mjs | 92 +++++++++++++++++ backend-lambda/OAuthProcessing/package.json | 8 ++ backend-lambda/getAPIUrl/index.mjs | 0 backend-lambda/oauth-processing/index.mjs | 106 -------------------- 6 files changed, 128 insertions(+), 106 deletions(-) create mode 100644 backend-lambda/OAuthGetUrl/index.mjs create mode 100644 backend-lambda/OAuthGetUrl/package.json create mode 100644 backend-lambda/OAuthProcessing/index.mjs create mode 100644 backend-lambda/OAuthProcessing/package.json delete mode 100644 backend-lambda/getAPIUrl/index.mjs delete mode 100644 backend-lambda/oauth-processing/index.mjs diff --git a/backend-lambda/OAuthGetUrl/index.mjs b/backend-lambda/OAuthGetUrl/index.mjs new file mode 100644 index 0000000..f17c395 --- /dev/null +++ b/backend-lambda/OAuthGetUrl/index.mjs @@ -0,0 +1,23 @@ +import { google } from 'googleapis' + +export const handler = async (event, context) => { + const url = getGoogleAuthUrl(); + + return { url }; +}; + +const getGoogleAuthUrl = () => { + const oauth = new google.auth.OAuth2( + process.env.CLIENT_ID, + process.env.CLIENT_SECRET, + process.env.OAUTH_CALLBACK_URL + ); + return oauth.generateAuthUrl({ + access_type: 'offline', + prompt: 'consent', + scope: [ + 'https://www.googleapis.com/auth/userinfo.email', + 'https://www.googleapis.com/auth/userinfo.profile', + ], + }); +}; diff --git a/backend-lambda/OAuthGetUrl/package.json b/backend-lambda/OAuthGetUrl/package.json new file mode 100644 index 0000000..fef9982 --- /dev/null +++ b/backend-lambda/OAuthGetUrl/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "googleapis": "^134.0.0" + } +} diff --git a/backend-lambda/OAuthProcessing/index.mjs b/backend-lambda/OAuthProcessing/index.mjs new file mode 100644 index 0000000..9b91076 --- /dev/null +++ b/backend-lambda/OAuthProcessing/index.mjs @@ -0,0 +1,92 @@ +import { google } from 'googleapis'; +import { MongoClient, ServerApiVersion } from "mongodb"; +import 'dotenv/config'; +import jwt from 'jsonwebtoken'; + +export const handler = async (event, context) => { + + const JWTSecret = process.env.JWT_SECRET; + const oauthClient = new google.auth.OAuth2( + process.env.CLIENT_ID, + process.env.CLIENT_SECRET, + process.env.OAUTH_CALLBACK_URL + ); + const { code } = event['queryStringParameters']; + const { tokens } = await oauthClient.getToken(code); + const url = getAccessAndBearerTokenUrl(tokens.access_token); + + const myHeaders = new Headers(); + const bearerToken = "Bearer "+tokens.id_token; + myHeaders.append("Authorization", bearerToken); + + const reqOptions = { + method: 'GET', + headers: myHeaders, + redirect: 'follow' + }; + return await fetch(url, reqOptions) + .then(response => response.json()) + .then(res => { + let user = updateOrCreateUserFromOAuth(res); + const token = jwt.sign( {"name":user.name, "email":user.email}, JWTSecret, {expiresIn: '2d'} ); + return { + statusCode: 200, + headers: { + "Location": `${process.env.APP_URL}/login?token=${token}` + } + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }); +}; + +const updateOrCreateUserFromOAuth = async (user) => { + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const { name, email } = user; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const users = database.collection("users"); + const existingUser = await users.findOne({email}) + if( existingUser ) { + const result = await users.findOneAndUpdate({email}, + { $set: {name, email}}, + { returnDocument: "after"} + ); + return { + statusCode: 200, + body: JSON.stringify(result.value) + }; + } + else { + const result = await users.insertOne( {email, name}); + return { + statusCode: 200, + body: JSON.stringify(result.value) + }; + } + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; + + + +const getAccessAndBearerTokenUrl = (access_token) => { + return `https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=${access_token}`; +}; \ No newline at end of file diff --git a/backend-lambda/OAuthProcessing/package.json b/backend-lambda/OAuthProcessing/package.json new file mode 100644 index 0000000..24d1676 --- /dev/null +++ b/backend-lambda/OAuthProcessing/package.json @@ -0,0 +1,8 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "googleapis": "^134.0.0", + "jsonwebtoken": "^9.0.2", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/getAPIUrl/index.mjs b/backend-lambda/getAPIUrl/index.mjs deleted file mode 100644 index e69de29..0000000 diff --git a/backend-lambda/oauth-processing/index.mjs b/backend-lambda/oauth-processing/index.mjs deleted file mode 100644 index 672dba5..0000000 --- a/backend-lambda/oauth-processing/index.mjs +++ /dev/null @@ -1,106 +0,0 @@ -import { google} from 'googleapis'; -import { MongoClient, ServerApiVersion } from "mongodb"; -import 'dotenv/config'; -import jwt from 'jsonwebtoken'; - -export const handler = async (event, context) => { - const JWTSecret = 'test123' - const authClient = new google.auth.OAuth2( - process.env.GOOGLE_CLIENT_ID, - process.env.GOOGLE_CLIENT_SECRET, - process.env.OAUTH_CALLBACK_URL - ); - const { code } = event.queryStringParameters; - const { tokens } = await authClient.getToken(code); - - const url = getAccessAndBearerTokenUrl(tokens.access_token); - const myHeaders = new Headers(); - const bearer = `Bearer ${tokens.id_token}`; - myHeaders.append("Authorization", bearer); - const reqOptions = { - method: 'GET', - headers: myHeaders, - redirect: 'follow' - }; - - fetch(url, reqOptions) - .then(res => res.json()) - .then(res => { - updateOrCreateUserFromOauth(res) - }) - .then(user => { - jwt.sign( {"name":user.name, "email":user.email}, JWTSecret, {expiresIn: '2d'}, (err, token) => { - if(err) { - return { - statusCode: 500, - body: JSON.stringify({message: "Internal Server Error"}) - } - } - return { - statusCode: 302, - headers: { - "Location": `${process.env.APP_URL}/login?token=${token}`, - }, - } - }) - }) - .catch(err => { - return { - statusCode: 500, - body: JSON.stringify({message: `Internal Server Error: ${err.message}`}) - } - }); - - /* - const token = authorization.split(" ")[1]; - console.log(token+ ": TOKEN"); - jwt.verify(token, JWTSecret, async (err, decoded) => { - if(err) { - res.status(401).json({message: "Invalid Token"}); - } - - console.log("Decoded: "+decoded); - - const DATABASE = client.db("vehicleDB"); - const users = DATABASE.collection("users"); - - const user = await users.findOne({email: decoded.email}); - console.log("AUTHORIZ USER: "+user); - - if(!user) { - res.status(404).json({message: "User not found"}); - } - res.json(user); - }); - */ -}; - -const updateOrCreateUserFromOauth = async (oauthUserInfo) => { - const { - name, - email, - } = oauthUserInfo; - - console.log(name); - console.log(email); - - const users = DATABASE.collection("users"); - - const existingUser = await users.findOne({email}) - - if( existingUser ) { - const result = await users.findOneAndUpdate({email}, - { $set: {name, email}}, - { returnDocument: "after"} - ); - return result; - } - else { - const result = await users.insertOne( {email, name}); - return { email, name, _id: result.insertedId }; - } -} - -const getAccessAndBearerTokenUrl = (access_token) => { - return `https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=${access_token}`; -} \ No newline at end of file From 4006fba67259fbb1b4f9bf337283df044fda2302 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Fri, 12 Apr 2024 22:37:03 -0230 Subject: [PATCH 13/15] deleteMaintenanceHistory & deleteUserVehicle lambda functions created & completed --- .../deleteMaintenanceHistory/index.mjs | 46 +++++++++++++++++++ .../deleteMaintenanceHistory/package.json | 6 +++ backend-lambda/deleteUserVehicle/index.mjs | 45 ++++++++++++++++++ backend-lambda/deleteUserVehicle/package.json | 6 +++ backend/src/app.js | 4 +- 5 files changed, 104 insertions(+), 3 deletions(-) create mode 100644 backend-lambda/deleteMaintenanceHistory/package.json create mode 100644 backend-lambda/deleteUserVehicle/package.json diff --git a/backend-lambda/deleteMaintenanceHistory/index.mjs b/backend-lambda/deleteMaintenanceHistory/index.mjs index e69de29..be3dbce 100644 --- a/backend-lambda/deleteMaintenanceHistory/index.mjs +++ b/backend-lambda/deleteMaintenanceHistory/index.mjs @@ -0,0 +1,46 @@ +import {MongoClient, ServerApiVersion} from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true + } + }); + const config_id = event['config_id']; + const email = event.headers['email']; + const { type, date, maintenance, cost } = event.body; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const garage = database.collection("user_vehicle_info"); + await garage.updateOne( + { + email: email, + config_id: parseInt(config_id) + }, + {$pull: { completed_maintenance: { + type: type, + date: date, + maintenance: maintenance, + cost: cost + } + } + } + ); + return { + statusCode: 200, + body: JSON.stringify({message: `History deleted: ${type} ${date} ${maintenance} ${cost} deleted from config ${config_id}`}) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/deleteMaintenanceHistory/package.json b/backend-lambda/deleteMaintenanceHistory/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/deleteMaintenanceHistory/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/deleteUserVehicle/index.mjs b/backend-lambda/deleteUserVehicle/index.mjs index e69de29..e24899b 100644 --- a/backend-lambda/deleteUserVehicle/index.mjs +++ b/backend-lambda/deleteUserVehicle/index.mjs @@ -0,0 +1,45 @@ +import {MongoClient, ServerApiVersion} from "mongodb"; +import 'dotenv/config'; + +export const handler = async (event, context) => { + + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true + } + }); + const config_id = event['config_id']; + const email = event.headers['email']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const garage = database.collection("user_garage"); + await garage.updateOne( + { email: email }, + { $pull: { vehicle_config_ids: config_id } } + ); + return { + statusCode: 200, + body: JSON.stringify({message: `Vehicle with config ${config_id} deleted from garage`}) + }; + }).then(async () => { + const database = client.db("vehicleDB"); + const vehicInfo = database.collection("user_vehicle_info"); + await vehicInfo.deleteOne( + { email: email, config_id: config_id } + ); + return { + statusCode: 200, + body: JSON.stringify({message: `Vehicle with config ${config_id} deleted from garage`}) + }; + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/deleteUserVehicle/package.json b/backend-lambda/deleteUserVehicle/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/deleteUserVehicle/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend/src/app.js b/backend/src/app.js index 91a1056..e527667 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -283,8 +283,6 @@ app.delete('/api/delete-maintenance-history', async (req, res) => { */ app.get('/api/get-user-vehicles', async (req, res) => { const garage = DATABASE.collection("user_garage"); - - const vehicles = await garage.aggregate([ { $match: { @@ -590,7 +588,7 @@ app.get('/api/get-user-vehicle-odometers', async (req, res) => { })); - res.status(200).json(response); + res.status(200).json(response); }); From cc5bfbc465e07c91d8ec502005477a81cab56716 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Fri, 12 Apr 2024 23:40:54 -0230 Subject: [PATCH 14/15] getMaintenance lambda completed --- backend-lambda/getMaintenance/index.mjs | 15 +++++++++++---- backend-lambda/getMaintenance/package.json | 6 ++++++ 2 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 backend-lambda/getMaintenance/package.json diff --git a/backend-lambda/getMaintenance/index.mjs b/backend-lambda/getMaintenance/index.mjs index 8d8ead5..43fe0d4 100644 --- a/backend-lambda/getMaintenance/index.mjs +++ b/backend-lambda/getMaintenance/index.mjs @@ -11,6 +11,7 @@ export const handler = async (event, context) => { } } ); + // TODO: add authorization const config_id = event['config_id']; const odometer = event['odometer']; @@ -19,20 +20,26 @@ export const handler = async (event, context) => { const database = client.db("vehicleDB"); const collection = database.collection("maintenance"); const docObject = await collection.findOne({config_id: config_id}); + let recommended = null; - if(docObject && docObject.schedules){ + if (docObject && docObject.schedules) { for (const schedule of docObject.schedules) { const mileage = parseInt(schedule.service_schedule_mileage.replace(',', '')); if (mileage > odometer) { - return schedule; + recommended = schedule; + break; } } + } else { + return { + statusCode: 404, + body: JSON.stringify({message: "Maintenance schedule not found"}) + } } - }).then(maintenance => { return { statusCode: 200, - body: JSON.stringify(maintenance) + body: JSON.stringify(recommended) }; }).catch(err => { return { diff --git a/backend-lambda/getMaintenance/package.json b/backend-lambda/getMaintenance/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/getMaintenance/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} From 5e6f462231629523cc39e7f4f5c1eb81a3102c88 Mon Sep 17 00:00:00 2001 From: Delaney H Date: Sat, 13 Apr 2024 12:24:32 -0230 Subject: [PATCH 15/15] #minor getUser and updateOdometer lambdas functional README.md updated --- README.md | 4 +- backend-lambda/getUser/index.mjs | 56 ++++++++++++++++++++ backend-lambda/getUser/package.json | 7 +++ backend-lambda/updateOdometer/index.mjs | 60 ++++++++++++++++++++++ backend-lambda/updateOdometer/package.json | 6 +++ backend/src/app.js | 3 +- 6 files changed, 132 insertions(+), 4 deletions(-) create mode 100644 backend-lambda/getUser/package.json create mode 100644 backend-lambda/updateOdometer/package.json diff --git a/README.md b/README.md index cbfadc5..ad6075a 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,8 @@ Driveline is a web application designed to streamline and automate the process o ## Key Features: - [x] **OAuth Login Page:** Utilizes OAuth for secure login, enabling users to create profiles seamlessly. -- [ ] **Vehicle Management:** Users can upload, edit, and remove vehicles from their Garage with ease. -- [ ] **Service History & Upcoming Services:** Users can view detailed service history, upcoming maintenance tasks, and general vehicle information when selecting a vehicle in their garage. +- [x] **Vehicle Management:** Users can upload, edit, and remove vehicles from their Garage with ease. +- [x] **Service History & Upcoming Services:** Users can view detailed service history, upcoming maintenance tasks, and general vehicle information when selecting a vehicle in their garage. - [ ] **Settings Configuration:** The settings page allows users to customize their profile and app settings, including preferences like light & dark mode ## Technologies Used: diff --git a/backend-lambda/getUser/index.mjs b/backend-lambda/getUser/index.mjs index e69de29..73861ea 100644 --- a/backend-lambda/getUser/index.mjs +++ b/backend-lambda/getUser/index.mjs @@ -0,0 +1,56 @@ +import { MongoClient, ServerApiVersion } from 'mongodb'; +import 'dotenv/config'; +import jwt from 'jsonwebtoken'; + +export const handler = async (event, context) => { + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const authorization = event.headers['authorization']; + console.log(authorization); + + try { + await client.connect(); + + if (authorization) { + const token = authorization.split(' ')[1]; + console.log(`token --- ${token}`); + try { + const decoded = jwt.verify(token, process.env.JWTSecret); + const database = client.db('vehicleDB'); + const users = database.collection('users'); + const user = await users.findOne({ email: decoded.email }); + console.log(user); + if (user) { + return { + statusCode: 200, + body: JSON.stringify(user) + }; + } else { + return { + statusCode: 404, + body: JSON.stringify({ message: 'User not found' }) + }; + } + } catch (err) { + return { + statusCode: 401, + body: JSON.stringify({ message: 'Unauthorized' }) + }; + } + } + } catch (err) { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + } finally { + await client.close(); + } +}; diff --git a/backend-lambda/getUser/package.json b/backend-lambda/getUser/package.json new file mode 100644 index 0000000..0d137fd --- /dev/null +++ b/backend-lambda/getUser/package.json @@ -0,0 +1,7 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "jsonwebtoken": "^9.0.2", + "mongodb": "^6.5.0" + } +} diff --git a/backend-lambda/updateOdometer/index.mjs b/backend-lambda/updateOdometer/index.mjs index e69de29..78a1485 100644 --- a/backend-lambda/updateOdometer/index.mjs +++ b/backend-lambda/updateOdometer/index.mjs @@ -0,0 +1,60 @@ +import { MongoClient, ServerApiVersion } from 'mongodb'; +import 'dotenv/config'; + +export const handler = async (event, context) => { + const uri = process.env.MONGO_URI; + const client = new MongoClient(uri, { + serverApi: { + version: ServerApiVersion.v1, + strict: true, + deprecationErrors: true, + } + } + ); + const email = event.headers['email']; + const config_id = event.body['config_id']; + const odometer = event.body['odometer']; + const picture_url = event.body['picture_url']; + + return client.connect() + .then(async () => { + const database = client.db("vehicleDB"); + const userVehicle = database.collection("user_vehicle_info"); + const updateData = {}; + let type = ''; + if (odometer) { + type = 'Odometer'; + await userVehicle.updateOne( + { email: email, config_id: config_id }, + { $set: { odometer: parseInt(odometer) } } + ); + return { + statusCode: 200, + body: JSON.stringify(`${type} updated to ${odometer}`) + }; + } + else if (picture_url) { + updateData.picture_url = picture_url; + type = 'Picture URL' + await userVehicle.updateOne( + { email: email, config_id: config_id }, + { $set: { picture_url: picture_url } } + ); + return { + statusCode: 200, + body: JSON.stringify(`${type} updated to ${picture_url}`) + }; + } + else { + return { + statusCode: 400, + body: JSON.stringify({ message: "Bad Request: Please provide odometer or picture_url" }) + }; + } + }).catch(err => { + return { + statusCode: 500, + body: JSON.stringify({ message: `Internal Server Error: ${err.message}` }) + }; + }).finally(() => client.close()); +}; \ No newline at end of file diff --git a/backend-lambda/updateOdometer/package.json b/backend-lambda/updateOdometer/package.json new file mode 100644 index 0000000..64195c9 --- /dev/null +++ b/backend-lambda/updateOdometer/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "dotenv": "^16.4.5", + "mongodb": "^6.5.0" + } +} diff --git a/backend/src/app.js b/backend/src/app.js index e527667..deebf4e 100644 --- a/backend/src/app.js +++ b/backend/src/app.js @@ -31,7 +31,6 @@ app.use(bodyParser.json()); const port = process.env.PORT || 8080; -const JWTSecret = "test123"; const getAccessAndBearerTokenUrl = (access_token) => { return `https://www.googleapis.com/oauth2/v1/userinfo?alt=json&access_token=${access_token}`; @@ -97,7 +96,7 @@ app.get('/api/user', async (req, res) => { const token = authorization.split(" ")[1]; console.log(token+ ": TOKEN"); - jwt.verify(token, JWTSecret, async (err, decoded) => { + jwt.verify(token, process.env.JWTSecret, async (err, decoded) => { if(err) { res.status(401).json({message: "Invalid Token"}); }