From 95a5e3774894626a1b9d710f59f578db256c0bd1 Mon Sep 17 00:00:00 2001 From: AG Date: Wed, 10 Dec 2025 14:56:20 +0200 Subject: [PATCH] Massive backend refactoring done --- debug_output.txt | Bin 0 -> 17448 bytes playwright-report/index.html | 2 +- server/controller_debug.json | 4 + server/package-lock.json | 220 +++++++ server/package.json | 5 +- server/prisma/dev.db | Bin 98304 -> 184320 bytes server/prisma/test.db | Bin 180224 -> 0 bytes server/promote_admin.ts | 17 +- server/route_hit.json | 4 + server/src/controllers/ai.controller.ts | 50 ++ server/src/controllers/auth.controller.ts | 149 +++++ server/src/controllers/exercise.controller.ts | 40 ++ server/src/controllers/plan.controller.ts | 40 ++ server/src/controllers/session.controller.ts | 160 +++++ server/src/controllers/weight.controller.ts | 34 + server/src/middleware/auth.ts | 5 +- server/src/middleware/validate.ts | 3 +- server/src/routes/ai.ts | 116 +--- server/src/routes/auth.ts | 304 +-------- server/src/routes/exercises.ts | 120 +--- server/src/routes/plans.ts | 147 +---- server/src/routes/sessions.ts | 595 +----------------- server/src/routes/weight.ts | 73 +-- server/src/services/ai.service.ts | 45 ++ server/src/services/auth.service.ts | 147 +++++ server/src/services/exercise.service.ts | 69 ++ server/src/services/plan.service.ts | 92 +++ server/src/services/session.service.ts | 435 +++++++++++++ server/src/services/weight.service.ts | 48 ++ server/src/utils/apiResponse.ts | 23 + server/src/utils/logger.ts | 22 + server/test.db | Bin 90112 -> 430080 bytes src/components/Tracker/useTracker.ts | 6 +- src/context/ActiveWorkoutContext.tsx | 2 +- src/services/auth.ts | 101 ++- src/services/exercises.ts | 17 +- src/services/geminiService.ts | 12 +- src/services/plans.ts | 13 +- src/services/sessions.ts | 38 +- src/services/weight.ts | 42 +- test_output.txt | Bin 0 -> 13612 bytes tests/core-auth.spec.ts | 2 + tests/data-progress.spec.ts | 24 +- tests/debug_login.spec.ts | 24 + tests/fixtures.ts | 10 +- tests/smoke.spec.ts | 52 ++ vite.config.ts | 2 +- 47 files changed, 1898 insertions(+), 1416 deletions(-) create mode 100644 debug_output.txt create mode 100644 server/controller_debug.json create mode 100644 server/route_hit.json create mode 100644 server/src/controllers/ai.controller.ts create mode 100644 server/src/controllers/auth.controller.ts create mode 100644 server/src/controllers/exercise.controller.ts create mode 100644 server/src/controllers/plan.controller.ts create mode 100644 server/src/controllers/session.controller.ts create mode 100644 server/src/controllers/weight.controller.ts create mode 100644 server/src/services/ai.service.ts create mode 100644 server/src/services/auth.service.ts create mode 100644 server/src/services/exercise.service.ts create mode 100644 server/src/services/plan.service.ts create mode 100644 server/src/services/session.service.ts create mode 100644 server/src/services/weight.service.ts create mode 100644 server/src/utils/apiResponse.ts create mode 100644 server/src/utils/logger.ts create mode 100644 test_output.txt create mode 100644 tests/debug_login.spec.ts create mode 100644 tests/smoke.spec.ts diff --git a/debug_output.txt b/debug_output.txt new file mode 100644 index 0000000000000000000000000000000000000000..b2101ac6954a9a73c236167b46faef7ff9f92805 GIT binary patch literal 17448 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 literal 0 HcmV?d00001 diff --git a/playwright-report/index.html b/playwright-report/index.html index 9bbb303..5a53fdb 100644 --- a/playwright-report/index.html +++ b/playwright-report/index.html @@ -82,4 +82,4 @@ Error generating stack: `+n.message+`
- \ No newline at end of file + \ No newline at end of file diff --git a/server/controller_debug.json b/server/controller_debug.json new file mode 100644 index 0000000..447ef3b --- /dev/null +++ b/server/controller_debug.json @@ -0,0 +1,4 @@ +{ + "email": "invalid@user.com", + "password": "wrongpassword" +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index d79940b..1da2585 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -19,6 +19,7 @@ "express": "5.1.0", "jsonwebtoken": "9.0.2", "ts-node-dev": "^2.0.0", + "winston": "^3.19.0", "zod": "^4.1.13" }, "devDependencies": { @@ -72,6 +73,15 @@ "devOptional": true, "license": "Apache-2.0" }, + "node_modules/@colors/colors": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -84,6 +94,17 @@ "node": ">=12" } }, + "node_modules/@dabh/diagnostics": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.8.tgz", + "integrity": "sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q==", + "license": "MIT", + "dependencies": { + "@so-ric/colorspace": "^1.1.6", + "enabled": "2.0.x", + "kuler": "^2.0.0" + } + }, "node_modules/@electric-sql/pglite": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/@electric-sql/pglite/-/pglite-0.3.2.tgz", @@ -379,6 +400,16 @@ "react-dom": "^18.0.0 || ^19.0.0" } }, + "node_modules/@so-ric/colorspace": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@so-ric/colorspace/-/colorspace-1.1.6.tgz", + "integrity": "sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw==", + "license": "MIT", + "dependencies": { + "color": "^5.0.2", + "text-hex": "1.0.x" + } + }, "node_modules/@standard-schema/spec": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", @@ -574,6 +605,12 @@ "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", "license": "MIT" }, + "node_modules/@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", + "license": "MIT" + }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -630,6 +667,12 @@ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "license": "MIT" }, + "node_modules/async": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", + "license": "MIT" + }, "node_modules/aws-ssl-profiles": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz", @@ -965,6 +1008,52 @@ "consola": "^3.2.3" } }, + "node_modules/color": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/color/-/color-5.0.3.tgz", + "integrity": "sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA==", + "license": "MIT", + "dependencies": { + "color-convert": "^3.1.3", + "color-string": "^2.1.3" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/color-convert": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-3.1.3.tgz", + "integrity": "sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=14.6" + } + }, + "node_modules/color-name": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-2.1.0.tgz", + "integrity": "sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg==", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/color-string": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-2.1.4.tgz", + "integrity": "sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg==", + "license": "MIT", + "dependencies": { + "color-name": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1306,6 +1395,12 @@ "node": ">=14" } }, + "node_modules/enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", + "license": "MIT" + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -1450,6 +1545,12 @@ "node": ">=8.0.0" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", + "license": "MIT" + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -1489,6 +1590,12 @@ "url": "https://opencollective.com/express" } }, + "node_modules/fn.name": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", + "license": "MIT" + }, "node_modules/foreground-child": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", @@ -1912,6 +2019,18 @@ "devOptional": true, "license": "MIT" }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1972,6 +2091,12 @@ "safe-buffer": "^5.0.1" } }, + "node_modules/kuler": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", + "license": "MIT" + }, "node_modules/lilconfig": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", @@ -2031,6 +2156,23 @@ "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", "license": "MIT" }, + "node_modules/logform": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", + "license": "MIT", + "dependencies": { + "@colors/colors": "1.6.0", + "@types/triple-beam": "^1.3.2", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "safe-stable-stringify": "^2.3.1", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/long": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", @@ -2357,6 +2499,15 @@ "wrappy": "1" } }, + "node_modules/one-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", + "license": "MIT", + "dependencies": { + "fn.name": "1.x.x" + } + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2791,6 +2942,15 @@ ], "license": "MIT" }, + "node_modules/safe-stable-stringify": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -3061,6 +3221,15 @@ "node": ">= 0.6" } }, + "node_modules/stack-trace": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", + "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -3157,6 +3326,12 @@ "node": ">=6" } }, + "node_modules/text-hex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", + "license": "MIT" + }, "node_modules/tinyexec": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.0.2.tgz", @@ -3207,6 +3382,15 @@ "tree-kill": "cli.js" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "license": "MIT", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", @@ -3422,6 +3606,42 @@ "node": ">= 8" } }, + "node_modules/winston": { + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", + "integrity": "sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA==", + "license": "MIT", + "dependencies": { + "@colors/colors": "^1.6.0", + "@dabh/diagnostics": "^2.0.8", + "async": "^3.2.3", + "is-stream": "^2.0.0", + "logform": "^2.7.0", + "one-time": "^1.0.0", + "readable-stream": "^3.4.0", + "safe-stable-stringify": "^2.3.1", + "stack-trace": "0.0.x", + "triple-beam": "^1.3.0", + "winston-transport": "^4.9.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, + "node_modules/winston-transport": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", + "license": "MIT", + "dependencies": { + "logform": "^2.7.0", + "readable-stream": "^3.6.2", + "triple-beam": "^1.3.0" + }, + "engines": { + "node": ">= 12.0.0" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/server/package.json b/server/package.json index c600a41..ca9c69b 100644 --- a/server/package.json +++ b/server/package.json @@ -6,7 +6,7 @@ "scripts": { "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", + "start:test": "cross-env APP_MODE=test DATABASE_URL=file:./test.db DATABASE_URL_TEST=file:./test.db npx prisma db push --accept-data-loss && cross-env APP_MODE=test DATABASE_URL_TEST=file:./test.db 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" @@ -23,6 +23,7 @@ "express": "5.1.0", "jsonwebtoken": "9.0.2", "ts-node-dev": "^2.0.0", + "winston": "^3.19.0", "zod": "^4.1.13" }, "devDependencies": { @@ -38,4 +39,4 @@ "ts-node": "*", "typescript": "*" } -} +} \ No newline at end of file diff --git a/server/prisma/dev.db b/server/prisma/dev.db index a19bd74394fb4972ddcf1c3ca986f2ce68b5e490..3fb4f6cfa7a5b0793436e49864cfb74af4f1bb74 100644 GIT binary patch literal 184320 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%0ArPfUzmnYtsN@)qmmYqbehl9%@V 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 delta 891 zcmcJNPe@cz6vpp;^Lje-?!6~LX%NLfjOCycZ+cIg$xsPQ7lNpaD+irFG(?NgA_|i+ zVuo3?c=n=4ifJ%l5INL?1{dKXf?5pKY9?AFA}wN|oe(bUPCZ*hi#BcU;^Um}{=Re0 z!kWCWAnElI8b%1Y7n^$pH2iEj3oZ=%TtRNw&$DSffUWVGd1k)9j5`Lne5}^R-v&8_ z$R5eEUOFUikU84K5|E~^AV&~rbVg3eMN(jO5GG!>Ntb9DN+2_xjIkZd-#;Lm8wc2D zJ@04{s{`@wpm4$wGCz#qHW%gY7%~VlR?GHRwzziB$n@QmFq9CKY-v~IFmRrQ;wsj!XIMeLU&xKZJxdgh3;F948AhL3D>NJM9V)R#db#s8ygcI>*=L7(MV1m!GgK!7us#gWdzGM(z>yny!cnjmMza+T_g@# zM$p5q(K4OoJyEJ$7hR#yAi_LBV@&m{r?jqsFB<8N_%v13e1W(>?o+jZ(iM%I)`Ia1 z#%Pnr&{u1y)_qb@{T+&OMp4GC-IZp6I3SHUdYVu9a7eNC3jIGBr*cUmQXN5@yAYn^ajKt@aKk^%;Z=KZwxDng|w_Vq2 zxDU!)%vC&dwz!$k0UmAswKT$$l*uEKrt_pkw;{u#kYHcnI6S8H>>SIo*CbE3=p<{U z4?%)K@}2fD%x=S5zO?fspFWF24)fEL;N?681O@w-k7i*6tG_Sfznt%jX)GSCt#%d> a1lcToLUu``JmGraEONFjXTEp?d!--M(F*(k diff --git a/server/prisma/test.db b/server/prisma/test.db index 71f3b227c1698afaea8960bea7ec3f3dc92461f1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 180224 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

=lg)ZWauC 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 diff --git a/server/promote_admin.ts b/server/promote_admin.ts index b4ed607..a846880 100644 --- a/server/promote_admin.ts +++ b/server/promote_admin.ts @@ -5,8 +5,21 @@ import prisma from './src/lib/prisma'; try { const email = process.argv[2]; if (!email) { - console.error('Please provide email'); - process.exit(1); + console.error('Please provide email'); + process.exit(1); + } + + let user; + for (let i = 0; i < 5; i++) { + user = await prisma.user.findUnique({ where: { email } }); + if (user) break; + console.log(`User ${email} not found, retrying (${i + 1}/5)...`); + await new Promise(resolve => setTimeout(resolve, 1000)); + } + + if (!user) { + console.error(`User ${email} not found after retries. CWD: ${process.cwd()} DB: ${process.env.DATABASE_URL}`); + process.exit(1); } await prisma.user.update({ diff --git a/server/route_hit.json b/server/route_hit.json new file mode 100644 index 0000000..447ef3b --- /dev/null +++ b/server/route_hit.json @@ -0,0 +1,4 @@ +{ + "email": "invalid@user.com", + "password": "wrongpassword" +} \ No newline at end of file diff --git a/server/src/controllers/ai.controller.ts b/server/src/controllers/ai.controller.ts new file mode 100644 index 0000000..fb31b5b --- /dev/null +++ b/server/src/controllers/ai.controller.ts @@ -0,0 +1,50 @@ +import { Request, Response } from 'express'; +import { AIService } from '../services/ai.service'; +import { sendSuccess, sendError } from '../utils/apiResponse'; +import logger from '../utils/logger'; + +export class AIController { + static async chat(req: any, res: Response) { + try { + const { systemInstruction, userMessage, sessionId } = req.body; + + if (!userMessage) { + return sendError(res, 'User message is required', 400); + } + + const userId = req.user.userId; + const result = await AIService.chat(userId, systemInstruction, userMessage, sessionId); + return sendSuccess(res, result); + + } catch (error: any) { + console.error('AI Chat Error:', error); // Keep console log for now as AI errors can be tricky + + let errorMessage = 'Failed to generate AI response'; + if (error.message?.includes('API key') || error.message === 'AI service not configured') { + errorMessage = 'AI service authentication failed'; + if (error.message === 'AI service not configured') { + return sendError(res, errorMessage, 500); + } + } else if (error.message?.includes('quota')) { + errorMessage = 'AI service quota exceeded'; + } else if (error.message) { + errorMessage = error.message; + } + + logger.error('Error in chat', { error: errorMessage }); + return sendError(res, errorMessage, 500); + } + } + + static async clearChat(req: any, res: Response) { + try { + const userId = req.user.userId; + const sessionId = req.params.sessionId || 'default'; + await AIService.clearChat(userId, sessionId); + return sendSuccess(res, null); + } catch (error) { + logger.error('Error in clearChat', { error }); + return sendError(res, 'Failed to clear chat session', 500); + } + } +} diff --git a/server/src/controllers/auth.controller.ts b/server/src/controllers/auth.controller.ts new file mode 100644 index 0000000..fbd4bce --- /dev/null +++ b/server/src/controllers/auth.controller.ts @@ -0,0 +1,149 @@ +import { Request, Response } from 'express'; +import { AuthService } from '../services/auth.service'; +import { sendSuccess, sendError } from '../utils/apiResponse'; +import logger from '../utils/logger'; + +export class AuthController { + static async getCurrentUser(req: any, res: Response) { + try { + const userId = req.user.userId; + const user = await AuthService.getUser(userId); + if (!user) { + return sendError(res, 'User not found', 404); + } + return sendSuccess(res, { user }); + } catch (error) { + logger.error('Error in getCurrentUser', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async login(req: any, res: Response) { + try { + const { email, password } = req.body; + const result = await AuthService.login(email, password); + return sendSuccess(res, result); + } catch (error: any) { + if (error.message === 'Invalid credentials') { + return sendError(res, error.message, 400); + } + if (error.message === 'Account is blocked') { + return sendError(res, error.message, 403); + } + logger.error('Error in login', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async register(req: any, res: Response) { + try { + const { email, password } = req.body; + const result = await AuthService.register(email, password); + return sendSuccess(res, result); + } catch (error: any) { + if (error.message === 'User already exists') { + return sendError(res, error.message, 400); + } + logger.error('Error in register', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async changePassword(req: any, res: Response) { + try { + const { userId, newPassword } = req.body; + const tokenUserId = req.user.userId; + + if (tokenUserId !== userId) { + return sendError(res, 'Forbidden', 403); + } + + await AuthService.changePassword(userId, newPassword); + return sendSuccess(res, null); + } catch (error) { + logger.error('Error in changePassword', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async updateProfile(req: any, res: Response) { + try { + const userId = req.user.userId; + await AuthService.updateProfile(userId, req.body); + return sendSuccess(res, null); + } catch (error) { + logger.error('Error in updateProfile', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async getAllUsers(req: any, res: Response) { + try { + if (req.user.role !== 'ADMIN') { + return sendError(res, 'Admin access required', 403); + } + const users = await AuthService.getAllUsers(); + return sendSuccess(res, { users }); + } catch (error) { + logger.error('Error in getAllUsers', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async deleteUser(req: any, res: Response) { + try { + if (req.user.role !== 'ADMIN') { + return sendError(res, 'Admin access required', 403); + } + const { id } = req.params; + const adminId = req.user.userId; + await AuthService.deleteUser(adminId, id); + return sendSuccess(res, null); + } catch (error: any) { + if (error.message === 'Cannot delete yourself') { + return sendError(res, error.message, 400); + } + logger.error('Error in deleteUser', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async toggleBlockUser(req: any, res: Response) { + try { + if (req.user.role !== 'ADMIN') { + return sendError(res, 'Admin access required', 403); + } + const { id } = req.params; + const { block } = req.body; + const adminId = req.user.userId; + + await AuthService.blockUser(adminId, id, block); + return sendSuccess(res, null); + } catch (error: any) { + if (error.message === 'Cannot block yourself') { + return sendError(res, error.message, 400); + } + logger.error('Error in toggleBlockUser', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async resetUserPassword(req: any, res: Response) { + try { + if (req.user.role !== 'ADMIN') { + return sendError(res, 'Admin access required', 403); + } + const { id } = req.params; + const { newPassword } = req.body; + + await AuthService.resetUserPassword(id, newPassword); + return sendSuccess(res, null); + } catch (error: any) { + if (error.message === 'Password too short') { + return sendError(res, error.message, 400); + } + logger.error('Error in resetUserPassword', { error }); + return sendError(res, 'Server error', 500); + } + } +} diff --git a/server/src/controllers/exercise.controller.ts b/server/src/controllers/exercise.controller.ts new file mode 100644 index 0000000..28c4481 --- /dev/null +++ b/server/src/controllers/exercise.controller.ts @@ -0,0 +1,40 @@ +import { Request, Response } from 'express'; +import { ExerciseService } from '../services/exercise.service'; +import { sendSuccess, sendError } from '../utils/apiResponse'; +import logger from '../utils/logger'; + +export class ExerciseController { + static async getAllExercises(req: any, res: Response) { + try { + const userId = req.user.userId; + const exercises = await ExerciseService.getAllExercises(userId); + return sendSuccess(res, exercises); + } catch (error) { + logger.error('Error in getAllExercises', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async getLastSet(req: any, res: Response) { + try { + const userId = req.user.userId; + const exerciseId = req.params.id; + const lastSet = await ExerciseService.getLastSet(userId, exerciseId); + return sendSuccess(res, { set: lastSet }); + } catch (error) { + logger.error('Error in getLastSet', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async saveExercise(req: any, res: Response) { + try { + const userId = req.user.userId; + const exercise = await ExerciseService.saveExercise(userId, req.body); + return sendSuccess(res, exercise); + } catch (error) { + logger.error('Error in saveExercise', { error }); + return sendError(res, 'Server error', 500); + } + } +} diff --git a/server/src/controllers/plan.controller.ts b/server/src/controllers/plan.controller.ts new file mode 100644 index 0000000..cccbd98 --- /dev/null +++ b/server/src/controllers/plan.controller.ts @@ -0,0 +1,40 @@ +import { Request, Response } from 'express'; +import { PlanService } from '../services/plan.service'; +import { sendSuccess, sendError } from '../utils/apiResponse'; +import logger from '../utils/logger'; + +export class PlanController { + static async getPlans(req: any, res: Response) { + try { + const userId = req.user.userId; + const plans = await PlanService.getPlans(userId); + return sendSuccess(res, plans); + } catch (error) { + logger.error('Error in getPlans', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async savePlan(req: any, res: Response) { + try { + const userId = req.user.userId; + const plan = await PlanService.savePlan(userId, req.body); + return sendSuccess(res, plan); + } catch (error) { + logger.error('Error in savePlan', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async deletePlan(req: any, res: Response) { + try { + const userId = req.user.userId; + const { id } = req.params; + await PlanService.deletePlan(userId, id); + return sendSuccess(res, null); + } catch (error) { + logger.error('Error in deletePlan', { error }); + return sendError(res, 'Server error', 500); + } + } +} diff --git a/server/src/controllers/session.controller.ts b/server/src/controllers/session.controller.ts new file mode 100644 index 0000000..69aa208 --- /dev/null +++ b/server/src/controllers/session.controller.ts @@ -0,0 +1,160 @@ +import { Request, Response } from 'express'; +import { SessionService } from '../services/session.service'; +import { sendSuccess, sendError } from '../utils/apiResponse'; +import logger from '../utils/logger'; + +export class SessionController { + static async getAllSessions(req: any, res: Response) { + try { + const userId = req.user.userId; + const sessions = await SessionService.getAllSessions(userId); + return sendSuccess(res, sessions); + } catch (error) { + logger.error('Error in getAllSessions', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async saveSession(req: any, res: Response) { + try { + const userId = req.user.userId; + const session = await SessionService.saveSession(userId, req.body); + return sendSuccess(res, session); + } catch (error: any) { + if (error.message === 'An active session already exists') { + return sendError(res, error.message, 400); + } + logger.error('Error in saveSession', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async getActiveSession(req: any, res: Response) { + try { + const userId = req.user.userId; + const session = await SessionService.getActiveSession(userId); + return sendSuccess(res, { session }); + } catch (error) { + logger.error('Error in getActiveSession', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async updateActiveSession(req: any, res: Response) { + try { + const userId = req.user.userId; + const session = await SessionService.updateActiveSession(userId, req.body); + return sendSuccess(res, { session }); + } catch (error: any) { + if (error.message === 'Session not found') { + return sendError(res, error.message, 404); + } + logger.error('Error in updateActiveSession', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async getTodayQuickLog(req: any, res: Response) { + try { + const userId = req.user.userId; + const session = await SessionService.getTodayQuickLog(userId); + return sendSuccess(res, { session }); + } catch (error) { + logger.error('Error in getTodayQuickLog', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async logSetToQuickLog(req: any, res: Response) { + try { + const userId = req.user.userId; + const set = await SessionService.logSetToQuickLog(userId, req.body); + return sendSuccess(res, { set }); + } catch (error) { + logger.error('Error in logSetToQuickLog', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async logSetToActiveSession(req: any, res: Response) { + try { + const userId = req.user.userId; + const result = await SessionService.logSetToActiveSession(userId, req.body); + return sendSuccess(res, result); + } catch (error: any) { + if (error.message === 'No active session found') { + return sendError(res, error.message, 404); + } + logger.error('Error in logSetToActiveSession', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async updateSet(req: any, res: Response) { + try { + const userId = req.user.userId; + const { setId } = req.params; + const updatedSet = await SessionService.updateSet(userId, setId, req.body); + return sendSuccess(res, { updatedSet }); + } catch (error: any) { + if (error.message === 'No active session found') { + return sendError(res, error.message, 404); + } + logger.error('Error in updateSet', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async patchSet(req: any, res: Response) { + try { + const userId = req.user.userId; + const { setId } = req.params; + const updatedSet = await SessionService.patchSet(userId, setId, req.body); + return sendSuccess(res, { updatedSet }); + } catch (error: any) { + if (error.message === 'No active session found') { + return sendError(res, error.message, 404); + } + logger.error('Error in patchSet', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async deleteSet(req: any, res: Response) { + try { + const userId = req.user.userId; + const { setId } = req.params; + await SessionService.deleteSet(userId, setId); + return sendSuccess(res, null); + } catch (error: any) { + if (error.message === 'No active session found') { + return sendError(res, error.message, 404); + } + logger.error('Error in deleteSet', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async deleteActiveSession(req: any, res: Response) { + try { + const userId = req.user.userId; + await SessionService.deleteActiveSession(userId); + return sendSuccess(res, null); + } catch (error) { + logger.error('Error in deleteActiveSession', { error }); + return sendError(res, 'Server error', 500); + } + } + + static async deleteSession(req: any, res: Response) { + try { + const userId = req.user.userId; + const { id } = req.params; + await SessionService.deleteSession(userId, id); + return sendSuccess(res, null); + } catch (error) { + logger.error('Error in deleteSession', { error }); + return sendError(res, 'Server error', 500); + } + } +} diff --git a/server/src/controllers/weight.controller.ts b/server/src/controllers/weight.controller.ts new file mode 100644 index 0000000..0a80289 --- /dev/null +++ b/server/src/controllers/weight.controller.ts @@ -0,0 +1,34 @@ +import { Request, Response } from 'express'; +import { WeightService } from '../services/weight.service'; +import { sendSuccess, sendError } from '../utils/apiResponse'; +import logger from '../utils/logger'; + +export class WeightController { + static async getWeightHistory(req: any, res: Response) { + try { + const userId = req.user.userId; + const weights = await WeightService.getWeightHistory(userId); + return sendSuccess(res, weights); + } catch (error) { + logger.error('Error in getWeightHistory', { error }); + return sendError(res, 'Failed to fetch weight history', 500); + } + } + + static async logWeight(req: any, res: Response) { + try { + const userId = req.user.userId; + const { weight, dateStr } = req.body; + + if (!weight || !dateStr) { + return sendError(res, 'Weight and dateStr are required', 400); + } + + const record = await WeightService.logWeight(userId, parseFloat(weight), dateStr); + return sendSuccess(res, record); + } catch (error) { + logger.error('Error in logWeight', { error }); + return sendError(res, 'Failed to log weight', 500); + } + } +} diff --git a/server/src/middleware/auth.ts b/server/src/middleware/auth.ts index 3ce0e61..ecfe36e 100644 --- a/server/src/middleware/auth.ts +++ b/server/src/middleware/auth.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from 'express'; import jwt from 'jsonwebtoken'; +import { sendError } from '../utils/apiResponse'; const JWT_SECRET = process.env.JWT_SECRET || 'secret'; @@ -8,12 +9,12 @@ export const authenticateToken = (req: Request, res: Response, next: NextFunctio const token = authHeader && authHeader.split(' ')[1]; if (!token) { - return res.sendStatus(401); + return sendError(res, 'Unauthorized', 401); } jwt.verify(token, JWT_SECRET, (err: any, user: any) => { if (err) { - return res.sendStatus(403); + return sendError(res, 'Forbidden', 403); } (req as any).user = user; next(); diff --git a/server/src/middleware/validate.ts b/server/src/middleware/validate.ts index 26609be..c30d41f 100644 --- a/server/src/middleware/validate.ts +++ b/server/src/middleware/validate.ts @@ -1,5 +1,6 @@ import { Request, Response, NextFunction } from 'express'; import { ZodSchema } from 'zod'; +import { sendError } from '../utils/apiResponse'; export const validate = (schema: ZodSchema) => async (req: Request, res: Response, next: NextFunction) => { try { @@ -10,6 +11,6 @@ export const validate = (schema: ZodSchema) => async (req: Request, res: Re }); return next(); } catch (error) { - return res.status(400).json(error); + return sendError(res, `Validation Error: ${JSON.stringify(error)}`, 400); } }; diff --git a/server/src/routes/ai.ts b/server/src/routes/ai.ts index dda76f4..55dbc51 100644 --- a/server/src/routes/ai.ts +++ b/server/src/routes/ai.ts @@ -1,116 +1,12 @@ -import express, { Request, Response, NextFunction } from 'express'; -import { GoogleGenerativeAI } from '@google/generative-ai'; -import jwt from 'jsonwebtoken'; - -interface JwtPayload { - userId: string; - role: string; -} - -interface AuthRequest extends Request { - user?: JwtPayload; -} +import express from 'express'; +import { AIController } from '../controllers/ai.controller'; +import { authenticateToken } from '../middleware/auth'; const router = express.Router(); -const JWT_SECRET = process.env.JWT_SECRET || 'secret'; -const API_KEY = process.env.GEMINI_API_KEY || process.env.API_KEY; -const MODEL_ID = 'gemini-flash-lite-latest'; -// Store chat sessions in memory (in production, use Redis or similar) -const chatSessions = new Map(); +router.use(authenticateToken); -const authenticate = (req: AuthRequest, res: Response, next: NextFunction) => { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - try { - const decoded = jwt.verify(token, JWT_SECRET) as JwtPayload; - req.user = decoded; - next(); - } catch { - res.status(401).json({ error: 'Invalid token' }); - } -}; - -router.use(authenticate); - -router.post('/chat', async (req: AuthRequest, res: Response) => { - try { - const { systemInstruction, userMessage, sessionId } = req.body; - - if (!API_KEY) { - return res.status(500).json({ error: 'AI service not configured' }); - } - - if (!userMessage) { - return res.status(400).json({ error: 'User message is required' }); - } - - if (!req.user) { - return res.status(401).json({ error: 'Unauthorized' }); - } - - const ai = new GoogleGenerativeAI(API_KEY); - const userId = req.user.userId; - const chatKey = `${userId}-${sessionId || 'default'}`; - - // Get or create chat session - let chat = chatSessions.get(chatKey); - - if (!chat || systemInstruction) { - // Create new chat with system instruction - const model = ai.getGenerativeModel({ - model: MODEL_ID, - systemInstruction: systemInstruction || 'You are a helpful fitness coach.' - }); - - chat = model.startChat({ - history: [] - }); - - chatSessions.set(chatKey, chat); - } - - // Send message and get response - const result = await chat.sendMessage(userMessage); - const response = result.response.text(); - - res.json({ response }); - } catch (error: any) { - console.error('AI Chat Error:', error); - - // Provide more detailed error messages - let errorMessage = 'Failed to generate AI response'; - if (error.message?.includes('API key')) { - errorMessage = 'AI service authentication failed'; - } else if (error.message?.includes('quota')) { - errorMessage = 'AI service quota exceeded'; - } else if (error.message) { - errorMessage = error.message; - } - - res.status(500).json({ error: errorMessage }); - } -}); - -// Clear chat session endpoint -router.delete('/chat/:sessionId', async (req: AuthRequest, res: Response) => { - try { - if (!req.user) { - return res.status(401).json({ error: 'Unauthorized' }); - } - - const userId = req.user.userId; - const sessionId = req.params.sessionId || 'default'; - const chatKey = `${userId}-${sessionId}`; - - chatSessions.delete(chatKey); - res.json({ success: true }); - } catch (error) { - console.error('Clear chat error:', error); - res.status(500).json({ error: 'Failed to clear chat session' }); - } -}); +router.post('/chat', AIController.chat); +router.delete('/chat/:sessionId', AIController.clearChat); export default router; - diff --git a/server/src/routes/auth.ts b/server/src/routes/auth.ts index 3d952ff..e538259 100644 --- a/server/src/routes/auth.ts +++ b/server/src/routes/auth.ts @@ -1,300 +1,26 @@ import express from 'express'; -import jwt from 'jsonwebtoken'; -import bcrypt from 'bcryptjs'; -import prisma from '../lib/prisma'; +import { AuthController } from '../controllers/auth.controller'; import { validate } from '../middleware/validate'; +import { authenticateToken } from '../middleware/auth'; import { loginSchema, registerSchema, changePasswordSchema, updateProfileSchema } from '../schemas/auth'; const router = express.Router(); -const JWT_SECRET = process.env.JWT_SECRET || 'secret'; -// Get Current User -router.get('/me', async (req, res) => { - try { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); +// Public routes +router.post('/login', validate(loginSchema), AuthController.login); +router.post('/register', validate(registerSchema), AuthController.register); - const decoded = jwt.verify(token, JWT_SECRET) as any; - const user = await prisma.user.findUnique({ - where: { id: decoded.userId }, - include: { profile: true } - }); +// Protected routes +router.use(authenticateToken); // Standard middleware now - if (!user) { - return res.status(404).json({ error: 'User not found' }); - } +router.get('/me', AuthController.getCurrentUser); +router.post('/change-password', validate(changePasswordSchema), AuthController.changePassword); +router.patch('/profile', validate(updateProfileSchema), AuthController.updateProfile); - const { password: _, ...userSafe } = user; - res.json({ success: true, user: userSafe }); - } catch (error) { - res.status(401).json({ error: 'Invalid token' }); - } -}); - -// Login -router.post('/login', validate(loginSchema), async (req, res) => { - try { - const { email, password } = req.body; - - const user = await prisma.user.findUnique({ - where: { email }, - include: { profile: true } - }); - - if (!user) { - return res.status(400).json({ error: 'Invalid credentials' }); - } - - if (user.isBlocked) { - return res.status(403).json({ error: 'Account is blocked' }); - } - - const isMatch = await bcrypt.compare(password, user.password); - if (!isMatch) { - return res.status(400).json({ error: 'Invalid credentials' }); - } - - const token = jwt.sign({ userId: user.id, role: user.role }, JWT_SECRET); - const { password: _, ...userSafe } = user; - - res.json({ success: true, user: userSafe, token }); - } catch (error) { - console.error('Login error:', error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Register -router.post('/register', validate(registerSchema), async (req, res) => { - try { - const { email, password } = req.body; - - // Check if user already exists - const existingUser = await prisma.user.findUnique({ where: { email } }); - if (existingUser) { - return res.status(400).json({ error: 'User already exists' }); - } - - const hashedPassword = await bcrypt.hash(password, 10); - - const user = await prisma.user.create({ - data: { - email, - password: hashedPassword, - role: 'USER', - profile: { - create: { - weight: 70 - } - } - }, - include: { profile: true } - }); - - const token = jwt.sign({ userId: user.id, role: user.role }, JWT_SECRET); - const { password: _, ...userSafe } = user; - - res.json({ success: true, user: userSafe, token }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Change Password -router.post('/change-password', validate(changePasswordSchema), async (req, res) => { - - try { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - const { userId, newPassword } = req.body; - - // Verify token - const decoded = jwt.verify(token, JWT_SECRET) as any; - if (decoded.userId !== userId) { - return res.status(403).json({ error: 'Forbidden' }); - } - - const hashed = await bcrypt.hash(newPassword, 10); - - await prisma.user.update({ - where: { id: userId }, - data: { - password: hashed, - isFirstLogin: false - } - }); - - res.json({ success: true }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Update Profile -router.patch('/profile', validate(updateProfileSchema), async (req, res) => { - try { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - // const { userId, profile } = req.body; - - - // Convert birthDate from timestamp to Date object if needed - if (req.body.birthDate) { - // Handle both number (timestamp) and string (ISO) - req.body.birthDate = new Date(req.body.birthDate); - } - - // Verify token - const decoded = jwt.verify(token, JWT_SECRET) as any; - const userId = decoded.userId; - - // Update or create profile - await prisma.userProfile.upsert({ - where: { userId: userId }, - update: { - ...req.body - }, - create: { - userId: userId, - ...req.body - } - }); - - res.json({ success: true }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - - -// Admin: Get All Users -router.get('/users', async (req, res) => { - try { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - const decoded = jwt.verify(token, JWT_SECRET) as any; - if (decoded.role !== 'ADMIN') { - return res.status(403).json({ error: 'Admin access required' }); - } - - const users = await prisma.user.findMany({ - select: { - id: true, - email: true, - role: true, - isBlocked: true, - isFirstLogin: true, - profile: true - }, - orderBy: { - email: 'asc' - } - }); - - res.json({ success: true, users }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Admin: Delete User -router.delete('/users/:id', async (req, res) => { - try { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - const decoded = jwt.verify(token, JWT_SECRET) as any; - if (decoded.role !== 'ADMIN') { - return res.status(403).json({ error: 'Admin access required' }); - } - - const { id } = req.params; - - // Prevent deleting self - if (id === decoded.userId) { - return res.status(400).json({ error: 'Cannot delete yourself' }); - } - - await prisma.user.delete({ where: { id } }); - - res.json({ success: true }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Admin: Toggle Block User -router.patch('/users/:id/block', async (req, res) => { - try { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - const decoded = jwt.verify(token, JWT_SECRET) as any; - if (decoded.role !== 'ADMIN') { - return res.status(403).json({ error: 'Admin access required' }); - } - - const { id } = req.params; - const { block } = req.body; - - // Prevent blocking self - if (id === decoded.userId) { - return res.status(400).json({ error: 'Cannot block yourself' }); - } - - await prisma.user.update({ - where: { id }, - data: { isBlocked: block } - }); - - res.json({ success: true }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Admin: Reset User Password -router.post('/users/:id/reset-password', async (req, res) => { - try { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - const decoded = jwt.verify(token, JWT_SECRET) as any; - if (decoded.role !== 'ADMIN') { - return res.status(403).json({ error: 'Admin access required' }); - } - - const { id } = req.params; - const { newPassword } = req.body; - - if (!newPassword || newPassword.length < 4) { - return res.status(400).json({ error: 'Password too short' }); - } - - const hashed = await bcrypt.hash(newPassword, 10); - - await prisma.user.update({ - where: { id }, - data: { - password: hashed, - isFirstLogin: true // Force them to change it on login - } - }); - - res.json({ success: true }); - } catch (error) { - console.error('Reset password error:', error); - res.status(500).json({ error: 'Server error' }); - } -}); +// Admin routes +router.get('/users', AuthController.getAllUsers); +router.delete('/users/:id', AuthController.deleteUser); +router.patch('/users/:id/block', AuthController.toggleBlockUser); +router.post('/users/:id/reset-password', AuthController.resetUserPassword); export default router; diff --git a/server/src/routes/exercises.ts b/server/src/routes/exercises.ts index c697122..943220b 100644 --- a/server/src/routes/exercises.ts +++ b/server/src/routes/exercises.ts @@ -1,121 +1,13 @@ import express from 'express'; -import jwt from 'jsonwebtoken'; -import prisma from '../lib/prisma'; +import { ExerciseController } from '../controllers/exercise.controller'; +import { authenticateToken } from '../middleware/auth'; const router = express.Router(); -const JWT_SECRET = process.env.JWT_SECRET || 'secret'; -// Middleware to check auth -// Middleware to check auth -const authenticate = (req: any, res: any, next: any) => { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); +router.use(authenticateToken); - try { - const decoded = jwt.verify(token, JWT_SECRET) as any; - req.user = decoded; - next(); - } catch { - res.status(401).json({ error: 'Invalid token' }); - } -}; - -router.use(authenticate); - -// Get all exercises (system default + user custom) -router.get('/', async (req: any, res) => { - try { - const userId = req.user.userId; - const exercises = await prisma.exercise.findMany({ - where: { - OR: [ - { userId: null }, // System default - { userId } // User custom - ] - } - }); - - res.json(exercises); - } catch (error) { - res.status(500).json({ error: 'Server error' }); - } -}); - -// Get last set for specific exercise -router.get('/:id/last-set', async (req: any, res) => { - try { - const userId = req.user.userId; - const exerciseId = req.params.id; - - const lastSet = await prisma.workoutSet.findFirst({ - where: { - exerciseId, - session: { userId } // Ensure optimization by filtering sessions of the user - }, - include: { - session: true - }, - orderBy: { - timestamp: 'desc' - } - }); - - res.json({ success: true, set: lastSet }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Create/Update exercise -router.post('/', async (req: any, res) => { - try { - const userId = req.user.userId; - const { id, name, type, bodyWeightPercentage, isArchived, isUnilateral } = req.body; - - const data = { - name, - type, - bodyWeightPercentage: bodyWeightPercentage ? parseFloat(bodyWeightPercentage) : undefined, - isArchived: !!isArchived, - isUnilateral: !!isUnilateral - }; - - // If id exists and belongs to user, update. Else create. - // Note: We can't update system exercises directly. If user edits a system exercise, - // we should probably create a copy or handle it as a user override. - // For simplicity, let's assume we are creating/updating user exercises. - - if (id) { - // Check if it exists and belongs to user - const existing = await prisma.exercise.findUnique({ where: { id } }); - if (existing && existing.userId === userId) { - - const updated = await prisma.exercise.update({ - where: { id }, - data: data - }); - - return res.json(updated); - } - } - - // Create new - const newExercise = await prisma.exercise.create({ - data: { - id: id || undefined, // Use provided ID if available - userId, - name: data.name, - type: data.type, - bodyWeightPercentage: data.bodyWeightPercentage, - isArchived: data.isArchived, - isUnilateral: data.isUnilateral, - } - }); - res.json(newExercise); - } catch (error) { - res.status(500).json({ error: 'Server error' }); - } -}); +router.get('/', ExerciseController.getAllExercises); +router.get('/:id/last-set', ExerciseController.getLastSet); +router.post('/', ExerciseController.saveExercise); export default router; diff --git a/server/src/routes/plans.ts b/server/src/routes/plans.ts index a97bf11..5c26c4e 100644 --- a/server/src/routes/plans.ts +++ b/server/src/routes/plans.ts @@ -1,148 +1,13 @@ import express from 'express'; -import jwt from 'jsonwebtoken'; -import prisma from '../lib/prisma'; +import { PlanController } from '../controllers/plan.controller'; +import { authenticateToken } from '../middleware/auth'; const router = express.Router(); -const JWT_SECRET = process.env.JWT_SECRET || 'secret'; -const authenticate = (req: any, res: any, next: any) => { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); +router.use(authenticateToken); - try { - const decoded = jwt.verify(token, JWT_SECRET) as any; - req.user = decoded; - next(); - } catch { - res.status(401).json({ error: 'Invalid token' }); - } -}; - -router.use(authenticate); - -// Get all plans -router.get('/', async (req: any, res) => { - try { - const userId = req.user.userId; - const plans = await prisma.workoutPlan.findMany({ - where: { userId }, - include: { - planExercises: { - include: { exercise: true }, - orderBy: { order: 'asc' } - } - }, - orderBy: { createdAt: 'desc' } - }); - - const mappedPlans = plans.map((p: any) => ({ - ...p, - steps: p.planExercises.map((pe: any) => ({ - id: pe.id, - exerciseId: pe.exerciseId, - exerciseName: pe.exercise.name, - exerciseType: pe.exercise.type, - isWeighted: pe.isWeighted, - // Add default properties if needed by PlannedSet interface - })) - })); - - res.json(mappedPlans); - } catch (error) { - console.error('Error fetching plans:', error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Save plan -router.post('/', async (req: any, res) => { - try { - const userId = req.user.userId; - const { id, name, description, steps } = req.body; - - // Steps array contains PlannedSet items - // We need to transact: create/update plan, then replace exercises - - await prisma.$transaction(async (tx) => { - // Upsert plan - let plan = await tx.workoutPlan.findUnique({ where: { id } }); - - if (plan) { - await tx.workoutPlan.update({ - where: { id }, - data: { name, description } - }); - // Delete existing plan exercises - await tx.planExercise.deleteMany({ where: { planId: id } }); - } else { - await tx.workoutPlan.create({ - data: { - id, - userId, - name, - description - } - }); - } - - // Create new plan exercises - if (steps && steps.length > 0) { - await tx.planExercise.createMany({ - data: steps.map((step: any, index: number) => ({ - planId: id, - exerciseId: step.exerciseId, - order: index, - isWeighted: step.isWeighted || false - })) - }); - } - }); - - // Return the updated plan structure - // Since we just saved it, we can mirror back what was sent or re-fetch. - // Re-fetching ensures DB state consistency. - const savedPlan = await prisma.workoutPlan.findUnique({ - where: { id }, - include: { - planExercises: { - include: { exercise: true }, - orderBy: { order: 'asc' } - } - } - }); - - if (!savedPlan) throw new Error("Plan failed to save"); - - const mappedPlan = { - ...savedPlan, - steps: savedPlan.planExercises.map((pe: any) => ({ - id: pe.id, - exerciseId: pe.exerciseId, - exerciseName: pe.exercise.name, - exerciseType: pe.exercise.type, - isWeighted: pe.isWeighted - })) - }; - - res.json(mappedPlan); - } catch (error) { - console.error('Error saving plan:', error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Delete plan -router.delete('/:id', async (req: any, res) => { - try { - const userId = req.user.userId; - const { id } = req.params; - await prisma.workoutPlan.delete({ - where: { id, userId } - }); - res.json({ success: true }); - } catch (error) { - res.status(500).json({ error: 'Server error' }); - } -}); +router.get('/', PlanController.getPlans); +router.post('/', PlanController.savePlan); +router.delete('/:id', PlanController.deletePlan); export default router; diff --git a/server/src/routes/sessions.ts b/server/src/routes/sessions.ts index 4bf53ca..41bba31 100644 --- a/server/src/routes/sessions.ts +++ b/server/src/routes/sessions.ts @@ -1,587 +1,24 @@ import express from 'express'; -import jwt from 'jsonwebtoken'; -import prisma from '../lib/prisma'; +import { SessionController } from '../controllers/session.controller'; import { validate } from '../middleware/validate'; +import { authenticateToken } from '../middleware/auth'; import { sessionSchema, logSetSchema, updateSetSchema } from '../schemas/sessions'; const router = express.Router(); -const JWT_SECRET = process.env.JWT_SECRET || 'secret'; -const authenticate = (req: any, res: any, next: any) => { - const token = req.headers.authorization?.split(' ')[1]; - if (!token) return res.status(401).json({ error: 'Unauthorized' }); - - try { - const decoded = jwt.verify(token, JWT_SECRET) as any; - req.user = decoded; - next(); - } catch { - res.status(401).json({ error: 'Invalid token' }); - } -}; - -router.use(authenticate); - -// Get all sessions -router.get('/', async (req: any, res) => { - try { - const userId = req.user.userId; - const sessions = await prisma.workoutSession.findMany({ - where: { - userId, - OR: [ - { endTime: { not: null } }, - { type: 'QUICK_LOG' } - ] - }, - include: { sets: { include: { exercise: true } } }, - orderBy: { startTime: 'desc' } - }); - - // Map exerciseName and type onto each set for frontend convenience - const mappedSessions = sessions.map(session => ({ - ...session, - sets: session.sets.map(set => ({ - ...set, - exerciseName: set.exercise.name, - type: set.exercise.type - })) - })); - - res.json(mappedSessions); - } catch (error) { - res.status(500).json({ error: 'Server error' }); - } -}); - -// Save session (create or update) -router.post('/', validate(sessionSchema), async (req: any, res) => { - try { - const userId = req.user.userId; - const { id, startTime, endTime, userBodyWeight, note, planId, planName, sets } = req.body; - - // Convert timestamps to Date objects if they are numbers - const start = new Date(startTime); - const end = endTime ? new Date(endTime) : null; - const weight = userBodyWeight ? parseFloat(userBodyWeight) : null; - - // Check if session exists - const existing = await prisma.workoutSession.findUnique({ where: { id } }); - - if (existing) { - // Update - // First delete existing sets to replace them (simplest strategy for now) - await prisma.workoutSet.deleteMany({ where: { sessionId: id } }); - - const updated = await prisma.workoutSession.update({ - where: { id }, - data: { - startTime: start, - endTime: end, - userBodyWeight: weight, - note, - planId, - planName, - sets: { - create: sets.map((s: any, idx: number) => ({ - exerciseId: s.exerciseId, - order: idx, - weight: s.weight, - reps: s.reps, - distanceMeters: s.distanceMeters, - durationSeconds: s.durationSeconds, - completed: s.completed !== undefined ? s.completed : true - })) - } - }, - include: { sets: true } - }); - return res.json(updated); - } else { - // Create - // If creating a new active session (endTime is null), check if one already exists - if (!end) { - const active = await prisma.workoutSession.findFirst({ - where: { - userId, - endTime: null, - type: 'STANDARD' // Only check for standard sessions, not Quick Log - } - }); - if (active) { - return res.status(400).json({ error: 'An active session already exists' }); - } - } - - const created = await prisma.workoutSession.create({ - data: { - id, // Use provided ID or let DB gen? Frontend usually generates UUIDs. - userId, - startTime: start, - endTime: end, - userBodyWeight: weight, - note, - planId, - planName, - sets: { - create: sets.map((s: any, idx: number) => ({ - exerciseId: s.exerciseId, - order: idx, - weight: s.weight, - reps: s.reps, - distanceMeters: s.distanceMeters, - durationSeconds: s.durationSeconds, - completed: s.completed !== undefined ? s.completed : true - })) - } - }, - include: { sets: true } - }); - - // Update user profile weight if session has weight and is finished - if (weight && end) { - await prisma.userProfile.upsert({ - where: { userId }, - create: { userId, weight }, - update: { weight } - }); - } - - return res.json(created); - } - - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Get active session (session without endTime) -router.get('/active', async (req: any, res) => { - try { - const userId = req.user.userId; - const activeSession = await prisma.workoutSession.findFirst({ - where: { - userId, - endTime: null, - type: 'STANDARD' - }, - include: { sets: { include: { exercise: true }, orderBy: { order: 'asc' } } } - }); - - if (!activeSession) { - return res.json({ success: true, session: null }); - } - - res.json({ success: true, session: activeSession }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Update active session (for real-time set updates) -router.put('/active', validate(sessionSchema), async (req: any, res) => { - try { - const userId = req.user.userId; - const { id, startTime, endTime, userBodyWeight, note, planId, planName, sets } = req.body; - - // Convert timestamps to Date objects if they are numbers - const start = new Date(startTime); - const end = endTime ? new Date(endTime) : null; - const weight = userBodyWeight ? parseFloat(userBodyWeight) : null; - - // Check if session exists and belongs to user - const existing = await prisma.workoutSession.findFirst({ - where: { id, userId } - }); - - if (!existing) { - return res.status(404).json({ error: 'Session not found' }); - } - - // Delete existing sets to replace them - await prisma.workoutSet.deleteMany({ where: { sessionId: id } }); - - const updated = await prisma.workoutSession.update({ - where: { id }, - data: { - startTime: start, - endTime: end, - userBodyWeight: weight, - note, - planId, - planName, - sets: { - create: sets.map((s: any, idx: number) => ({ - exerciseId: s.exerciseId, - order: idx, - weight: s.weight, - reps: s.reps, - distanceMeters: s.distanceMeters, - durationSeconds: s.durationSeconds, - completed: s.completed !== undefined ? s.completed : true - })) - } - }, - include: { sets: { include: { exercise: true } } } - }); - - // Update user profile weight if session has weight and is finished - if (weight && end) { - await prisma.userProfile.upsert({ - where: { userId }, - create: { userId, weight }, - update: { weight } - }); - } - - res.json({ success: true, session: updated }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Get today's quick log session -router.get('/quick-log', async (req: any, res) => { - try { - const userId = req.user.userId; - const startOfDay = new Date(); - startOfDay.setHours(0, 0, 0, 0); - const endOfDay = new Date(); - endOfDay.setHours(23, 59, 59, 999); - - const session = await prisma.workoutSession.findFirst({ - where: { - userId, - type: 'QUICK_LOG', - startTime: { - gte: startOfDay, - lte: endOfDay - } - }, - include: { sets: { include: { exercise: true }, orderBy: { timestamp: 'desc' } } } - }); - - if (!session) { - return res.json({ success: true, session: null }); - } - - // Map exerciseName and type onto sets - const mappedSession = { - ...session, - sets: session.sets.map(set => ({ - ...set, - exerciseName: set.exercise.name, - type: set.exercise.type - })) - }; - - res.json({ success: true, session: mappedSession }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Log a set to today's quick log session -router.post('/quick-log/set', validate(logSetSchema), async (req: any, res) => { - try { - const userId = req.user.userId; - const { exerciseId, weight, reps, distanceMeters, durationSeconds, height, bodyWeightPercentage, note, side } = req.body; - - const startOfDay = new Date(); - startOfDay.setHours(0, 0, 0, 0); - const endOfDay = new Date(); - endOfDay.setHours(23, 59, 59, 999); - - // Find or create today's quick log session - let session = await prisma.workoutSession.findFirst({ - where: { - userId, - type: 'QUICK_LOG', - startTime: { - gte: startOfDay, - lte: endOfDay - } - } - }); - - if (!session) { - session = await prisma.workoutSession.create({ - data: { - userId, - startTime: startOfDay, - type: 'QUICK_LOG', - note: 'Daily Quick Log' - } - }); - } - - // Create the set - const newSet = await prisma.workoutSet.create({ - data: { - sessionId: session.id, - exerciseId, - order: 0, - weight: weight ? parseFloat(weight) : null, - reps: reps ? parseInt(reps) : null, - distanceMeters: distanceMeters ? parseFloat(distanceMeters) : null, - durationSeconds: durationSeconds ? parseInt(durationSeconds) : null, - side: side || null - }, - include: { exercise: true } - }); - - const mappedSet = { - ...newSet, - exerciseName: newSet.exercise.name, - type: newSet.exercise.type - }; - - res.json({ success: true, set: mappedSet }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Log a set to the active session -router.post('/active/log-set', validate(logSetSchema), async (req: any, res) => { - try { - const userId = req.user.userId; - const { exerciseId, reps, weight, distanceMeters, durationSeconds, side } = req.body; - - // Find active session - const activeSession = await prisma.workoutSession.findFirst({ - where: { userId, endTime: null, type: 'STANDARD' }, - include: { sets: true } - }); - - if (!activeSession) { - return res.status(404).json({ error: 'No active session found' }); - } - - // Get the highest order value from the existing sets - const maxOrder = activeSession.sets.reduce((max, set) => Math.max(max, set.order), -1); - - // Create the new set - const newSet = await prisma.workoutSet.create({ - data: { - sessionId: activeSession.id, - exerciseId, - order: maxOrder + 1, - reps: reps ? parseInt(reps) : null, - weight: weight ? parseFloat(weight) : null, - distanceMeters: distanceMeters ? parseFloat(distanceMeters) : null, - durationSeconds: durationSeconds ? parseInt(durationSeconds) : null, - side: side || null, - completed: true - }, - include: { exercise: true } - }); - - // Recalculate active step - if (activeSession.planId) { - const plan = await prisma.workoutPlan.findUnique({ - where: { id: activeSession.planId } - }); - - if (plan) { - const planExercises: { id: string }[] = JSON.parse(plan.exercises || '[]'); - const allPerformedSets = await prisma.workoutSet.findMany({ - where: { sessionId: activeSession.id } - }); - - const performedCounts = new Map(); - for (const set of allPerformedSets) { - performedCounts.set(set.exerciseId, (performedCounts.get(set.exerciseId) || 0) + 1); - } - - let activeExerciseId = null; - const plannedCounts = new Map(); - for (const planExercise of planExercises) { - const exerciseId = planExercise.id; - plannedCounts.set(exerciseId, (plannedCounts.get(exerciseId) || 0) + 1); - const performedCount = performedCounts.get(exerciseId) || 0; - - if (performedCount < plannedCounts.get(exerciseId)!) { - activeExerciseId = exerciseId; - break; - } - } - - const mappedNewSet = { - ...newSet, - exerciseName: newSet.exercise.name, - type: newSet.exercise.type - }; - - return res.json({ success: true, newSet: mappedNewSet, activeExerciseId }); - } - } - - // If no plan or plan not found, just return the new set - const mappedNewSet = { - ...newSet, - exerciseName: newSet.exercise.name, - type: newSet.exercise.type - }; - - res.json({ success: true, newSet: mappedNewSet, activeExerciseId: null }); - - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Update a set in the active session -router.put('/active/set/:setId', async (req: any, res) => { - try { - const userId = req.user.userId; - const { setId } = req.params; - const { reps, weight, distanceMeters, durationSeconds } = req.body; - - // Find active session (STANDARD or QUICK_LOG) - const activeSession = await prisma.workoutSession.findFirst({ - where: { userId, endTime: null }, - }); - - if (!activeSession) { - return res.status(404).json({ error: 'No active session found' }); - } - - const updatedSet = await prisma.workoutSet.update({ - where: { id: setId }, - data: { - reps: reps ? parseInt(reps) : null, - weight: weight ? parseFloat(weight) : null, - distanceMeters: distanceMeters ? parseFloat(distanceMeters) : null, - durationSeconds: durationSeconds ? parseInt(durationSeconds) : null, - }, - include: { exercise: true } - }); - - const mappedUpdatedSet = { - ...updatedSet, - exerciseName: updatedSet.exercise.name, - type: updatedSet.exercise.type - }; - - res.json({ success: true, updatedSet: mappedUpdatedSet }); - - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Update a set in the active session (STANDARD or QUICK_LOG) -router.patch('/active/set/:setId', validate(updateSetSchema), async (req: any, res) => { - try { - const userId = req.user.userId; - const { setId } = req.params; - const { reps, weight, distanceMeters, durationSeconds, height, bodyWeightPercentage, side, note } = req.body; - - // Find active session (STANDARD or QUICK_LOG) - const activeSession = await prisma.workoutSession.findFirst({ - where: { userId, endTime: null }, - }); - - if (!activeSession) { - return res.status(404).json({ error: 'No active session found' }); - } - - const updatedSet = await prisma.workoutSet.update({ - where: { id: setId }, - data: { - reps: reps !== undefined ? (reps ? parseInt(reps) : null) : undefined, - weight: weight !== undefined ? (weight ? parseFloat(weight) : null) : undefined, - distanceMeters: distanceMeters !== undefined ? (distanceMeters ? parseFloat(distanceMeters) : null) : undefined, - durationSeconds: durationSeconds !== undefined ? (durationSeconds ? parseInt(durationSeconds) : null) : undefined, - height: height !== undefined ? (height ? parseFloat(height) : null) : undefined, - bodyWeightPercentage: bodyWeightPercentage !== undefined ? (bodyWeightPercentage ? parseFloat(bodyWeightPercentage) : null) : undefined, - side: side !== undefined ? side : undefined, - }, - include: { exercise: true } - }); - - const mappedUpdatedSet = { - ...updatedSet, - exerciseName: updatedSet.exercise.name, - type: updatedSet.exercise.type - }; - - res.json({ success: true, updatedSet: mappedUpdatedSet }); - - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Delete a set from the active session -router.delete('/active/set/:setId', async (req: any, res) => { - try { - const userId = req.user.userId; - const { setId } = req.params; - - // Find active session (STANDARD or QUICK_LOG) - const activeSession = await prisma.workoutSession.findFirst({ - where: { userId, endTime: null }, - }); - - if (!activeSession) { - return res.status(404).json({ error: 'No active session found' }); - } - - await prisma.workoutSet.delete({ - where: { id: setId } - }); - - res.json({ success: true }); - - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Delete active session (quit without saving) -router.delete('/active', async (req: any, res) => { - try { - const userId = req.user.userId; - - // Delete all active sessions for this user to ensure clean state - await prisma.workoutSession.deleteMany({ - where: { - userId, - endTime: null, - type: 'STANDARD' - } - }); - - res.json({ success: true }); - } catch (error) { - console.error(error); - res.status(500).json({ error: 'Server error' }); - } -}); - -// Delete session -router.delete('/:id', async (req: any, res) => { - try { - const userId = req.user.userId; - const { id } = req.params; - await prisma.workoutSession.delete({ - where: { id, userId } // Ensure user owns it - }); - res.json({ success: true }); - } catch (error) { - res.status(500).json({ error: 'Server error' }); - } -}); +router.use(authenticateToken); + +router.get('/', SessionController.getAllSessions); +router.post('/', validate(sessionSchema), SessionController.saveSession); +router.get('/active', SessionController.getActiveSession); +router.put('/active', validate(sessionSchema), SessionController.updateActiveSession); +router.get('/quick-log', SessionController.getTodayQuickLog); +router.post('/quick-log/set', validate(logSetSchema), SessionController.logSetToQuickLog); +router.post('/active/log-set', validate(logSetSchema), SessionController.logSetToActiveSession); +router.put('/active/set/:setId', SessionController.updateSet); +router.patch('/active/set/:setId', validate(updateSetSchema), SessionController.patchSet); +router.delete('/active/set/:setId', SessionController.deleteSet); +router.delete('/active', SessionController.deleteActiveSession); +router.delete('/:id', SessionController.deleteSession); export default router; diff --git a/server/src/routes/weight.ts b/server/src/routes/weight.ts index 6427e9a..aac03de 100644 --- a/server/src/routes/weight.ts +++ b/server/src/routes/weight.ts @@ -1,77 +1,12 @@ import express from 'express'; +import { WeightController } from '../controllers/weight.controller'; import { authenticateToken } from '../middleware/auth'; -import prisma from '../lib/prisma'; const router = express.Router(); -// Get weight history -router.get('/', authenticateToken, async (req, res) => { - try { - const userId = (req as any).user.userId; - const weights = await prisma.bodyWeightRecord.findMany({ - where: { userId }, - orderBy: { date: 'desc' }, - take: 365 // Limit to last year for now - }); - res.json(weights); - } catch (error) { - console.error('Error fetching weight history:', error); - res.status(500).json({ error: 'Failed to fetch weight history' }); - } -}); +router.use(authenticateToken); -// Log weight -router.post('/', authenticateToken, async (req, res) => { - try { - const userId = (req as any).user.userId; - const { weight, dateStr } = req.body; - - if (!weight || !dateStr) { - return res.status(400).json({ error: 'Weight and dateStr are required' }); - } - - // Upsert: Update if exists for this day, otherwise create - const record = await prisma.bodyWeightRecord.upsert({ - where: { - userId_dateStr: { - userId, - dateStr - } - }, - update: { - weight: parseFloat(weight), - date: new Date(dateStr) // Update date object just in case - }, - create: { - userId, - weight: parseFloat(weight), - dateStr, - date: new Date(dateStr) - } - }); - - // Also update the user profile weight to the latest logged weight - // But only if the logged date is today or in the future (or very recent) - // For simplicity, let's just update the profile weight if it's the most recent record - // Or we can just update it always if the user considers this their "current" weight. - // Let's check if this is the latest record by date. - const latestRecord = await prisma.bodyWeightRecord.findFirst({ - where: { userId }, - orderBy: { date: 'desc' } - }); - - if (latestRecord && latestRecord.id === record.id) { - await prisma.userProfile.update({ - where: { userId }, - data: { weight: parseFloat(weight) } - }); - } - - res.json(record); - } catch (error) { - console.error('Error logging weight:', error); - res.status(500).json({ error: 'Failed to log weight' }); - } -}); +router.get('/', WeightController.getWeightHistory); +router.post('/', WeightController.logWeight); export default router; diff --git a/server/src/services/ai.service.ts b/server/src/services/ai.service.ts new file mode 100644 index 0000000..d04e481 --- /dev/null +++ b/server/src/services/ai.service.ts @@ -0,0 +1,45 @@ +import { GoogleGenerativeAI } from '@google/generative-ai'; + +const API_KEY = process.env.GEMINI_API_KEY || process.env.API_KEY; +const MODEL_ID = 'gemini-flash-lite-latest'; + +// Store chat sessions in memory +const chatSessions = new Map(); + +export class AIService { + static async chat(userId: string, systemInstruction: string, userMessage: string, sessionId: string) { + if (!API_KEY) { + throw new Error('AI service not configured'); + } + + const chatKey = `${userId}-${sessionId || 'default'}`; + + // Get or create chat session + let chat = chatSessions.get(chatKey); + + if (!chat || systemInstruction) { + const ai = new GoogleGenerativeAI(API_KEY); + // Create new chat with system instruction + const model = ai.getGenerativeModel({ + model: MODEL_ID, + systemInstruction: systemInstruction || 'You are a helpful fitness coach.' + }); + + chat = model.startChat({ + history: [] + }); + + chatSessions.set(chatKey, chat); + } + + const result = await chat.sendMessage(userMessage); + const response = result.response.text(); + + return { response }; + } + + static async clearChat(userId: string, sessionId: string) { + const chatKey = `${userId}-${sessionId}`; + chatSessions.delete(chatKey); + } +} diff --git a/server/src/services/auth.service.ts b/server/src/services/auth.service.ts new file mode 100644 index 0000000..35a403c --- /dev/null +++ b/server/src/services/auth.service.ts @@ -0,0 +1,147 @@ +import prisma from '../lib/prisma'; +import bcrypt from 'bcryptjs'; +import jwt from 'jsonwebtoken'; + +const JWT_SECRET = process.env.JWT_SECRET || 'secret'; + +export class AuthService { + static async getUser(userId: string) { + const user = await prisma.user.findUnique({ + where: { id: userId }, + include: { profile: true } + }); + + if (!user) return null; + + const { password: _, ...userSafe } = user; + return userSafe; + } + + static async login(email: string, password: string) { + const user = await prisma.user.findUnique({ + where: { email }, + include: { profile: true } + }); + + if (!user) { + throw new Error('Invalid credentials'); + } + + if (user.isBlocked) { + throw new Error('Account is blocked'); + } + + const isMatch = await bcrypt.compare(password, user.password); + if (!isMatch) { + throw new Error('Invalid credentials'); + } + + const token = jwt.sign({ userId: user.id, role: user.role }, JWT_SECRET); + const { password: _, ...userSafe } = user; + + return { user: userSafe, token }; + } + + static async register(email: string, password: string) { + const existingUser = await prisma.user.findUnique({ where: { email } }); + if (existingUser) { + throw new Error('User already exists'); + } + + const hashedPassword = await bcrypt.hash(password, 10); + + const user = await prisma.user.create({ + data: { + email, + password: hashedPassword, + role: 'USER', + profile: { + create: { + weight: 70 + } + } + }, + include: { profile: true } + }); + + const token = jwt.sign({ userId: user.id, role: user.role }, JWT_SECRET); + const { password: _, ...userSafe } = user; + + return { user: userSafe, token }; + } + + static async changePassword(userId: string, newPassword: string) { + const hashed = await bcrypt.hash(newPassword, 10); + + await prisma.user.update({ + where: { id: userId }, + data: { + password: hashed, + isFirstLogin: false + } + }); + } + + static async updateProfile(userId: string, data: any) { + // Convert birthDate if needed + if (data.birthDate) { + data.birthDate = new Date(data.birthDate); + } + + await prisma.userProfile.upsert({ + where: { userId: userId }, + update: { ...data }, + create: { userId: userId, ...data } + }); + } + + static async getAllUsers() { + const users = await prisma.user.findMany({ + select: { + id: true, + email: true, + role: true, + isBlocked: true, + isFirstLogin: true, + profile: true + }, + orderBy: { + email: 'asc' + } + }); + return users; + } + + static async deleteUser(adminId: string, targetId: string) { + if (targetId === adminId) { + throw new Error('Cannot delete yourself'); + } + await prisma.user.delete({ where: { id: targetId } }); + } + + static async blockUser(adminId: string, targetId: string, block: boolean) { + if (targetId === adminId) { + throw new Error('Cannot block yourself'); + } + await prisma.user.update({ + where: { id: targetId }, + data: { isBlocked: block } + }); + } + + static async resetUserPassword(targetId: string, newPassword: string) { + if (!newPassword || newPassword.length < 4) { + throw new Error('Password too short'); + } + + const hashed = await bcrypt.hash(newPassword, 10); + + await prisma.user.update({ + where: { id: targetId }, + data: { + password: hashed, + isFirstLogin: true + } + }); + } +} diff --git a/server/src/services/exercise.service.ts b/server/src/services/exercise.service.ts new file mode 100644 index 0000000..a864e86 --- /dev/null +++ b/server/src/services/exercise.service.ts @@ -0,0 +1,69 @@ +import prisma from '../lib/prisma'; + +export class ExerciseService { + static async getAllExercises(userId: string) { + const exercises = await prisma.exercise.findMany({ + where: { + OR: [ + { userId: null }, // System default + { userId } // User custom + ] + } + }); + return exercises; + } + + static async getLastSet(userId: string, exerciseId: string) { + const lastSet = await prisma.workoutSet.findFirst({ + where: { + exerciseId, + session: { userId } + }, + include: { + session: true + }, + orderBy: { + timestamp: 'desc' + } + }); + return lastSet; + } + + static async saveExercise(userId: string, data: any) { + const { id, name, type, bodyWeightPercentage, isArchived, isUnilateral } = data; + + const exerciseData = { + name, + type, + bodyWeightPercentage: bodyWeightPercentage ? parseFloat(bodyWeightPercentage) : undefined, + isArchived: !!isArchived, + isUnilateral: !!isUnilateral + }; + + if (id) { + // Check if it exists and belongs to user + const existing = await prisma.exercise.findUnique({ where: { id } }); + if (existing && existing.userId === userId) { + const updated = await prisma.exercise.update({ + where: { id }, + data: exerciseData + }); + return updated; + } + } + + // Create new + const newExercise = await prisma.exercise.create({ + data: { + id: id || undefined, + userId, + name: exerciseData.name, + type: exerciseData.type, + bodyWeightPercentage: exerciseData.bodyWeightPercentage, + isArchived: exerciseData.isArchived, + isUnilateral: exerciseData.isUnilateral, + } + }); + return newExercise; + } +} diff --git a/server/src/services/plan.service.ts b/server/src/services/plan.service.ts new file mode 100644 index 0000000..1068d94 --- /dev/null +++ b/server/src/services/plan.service.ts @@ -0,0 +1,92 @@ +import prisma from '../lib/prisma'; + +export class PlanService { + static async getPlans(userId: string) { + const plans = await prisma.workoutPlan.findMany({ + where: { userId }, + include: { + planExercises: { + include: { exercise: true }, + orderBy: { order: 'asc' } + } + }, + orderBy: { createdAt: 'desc' } + }); + + return plans.map((p: any) => ({ + ...p, + steps: p.planExercises.map((pe: any) => ({ + id: pe.id, + exerciseId: pe.exerciseId, + exerciseName: pe.exercise.name, + exerciseType: pe.exercise.type, + isWeighted: pe.isWeighted, + })) + })); + } + + static async savePlan(userId: string, data: any) { + const { id, name, description, steps } = data; + + await prisma.$transaction(async (tx) => { + let plan = await tx.workoutPlan.findUnique({ where: { id } }); + + if (plan) { + await tx.workoutPlan.update({ + where: { id }, + data: { name, description } + }); + await tx.planExercise.deleteMany({ where: { planId: id } }); + } else { + await tx.workoutPlan.create({ + data: { + id, + userId, + name, + description + } + }); + } + + if (steps && steps.length > 0) { + await tx.planExercise.createMany({ + data: steps.map((step: any, index: number) => ({ + planId: id, + exerciseId: step.exerciseId, + order: index, + isWeighted: step.isWeighted || false + })) + }); + } + }); + + const savedPlan = await prisma.workoutPlan.findUnique({ + where: { id }, + include: { + planExercises: { + include: { exercise: true }, + orderBy: { order: 'asc' } + } + } + }); + + if (!savedPlan) throw new Error("Plan failed to save"); + + return { + ...savedPlan, + steps: savedPlan.planExercises.map((pe: any) => ({ + id: pe.id, + exerciseId: pe.exerciseId, + exerciseName: pe.exercise.name, + exerciseType: pe.exercise.type, + isWeighted: pe.isWeighted + })) + }; + } + + static async deletePlan(userId: string, id: string) { + await prisma.workoutPlan.delete({ + where: { id, userId } + }); + } +} diff --git a/server/src/services/session.service.ts b/server/src/services/session.service.ts new file mode 100644 index 0000000..3a974cd --- /dev/null +++ b/server/src/services/session.service.ts @@ -0,0 +1,435 @@ +import prisma from '../lib/prisma'; +import { WorkoutSession, WorkoutSet } from '@prisma/client'; + +export class SessionService { + static async getAllSessions(userId: string) { + const sessions = await prisma.workoutSession.findMany({ + where: { + userId, + OR: [ + { endTime: { not: null } }, + { type: { equals: 'QUICK_LOG' } } // Ensure type is handled correctly + ] + }, + include: { sets: { include: { exercise: true } } }, + orderBy: { startTime: 'desc' } + }); + + return sessions.map(session => ({ + ...session, + sets: session.sets.map(set => ({ + ...set, + exerciseName: set.exercise.name, + type: set.exercise.type + })) + })); + } + + static async saveSession(userId: string, data: any) { + const { id, startTime, endTime, userBodyWeight, note, planId, planName, sets } = data; + + const start = new Date(startTime); + const end = endTime ? new Date(endTime) : null; + const weight = userBodyWeight ? parseFloat(userBodyWeight) : null; + + const existing = await prisma.workoutSession.findUnique({ where: { id } }); + + if (existing) { + // Update + await prisma.workoutSet.deleteMany({ where: { sessionId: id } }); + + const updated = await prisma.workoutSession.update({ + where: { id }, + data: { + startTime: start, + endTime: end, + userBodyWeight: weight, + note, + planId, + planName, + sets: { + create: sets.map((s: any, idx: number) => ({ + exerciseId: s.exerciseId, + order: idx, + weight: s.weight, + reps: s.reps, + distanceMeters: s.distanceMeters, + durationSeconds: s.durationSeconds, + completed: s.completed !== undefined ? s.completed : true + })) + } + }, + include: { sets: true } + }); + return updated; + } else { + // Create + if (!end) { + const active = await prisma.workoutSession.findFirst({ + where: { + userId, + endTime: null, + type: 'STANDARD' + } + }); + if (active) { + throw new Error('An active session already exists'); + } + } + + const created = await prisma.workoutSession.create({ + data: { + id, + userId, + startTime: start, + endTime: end, + userBodyWeight: weight, + note, + planId, + planName, + sets: { + create: sets.map((s: any, idx: number) => ({ + exerciseId: s.exerciseId, + order: idx, + weight: s.weight, + reps: s.reps, + distanceMeters: s.distanceMeters, + durationSeconds: s.durationSeconds, + completed: s.completed !== undefined ? s.completed : true + })) + } + }, + include: { sets: true } + }); + + if (weight && end) { + await prisma.userProfile.upsert({ + where: { userId }, + create: { userId, weight }, + update: { weight } + }); + } + + return created; + } + } + + static async getActiveSession(userId: string) { + const activeSession = await prisma.workoutSession.findFirst({ + where: { + userId, + endTime: null, + type: 'STANDARD' + }, + include: { sets: { include: { exercise: true }, orderBy: { order: 'asc' } } } + }); + return activeSession; + } + + static async updateActiveSession(userId: string, data: any) { + const { id, startTime, endTime, userBodyWeight, note, planId, planName, sets } = data; + + const start = new Date(startTime); + const end = endTime ? new Date(endTime) : null; + const weight = userBodyWeight ? parseFloat(userBodyWeight) : null; + + const existing = await prisma.workoutSession.findFirst({ + where: { id, userId } + }); + + if (!existing) { + throw new Error('Session not found'); + } + + await prisma.workoutSet.deleteMany({ where: { sessionId: id } }); + + const updated = await prisma.workoutSession.update({ + where: { id }, + data: { + startTime: start, + endTime: end, + userBodyWeight: weight, + note, + planId, + planName, + sets: { + create: sets.map((s: any, idx: number) => ({ + exerciseId: s.exerciseId, + order: idx, + weight: s.weight, + reps: s.reps, + distanceMeters: s.distanceMeters, + durationSeconds: s.durationSeconds, + completed: s.completed !== undefined ? s.completed : true + })) + } + }, + include: { sets: { include: { exercise: true } } } + }); + + if (weight && end) { + await prisma.userProfile.upsert({ + where: { userId }, + create: { userId, weight }, + update: { weight } + }); + } + + return updated; + } + + static async getTodayQuickLog(userId: string) { + const startOfDay = new Date(); + startOfDay.setHours(0, 0, 0, 0); + const endOfDay = new Date(); + endOfDay.setHours(23, 59, 59, 999); + + const session = await prisma.workoutSession.findFirst({ + where: { + userId, + // @ts-ignore: Prisma enum mismatch in generated types potentially + type: 'QUICK_LOG', + startTime: { + gte: startOfDay, + lte: endOfDay + } + }, + include: { sets: { include: { exercise: true }, orderBy: { timestamp: 'desc' } } } + }); + + if (!session) return null; + + return { + ...session, + sets: session.sets.map(set => ({ + ...set, + exerciseName: set.exercise.name, + type: set.exercise.type + })) + }; + } + + static async logSetToQuickLog(userId: string, data: any) { + const { exerciseId, weight, reps, distanceMeters, durationSeconds, height, bodyWeightPercentage, note, side } = data; + + const startOfDay = new Date(); + startOfDay.setHours(0, 0, 0, 0); + const endOfDay = new Date(); + endOfDay.setHours(23, 59, 59, 999); + + let session = await prisma.workoutSession.findFirst({ + where: { + userId, + type: 'QUICK_LOG', // Type safety is tricky with string literals sometimes + startTime: { + gte: startOfDay, + lte: endOfDay + } + } + }); + + if (!session) { + session = await prisma.workoutSession.create({ + data: { + userId, + startTime: startOfDay, + type: 'QUICK_LOG', + note: 'Daily Quick Log' + } + }); + } + + const newSet = await prisma.workoutSet.create({ + data: { + sessionId: session.id, + exerciseId, + order: 0, + weight: weight ? parseFloat(weight) : null, + reps: reps ? parseInt(reps) : null, + distanceMeters: distanceMeters ? parseFloat(distanceMeters) : null, + durationSeconds: durationSeconds ? parseInt(durationSeconds) : null, + side: side || null + }, + include: { exercise: true } + }); + + return { + ...newSet, + exerciseName: newSet.exercise.name, + type: newSet.exercise.type + }; + } + + static async logSetToActiveSession(userId: string, data: any) { + const { exerciseId, reps, weight, distanceMeters, durationSeconds, side } = data; + + const activeSession = await prisma.workoutSession.findFirst({ + where: { userId, endTime: null, type: 'STANDARD' }, + include: { sets: true } + }); + + if (!activeSession) { + throw new Error('No active session found'); + } + + const maxOrder = activeSession.sets.reduce((max, set) => Math.max(max, set.order), -1); + + const newSet = await prisma.workoutSet.create({ + data: { + sessionId: activeSession.id, + exerciseId, + order: maxOrder + 1, + reps: reps ? parseInt(reps) : null, + weight: weight ? parseFloat(weight) : null, + distanceMeters: distanceMeters ? parseFloat(distanceMeters) : null, + durationSeconds: durationSeconds ? parseInt(durationSeconds) : null, + side: side || null, + completed: true + }, + include: { exercise: true } + }); + + // Recalculate active step + let activeExerciseId = null; + if (activeSession.planId) { + const plan = await prisma.workoutPlan.findUnique({ + where: { id: activeSession.planId } + }); + + if (plan) { + const planExercises: { id: string }[] = JSON.parse(plan.exercises || '[]'); + const allPerformedSets = await prisma.workoutSet.findMany({ + where: { sessionId: activeSession.id } + }); + + const performedCounts = new Map(); + for (const set of allPerformedSets) { + performedCounts.set(set.exerciseId, (performedCounts.get(set.exerciseId) || 0) + 1); + } + + const plannedCounts = new Map(); + for (const planExercise of planExercises) { + const exerciseIdStr = planExercise.id; + plannedCounts.set(exerciseIdStr, (plannedCounts.get(exerciseIdStr) || 0) + 1); + const performedCount = performedCounts.get(exerciseIdStr) || 0; + + if (performedCount < plannedCounts.get(exerciseIdStr)!) { + activeExerciseId = exerciseIdStr; + break; + } + } + } + } + + return { + newSet: { + ...newSet, + exerciseName: newSet.exercise.name, + type: newSet.exercise.type + }, + activeExerciseId + }; + } + + static async updateSet(userId: string, setId: string, data: any) { + // Find active session (STANDARD or QUICK_LOG) to ensure user owns the set effectively + // Or just check if set belongs to a session owned by user. + // The existing code checked for an active session but really we just need to verify ownership. + // However, `updateSet` in `sessions.ts` only looked for an active session first, which implies you can only edit sets in active sessions. + // I will maintain that logic. + + const activeSession = await prisma.workoutSession.findFirst({ + where: { userId, endTime: null }, + }); + + if (!activeSession) { + throw new Error('No active session found'); + } + + // We should probably verify the set belongs to this session, but the original code just checked activeSession exists and assumed set id is valid/belongs to it? + // Actually `updatedSet = await prisma.workoutSet.update({ where: { id: setId } ... })` handles the update. + // If the set doesn't exist it throws. If it belongs to another user... wait, `update` uses `id` primarily. + // Ideally we should check ownership. But copying logic for now. + + const { reps, weight, distanceMeters, durationSeconds } = data; + + const updatedSet = await prisma.workoutSet.update({ + where: { id: setId }, + data: { + reps: reps ? parseInt(reps) : null, + weight: weight ? parseFloat(weight) : null, + distanceMeters: distanceMeters ? parseFloat(distanceMeters) : null, + durationSeconds: durationSeconds ? parseInt(durationSeconds) : null, + }, + include: { exercise: true } + }); + + return { + ...updatedSet, + exerciseName: updatedSet.exercise.name, + type: updatedSet.exercise.type + }; + } + + static async patchSet(userId: string, setId: string, data: any) { + const activeSession = await prisma.workoutSession.findFirst({ + where: { userId, endTime: null }, + }); + + if (!activeSession) { + throw new Error('No active session found'); + } + + const { reps, weight, distanceMeters, durationSeconds, height, bodyWeightPercentage, side, note } = data; + + const updatedSet = await prisma.workoutSet.update({ + where: { id: setId }, + data: { + reps: reps !== undefined ? (reps ? parseInt(reps) : null) : undefined, + weight: weight !== undefined ? (weight ? parseFloat(weight) : null) : undefined, + distanceMeters: distanceMeters !== undefined ? (distanceMeters ? parseFloat(distanceMeters) : null) : undefined, + durationSeconds: durationSeconds !== undefined ? (durationSeconds ? parseInt(durationSeconds) : null) : undefined, + height: height !== undefined ? (height ? parseFloat(height) : null) : undefined, + bodyWeightPercentage: bodyWeightPercentage !== undefined ? (bodyWeightPercentage ? parseFloat(bodyWeightPercentage) : null) : undefined, + side: side !== undefined ? side : undefined, + }, + include: { exercise: true } + }); + + return { + ...updatedSet, + exerciseName: updatedSet.exercise.name, + type: updatedSet.exercise.type + }; + } + + static async deleteSet(userId: string, setId: string) { + const activeSession = await prisma.workoutSession.findFirst({ + where: { userId, endTime: null }, + }); + + if (!activeSession) { + throw new Error('No active session found'); + } + + await prisma.workoutSet.delete({ + where: { id: setId } + }); + } + + static async deleteActiveSession(userId: string) { + await prisma.workoutSession.deleteMany({ + where: { + userId, + endTime: null, + type: 'STANDARD' + } + }); + } + + static async deleteSession(userId: string, sessionId: string) { + await prisma.workoutSession.delete({ + where: { id: sessionId, userId } + }); + } +} diff --git a/server/src/services/weight.service.ts b/server/src/services/weight.service.ts new file mode 100644 index 0000000..53c9d4b --- /dev/null +++ b/server/src/services/weight.service.ts @@ -0,0 +1,48 @@ +import prisma from '../lib/prisma'; + +export class WeightService { + static async getWeightHistory(userId: string) { + const weights = await prisma.bodyWeightRecord.findMany({ + where: { userId }, + orderBy: { date: 'desc' }, + take: 365 + }); + return weights; + } + + static async logWeight(userId: string, weight: number, dateStr: string) { + const record = await prisma.bodyWeightRecord.upsert({ + where: { + userId_dateStr: { + userId, + dateStr + } + }, + update: { + weight: weight, + date: new Date(dateStr) + }, + create: { + userId, + weight: weight, + dateStr, + date: new Date(dateStr) + } + }); + + // Update profile if latest + const latestRecord = await prisma.bodyWeightRecord.findFirst({ + where: { userId }, + orderBy: { date: 'desc' } + }); + + if (latestRecord && latestRecord.id === record.id) { + await prisma.userProfile.update({ + where: { userId }, + data: { weight: weight } + }); + } + + return record; + } +} diff --git a/server/src/utils/apiResponse.ts b/server/src/utils/apiResponse.ts new file mode 100644 index 0000000..a8310d2 --- /dev/null +++ b/server/src/utils/apiResponse.ts @@ -0,0 +1,23 @@ +import { Response } from 'express'; + +interface ApiResponse { + success: boolean; + data?: T; + error?: string; +} + +export const sendSuccess = (res: Response, data: T, statusCode: number = 200) => { + const response: ApiResponse = { + success: true, + data, + }; + return res.status(statusCode).json(response); +}; + +export const sendError = (res: Response, error: string, statusCode: number = 400) => { + const response: ApiResponse = { + success: false, + error, + }; + return res.status(statusCode).json(response); +}; diff --git a/server/src/utils/logger.ts b/server/src/utils/logger.ts new file mode 100644 index 0000000..320b930 --- /dev/null +++ b/server/src/utils/logger.ts @@ -0,0 +1,22 @@ +import winston from 'winston'; + +const logger = winston.createLogger({ + level: 'info', + format: winston.format.json(), + defaultMeta: { service: 'gymflow-backend' }, + transports: [ + new winston.transports.File({ filename: 'error.log', level: 'error' }), + new winston.transports.File({ filename: 'combined.log' }), + ], +}); + +if (process.env.APP_MODE !== 'prod') { + logger.add(new winston.transports.Console({ + format: winston.format.combine( + winston.format.colorize(), + winston.format.simple() + ), + })); +} + +export default logger; diff --git a/server/test.db b/server/test.db index 48dc7ec47897067fff3f5e192d464aa1070d707f..224623e270df057eba83d2f95c96c5da6485c5f2 100644 GIT binary patch literal 430080 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­%?l!n5#3>3sP+)Eg{7VX#lBuj(! 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 delta 337 zcmZozAk}byb%GQd12+Q$gV;m`I}l5+s$gTv9DX)lpcsR|cEJX=68?z`+Ss_z_`_U& PnE;~#hM&>H0F4g-q1sK5 diff --git a/src/components/Tracker/useTracker.ts b/src/components/Tracker/useTracker.ts index 3bc93cc..1e7dcd5 100644 --- a/src/components/Tracker/useTracker.ts +++ b/src/components/Tracker/useTracker.ts @@ -85,9 +85,9 @@ export const useTracker = (props: any) => { // Props ignored/removed // Function to reload Quick Log session const loadQuickLogSession = async () => { try { - const response = await api.get<{ success: boolean; session?: WorkoutSession }>('/sessions/quick-log'); - if (response.success && response.session) { - setQuickLogSession(response.session); + const response = await api.get('/sessions/quick-log'); + if (response.success && response.data?.session) { + setQuickLogSession(response.data.session); } } catch (error) { console.error("Failed to load quick log session:", error); diff --git a/src/context/ActiveWorkoutContext.tsx b/src/context/ActiveWorkoutContext.tsx index cf1750a..4f3a22d 100644 --- a/src/context/ActiveWorkoutContext.tsx +++ b/src/context/ActiveWorkoutContext.tsx @@ -142,7 +142,7 @@ export const ActiveWorkoutProvider: React.FC<{ children: React.ReactNode }> = ({ // or similar. I need to type the response properly or cast it. // Assuming response.newSet needs to be added. - if (response.success && response.newSet) { + if (response && response.newSet) { setActiveSession(prev => prev ? ({ ...prev, sets: [...prev.sets, response.newSet] diff --git a/src/services/auth.ts b/src/services/auth.ts index aecb29f..946c1c7 100644 --- a/src/services/auth.ts +++ b/src/services/auth.ts @@ -1,21 +1,35 @@ import { User, UserRole, UserProfile } from '../types'; import { api, setAuthToken, removeAuthToken } from './api'; +interface ApiResponse { + success: boolean; + data: T; + error?: string; +} + export const getUsers = async (): Promise<{ success: boolean; users?: User[]; error?: string }> => { try { - const res = await api.get('/auth/users'); - return res; - } catch (e) { - return { success: false, error: 'Failed to fetch users' }; + const res = await api.get>('/auth/users'); + if (res.success && res.data) { + return { success: true, users: res.data.users }; + } + return { success: false, error: res.error }; + } catch (e: any) { + try { + const err = JSON.parse(e.message); + return { success: false, error: err.error || 'Failed to fetch users' }; + } catch { + return { success: false, error: 'Failed to fetch users' }; + } } }; export const login = async (email: string, password: string): Promise<{ success: boolean; user?: User; error?: string }> => { try { - const res = await api.post('/auth/login', { email, password }); - if (res.success) { - setAuthToken(res.token); - return { success: true, user: res.user }; + const res = await api.post>('/auth/login', { email, password }); + if (res.success && res.data) { + setAuthToken(res.data.token); + return { success: true, user: res.data.user }; } return { success: false, error: res.error }; } catch (e: any) { @@ -30,9 +44,9 @@ export const login = async (email: string, password: string): Promise<{ success: export const createUser = async (email: string, password: string): Promise<{ success: boolean; error?: string }> => { try { - const res = await api.post('/auth/register', { email, password }); - if (res.success) { - setAuthToken(res.token); + const res = await api.post>('/auth/register', { email, password }); + if (res.success && res.data) { + setAuthToken(res.data.token); return { success: true }; } return { success: false, error: res.error }; @@ -48,50 +62,74 @@ export const createUser = async (email: string, password: string): Promise<{ suc export const deleteUser = async (userId: string) => { try { - const res = await api.delete(`/auth/users/${userId}`); + const res = await api.delete>(`/auth/users/${userId}`); return res; - } catch (e) { - return { success: false, error: 'Failed to delete user' }; + } catch (e: any) { + try { + const err = JSON.parse(e.message); + return { success: false, error: err.error || 'Failed to delete user' }; + } catch { + return { success: false, error: 'Failed to delete user' }; + } } }; export const toggleBlockUser = async (userId: string, block: boolean) => { try { - const res = await api.patch(`/auth/users/${userId}/block`, { block }); + const res = await api.patch>(`/auth/users/${userId}/block`, { block }); return res; - } catch (e) { - return { success: false, error: 'Failed to update user status' }; + } catch (e: any) { + try { + const err = JSON.parse(e.message); + return { success: false, error: err.error || 'Failed to update user status' }; + } catch { + return { success: false, error: 'Failed to update user status' }; + } } }; export const adminResetPassword = async (userId: string, newPass: string) => { try { - const res = await api.post(`/auth/users/${userId}/reset-password`, { newPassword: newPass }); + const res = await api.post>(`/auth/users/${userId}/reset-password`, { newPassword: newPass }); return res; - } catch (e) { - return { success: false, error: 'Failed to reset password' }; + } catch (e: any) { + try { + const err = JSON.parse(e.message); + return { success: false, error: err.error || 'Failed to reset password' }; + } catch { + return { success: false, error: 'Failed to reset password' }; + } } }; export const updateUserProfile = async (userId: string, profile: Partial): Promise<{ success: boolean; error?: string }> => { try { - const res = await api.patch('/auth/profile', profile); + const res = await api.patch>('/auth/profile', profile); return res; - } catch (e) { - return { success: false, error: 'Failed to update profile' }; + } catch (e: any) { + try { + const err = JSON.parse(e.message); + return { success: false, error: err.error || 'Failed to update profile' }; + } catch { + return { success: false, error: 'Failed to update profile' }; + } } }; export const changePassword = async (userId: string, newPassword: string) => { try { - const res = await api.post('/auth/change-password', { userId, newPassword }); + const res = await api.post>('/auth/change-password', { userId, newPassword }); if (!res.success) { console.error('Failed to change password:', res.error); } return res; - } catch (e) { - console.error(e); - return { success: false, error: 'Network error' }; + } catch (e: any) { + try { + const err = JSON.parse(e.message); + return { success: false, error: err.error || 'Network error' }; + } catch { + return { success: false, error: 'Network error' }; + } } }; @@ -103,9 +141,12 @@ export const getCurrentUserProfile = (userId: string): UserProfile | undefined = export const getMe = async (): Promise<{ success: boolean; user?: User; error?: string }> => { try { - const res = await api.get('/auth/me'); - return res; - } catch (e) { + const res = await api.get>('/auth/me'); + if (res.success && res.data) { + return { success: true, user: res.data.user }; + } + return { success: false, error: res.error }; + } catch (e: any) { return { success: false, error: 'Failed to fetch user' }; } }; diff --git a/src/services/exercises.ts b/src/services/exercises.ts index dd16f6a..fd2b553 100644 --- a/src/services/exercises.ts +++ b/src/services/exercises.ts @@ -1,23 +1,30 @@ import { ExerciseDef, WorkoutSet } from '../types'; import { api } from './api'; +interface ApiResponse { + success: boolean; + data: T; + error?: string; +} + export const getExercises = async (userId: string): Promise => { try { - return await api.get('/exercises'); + const res = await api.get>('/exercises'); + return res.data || []; } catch { return []; } }; export const saveExercise = async (userId: string, exercise: ExerciseDef): Promise => { - await api.post('/exercises', exercise); + await api.post>('/exercises', exercise); }; export const getLastSetForExercise = async (userId: string, exerciseId: string): Promise => { try { - const response = await api.get<{ success: boolean; set?: WorkoutSet }>(`/exercises/${exerciseId}/last-set`); - if (response.success && response.set) { - return response.set; + const response = await api.get>(`/exercises/${exerciseId}/last-set`); + if (response.success && response.data?.set) { + return response.data.set; } return undefined; } catch (error) { diff --git a/src/services/geminiService.ts b/src/services/geminiService.ts index ec1f7d9..7916fd0 100644 --- a/src/services/geminiService.ts +++ b/src/services/geminiService.ts @@ -2,6 +2,12 @@ import { WorkoutSession, UserProfile, WorkoutPlan } from '../types'; import { api } from './api'; import { generateId } from '../utils/uuid'; +interface ApiResponse { + success: boolean; + data: T; + error?: string; +} + interface FitnessChatOptions { history: WorkoutSession[]; userProfile?: UserProfile; @@ -111,15 +117,15 @@ export const createFitnessChat = ( return { sendMessage: async (userMessage: string) => { - const res = await api.post('/ai/chat', { + const res = await api.post>('/ai/chat', { systemInstruction, userMessage, sessionId }); return { - text: res.response, + text: res.data.response, response: { - text: () => res.response + text: () => res.data.response } }; } diff --git a/src/services/plans.ts b/src/services/plans.ts index 836612e..9283f3a 100644 --- a/src/services/plans.ts +++ b/src/services/plans.ts @@ -1,18 +1,25 @@ import { WorkoutPlan } from '../types'; import { api } from './api'; +interface ApiResponse { + success: boolean; + data: T; + error?: string; +} + export const getPlans = async (userId: string): Promise => { try { - return await api.get('/plans'); + const res = await api.get>('/plans'); + return res.data || []; } catch { return []; } }; export const savePlan = async (userId: string, plan: WorkoutPlan): Promise => { - await api.post('/plans', plan); + await api.post>('/plans', plan); }; export const deletePlan = async (userId: string, id: string): Promise => { - await api.delete(`/plans/${id}`); + await api.delete>(`/plans/${id}`); }; diff --git a/src/services/sessions.ts b/src/services/sessions.ts index 55ee12c..9b556b6 100644 --- a/src/services/sessions.ts +++ b/src/services/sessions.ts @@ -13,9 +13,16 @@ interface ApiSession extends Omit { + success: boolean; + data: T; + error?: string; +} + export const getSessions = async (userId: string): Promise => { try { - const sessions = await api.get('/sessions'); + const response = await api.get>('/sessions'); + const sessions = response.data || []; // Convert ISO date strings to timestamps return sessions.map((session) => ({ ...session, @@ -33,16 +40,17 @@ export const getSessions = async (userId: string): Promise => }; export const saveSession = async (userId: string, session: WorkoutSession): Promise => { - await api.post('/sessions', session); + await api.post>('/sessions', session); }; export const getActiveSession = async (userId: string): Promise => { try { - const response = await api.get<{ success: boolean; session?: ApiSession }>('/sessions/active'); - if (!response.success || !response.session) { + const response = await api.get>('/sessions/active'); + + if (!response.success || !response.data?.session) { return null; } - const session = response.session; + const session = response.data.session; // Convert ISO date strings to timestamps return { ...session, @@ -60,29 +68,35 @@ export const getActiveSession = async (userId: string): Promise => { - await api.put('/sessions/active', session); + await api.put>('/sessions/active', session); }; export const deleteSetFromActiveSession = async (userId: string, setId: string): Promise => { - await api.delete(`/sessions/active/set/${setId}`); + await api.delete>(`/sessions/active/set/${setId}`); }; export const updateSetInActiveSession = async (userId: string, setId: string, setData: Partial): Promise => { - const response = await api.put<{ success: boolean; updatedSet: WorkoutSet }>(`/sessions/active/set/${setId}`, setData); - return response.updatedSet; + const response = await api.put>(`/sessions/active/set/${setId}`, setData); + const updatedSet = response.data.updatedSet; + return { + ...updatedSet, + exerciseName: updatedSet.exercise?.name || 'Unknown', + type: updatedSet.exercise?.type || ExerciseType.STRENGTH + } as WorkoutSet; }; export const deleteActiveSession = async (userId: string): Promise => { - await api.delete('/sessions/active'); + await api.delete>('/sessions/active'); }; export const deleteSession = async (userId: string, id: string): Promise => { - await api.delete(`/sessions/${id}`); + await api.delete>(`/sessions/${id}`); }; export const addSetToActiveSession = async (userId: string, setData: any): Promise => { - return await api.post('/sessions/active/log-set', setData); + const response = await api.post>('/sessions/active/log-set', setData); + return response.data; }; export const deleteAllUserData = (userId: string) => { diff --git a/src/services/weight.ts b/src/services/weight.ts index eb8ba00..f2dd9b2 100644 --- a/src/services/weight.ts +++ b/src/services/weight.ts @@ -1,23 +1,16 @@ import { BodyWeightRecord } from '../types'; +import { api } from './api'; -const API_URL = '/api'; +interface ApiResponse { + success: boolean; + data: T; + error?: string; +} export const getWeightHistory = async (): Promise => { - const token = localStorage.getItem('token'); - if (!token) return []; - try { - const response = await fetch(`${API_URL}/weight`, { - headers: { - 'Authorization': `Bearer ${token}` - } - }); - - if (!response.ok) { - throw new Error('Failed to fetch weight history'); - } - - return await response.json(); + const res = await api.get>('/weight'); + return res.data || []; } catch (error) { console.error('Error fetching weight history:', error); return []; @@ -25,27 +18,12 @@ export const getWeightHistory = async (): Promise => { }; export const logWeight = async (weight: number, dateStr?: string): Promise => { - const token = localStorage.getItem('token'); - if (!token) return null; - try { // Default to today if no date provided const date = dateStr || new Date().toISOString().split('T')[0]; - const response = await fetch(`${API_URL}/weight`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ weight, dateStr: date }) - }); - - if (!response.ok) { - throw new Error('Failed to log weight'); - } - - return await response.json(); + const res = await api.post>('/weight', { weight, dateStr: date }); + return res.data; } catch (error) { console.error('Error logging weight:', error); return null; diff --git a/test_output.txt b/test_output.txt new file mode 100644 index 0000000000000000000000000000000000000000..de2f3f04089ed3674a09e49239fdb49487c1d9f9 GIT binary patch literal 13612 zcmeI3>uwuW5XX_J+>ZD3Oyy{~XF}6axshs>)%UsHbalsQ+Gf+-wZBmdyZRQG?Qz|}e5|K?cZ2Tl#qF=mj^*Pc z-L-YMXI_e*ND*_*ydq)DBeQ^H;gt=sh+5Lsxp0*WJMh4ZlG&N=f1v-`B15wXA zWD7nW*}CUeve(VJm44T6dEC~z+Ja**CccK_ucO4MkoHhC^;GB3w%*nV8Ta#<+zB*} zin*iTcVVRlZ}tc3KZPIJUFbw|XQH2M<)TVK&Ccsg(m}m6=5PoCLbI z?y9brMc>Pg<`x}@l%T7aDe8}`9B_}m4Xp$Wt;Rv$rRl`b?5dpCcVUXI3r*FuOkFeI zP)Uw7jh0q3(vqPlo7CFRG)7MYU*j~CMR6oy>DsU=2`<7SG({0#`z<12RB*=H<%Y5cY-o#ym8wgHUbP$W9sy+_ac7VZdtxO?hhm$%gF zPtq5l=Y7@hy(ydQff{#WwLusi)uK+MRlOxaH$@|XibItfslO|0!LTVMvnDGssk6GN zI%`cmqpyAIJ26hsJMDwzA}ZpgpXv+Tb9R!ln=uO+FFDC~5K_<9M1PjlI{4#E?SQzz zSNJ5;v~OD-3>s%X4mG-XAAT;N1sorzB`~+tcG|4mQprov0rs1={Be4s`F&fjmv-(v z&W+IGyt6dfJ0pmX0-BrFcYCe7X*IKzw}H~SXzz^gMoeX1I- zbe^deGtC^Y#q8snp8wG7l_ir{$F7iSNzb39jIO1!uP5Grp*Kx=bi7ZF8GId$dUA!P z(ExhOF8ho;T`tn8aHC8c?ezGIdGpHz2kE1wHJ1km=a+)4+-zC@JI+mHXv=9j@}KWf3Wrr@gM0Oa@DiafHt1o@yZkDFAEp4;?b1{5Z^-r`()j%$;$ET zJ%F0UUit3*EQ9<``v$D(|JzQ`hTRL=7cR$Mq-ncwO50&YB5jwy?Wh-IJ1W9K&0MVq zyGlum@nCERE_B5j5HE24jN9D?HwVJNJJwo&iHG8*^RkMy8jDYVR_(R27xUVSJ+1s= z_FXH&Kl$#wHs)AuL@_~Z$98qz%xYV7`d6#%rekS)^3#f1ZB<#fJUt`g{NHJ{u)BAt zD?3)scCmMMUp8&1y&U#N&S#c5kgUvE7&3$Y%{A;Z&l~MAz zm5bsf#1DVe`*=JL&XOZX#MkFqeWP8KN76chG|QO~DEXjiF;Aj|E@pgeqkk7R{xP&s zJ@Q52URu4HtU-Fr%*U0|BT+RW{A47GC?@^9y*-yPMWlhOLE=+fmi-B?u$diKx@@b)UVCTns7Cx_mEJ`vb z$z#B8$8wOhNJgZKQj=Q=$4+ci8Nc4|tC1PNt{NH0C*mQQ11_%)%R~MqId=TId^;l8 zzTYUr)5ikiQ9Wp>&y1ydN{=m#CG(NmPtH|;9Q|fYudLkpTK?*!)#YMv-_vS4E0S?S6-n506m7 z34}5W^*Mx+H|B%;XdN$&=)Ji77poK zCM*aK$l4)Si=BCg@=CG~WMYu<= { } console.log('Failed to handle first login. Dumping page content...'); + const fs = require('fs'); // Playwright runs in Node + await fs.writeFileSync('auth_failure.html', await page.content()); console.log(await page.content()); throw e; } diff --git a/tests/data-progress.spec.ts b/tests/data-progress.spec.ts index a9962fd..203f6de 100644 --- a/tests/data-progress.spec.ts +++ b/tests/data-progress.spec.ts @@ -93,7 +93,7 @@ test.describe('IV. Data & Progress', () => { // Complete session await page.getByRole('button', { name: /Free Workout|Start Empty/i }).click(); await page.getByRole('textbox', { name: /Select Exercise/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel('Weight (kg)').first().fill('50'); await page.getByLabel('Reps').first().fill('10'); @@ -130,7 +130,7 @@ test.describe('IV. Data & Progress', () => { await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('10'); @@ -162,7 +162,7 @@ test.describe('IV. Data & Progress', () => { await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('10'); @@ -198,7 +198,7 @@ test.describe('IV. Data & Progress', () => { await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('10'); @@ -231,7 +231,7 @@ test.describe('IV. Data & Progress', () => { await page.getByRole('button', { name: 'Quick Log' }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('12'); @@ -259,7 +259,7 @@ test.describe('IV. Data & Progress', () => { await page.getByRole('button', { name: 'Quick Log' }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('12'); await page.getByRole('button', { name: /Log/i }).click(); @@ -286,7 +286,7 @@ test.describe('IV. Data & Progress', () => { // Session 1 await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('10'); await page.getByRole('button', { name: /Log/i }).click(); @@ -299,7 +299,7 @@ test.describe('IV. Data & Progress', () => { // Session 2 await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('60'); await page.getByLabel(/Reps/i).first().fill('10'); await page.getByRole('button', { name: /Log/i }).click(); @@ -319,7 +319,7 @@ test.describe('IV. Data & Progress', () => { // Session 1 await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('10'); await page.getByRole('button', { name: /Log/i }).click(); @@ -329,7 +329,7 @@ test.describe('IV. Data & Progress', () => { // Session 2 await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('60'); await page.getByLabel(/Reps/i).first().fill('10'); await page.getByRole('button', { name: /Log/i }).click(); @@ -350,7 +350,7 @@ test.describe('IV. Data & Progress', () => { // Session 1 await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('50'); await page.getByLabel(/Reps/i).first().fill('10'); await page.getByRole('button', { name: /Log/i }).click(); @@ -360,7 +360,7 @@ test.describe('IV. Data & Progress', () => { // Session 2 await page.getByRole('button', { name: /Free Workout/i }).click(); await page.getByRole('textbox', { name: /Select/i }).click(); - await page.getByText(exName).click(); + await page.getByRole('button', { name: exName }).click(); await page.getByLabel(/Weight/i).first().fill('60'); await page.getByLabel(/Reps/i).first().fill('10'); await page.getByRole('button', { name: /Log/i }).click(); diff --git a/tests/debug_login.spec.ts b/tests/debug_login.spec.ts new file mode 100644 index 0000000..dc9c4a1 --- /dev/null +++ b/tests/debug_login.spec.ts @@ -0,0 +1,24 @@ +import { test, expect } from './fixtures'; + +test('Debug Login Payload', async ({ page, createUniqueUser }) => { + const user = await createUniqueUser(); + console.log('Created user:', user); + + await page.goto('/'); + + // Intercept login request + await page.route('**/api/auth/login', async route => { + const request = route.request(); + const postData = request.postDataJSON(); + console.log('LOGIN REQUEST BODY:', JSON.stringify(postData, null, 2)); + console.log('LOGIN REQUEST HEADERS:', JSON.stringify(request.headers(), null, 2)); + await route.continue(); + }); + + await page.getByLabel('Email').fill(user.email); + await page.getByLabel('Password').fill(user.password); + await page.getByRole('button', { name: 'Login' }).click(); + + // Wait a bit for request to happen + await page.waitForTimeout(3000); +}); diff --git a/tests/fixtures.ts b/tests/fixtures.ts index 92552b1..782374d 100644 --- a/tests/fixtures.ts +++ b/tests/fixtures.ts @@ -37,13 +37,13 @@ export const test = base.extend({ const body = await response.json(); // If registration fails because we hit a collision (unlikely) or other error, fail the test - if (!response.ok()) { + if (!response.ok() || !body.success) { console.error(`REGISTRATION FAILED: ${response.status()} ${response.statusText()}`); console.error(`RESPONSE BODY: ${JSON.stringify(body, null, 2)}`); throw new Error(`Failed to register user: ${JSON.stringify(body)}`); } - return { email, password, id: body.user.id, token: body.token }; + return { email, password, id: body.data.user.id, token: body.data.token }; }; // Use the fixture @@ -65,7 +65,7 @@ export const test = base.extend({ try { const { stdout, stderr } = await exec(`npx ts-node promote_admin.ts ${user.email}`, { cwd: 'server', - env: { ...process.env, APP_MODE: 'test', DATABASE_URL: 'file:./prisma/test.db', DATABASE_URL_TEST: 'file:./prisma/test.db' } + env: { ...process.env, APP_MODE: 'test', DATABASE_URL: 'file:d:/Coding/gymflow/server/test.db', DATABASE_URL_TEST: 'file:d:/Coding/gymflow/server/test.db' } }); if (stderr) { console.error(`Promote Admin Stderr: ${stderr}`); @@ -74,8 +74,10 @@ export const test = base.extend({ if (!stdout.includes(`User ${user.email} promoted to ADMIN`)) { throw new Error('Admin promotion failed or unexpected output.'); } - } catch (error) { + } catch (error: any) { console.error(`Error promoting user ${user.email} to ADMIN:`, error); + if (error.stdout) console.log(`Failed CMD Stdout: ${error.stdout}`); + if (error.stderr) console.error(`Failed CMD Stderr: ${error.stderr}`); throw error; } return user; diff --git a/tests/smoke.spec.ts b/tests/smoke.spec.ts new file mode 100644 index 0000000..d92539f --- /dev/null +++ b/tests/smoke.spec.ts @@ -0,0 +1,52 @@ +import { test, expect } from '@playwright/test'; + +test.describe('Smoke Tests - Backend Refactor', () => { + test('Login, Exercises, and Session Flow', async ({ request }) => { + const email = `smoke_${Date.now()}@example.com`; + const password = 'password123'; + + // 1. Register + const registerRes = await request.post('http://localhost:3001/api/auth/register', { + data: { email, password } + }); + expect(registerRes.ok()).toBeTruthy(); + const registerBody = await registerRes.json(); + // Check new structure + expect(registerBody.success).toBe(true); + expect(registerBody.data).toHaveProperty('token'); + const token = registerBody.data.token; + + // 2. Get Exercises + const exercisesRes = await request.get('http://localhost:3001/api/exercises', { + headers: { Authorization: `Bearer ${token}` } + }); + expect(exercisesRes.ok()).toBeTruthy(); + const exercisesBody = await exercisesRes.json(); + expect(exercisesBody.success).toBe(true); + expect(Array.isArray(exercisesBody.data)).toBe(true); + + // 3. Create Session + const sessionRes = await request.post('http://localhost:3001/api/sessions', { + headers: { Authorization: `Bearer ${token}` }, + data: { + id: "test-session-" + Date.now(), + startTime: new Date().toISOString(), + sets: [] + } + }); + expect(sessionRes.ok()).toBeTruthy(); + const sessionBody = await sessionRes.json(); + expect(sessionBody.success).toBe(true); + expect(sessionBody.data).toHaveProperty('id'); + + // 4. Get Active Session + const activeRes = await request.get('http://localhost:3001/api/sessions/active', { + headers: { Authorization: `Bearer ${token}` } + }); + expect(activeRes.ok()).toBeTruthy(); + const activeBody = await activeRes.json(); + expect(activeBody.success).toBe(true); + expect(activeBody.data).toHaveProperty('session'); + expect(activeBody.data.session.id).toBe(sessionBody.data.id); + }); +}); diff --git a/vite.config.ts b/vite.config.ts index fd5f6dc..c35dd7d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -10,7 +10,7 @@ export default defineConfig(({ mode }) => { host: '0.0.0.0', proxy: { '/api': { - target: 'http://127.0.0.1:3001', + target: 'http://localhost:3001', changeOrigin: true, secure: false, }