From 34900aebddcd63b920f21ac05d97140764c2b6e3 Mon Sep 17 00:00:00 2001 From: AG Date: Sun, 7 Dec 2025 20:27:29 +0200 Subject: [PATCH] Dev, Test, and Prod DBs separated. .env is unified now. --- package.json | 6 ++++-- server/package-lock.json | 26 ++++++++++++++++++++++++++ server/package.json | 10 ++++++---- server/prisma.config.js | 5 +++++ server/prisma/dev.db | Bin 114688 -> 90112 bytes server/prisma/prod.db | Bin 0 -> 90112 bytes server/prisma/test.db | Bin 0 -> 90112 bytes server/src/index.ts | 22 +++++++++++++++++++--- server/src/lib/prisma.ts | 26 ++++++++++++++++++++++++-- server/src/routes/sessions.ts | 2 +- server/test.db | Bin 0 -> 90112 bytes 11 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 server/prisma.config.js create mode 100644 server/prisma/prod.db create mode 100644 server/prisma/test.db create mode 100644 server/test.db diff --git a/package.json b/package.json index 206b8e2..cadf227 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@ "build": "vite build", "preview": "vite preview", "dev:full": "npm-run-all --parallel dev \"dev --prefix server\"", - "dev:full:bg": "npm-run-all --parallel dev \"dev --prefix server\" &" + "dev:full:bg": "npm-run-all --parallel dev \"dev --prefix server\" &", + "test:full": "npm-run-all --parallel dev \"start:test --prefix server\"", + "prod:full": "npm-run-all --parallel preview \"start:prod --prefix server\"" }, "dependencies": { "@google/genai": "^1.30.0", @@ -29,4 +31,4 @@ "typescript": "~5.8.2", "vite": "^6.2.0" } -} +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index 4db6a61..e373e05 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -26,6 +26,7 @@ "@types/express": "*", "@types/jsonwebtoken": "*", "@types/node": "*", + "cross-env": "^10.1.0", "dotenv-cli": "^11.0.0", "nodemon": "*", "prisma": "^7.1.0", @@ -112,6 +113,13 @@ "@electric-sql/pglite": "0.3.2" } }, + "node_modules/@epic-web/invariant": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@epic-web/invariant/-/invariant-1.0.0.tgz", + "integrity": "sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==", + "dev": true, + "license": "MIT" + }, "node_modules/@google/generative-ai": { "version": "0.24.1", "resolved": "https://registry.npmjs.org/@google/generative-ai/-/generative-ai-0.24.1.tgz", @@ -1038,6 +1046,24 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "license": "MIT" }, + "node_modules/cross-env": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-10.1.0.tgz", + "integrity": "sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@epic-web/invariant": "^1.0.0", + "cross-spawn": "^7.0.6" + }, + "bin": { + "cross-env": "dist/bin/cross-env.js", + "cross-env-shell": "dist/bin/cross-env-shell.js" + }, + "engines": { + "node": ">=20" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", diff --git a/server/package.json b/server/package.json index 93196ff..21aac07 100644 --- a/server/package.json +++ b/server/package.json @@ -4,11 +4,12 @@ "description": "Backend for GymFlow AI", "main": "src/index.ts", "scripts": { - "start": "node dist/index.js", - "dev": "ts-node-dev -r dotenv/config --respawn --transpile-only src/index.ts", + "start": "npm run start:prod", + "start:prod": "cross-env APP_MODE=prod node dist/index.js", + "start:test": "cross-env APP_MODE=test ts-node-dev -r dotenv/config --respawn --transpile-only src/index.ts", + "dev": "cross-env APP_MODE=dev ts-node-dev -r dotenv/config --respawn --transpile-only src/index.ts", "build": "tsc", "migrate:deploy": "npx prisma migrate deploy" - }, "dependencies": { "@google/generative-ai": "^0.24.1", @@ -29,10 +30,11 @@ "@types/express": "*", "@types/jsonwebtoken": "*", "@types/node": "*", + "cross-env": "^10.1.0", "dotenv-cli": "^11.0.0", "nodemon": "*", "prisma": "^7.1.0", "ts-node": "*", "typescript": "*" } -} +} \ No newline at end of file diff --git a/server/prisma.config.js b/server/prisma.config.js new file mode 100644 index 0000000..68efaae --- /dev/null +++ b/server/prisma.config.js @@ -0,0 +1,5 @@ +module.exports = { + datasource: { + url: process.env.DATABASE_URL, + }, +}; diff --git a/server/prisma/dev.db b/server/prisma/dev.db index 34bc2f7373a19d6066352905fa90fd38686d89e2..48dc7ec47897067fff3f5e192d464aa1070d707f 100644 GIT binary patch delta 1158 zcmds$PiPZC6vp@4KQoibZg!J4*-bD?f-MD;9+XnBVujcyu@oy}i+T{1AcCND6~v3N zX?v8$1?OlFBIv;?5pog)#TGA~rG*wj#Iq+!q3*V{V5=ye#DT}m`yP*ZJbqubN~^E5 znN&;)OOllEWAlXTx&7U~+I{Pq=4&upL8Z-XMI8P~KO55c3$n%*loj$$mXybs$Nckp zA4so7?4b^?pF84C2`M#N>ommGA!NPVazZ?{a94aQU`6hUh{G0kc?H=~&8bV_rZbGs zGC80VyO*oO3n=?91Wn+i2kP$qrW^@FL zW_@-K;oI{6yxwK71t~<@pv{bhY6@{Km}aS(YVgjGZtF>$7de#C<;F6N3D yLG*qJX|xAQQuLOvd#5!gRZ}b-#a>uV3}6{Qn)2ty-RaOR^KN>QhPQ+MoBTUwEf+Na literal 114688 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 diff --git a/server/prisma/prod.db b/server/prisma/prod.db new file mode 100644 index 0000000000000000000000000000000000000000..48dc7ec47897067fff3f5e192d464aa1070d707f GIT binary patch literal 90112 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 { }); if (plan) { - const planExercises: { id: string }[] = JSON.parse(plan.exercises); + const planExercises: { id: string }[] = JSON.parse(plan.exercises || '[]'); const allPerformedSets = await prisma.workoutSet.findMany({ where: { sessionId: activeSession.id } }); diff --git a/server/test.db b/server/test.db new file mode 100644 index 0000000000000000000000000000000000000000..48dc7ec47897067fff3f5e192d464aa1070d707f GIT binary patch literal 90112 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