From 330baa51ac26faa5c27067ff7128378b5676fffa Mon Sep 17 00:00:00 2001 From: JBB0807 <104856796+JBB0807@users.noreply.github.com> Date: Tue, 20 May 2025 17:03:18 -0700 Subject: [PATCH] more bug fix, fix to run on fly.io --- assignment-db-service/fly.toml | 37 ++-- assignment-service/fly.toml | 33 +--- assignment-service/routes/StudentRouter.js | 4 - assignment-service/server.js | 43 ++--- auth-service/package-lock.json | 108 +++++++++++ auth-service/package.json | 4 +- auth-service/routes/api.js | 23 +++ auth-service/routes/auth.js | 16 +- auth-service/server.js | 2 + deployment-service/Dockerfile | 2 - deployment-service/fly.toml | 48 ++--- deployment-service/package-lock.json | 108 +++++++++++ deployment-service/package.json | 5 +- deployment-service/src/index.js | 34 +++- user-db-service/package-lock.json | 206 +++++++++++++++++++-- user-db-service/package.json | 6 +- 16 files changed, 529 insertions(+), 150 deletions(-) create mode 100644 auth-service/routes/api.js diff --git a/assignment-db-service/fly.toml b/assignment-db-service/fly.toml index 4f08c1f..e16d084 100644 --- a/assignment-db-service/fly.toml +++ b/assignment-db-service/fly.toml @@ -1,4 +1,4 @@ -# fly.toml app configuration file generated for db-assignment-service on 2025-04-24T11:13:50-07:00 +# fly.toml app configuration file generated for db-assignment-service on 2025-05-20T15:45:38-07:00 # # See https://fly.io/docs/reference/configuration/ for information about how to use this file. # @@ -7,39 +7,28 @@ app = 'db-assignment-service' primary_region = 'sea' [build] -# Only needed if you're using a Dockerfile — can be empty if using buildpacks or Node preset -# Removed the [http_service] section to disable public HTTP/HTTPS access -# [http_service] -# internal_port = 3000 -# force_https = true -# auto_stop_machines = true -# auto_start_machines = true -# min_machines_running = 0 -# processes = ["app"] +#[http_service] +# internal_port = 3000 +# force_https = true +# auto_stop_machines = 'stop' +# auto_start_machines = true +# min_machines_running = 0 +# processes = ['app'] [[services]] - protocol = "tcp" + protocol = 'tcp' internal_port = 3000 - internal_only = true # Makes this service only accessible internally + auto_stop_machines = 'stop' auto_start_machines = true - auto_stop_machines = true - - # Removed public port exposure - # [[services.ports]] - # port = 80 - # handlers = ["http"] - - # [[services.ports]] - # port = 443 - # handlers = ["tls", "http"] + ports = [] [services.concurrency] - type = "requests" + type = 'requests' hard_limit = 1000 soft_limit = 500 [[vm]] memory = '1gb' - cpu_kind = "shared" + cpu_kind = 'shared' cpus = 1 diff --git a/assignment-service/fly.toml b/assignment-service/fly.toml index dc1b81f..db92c67 100644 --- a/assignment-service/fly.toml +++ b/assignment-service/fly.toml @@ -1,4 +1,4 @@ -# fly.toml app configuration file generated for assignment-service on 2025-05-09T00:17:41-07:00 +# fly.toml app configuration file generated for assignment-service on 2025-05-20T12:51:18-07:00 # # See https://fly.io/docs/reference/configuration/ for information about how to use this file. # @@ -8,40 +8,19 @@ primary_region = 'sea' [build] -[build] -# Only needed if you're using a Dockerfile — can be empty if using buildpacks or Node preset - -# Removed the [http_service] section to disable public HTTP/HTTPS access -# [http_service] -# internal_port = 3000 -# force_https = true -# auto_stop_machines = true -# auto_start_machines = true -# min_machines_running = 0 -# processes = ["app"] - [[services]] - protocol = "tcp" + protocol = 'tcp' internal_port = 8080 - internal_only = true # Makes this service only accessible internally + auto_stop_machines = 'stop' auto_start_machines = true - auto_stop_machines = true - - # Removed public port exposure - # [[services.ports]] - # port = 80 - # handlers = ["http"] - - # [[services.ports]] - # port = 443 - # handlers = ["tls", "http"] + ports = [] # ✅ No public ports = no public IP [services.concurrency] - type = "requests" + type = 'requests' hard_limit = 1000 soft_limit = 500 [[vm]] memory = '1gb' - cpu_kind = "shared" + cpu_kind = 'shared' cpus = 1 diff --git a/assignment-service/routes/StudentRouter.js b/assignment-service/routes/StudentRouter.js index 15fbb26..f0162d1 100644 --- a/assignment-service/routes/StudentRouter.js +++ b/assignment-service/routes/StudentRouter.js @@ -62,10 +62,6 @@ studentRouter.post("/save", async (req, res) => { }); }); -studentRouter.post("/deploy", (req, res) => { - -}); - studentRouter.get("/assignment/:qrnum", (req, res) => { const qrnum = req.params.qrnum; console.log("Fetching details for qr number:", qrnum); diff --git a/assignment-service/server.js b/assignment-service/server.js index 7b109f0..041c641 100644 --- a/assignment-service/server.js +++ b/assignment-service/server.js @@ -3,19 +3,23 @@ const cors = require("cors"); const passport = require("passport"); const session = require("express-session"); +const axios = require("axios"); + const express = require("express"); const AWS = require("aws-sdk"); const instructorRouter = require("./routes/InstructorRouter"); const studentRouter = require("./routes/StudentRouter"); -const s3 = new AWS.S3({ - endpoint: process.env.AWS_ENDPOINT_URL_S3, - accessKeyId: process.env.AWS_ACCESS_KEY_ID, - secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, - region: process.env.AWS_REGION, - s3ForcePathStyle: true, -}); -const BUCKET = process.env.COMMON_BUCKET; +const DEPLOY_API_URL = process.env.DEPLOY_API_URL || "http://localhost:3600"; + +// const s3 = new AWS.S3({ +// endpoint: process.env.AWS_ENDPOINT_URL_S3, +// accessKeyId: process.env.AWS_ACCESS_KEY_ID, +// secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, +// region: process.env.AWS_REGION, +// s3ForcePathStyle: true, +// }); +// const BUCKET = process.env.COMMON_BUCKET; const app = express(); app.use(express.json()); @@ -57,20 +61,17 @@ app.get("/notebook/save/:appname", async (req, res) => { app.get("/notebook/:appName", async (req, res) => { try { const { appName } = req.params; - const prefix = `${appName}/notebooks/`; - const list = await s3 - .listObjectsV2({ Bucket: BUCKET, Prefix: prefix }) - .promise(); - if (!list.Contents || list.Contents.length === 0) { - return res.status(404).json({ error: "Notebook not found" }); + console.log(`Fetching notebook for appName: ${appName}`); + + const response = await axios.get(`${DEPLOY_API_URL}/notebook/${appName}`); + if (response.status !== 200) { + console.log(`Failed to restart app for appName: ${appName}`); + return res.status(500).json({ error: "Failed to restart app" }); } - const latest = list.Contents.reduce((prev, curr) => - prev.LastModified > curr.LastModified ? prev : curr - ); - const data = await s3 - .getObject({ Bucket: BUCKET, Key: latest.Key }) - .promise(); - res.send(data.Body.toString("utf-8")); + + console.log(`Notebook data received for appName: ${appName}`); + res.status(200).json(response.data); + } catch (error) { console.error("Failed to load notebook:", error); res.status(500).json({ error: "Failed to load notebook" }); diff --git a/auth-service/package-lock.json b/auth-service/package-lock.json index 26d2726..df30c0d 100644 --- a/auth-service/package-lock.json +++ b/auth-service/package-lock.json @@ -14,6 +14,8 @@ "dotenv": "^16.5.0", "express": "^5.1.0", "express-session": "^1.18.1", + "http-proxy": "^1.18.1", + "http-proxy-middleware": "^3.0.5", "nodemon": "^3.1.9", "passport": "^0.7.0", "passport-custom": "^1.1.1", @@ -23,6 +25,24 @@ "dotenv-cli": "^8.0.0" } }, + "node_modules/@types/http-proxy": { + "version": "1.17.16", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.16.tgz", + "integrity": "sha512-sdWoUajOB1cd0A8cRRQ1cfyWNbmFKLAqBB89Y8x5iYyG/mkJHc0YUH8pdWBy2omi9qtCpiIgGjuwO0dQST2l5w==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/node": { + "version": "22.15.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.20.tgz", + "integrity": "sha512-A6BohGFRGHAscJsTslDCA9JG7qSJr/DWUvrvY8yi9IgnGtMxCyat7vvQ//MFa0DnLsyuS3wYTpLdw4Hf+Q5JXw==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -459,6 +479,12 @@ "node": ">= 0.6" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, "node_modules/express": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", @@ -811,6 +837,54 @@ "node": ">= 0.8" } }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz", + "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.15", + "debug": "^4.3.6", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.3", + "is-plain-object": "^5.0.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/http-proxy-middleware/node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -886,6 +960,15 @@ "node": ">=0.12.0" } }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", @@ -929,6 +1012,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.54.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", @@ -1298,6 +1394,12 @@ "node": ">=8.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, "node_modules/router": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", @@ -1625,6 +1727,12 @@ "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", "license": "MIT" }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/auth-service/package.json b/auth-service/package.json index 2d95f65..c7ccb5c 100644 --- a/auth-service/package.json +++ b/auth-service/package.json @@ -18,7 +18,9 @@ "nodemon": "^3.1.9", "passport": "^0.7.0", "passport-custom": "^1.1.1", - "passport-google-oauth20": "^2.0.0" + "passport-google-oauth20": "^2.0.0", + "http-proxy": "^1.18.1", + "http-proxy-middleware": "^3.0.5" }, "devDependencies": { "dotenv-cli": "^8.0.0" diff --git a/auth-service/routes/api.js b/auth-service/routes/api.js new file mode 100644 index 0000000..91be5b4 --- /dev/null +++ b/auth-service/routes/api.js @@ -0,0 +1,23 @@ +const { createProxyMiddleware } = require("http-proxy-middleware"); +const api = require("express").Router(); + +const ASSIGNMENT_SERVICE_URL = process.env.ASSIGNMENT_SERVICE_URL; + +// rerout to asisgnment url +api.use((req, res, next) => { + console.log(`Proxying request to: ${ASSIGNMENT_SERVICE_URL} : original url : ${req.originalUrl}`); + next(); +}); + +api.use( + '/', + createProxyMiddleware({ + target: ASSIGNMENT_SERVICE_URL, + changeOrigin: true, + pathRewrite: { + '^/api': '', // only remove /api + }, + }) +); + +module.exports = api; diff --git a/auth-service/routes/auth.js b/auth-service/routes/auth.js index 88a0309..77193f1 100644 --- a/auth-service/routes/auth.js +++ b/auth-service/routes/auth.js @@ -1,10 +1,10 @@ -const router = require("express").Router(); +const auth = require("express").Router(); const passport = require("passport"); const axios = require("axios"); const AUTH_URL = process.env.AUTH_URL || "http://localhost:8080"; -router.get( +auth.get( "/google/callback", passport.authenticate("google", { failureRedirect: "/auth/login/failed", @@ -41,7 +41,7 @@ router.get( } ); -router.get("/current_user", (req, res) => { +auth.get("/current_user", (req, res) => { console.log("Current user endpoint hit"); console.log("Request user:", req.user); if (req.isAuthenticated()) { @@ -76,16 +76,16 @@ router.get("/current_user", (req, res) => { // } // }); -router.get("/login/failed", (req, res) => { +auth.get("/login/failed", (req, res) => { res.status(401).json({ error: true, message: "Log in failure", }); }); -router.get("/google", passport.authenticate("google", ["profile", "email"])); +auth.get("/google", passport.authenticate("google", ["profile", "email"])); -router.post( +auth.post( "/student/login", passport.authenticate("student-auth", { keepSessionInfo: true }), (req, res) => { @@ -117,7 +117,7 @@ router.post( } ); -router.get("/logout", (req, res) => { +auth.get("/logout", (req, res) => { req.logout((err) => { if (err) { return next(err); @@ -126,4 +126,4 @@ router.get("/logout", (req, res) => { }); }); -module.exports = router; +module.exports = auth; diff --git a/auth-service/server.js b/auth-service/server.js index 5f5a393..18cdb72 100644 --- a/auth-service/server.js +++ b/auth-service/server.js @@ -5,6 +5,7 @@ const express = require("express"); const passport = require("passport"); const passportSetup = require("./passport"); const authRoute = require("./routes/auth"); +const apiRoute = require("./routes/api"); const session = require("express-session"); const bodyParser = require("body-parser"); @@ -48,6 +49,7 @@ const corsOptions = { app.use(cors(corsOptions)); +app.use("/api", apiRoute); app.use("/auth", authRoute); const port = process.env.PORT || 8080; diff --git a/deployment-service/Dockerfile b/deployment-service/Dockerfile index cbe3958..c83c8b3 100644 --- a/deployment-service/Dockerfile +++ b/deployment-service/Dockerfile @@ -7,7 +7,5 @@ RUN npm ci --only=production COPY src ./src COPY snakeapi_service ./snakeapi_service -ENV FLY_ACCESS_TOKEN="FlyV1 fm2_lJPECAAAAAAACJJHxBAjRF69RAjf3FXXuVT+M3bcwrVodHRwczovL2FwaS5mbHkuaW8vdjGUAJLOAA//nh8Lk7lodHRwczovL2FwaS5mbHkuaW8vYWFhL3YxxDxmIdNTu/DGjUSyYxuC5W7Rio4bNT5w6c1Ihi+ZJnjcmEutbt5KuyFcCo1C0CFPEhrP4hY5SEvXN58GHUDEToWZ0GwI5ndmIsZnhWSG8TBixbuFTaBb8lTBU5lNOvm2l4rX1i6dfId7S9Ko6qXpOzl9oYngy0zw+g2MwXuQrH6/XELBdEy/KThVeTEjt8QgBzOo/Eae+DsrATm6WjVv9f5a4iS/s7WtYHydZZr3z9M=,fm2_lJPEToWZ0GwI5ndmIsZnhWSG8TBixbuFTaBb8lTBU5lNOvm2l4rX1i6dfId7S9Ko6qXpOzl9oYngy0zw+g2MwXuQrH6/XELBdEy/KThVeTEjt8QQNZaUoOrVdOnk6Vo/DkeMGsO5aHR0cHM6Ly9hcGkuZmx5LmlvL2FhYS92MZgEks5oGwzFzwAAAAEkEyrjF84AD2FZCpHOAA9hWQzEEASQrBHkPDFO3LlZDaxRRIjEIEW1ki/syKHnhFamHgze8PFeunPOAmNmh57hslV04lL7" - EXPOSE 8080 CMD ["node", "src/index.js"] diff --git a/deployment-service/fly.toml b/deployment-service/fly.toml index 348b310..eee5ff1 100644 --- a/deployment-service/fly.toml +++ b/deployment-service/fly.toml @@ -1,51 +1,27 @@ -app = 'deployment-service-test' +# fly.toml app configuration file generated for deployment-service on 2025-05-20T16:15:07-07:00 +# +# See https://fly.io/docs/reference/configuration/ for information about how to use this file. +# + +app = 'deployment-service' primary_region = 'sea' [build] - dockerfile = "Dockerfile" - -[env] - FLY_ORG="personal" - COMMON_BUCKET="snakeapi-deployment-test-bucket" - AWS_ACCESS_KEY_ID="tid__NSmOVaGknqitaCySppZjqVTgJSdDFnFbWcQllkC_juHwkbQZO" - AWS_SECRET_ACCESS_KEY="tsec_6Bz1aMbfYQftuq5WfIVEDZkHwskU4MMjVywdtxSP6uxetEBvkSC2VHI9HfTeDgHr4D6kiz" - AWS_ENDPOINT_URL_S3="https://fly.storage.tigris.dev" - AWS_REGION="auto" - IMAGE_REF="registry.fly.io/snake-api-template:latest" - FLY_API_BASE_URL = "https://api.machines.dev/v1" - - -# Removed the [http_service] section to disable public HTTP/HTTPS access -# [http_service] -# internal_port = 3000 -# force_https = true -# auto_stop_machines = true -# auto_start_machines = true -# min_machines_running = 0 -# processes = ["app"] + dockerfile = 'Dockerfile' [[services]] - protocol = "tcp" + protocol = 'tcp' internal_port = 8080 - internal_only = true # Makes this service only accessible internally + auto_stop_machines = 'stop' auto_start_machines = true - auto_stop_machines = true - - # Removed public port exposure - # [[services.ports]] - # port = 80 - # handlers = ["http"] - - # [[services.ports]] - # port = 443 - # handlers = ["tls", "http"] + ports = [] [services.concurrency] - type = "requests" + type = 'requests' hard_limit = 1000 soft_limit = 500 [[vm]] memory = '1gb' - cpu_kind = "shared" + cpu_kind = 'shared' cpus = 1 diff --git a/deployment-service/package-lock.json b/deployment-service/package-lock.json index f775c84..4271d7c 100644 --- a/deployment-service/package-lock.json +++ b/deployment-service/package-lock.json @@ -15,6 +15,7 @@ "tar": "^7.4.3" }, "devDependencies": { + "dotenv-cli": "^8.0.0", "nodemon": "^2.0.22" } }, @@ -361,6 +362,21 @@ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", "license": "MIT" }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -427,6 +443,32 @@ "url": "https://dotenvx.com" } }, + "node_modules/dotenv-cli": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-8.0.0.tgz", + "integrity": "sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -1004,6 +1046,13 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, "node_modules/jmespath": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", @@ -1095,6 +1144,16 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -1235,6 +1294,16 @@ "node": ">= 0.8" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", @@ -1492,6 +1561,29 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -1737,6 +1829,22 @@ "node": ">= 0.8" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/which-typed-array": { "version": "1.1.19", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", diff --git a/deployment-service/package.json b/deployment-service/package.json index 440cd07..46852f1 100644 --- a/deployment-service/package.json +++ b/deployment-service/package.json @@ -5,7 +5,7 @@ "main": "src/index.js", "scripts": { "start": "node src/index.js", - "dev": "nodemon src/index.js" + "dev": "dotenv -e .env.development nodemon src/index.js" }, "dependencies": { "aws-sdk": "^2.1420.0", @@ -15,6 +15,7 @@ "tar": "^7.4.3" }, "devDependencies": { - "nodemon": "^2.0.22" + "nodemon": "^2.0.22", + "dotenv-cli": "^8.0.0" } } diff --git a/deployment-service/src/index.js b/deployment-service/src/index.js index d0bbc97..fc09763 100644 --- a/deployment-service/src/index.js +++ b/deployment-service/src/index.js @@ -273,11 +273,6 @@ app.post("/:appName/delete", async (req, res) => { } }); -const LISTEN_PORT = process.env.PORT || 3006; -app.listen(LISTEN_PORT, "0.0.0.0", () => { - console.log(`Deployment service listening on port ${LISTEN_PORT}`); -}); - //deploy fly app based on appname app.post("/deploy/:appName", async (req, res) => { const { appName } = req.params; @@ -302,3 +297,32 @@ app.post("/deploy/:appName", async (req, res) => { return res.status(500).json({ error: err.response?.data || err.message }); } }); + +app.get("/notebook/:appName", async (req, res) => { + try { + const { appName } = req.params; + const prefix = `${appName}/notebooks/`; + const list = await s3 + .listObjectsV2({ Bucket: COMMON_BUCKET, Prefix: prefix }) + .promise(); + if (!list.Contents || list.Contents.length === 0) { + return res.status(404).json({ error: "Notebook not found" }); + } + const latest = list.Contents.reduce((prev, curr) => + prev.LastModified > curr.LastModified ? prev : curr + ); + const data = await s3 + .getObject({ Bucket: COMMON_BUCKET, Key: latest.Key }) + .promise(); + res.send(data.Body.toString("utf-8")); + } catch (error) { + console.error("Failed to load notebook:", error); + res.status(500).json({ error: "Failed to load notebook" }); + } +}); + + +const LISTEN_PORT = process.env.NODE_PORT || 8080; +app.listen(LISTEN_PORT, () => { + console.log(`Server running at :${LISTEN_PORT}`); +}); diff --git a/user-db-service/package-lock.json b/user-db-service/package-lock.json index cd968d1..b0d75a4 100644 --- a/user-db-service/package-lock.json +++ b/user-db-service/package-lock.json @@ -9,6 +9,10 @@ "express": "^5.1.0", "nodemon": "^3.1.9", "prisma": "^6.1.0" + }, + "devDependencies": { + "dotenv-cli": "^8.0.0", + "nodemon": "^2.0.22" } }, "node_modules/@prisma/client": { @@ -91,6 +95,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -104,12 +109,14 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -142,6 +149,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -152,6 +160,7 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" @@ -202,6 +211,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, "license": "MIT", "dependencies": { "anymatch": "~3.1.2", @@ -226,6 +236,7 @@ "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, "license": "MIT" }, "node_modules/content-disposition": { @@ -267,6 +278,21 @@ "node": ">=6.6.0" } }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", @@ -293,6 +319,45 @@ "node": ">= 0.8" } }, + "node_modules/dotenv": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.5.0.tgz", + "integrity": "sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dotenv-cli": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv-cli/-/dotenv-cli-8.0.0.tgz", + "integrity": "sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "dotenv": "^16.3.0", + "dotenv-expand": "^10.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "dotenv": "cli.js" + } + }, + "node_modules/dotenv-expand": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz", + "integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -413,6 +478,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -520,6 +586,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -544,6 +611,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -605,6 +673,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", + "dev": true, "license": "ISC" }, "node_modules/inherits": { @@ -626,6 +695,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -638,6 +708,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -647,6 +718,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -659,6 +731,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -670,6 +743,13 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -725,6 +805,7 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" @@ -733,6 +814,16 @@ "node": "*" } }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -749,18 +840,19 @@ } }, "node_modules/nodemon": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.9.tgz", - "integrity": "sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.22.tgz", + "integrity": "sha512-B8YqaKMmyuCO7BowF1Z1/mkPqLk6cs/l63Ojtd6otKjMx47Dq1utxfRxcavH1I7VSaL8n5BUaoutadnsX3AAVQ==", + "dev": true, "license": "MIT", "dependencies": { "chokidar": "^3.5.2", - "debug": "^4", + "debug": "^3.2.7", "ignore-by-default": "^1.0.1", "minimatch": "^3.1.2", "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", + "semver": "^5.7.1", + "simple-update-notifier": "^1.0.7", "supports-color": "^5.5.0", "touch": "^3.1.0", "undefsafe": "^2.0.5" @@ -769,17 +861,28 @@ "nodemon": "bin/nodemon.js" }, "engines": { - "node": ">=10" + "node": ">=8.10.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/nodemon" } }, + "node_modules/nodemon/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -827,6 +930,16 @@ "node": ">= 0.8" } }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/path-to-regexp": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", @@ -840,6 +953,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -884,6 +998,7 @@ "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", + "dev": true, "license": "MIT" }, "node_modules/qs": { @@ -929,6 +1044,7 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -980,15 +1096,13 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, "license": "ISC", "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "semver": "bin/semver" } }, "node_modules/send": { @@ -1034,6 +1148,29 @@ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "license": "ISC" }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -1107,15 +1244,26 @@ } }, "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", + "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", + "dev": true, "license": "MIT", "dependencies": { - "semver": "^7.5.3" + "semver": "~7.0.0" }, "engines": { - "node": ">=10" + "node": ">=8.10.0" + } + }, + "node_modules/simple-update-notifier/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, "node_modules/statuses": { @@ -1131,6 +1279,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -1143,6 +1292,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -1164,6 +1314,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", + "dev": true, "license": "ISC", "bin": { "nodetouch": "bin/nodetouch.js" @@ -1187,6 +1338,7 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", + "dev": true, "license": "MIT" }, "node_modules/unpipe": { @@ -1207,6 +1359,22 @@ "node": ">= 0.8" } }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/user-db-service/package.json b/user-db-service/package.json index 84a30b2..673a4a6 100644 --- a/user-db-service/package.json +++ b/user-db-service/package.json @@ -7,6 +7,10 @@ }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1", - "dev": "nodemon app.js" + "dev": "dotenv -e .env.development nodemon app.js" + }, + "devDependencies": { + "nodemon": "^2.0.22", + "dotenv-cli": "^8.0.0" } }