diff --git a/Backend/v1/package-lock.json b/Backend/v1/package-lock.json index 72ddd3b..94ec815 100644 --- a/Backend/v1/package-lock.json +++ b/Backend/v1/package-lock.json @@ -6,16 +6,18 @@ "": { "name": "v1", "dependencies": { - "@prisma/client": "^6.9.0", + "@prisma/client": "^6.12.0", "@prisma/extension-accelerate": "^2.0.1", + "argon2": "^0.43.1", "express": "^5.1.0", "hono": "^4.7.7" }, "devDependencies": { "@cloudflare/workers-types": "^4.20250214.0", + "@types/argon2": "^0.14.1", "@types/node": "^22.15.30", - "prisma": "^6.9.0", - "wrangler": "^4.4.0" + "prisma": "^6.12.0", + "wrangler": "^4.25.1" } }, "node_modules/@cloudflare/kv-asset-handler": { @@ -32,14 +34,14 @@ } }, "node_modules/@cloudflare/unenv-preset": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.1.tgz", - "integrity": "sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.3.3.tgz", + "integrity": "sha512-/M3MEcj3V2WHIRSW1eAQBPRJ6JnGQHc6JKMAPLkDb7pLs3m6X9ES/+K3ceGqxI6TKeF32AWAi7ls0AYzVxCP0A==", "dev": true, "license": "MIT OR Apache-2.0", "peerDependencies": { - "unenv": "2.0.0-rc.15", - "workerd": "^1.20250320.0" + "unenv": "2.0.0-rc.17", + "workerd": "^1.20250508.0" }, "peerDependenciesMeta": { "workerd": { @@ -48,9 +50,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-64": { - "version": "1.20250410.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250410.0.tgz", - "integrity": "sha512-U3Pb+pr6DYeESXGiDAS/SKTVBoDA/BbFyiTTi4BJSdk2I703vaDJGH4k1jFsOJmb/S+Gy7w5xVJwHgZA7w6Kaw==", + "version": "1.20250712.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20250712.0.tgz", + "integrity": "sha512-M6S6a/LQ0Jb0R+g0XhlYi1adGifvYmxA5mD/i9TuZZgjs2bIm5ELuka/n3SCnI98ltvlx3HahRaHagAtOilsFg==", "cpu": [ "x64" ], @@ -65,9 +67,9 @@ } }, "node_modules/@cloudflare/workerd-darwin-arm64": { - "version": "1.20250410.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250410.0.tgz", - "integrity": "sha512-stvgUOVDXGBdV1HTEdgcQ/d/c9T4Vrmg+8OJK4HXn6uM1spMediyQXed64greG0I5rNJ0pTPq0uZsfCjn9T7cA==", + "version": "1.20250712.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20250712.0.tgz", + "integrity": "sha512-7sFzn6rvAcnLy7MktFL42dYtzL0Idw/kiUmNf2P3TvsBRoShhLK5ZKhbw+NAhvU8e4pXWm5lkE0XmpieA0zNjw==", "cpu": [ "arm64" ], @@ -82,9 +84,9 @@ } }, "node_modules/@cloudflare/workerd-linux-64": { - "version": "1.20250410.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250410.0.tgz", - "integrity": "sha512-n7BRelPUc7+UNVKlS7z/uhI6xqsoyoZayjrezLcZ54IY4o9XASt4oc4kFDrc5ow9YNW94sq2tBG8z/ZQ9wBjLA==", + "version": "1.20250712.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20250712.0.tgz", + "integrity": "sha512-EFRrGe/bqK7NHtht7vNlbrDpfvH3eRvtJOgsTpEQEysDjVmlK6pVJxSnLy9Hg1zlLY15IfhfGC+K2qisseHGJQ==", "cpu": [ "x64" ], @@ -99,9 +101,9 @@ } }, "node_modules/@cloudflare/workerd-linux-arm64": { - "version": "1.20250410.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250410.0.tgz", - "integrity": "sha512-R9zE5LhVQCgIPIB/LWSt+XqFjzkPRfkLk4pqae8OYhMg0Dr3G7xO/xNxIabCVNPHhF7dj2yXfMyLGX603Y8/LQ==", + "version": "1.20250712.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20250712.0.tgz", + "integrity": "sha512-rG8JUleddhUHQVwpXOYv0VbL0S9kOtR9PNKecgVhFpxEhC8aTeg2HNBBjo8st7IfcUvY8WaW3pD3qdAMZ05UwQ==", "cpu": [ "arm64" ], @@ -116,9 +118,9 @@ } }, "node_modules/@cloudflare/workerd-windows-64": { - "version": "1.20250410.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250410.0.tgz", - "integrity": "sha512-UcoQ2u+TQcKNEQUXBRsoqfXibOCklCilukN5xxz7svuAi1f2P0/lR29iuq6DBEwDu/GqQd6H5WLrczXwfPLZsQ==", + "version": "1.20250712.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20250712.0.tgz", + "integrity": "sha512-qS8H5RCYwE21Om9wo5/F807ClBJIfknhuLBj16eYxvJcj9JqgAKWi12BGgjyGxHuJJjeoQ63lr4wHAdbFntDDg==", "cpu": [ "x64" ], @@ -133,9 +135,9 @@ } }, "node_modules/@cloudflare/workers-types": { - "version": "4.20250416.0", - "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250416.0.tgz", - "integrity": "sha512-i37TX0Clp+MrPdXMBdvKZM7JghCrWD9GtG7E+8ANOAPmtZjUkZfEy9qq46IG3XlNpagPaWDkY3SgJ3s01gPxCw==", + "version": "4.20250719.0", + "resolved": "https://registry.npmjs.org/@cloudflare/workers-types/-/workers-types-4.20250719.0.tgz", + "integrity": "sha512-tSc2FM2QPWA8ZmDniQXz+4qVKuf8zrwVwqlkXxxGBsQHxTpcukuMibYcYWxwonzbzK7YzSug+iena2F8gGOuOw==", "dev": true, "license": "MIT OR Apache-2.0" }, @@ -153,9 +155,9 @@ } }, "node_modules/@emnapi/runtime": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz", - "integrity": "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", + "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", "dev": true, "license": "MIT", "optional": true, @@ -164,9 +166,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.2.tgz", - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", "cpu": [ "ppc64" ], @@ -181,9 +183,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.2.tgz", - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", "cpu": [ "arm" ], @@ -198,9 +200,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.2.tgz", - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", "cpu": [ "arm64" ], @@ -215,9 +217,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.2.tgz", - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", "cpu": [ "x64" ], @@ -232,9 +234,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.2.tgz", - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", "cpu": [ "arm64" ], @@ -249,9 +251,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.2.tgz", - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", "cpu": [ "x64" ], @@ -266,9 +268,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.2.tgz", - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", "cpu": [ "arm64" ], @@ -283,9 +285,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.2.tgz", - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", "cpu": [ "x64" ], @@ -300,9 +302,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.2.tgz", - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", "cpu": [ "arm" ], @@ -317,9 +319,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.2.tgz", - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", "cpu": [ "arm64" ], @@ -334,9 +336,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.2.tgz", - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", "cpu": [ "ia32" ], @@ -351,9 +353,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.2.tgz", - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", "cpu": [ "loong64" ], @@ -368,9 +370,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.2.tgz", - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", "cpu": [ "mips64el" ], @@ -385,9 +387,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.2.tgz", - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", "cpu": [ "ppc64" ], @@ -402,9 +404,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.2.tgz", - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", "cpu": [ "riscv64" ], @@ -419,9 +421,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.2.tgz", - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", "cpu": [ "s390x" ], @@ -436,9 +438,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.2.tgz", - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", "cpu": [ "x64" ], @@ -453,9 +455,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.2.tgz", - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", "cpu": [ "arm64" ], @@ -470,9 +472,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.2.tgz", - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", "cpu": [ "x64" ], @@ -487,9 +489,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.2.tgz", - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", "cpu": [ "arm64" ], @@ -504,9 +506,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.2.tgz", - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", "cpu": [ "x64" ], @@ -521,9 +523,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.2.tgz", - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", "cpu": [ "x64" ], @@ -538,9 +540,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.2.tgz", - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", "cpu": [ "arm64" ], @@ -555,9 +557,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.2.tgz", - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", "cpu": [ "ia32" ], @@ -572,9 +574,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.2.tgz", - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", "cpu": [ "x64" ], @@ -588,16 +590,6 @@ "node": ">=18" } }, - "node_modules/@fastify/busboy": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.1.tgz", - "integrity": "sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } - }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz", @@ -989,9 +981,9 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", "dev": true, "license": "MIT" }, @@ -1006,10 +998,48 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@poppinss/colors": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.5.tgz", + "integrity": "sha512-FvdDqtcRCtz6hThExcFOgW0cWX+xwSMWcRuQe5ZEb2m7cVQOAVZOIMt+/v9RxGiD9/OY16qJBXK4CVKWAPalBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "kleur": "^4.1.5" + } + }, + "node_modules/@poppinss/dumper": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.4.tgz", + "integrity": "sha512-iG0TIdqv8xJ3Lt9O8DrPRxw1MRLjNpoqiSGU03P/wNLP/s0ra0udPJ1J2Tx5M0J3H/cVyEgpbn8xUKRY9j59kQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/colors": "^4.1.5", + "@sindresorhus/is": "^7.0.2", + "supports-color": "^10.0.0" + } + }, + "node_modules/@poppinss/exception": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.2.tgz", + "integrity": "sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==", + "dev": true, + "license": "MIT" + }, "node_modules/@prisma/client": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.9.0.tgz", - "integrity": "sha512-Gg7j1hwy3SgF1KHrh0PZsYvAaykeR0PaxusnLXydehS96voYCGt1U5zVR31NIouYc63hWzidcrir1a7AIyCsNQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@prisma/client/-/client-6.12.0.tgz", + "integrity": "sha512-wn98bJ3Cj6edlF4jjpgXwbnQIo/fQLqqQHPk2POrZPxTlhY3+n90SSIF3LMRVa8VzRFC/Gec3YKJRxRu+AIGVA==", "hasInstallScript": true, "license": "Apache-2.0", "engines": { @@ -1029,9 +1059,9 @@ } }, "node_modules/@prisma/config": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.9.0.tgz", - "integrity": "sha512-Wcfk8/lN3WRJd5w4jmNQkUwhUw0eksaU/+BlAJwPQKW10k0h0LC9PD/6TQFmqKVbHQL0vG2z266r0S1MPzzhbA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@prisma/config/-/config-6.12.0.tgz", + "integrity": "sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -1039,30 +1069,30 @@ } }, "node_modules/@prisma/debug": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.9.0.tgz", - "integrity": "sha512-bFeur/qi/Q+Mqk4JdQ3R38upSYPebv5aOyD1RKywVD+rAMLtRkmTFn28ZuTtVOnZHEdtxnNOCH+bPIeSGz1+Fg==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@prisma/debug/-/debug-6.12.0.tgz", + "integrity": "sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ==", "devOptional": true, "license": "Apache-2.0" }, "node_modules/@prisma/engines": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.9.0.tgz", - "integrity": "sha512-im0X0bwDLA0244CDf8fuvnLuCQcBBdAGgr+ByvGfQY9wWl6EA+kRGwVk8ZIpG65rnlOwtaWIr/ZcEU5pNVvq9g==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-6.12.0.tgz", + "integrity": "sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.9.0", - "@prisma/engines-version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e", - "@prisma/fetch-engine": "6.9.0", - "@prisma/get-platform": "6.9.0" + "@prisma/debug": "6.12.0", + "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", + "@prisma/fetch-engine": "6.12.0", + "@prisma/get-platform": "6.12.0" } }, "node_modules/@prisma/engines-version": { - "version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e", - "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e.tgz", - "integrity": "sha512-Qp9gMoBHgqhKlrvumZWujmuD7q4DV/gooEyPCLtbkc13EZdSz2RsGUJ5mHb3RJgAbk+dm6XenqG7obJEhXcJ6Q==", + "version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", + "resolved": "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc.tgz", + "integrity": "sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ==", "devOptional": true, "license": "Apache-2.0" }, @@ -1078,25 +1108,55 @@ } }, "node_modules/@prisma/fetch-engine": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.9.0.tgz", - "integrity": "sha512-PMKhJdl4fOdeE3J3NkcWZ+tf3W6rx3ht/rLU8w4SXFRcLhd5+3VcqY4Kslpdm8osca4ej3gTfB3+cSk5pGxgFg==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.12.0.tgz", + "integrity": "sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.9.0", - "@prisma/engines-version": "6.9.0-10.81e4af48011447c3cc503a190e86995b66d2a28e", - "@prisma/get-platform": "6.9.0" + "@prisma/debug": "6.12.0", + "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", + "@prisma/get-platform": "6.12.0" } }, "node_modules/@prisma/get-platform": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.9.0.tgz", - "integrity": "sha512-/B4n+5V1LI/1JQcHp+sUpyRT1bBgZVPHbsC4lt4/19Xp4jvNIVcq5KYNtQDk5e/ukTSjo9PZVAxxy9ieFtlpTQ==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.12.0.tgz", + "integrity": "sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA==", "devOptional": true, "license": "Apache-2.0", "dependencies": { - "@prisma/debug": "6.9.0" + "@prisma/debug": "6.12.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-7.0.2.tgz", + "integrity": "sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@speed-highlight/core": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.7.tgz", + "integrity": "sha512-0dxmVj4gxg3Jg879kvFS/msl4s9F3T9UXC1InxgOf7t5NvcPD97u/WTA5vL/IxWHMn7qSxBozqrnnE2wvl1m8g==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/@types/argon2": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@types/argon2/-/argon2-0.14.1.tgz", + "integrity": "sha512-PH5bYzOBbjluvhsbrIjhst7hkfRH8FUkJWRpRpahRpks6M3RjuMQQrW4n+Qrp616o8nBoM5ooRkDYIiT7Gb+tA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" } }, "node_modules/@types/node": { @@ -1145,14 +1205,19 @@ "node": ">=0.4.0" } }, - "node_modules/as-table": { - "version": "1.0.55", - "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", - "dev": true, + "node_modules/argon2": { + "version": "0.43.1", + "resolved": "https://registry.npmjs.org/argon2/-/argon2-0.43.1.tgz", + "integrity": "sha512-TfOzvDWUaQPurCT1hOwIeFNkgrAJDpbBGBGWDgzDsm11nNhImc13WhdGdCU6K7brkp8VpeY07oGtSex0Wmhg8w==", + "hasInstallScript": true, "license": "MIT", "dependencies": { - "printable-characters": "^1.0.42" + "@phc/format": "^1.0.0", + "node-addon-api": "^8.4.0", + "node-gyp-build": "^4.8.4" + }, + "engines": { + "node": ">=16.17.0" } }, "node_modules/blake3-wasm": { @@ -1226,7 +1291,6 @@ "integrity": "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" @@ -1241,7 +1305,6 @@ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -1254,8 +1317,7 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/color-string": { "version": "1.9.1", @@ -1263,7 +1325,6 @@ "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" @@ -1308,13 +1369,6 @@ "node": ">=6.6.0" } }, - "node_modules/data-uri-to-buffer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-2.0.2.tgz", - "integrity": "sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==", - "dev": true, - "license": "MIT" - }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -1349,12 +1403,11 @@ } }, "node_modules/detect-libc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.3.tgz", - "integrity": "sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", "dev": true, "license": "Apache-2.0", - "optional": true, "engines": { "node": ">=8" } @@ -1388,6 +1441,16 @@ "node": ">= 0.8" } }, + "node_modules/error-stack-parser-es": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz", + "integrity": "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -1419,9 +1482,9 @@ } }, "node_modules/esbuild": { - "version": "0.25.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz", - "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -1432,31 +1495,31 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.2", - "@esbuild/android-arm": "0.25.2", - "@esbuild/android-arm64": "0.25.2", - "@esbuild/android-x64": "0.25.2", - "@esbuild/darwin-arm64": "0.25.2", - "@esbuild/darwin-x64": "0.25.2", - "@esbuild/freebsd-arm64": "0.25.2", - "@esbuild/freebsd-x64": "0.25.2", - "@esbuild/linux-arm": "0.25.2", - "@esbuild/linux-arm64": "0.25.2", - "@esbuild/linux-ia32": "0.25.2", - "@esbuild/linux-loong64": "0.25.2", - "@esbuild/linux-mips64el": "0.25.2", - "@esbuild/linux-ppc64": "0.25.2", - "@esbuild/linux-riscv64": "0.25.2", - "@esbuild/linux-s390x": "0.25.2", - "@esbuild/linux-x64": "0.25.2", - "@esbuild/netbsd-arm64": "0.25.2", - "@esbuild/netbsd-x64": "0.25.2", - "@esbuild/openbsd-arm64": "0.25.2", - "@esbuild/openbsd-x64": "0.25.2", - "@esbuild/sunos-x64": "0.25.2", - "@esbuild/win32-arm64": "0.25.2", - "@esbuild/win32-ia32": "0.25.2", - "@esbuild/win32-x64": "0.25.2" + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" } }, "node_modules/escape-html": { @@ -1530,9 +1593,9 @@ } }, "node_modules/exsolve": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.4.tgz", - "integrity": "sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", "dev": true, "license": "MIT" }, @@ -1632,17 +1695,6 @@ "node": ">= 0.4" } }, - "node_modules/get-source": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/get-source/-/get-source-2.0.12.tgz", - "integrity": "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "data-uri-to-buffer": "^2.0.0", - "source-map": "^0.6.1" - } - }, "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", @@ -1752,8 +1804,7 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", "dev": true, - "license": "MIT", - "optional": true + "license": "MIT" }, "node_modules/is-promise": { "version": "4.0.0", @@ -1771,6 +1822,16 @@ "jiti": "lib/jiti-cli.mjs" } }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -1836,9 +1897,9 @@ } }, "node_modules/miniflare": { - "version": "4.20250410.1", - "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250410.1.tgz", - "integrity": "sha512-xnJEyLbEBMFTIbiamt/BLQLeTj7iMsnsZANhZIHYBP+4YfwFQ20XAGDZ14U3AQ9yz30N3EhRcim8wIcZn75KLQ==", + "version": "4.20250712.1", + "resolved": "https://registry.npmjs.org/miniflare/-/miniflare-4.20250712.1.tgz", + "integrity": "sha512-46gB3FGPOsy+EpFGufjhr8agYycO/55d6l0y7hNJ13NcTVwrObMg/0HmI3pC5yQj0974IVXzBgUfDBMAX6thow==", "dev": true, "license": "MIT", "dependencies": { @@ -1847,11 +1908,12 @@ "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", + "sharp": "^0.33.5", "stoppable": "1.1.0", - "undici": "^5.28.5", - "workerd": "1.20250410.0", + "undici": "^7.10.0", + "workerd": "1.20250712.0", "ws": "8.18.0", - "youch": "3.3.4", + "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { @@ -1867,16 +1929,6 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mustache": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz", - "integrity": "sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==", - "dev": true, - "license": "MIT", - "bin": { - "mustache": "bin/mustache" - } - }, "node_modules/negotiator": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", @@ -1886,6 +1938,26 @@ "node": ">= 0.6" } }, + "node_modules/node-addon-api": { + "version": "8.5.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", + "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", + "license": "MIT", + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, + "node_modules/node-gyp-build": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", + "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", + "license": "MIT", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", @@ -1949,23 +2021,16 @@ "dev": true, "license": "MIT" }, - "node_modules/printable-characters": { - "version": "1.0.42", - "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", - "dev": true, - "license": "Unlicense" - }, "node_modules/prisma": { - "version": "6.9.0", - "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.9.0.tgz", - "integrity": "sha512-resJAwMyZREC/I40LF6FZ6rZTnlrlrYrb63oW37Gq+U+9xHwbyMSPJjKtM7VZf3gTO86t/Oyz+YeSXr3CmAY1Q==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/prisma/-/prisma-6.12.0.tgz", + "integrity": "sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg==", "devOptional": true, "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@prisma/config": "6.9.0", - "@prisma/engines": "6.9.0" + "@prisma/config": "6.12.0", + "@prisma/engines": "6.12.0" }, "bin": { "prisma": "build/index.js" @@ -2086,12 +2151,11 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", - "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", - "optional": true, "bin": { "semver": "bin/semver.js" }, @@ -2149,7 +2213,6 @@ "dev": true, "hasInstallScript": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", @@ -2261,32 +2324,10 @@ "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { "is-arrayish": "^0.3.1" } }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stacktracey": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/stacktracey/-/stacktracey-2.1.8.tgz", - "integrity": "sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==", - "dev": true, - "license": "Unlicense", - "dependencies": { - "as-table": "^1.0.36", - "get-source": "^2.0.12" - } - }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -2307,6 +2348,19 @@ "npm": ">=6" } }, + "node_modules/supports-color": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-10.0.0.tgz", + "integrity": "sha512-HRVVSbCCMbj7/kdWF9Q+bbckjBHLtHMEoJWlkmYzzdwhYMkjkOwubLM6t7NbWKjgKamGDrWL1++KrjUO1t9oAQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -2346,16 +2400,13 @@ "license": "MIT" }, "node_modules/undici": { - "version": "5.29.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.29.0.tgz", - "integrity": "sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.12.0.tgz", + "integrity": "sha512-GrKEsc3ughskmGA9jevVlIOPMiiAHJ4OFUtaAH+NhfTUSiZ1wMPIQqQvAJUrJspFXJt3EBWgpAeoHEDVT1IBug==", "dev": true, "license": "MIT", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, "engines": { - "node": ">=14.0" + "node": ">=20.18.1" } }, "node_modules/undici-types": { @@ -2366,9 +2417,9 @@ "license": "MIT" }, "node_modules/unenv": { - "version": "2.0.0-rc.15", - "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.15.tgz", - "integrity": "sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==", + "version": "2.0.0-rc.17", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.17.tgz", + "integrity": "sha512-B06u0wXkEd+o5gOCMl/ZHl5cfpYbDZKAT+HWTL+Hws6jWu7dCiqBBXXXzMFcFVJb8D4ytAnYmxJA83uwOQRSsg==", "dev": true, "license": "MIT", "dependencies": { @@ -2376,7 +2427,7 @@ "exsolve": "^1.0.4", "ohash": "^2.0.11", "pathe": "^2.0.3", - "ufo": "^1.5.4" + "ufo": "^1.6.1" } }, "node_modules/unpipe": { @@ -2398,9 +2449,9 @@ } }, "node_modules/workerd": { - "version": "1.20250410.0", - "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250410.0.tgz", - "integrity": "sha512-W7vy1+Z3+jpLr68nmda3VFapn284VwIb22TZlI1LbCvThAiNABIa/t06bTE9mohSjUudFou9rc9de49fUvrUDQ==", + "version": "1.20250712.0", + "resolved": "https://registry.npmjs.org/workerd/-/workerd-1.20250712.0.tgz", + "integrity": "sha512-7h+k1OxREpiZW0849g0uQNexRWMcs5i5gUGhJzCY8nIx6Tv4D/ndlXJ47lEFj7/LQdp165IL9dM2D5uDiedZrg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -2411,28 +2462,28 @@ "node": ">=16" }, "optionalDependencies": { - "@cloudflare/workerd-darwin-64": "1.20250410.0", - "@cloudflare/workerd-darwin-arm64": "1.20250410.0", - "@cloudflare/workerd-linux-64": "1.20250410.0", - "@cloudflare/workerd-linux-arm64": "1.20250410.0", - "@cloudflare/workerd-windows-64": "1.20250410.0" + "@cloudflare/workerd-darwin-64": "1.20250712.0", + "@cloudflare/workerd-darwin-arm64": "1.20250712.0", + "@cloudflare/workerd-linux-64": "1.20250712.0", + "@cloudflare/workerd-linux-arm64": "1.20250712.0", + "@cloudflare/workerd-windows-64": "1.20250712.0" } }, "node_modules/wrangler": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.11.1.tgz", - "integrity": "sha512-xA+Z6N/aqarTUcrOb8OSKewITUqtvFW+nGP5hz/5hlJTzdB1a3dh9pGMQop0SPuraa44sxqIQnxNqPSAEuasew==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/wrangler/-/wrangler-4.25.1.tgz", + "integrity": "sha512-4Tlg+jmqxCX3xFm+Nz1b4jHHY9iOu1EyJ17SSCCJ6MGp+FCGtXgr+CynT94+MP0v/qKQUkMKjoeJ5FNDunZ9cA==", "dev": true, "license": "MIT OR Apache-2.0", "dependencies": { "@cloudflare/kv-asset-handler": "0.4.0", - "@cloudflare/unenv-preset": "2.3.1", + "@cloudflare/unenv-preset": "2.3.3", "blake3-wasm": "2.1.5", - "esbuild": "0.25.2", - "miniflare": "4.20250410.1", + "esbuild": "0.25.4", + "miniflare": "4.20250712.1", "path-to-regexp": "6.3.0", - "unenv": "2.0.0-rc.15", - "workerd": "1.20250410.0" + "unenv": "2.0.0-rc.17", + "workerd": "1.20250712.0" }, "bin": { "wrangler": "bin/wrangler.js", @@ -2442,11 +2493,10 @@ "node": ">=18.0.0" }, "optionalDependencies": { - "fsevents": "~2.3.2", - "sharp": "^0.33.5" + "fsevents": "~2.3.2" }, "peerDependencies": { - "@cloudflare/workers-types": "^4.20250410.0" + "@cloudflare/workers-types": "^4.20250712.0" }, "peerDependenciesMeta": { "@cloudflare/workers-types": { @@ -2483,15 +2533,38 @@ } }, "node_modules/youch": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.4.tgz", - "integrity": "sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==", + "version": "4.1.0-beta.10", + "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz", + "integrity": "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==", "dev": true, "license": "MIT", "dependencies": { - "cookie": "^0.7.1", - "mustache": "^4.2.0", - "stacktracey": "^2.1.8" + "@poppinss/colors": "^4.1.5", + "@poppinss/dumper": "^0.6.4", + "@speed-highlight/core": "^1.2.7", + "cookie": "^1.0.2", + "youch-core": "^0.3.3" + } + }, + "node_modules/youch-core": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz", + "integrity": "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@poppinss/exception": "^1.2.2", + "error-stack-parser-es": "^1.0.5" + } + }, + "node_modules/youch/node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, "node_modules/zod": { diff --git a/Backend/v1/package.json b/Backend/v1/package.json index ff5f43d..c311957 100644 --- a/Backend/v1/package.json +++ b/Backend/v1/package.json @@ -8,15 +8,17 @@ "prisma:studio": "prisma studio" }, "dependencies": { - "@prisma/client": "^6.9.0", + "@prisma/client": "^6.12.0", "@prisma/extension-accelerate": "^2.0.1", + "argon2": "^0.43.1", "express": "^5.1.0", "hono": "^4.7.7" }, "devDependencies": { "@cloudflare/workers-types": "^4.20250214.0", + "@types/argon2": "^0.14.1", "@types/node": "^22.15.30", - "prisma": "^6.9.0", - "wrangler": "^4.4.0" + "prisma": "^6.12.0", + "wrangler": "^4.25.1" } } diff --git a/Backend/v1/prisma/migrations/20250723163615_init/migration.sql b/Backend/v1/prisma/migrations/20250723163615_init/migration.sql new file mode 100644 index 0000000..08486d3 --- /dev/null +++ b/Backend/v1/prisma/migrations/20250723163615_init/migration.sql @@ -0,0 +1,8 @@ +/* + Warnings: + + - You are about to drop the `PageViews` table. If the table is not empty, all the data it contains will be lost. + +*/ +-- DropTable +DROP TABLE "PageViews"; diff --git a/Backend/v1/prisma/schema.prisma b/Backend/v1/prisma/schema.prisma index 215dfcd..4f8fee8 100644 --- a/Backend/v1/prisma/schema.prisma +++ b/Backend/v1/prisma/schema.prisma @@ -132,4 +132,20 @@ model Visitor { staffId String? user User? @relation("UserVisits", fields: [userId], references: [uniqueId]) staff Staff? @relation("StaffVisits", fields: [staffId], references: [staffId]) +} + +model BoardMember { + id Int @id @default(autoincrement()) + name String + image String + title String + tagline String + post String +} + +model CarouselImage { + id Int @id @default(autoincrement()) + image String + title String + tagline String } \ No newline at end of file diff --git a/Backend/v1/src/index.ts b/Backend/v1/src/index.ts index e1ff28b..fe509f7 100644 --- a/Backend/v1/src/index.ts +++ b/Backend/v1/src/index.ts @@ -2,6 +2,7 @@ import { Hono } from "hono"; import { PrismaClient } from '@prisma/client/edge'; import { withAccelerate } from '@prisma/extension-accelerate'; import { cors } from 'hono/cors'; +import userRouter from "./routes/userRouter"; const app = new Hono(); @@ -26,6 +27,11 @@ app.get("/", (c) => { ); }); +// In your main app file (index.ts or similar) +app.route('/user', userRouter); +app.route('/about', aboutRouter); + + // Initialize Prisma client const prisma = new PrismaClient({ datasourceUrl: process.env.DIRECT_URL diff --git a/Backend/v1/src/routes/about.ts b/Backend/v1/src/routes/about.ts new file mode 100644 index 0000000..123f358 --- /dev/null +++ b/Backend/v1/src/routes/about.ts @@ -0,0 +1,73 @@ +import { Hono } from 'hono'; +import { PrismaClient } from '@prisma/client/edge'; +import { withAccelerate } from '@prisma/extension-accelerate'; +import { cors } from 'hono/cors'; + +const aboutRouter = new Hono(); + +// Initialize Prisma client +const prisma = new PrismaClient({ + datasourceUrl: process.env.DIRECT_URL +}).$extends(withAccelerate()); + +aboutRouter.use('/*', cors({ + origin: ['http://localhost:5173', 'https://codeclubagpit.vercel.app'], + allowMethods: ['GET', 'OPTIONS'], + allowHeaders: ['Content-Type'], + exposeHeaders: ['Content-Length'], + maxAge: 600, + credentials: true, +})); + +aboutRouter.options('*', (c) => { + return new Response(null, { status: 204 }); +}); + + +aboutRouter.get('/board-members', async (c) => { + try { + const boardMembers = await prisma.boardMember.findMany({ + select: { + id: true, + name: true, + image: true, + title: true, + tagline: true, + post: true, + }, + }); + + return c.json({ success: true, boardMembers }); + } catch (error) { + console.error('Board members fetch error:', error); + return c.json({ + success: false, + message: 'Internal server error', + details: error instanceof Error ? error.message : 'Unknown error' + }, 500); + } +}); + +aboutRouter.get('/carousel-images', async (c) => { + try { + const images = await prisma.carouselImage.findMany({ + select: { + id: true, + image: true, + title: true, + tagline: true, + }, + }); + + return c.json({ success: true, images }); + } catch (error) { + console.error('Carousel images fetch error:', error); + return c.json({ + success: false, + message: 'Internal server error', + details: error instanceof Error ? error.message : 'Unknown error' + }, 500); + } +}); + +export default aboutRouter; \ No newline at end of file diff --git a/Backend/v1/src/routes/eventRouter.ts b/Backend/v1/src/routes/eventRouter.ts new file mode 100644 index 0000000..ee84c44 --- /dev/null +++ b/Backend/v1/src/routes/eventRouter.ts @@ -0,0 +1,56 @@ +import { Hono } from 'hono'; +import { PrismaClient } from '@prisma/client/edge'; +import { withAccelerate } from '@prisma/extension-accelerate'; +import { cors } from 'hono/cors'; + +// Define the events router +const eventsRouter = new Hono(); + +// Initialize Prisma client +const prisma = new PrismaClient({ + datasourceUrl: process.env.DIRECT_URL +}).$extends(withAccelerate()); + +// Apply CORS middleware for events routes +eventsRouter.use('/*', cors({ + origin: ['http://localhost:5173', 'https://codeclubagpit.vercel.app'], + allowMethods: ['GET', 'OPTIONS'], + allowHeaders: ['Content-Type'], + exposeHeaders: ['Content-Length'], + maxAge: 600, + credentials: true, +})); + +// Handle preflight requests +eventsRouter.options('*', (c) => { + return new Response(null, { status: 204 }); +}); + +// Events route +eventsRouter.get('/events', async (c) => { + try { + const events = await prisma.event.findMany({ + select: { + name1: true, + year: true, + detail: true, + description: true, + image1: true, + image2: true, + image3: true, + status: true, + }, + }); + + return c.json({ success: true, events }); + } catch (error) { + console.error('Events fetch error:', error); + return c.json({ + success: false, + message: 'Internal server error', + details: error instanceof Error ? error.message : 'Unknown error' + }, 500); + } +}); + +export default eventsRouter; \ No newline at end of file diff --git a/Backend/v1/src/routes/userRouter.ts b/Backend/v1/src/routes/userRouter.ts new file mode 100644 index 0000000..eb1d14b --- /dev/null +++ b/Backend/v1/src/routes/userRouter.ts @@ -0,0 +1,208 @@ +import { Hono } from 'hono'; +import { PrismaClient } from '@prisma/client/edge'; +import { withAccelerate } from '@prisma/extension-accelerate'; +import { z } from 'zod'; +import { sign, verify } from 'hono/jwt'; +import { hash, verify as argonVerify } from 'argon2'; +import { cors } from 'hono/cors'; + +// Define the user router +const userRouter = new Hono(); + +// Initialize Prisma client +const prisma = new PrismaClient({ + datasourceUrl: process.env.DIRECT_URL +}).$extends(withAccelerate()); + +// Zod schemas for input validation (matching frontend) +const userSignupInput = z.object({ + name: z.string().min(1, 'Name is required'), + email: z.string().email('Invalid email address'), + password: z.string().min(8, 'Password must be at least 8 characters'), +}); + +const userSigninInput = z.object({ + email: z.string().email('Invalid email address'), + password: z.string().min(8, 'Password must be at least 8 characters'), +}); + +// Zod schema for board type validation +const boardTypeSchema = z.enum(['TY', 'SY', 'FY']); + +// Apply CORS middleware specifically for user routes +userRouter.use('/*', cors({ + origin: ['http://localhost:5173', 'https://codeclubagpit.vercel.app'], + allowMethods: ['GET', 'POST', 'OPTIONS'], + allowHeaders: ['Content-Type', 'Authorization'], + exposeHeaders: ['Content-Length'], + maxAge: 600, + credentials: true, +})); + +// Middleware to verify JWT +userRouter.use('/profile', async (c, next) => { + const authHeader = c.req.header('Authorization'); + if (!authHeader || !authHeader.startsWith('Bearer ')) { + return c.json({ success: false, message: 'Unauthorized: No token provided' }, 401); + } + + const token = authHeader.split(' ')[1]; + try { + const payload = await verify(token, process.env.JWT_SECRET || 'your-secret-key'); + c.set('jwtPayload', payload); + await next(); + } catch (error) { + return c.json({ success: false, message: 'Unauthorized: Invalid token' }, 401); + } +}); + +// Handle preflight requests +userRouter.options('*', (c) => { + return new Response(null, { status: 204 }); +}); + +// Signup route +userRouter.post('/signup', async (c) => { + try { + const body = await c.req.json(); + const result = userSignupInput.safeParse(body); + + if (!result.success) { + return c.json({ + success: false, + message: 'Invalid input', + errors: result.error.issues + }, 400); + } + + const { name, email, password } = result.data; + + // Check if user already exists + const existingUser = await prisma.user.findUnique({ + where: { email } + }); + + if (existingUser) { + return c.json({ + success: false, + message: 'User with this email already exists' + }, 400); + } + + // Hash password + const hashedPassword = await hash(password); + + // Create new user + const user = await prisma.user.create({ + data: { + name, + email, + password: hashedPassword, + }, + }); + + // Generate JWT + const token = await sign( + { userId: user.id, email: user.email }, + process.env.JWT_SECRET || 'your-secret-key' + ); + + return c.text(token); + } catch (error) { + console.error('Signup error:', error); + return c.json({ + success: false, + message: 'Internal server error', + details: error instanceof Error ? error.message : 'Unknown error' + }, 500); + } +}); + +// Signin route +userRouter.post('/signin', async (c) => { + try { + const body = await c.req.json(); + const result = userSigninInput.safeParse(body); + + if (!result.success) { + return c.json({ + success: false, + message: 'Invalid input', + errors: result.error.issues + }, 400); + } + + const { email, password } = result.data; + + // Find user + const user = await prisma.user.findUnique({ + where: { email } + }); + + if (!user) { + return c.json({ + success: false, + message: 'Invalid email or password' + }, 401); + } + + // Verify password + const isPasswordValid = await argonVerify(user.password, password); + + if (!isPasswordValid) { + return c.json({ + success: false, + message: 'Invalid email or password' + }, 401); + } + + // Generate JWT + const token = await sign( + { userId: user.id, email: user.email }, + process.env.JWT_SECRET || 'your-secret-key' + ); + + return c.text(token); + } catch (error) { + console.error('Signin error:', error); + return c.json({ + success: false, + message: 'Internal server error', + details: error instanceof Error ? error.message : 'Unknown error' + }, 500); + } +}); + +// Profile route +userRouter.get('/profile', async (c) => { + try { + const payload = c.get('jwtPayload'); + const user = await prisma.user.findUnique({ + where: { id: payload.userId }, + select: { + id: true, + name: true, + email: true, + role: true, + skills: true, + bio: true, + }, + }); + + if (!user) { + return c.json({ success: false, message: 'User not found' }, 404); + } + + return c.json({ success: true, user }); + } catch (error) { + console.error('Profile fetch error:', error); + return c.json({ + success: false, + message: 'Internal server error', + details: error instanceof Error ? error.message : 'Unknown error' + }, 500); + } +}); + + +export default userRouter; \ No newline at end of file diff --git a/Backend/v1/wrangler.jsonc b/Backend/v1/wrangler.jsonc index 33f37da..abc7675 100644 --- a/Backend/v1/wrangler.jsonc +++ b/Backend/v1/wrangler.jsonc @@ -2,13 +2,13 @@ "$schema": "node_modules/wrangler/config-schema.json", "name": "v1", "main": "src/index.ts", - "compatibility_date": "2025-04-16" + "compatibility_date": "2025-04-16", // "compatibility_flags": [ // "nodejs_compat" // ], - // "vars": { - // "MY_VAR": "my-variable" - // }, + "vars": { + + }, // "kv_namespaces": [ // { // "binding": "MY_KV_NAMESPACE", diff --git a/Frontend/config.ts b/Frontend/config.ts new file mode 100644 index 0000000..536d1e8 --- /dev/null +++ b/Frontend/config.ts @@ -0,0 +1 @@ +export const BACKEND_URL = "http://127.0.0.1:8787"; \ No newline at end of file diff --git a/Frontend/package-lock.json b/Frontend/package-lock.json index 6269ff0..d1f1165 100644 --- a/Frontend/package-lock.json +++ b/Frontend/package-lock.json @@ -9,6 +9,8 @@ "version": "0.0.0", "dependencies": { "@headlessui/react": "^2.2.2", + "@hookform/resolvers": "^5.1.1", + "@nasirnadaf/codeclubagpit-common": "^1.0.0", "@radix-ui/react-accordion": "^1.2.4", "@radix-ui/react-avatar": "^1.1.4", "@radix-ui/react-checkbox": "^1.1.5", @@ -17,11 +19,11 @@ "@radix-ui/react-dropdown-menu": "^2.1.7", "@radix-ui/react-hover-card": "^1.1.7", "@radix-ui/react-icons": "^1.3.2", - "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-scroll-area": "^1.2.4", "@radix-ui/react-select": "^2.1.7", "@radix-ui/react-separator": "^1.1.3", - "@radix-ui/react-slot": "^1.2.2", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.4", "@radix-ui/react-tooltip": "^1.2.0", "@tailwindcss/vite": "^4.1.3", @@ -45,17 +47,19 @@ "react-countup": "^6.5.3", "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", + "react-hook-form": "^7.60.0", "react-icons": "^5.5.0", "react-router-dom": "^7.5.0", "react-use-measure": "^2.1.7", "recharts": "^2.15.3", "set-value": "^4.1.0", - "tailwind-merge": "^3.2.0", + "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.3", "tailwindcss-animate": "^1.0.7", "tooltip": "^1.6.1", "update": "^0.7.4", - "upgrade": "^1.1.0" + "upgrade": "^1.1.0", + "zod": "^4.0.5" }, "devDependencies": { "@eslint/js": "^9.24.0", @@ -1136,6 +1140,18 @@ "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, + "node_modules/@hookform/resolvers": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.1.1.tgz", + "integrity": "sha512-J/NVING3LMAEvexJkyTLjruSm7aOFx7QX21pzkiJfMoNG0wl5aFEjLTl7ay7IQb9EWY6AkrBy7tHL2Alijpdcg==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, + "peerDependencies": { + "react-hook-form": "^7.55.0" + } + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1658,6 +1674,16 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nasirnadaf/codeclubagpit-common": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@nasirnadaf/codeclubagpit-common/-/codeclubagpit-common-1.0.0.tgz", + "integrity": "sha512-kiV4BboVMmfIiADzD5iAofXeseh8vQ8/y7VwUKXAigHKpYPg7UpIwUH3nXvO8JpDs50EKN5+NVQs9ql661Emdw==", + "license": "ISC", + "dependencies": { + "typescript": "^5.8.3", + "zod": "^4.0.5" + } + }, "node_modules/@next/env": { "version": "15.3.3", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.3.3.tgz", @@ -3164,6 +3190,12 @@ "win32" ] }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@swc/counter": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", @@ -4489,6 +4521,15 @@ "aceternity-ui": "dist/index.js" } }, + "node_modules/aceternity-ui/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", @@ -14763,6 +14804,22 @@ "react": "^18.3.1" } }, + "node_modules/react-hook-form": { + "version": "7.60.0", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.60.0.tgz", + "integrity": "sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A==", + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18 || ^19" + } + }, "node_modules/react-icons": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", @@ -16205,9 +16262,9 @@ } }, "node_modules/tailwind-merge": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.0.tgz", - "integrity": "sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", + "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", "license": "MIT", "funding": { "type": "github", @@ -16878,7 +16935,6 @@ "version": "5.8.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", - "devOptional": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -17935,9 +17991,9 @@ } }, "node_modules/zod": { - "version": "3.25.51", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.51.tgz", - "integrity": "sha512-TQSnBldh+XSGL+opiSIq0575wvDPqu09AqWe1F7JhUMKY+M91/aGlK4MhpVNO7MgYfHcVCB1ffwAUTJzllKJqg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.0.5.tgz", + "integrity": "sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" diff --git a/Frontend/package.json b/Frontend/package.json index 22b4455..f9aaf00 100644 --- a/Frontend/package.json +++ b/Frontend/package.json @@ -12,6 +12,8 @@ }, "dependencies": { "@headlessui/react": "^2.2.2", + "@hookform/resolvers": "^5.1.1", + "@nasirnadaf/codeclubagpit-common": "^1.0.0", "@radix-ui/react-accordion": "^1.2.4", "@radix-ui/react-avatar": "^1.1.4", "@radix-ui/react-checkbox": "^1.1.5", @@ -20,11 +22,11 @@ "@radix-ui/react-dropdown-menu": "^2.1.7", "@radix-ui/react-hover-card": "^1.1.7", "@radix-ui/react-icons": "^1.3.2", - "@radix-ui/react-label": "^2.1.3", + "@radix-ui/react-label": "^2.1.7", "@radix-ui/react-scroll-area": "^1.2.4", "@radix-ui/react-select": "^2.1.7", "@radix-ui/react-separator": "^1.1.3", - "@radix-ui/react-slot": "^1.2.2", + "@radix-ui/react-slot": "^1.2.3", "@radix-ui/react-tabs": "^1.1.4", "@radix-ui/react-tooltip": "^1.2.0", "@tailwindcss/vite": "^4.1.3", @@ -48,17 +50,19 @@ "react-countup": "^6.5.3", "react-day-picker": "^8.10.1", "react-dom": "^18.3.1", + "react-hook-form": "^7.60.0", "react-icons": "^5.5.0", "react-router-dom": "^7.5.0", "react-use-measure": "^2.1.7", "recharts": "^2.15.3", "set-value": "^4.1.0", - "tailwind-merge": "^3.2.0", + "tailwind-merge": "^3.3.1", "tailwindcss": "^4.1.3", "tailwindcss-animate": "^1.0.7", "tooltip": "^1.6.1", "update": "^0.7.4", - "upgrade": "^1.1.0" + "upgrade": "^1.1.0", + "zod": "^4.0.5" }, "devDependencies": { "@eslint/js": "^9.24.0", diff --git a/Frontend/src/App.tsx b/Frontend/src/App.tsx index 4f88215..631d183 100644 --- a/Frontend/src/App.tsx +++ b/Frontend/src/App.tsx @@ -14,12 +14,45 @@ import UserProfileSection from './components/user_page/UserProfileSection'; import UserClubInfoSection from './components/user_page/UserClubInfoSection'; import UserPastEventsSection from './components/user_page/UserPastEventsSection'; import { ThemeProvider } from './contexts/ThemeContext'; +import Login from './components/Auth/Login' +import Signup from './components/Auth/Signup' import { PageViewsProvider } from './contexts/PageViewsContext'; function App() { return ( + + + } /> + } /> + } /> + } /> + {/* User page with nested routes */} + }> + } /> + } /> + } /> + } /> + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + } /> + } /> + + + + diff --git a/Frontend/src/components/About/about.tsx b/Frontend/src/components/About/about.tsx index 6e51268..af03509 100644 --- a/Frontend/src/components/About/about.tsx +++ b/Frontend/src/components/About/about.tsx @@ -16,6 +16,8 @@ import { ChevronDown, Menu, X } from "lucide-react"; import { useState, useEffect } from "react"; import { motion } from "framer-motion"; import { ProgressiveBlur } from "@/components/ui/progressive-blur"; +import axios from "axios"; +import { BACKEND_URL } from "../../../config"; interface BoardMember { id: number; @@ -23,7 +25,7 @@ interface BoardMember { image: string; title: string; tagline: string; - Post: string; + post: string; } const user = { @@ -49,57 +51,82 @@ const user = { const GalleryCarousel = () => { const [hoveredImageId, setHoveredImageId] = useState(null); const [boardMembers, setBoardMembers] = useState([]); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const dummyBoardMembers: BoardMember[] = [ + { + id: 1, + name: "S.A Patil", + image: "/SecretaryDesk.png", + title: "President", + tagline: "Young, ignited minds is the need of the hour.", + post: "Secretary" + }, + { + id: 2, + name: "Dr. M A Chougule", + image: "/campus_director_chougule_sir.jpg", + title: "Campus Director", + tagline: "Fostering an environment where ambition thrives and success follows.", + post: "Campus Director" + }, + { + id: 3, + name: "Dr. V V Potdar", + image: "/Principal-desk.jpeg.jpg", + title: "Principal", + tagline: "Inspiring Leadership, Empowering Futures", + post: "Principal" + }, + { + id: 5, + name: "Mr. S.V Kulkarni", + image: "/Kulkarni.jpg", + title: "HOD CSE", + tagline: "Guiding brilliance, nurturing innovation, and unlocking potential.", + post: "Head Of Department" + } + ]; useEffect(() => { const fetchBoardMembers = async () => { + setLoading(true); + setError(null); try { - const response = await fetch('/board_members.json'); - if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); - const data = await response.json(); - setBoardMembers(data); - } catch (err) { - console.error("Error loading board members:", err); - setBoardMembers([ - { - "id": 1, - "name":"S.A Patil", - "image": "/SecretaryDesk.png", - "title": "President", - "tagline": "Young, ignited minds is the need of the hour.", - "Post":"Secretary" - }, - { - "id": 2, - "name":"Dr. M A Chougule", - "image": "/campus_director_chougule_sir.jpg", - "title": "Campus Director", - "tagline": "Fostering an environment where ambition thrives and success follows.", - "Post":"Campus Director" - }, - { - "id": 3, - "name":"Dr. V V Potdar", - "image": "/Principal-desk.jpeg.jpg", - "title": "Principal", - "tagline": "Inspiring Leadership, Empowering Futures", - "Post":"Principal" - }, - { - "id": 5, - "name":"Mr. S.V Kulkarni", - "image": "/Kulkarni.jpg", - "title": "HOD CSE", - "tagline": "Guiding brilliance, nurturing innovation, and unlocking potential.", - "Post":"Head Of Department" - } - ]); + const response = await axios.get(`${BACKEND_URL}/about/board-members`); + setBoardMembers(response.data.boardMembers); + } catch (err: any) { + console.error("Error loading board members from backend:", err); + setError("Failed to load board members. Using default data."); + // Fallback to JSON file + try { + const response = await fetch('/board_members.json'); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); + const data = await response.json(); + setBoardMembers(data); + } catch (jsonErr) { + console.error("Error loading board members from JSON:", jsonErr); + setBoardMembers(dummyBoardMembers); + } + } finally { + setLoading(false); } }; fetchBoardMembers(); }, []); + if (loading) { + return ( +
+
Loading...
+
+ ); + } + return (
+ {error &&
{error}
}
{boardMembers.map((item) => (
@@ -142,10 +169,9 @@ const GalleryCarousel = () => {
- {/* ONLY ADDED THIS SECTION - NAME AND POSITION BELOW IMAGE */}

{item.name}

-

{item.Post}

+

{item.post}

))} @@ -168,7 +194,6 @@ const About = () => { return (
- {/* Navbar - completely unchanged */}
logo @@ -176,7 +201,6 @@ const About = () => { CODE CLUB AGPIT
- {/* Mobile menu toggle button */}
- {/* Desktop Navigation */}
  • navigate("/")}>Home
  • @@ -223,8 +246,6 @@ const About = () => {
- - {/* Mobile Side Navigation - completely unchanged */}
- {isMobileMenuOpen && (
)} - - {/* Hero Section - completely unchanged */}
-

About Us

+

About Us


Welcome to A.G. Patil Code Club! We are a community of passionate tech enthusiasts, @@ -292,12 +310,9 @@ const About = () => {

AGPIT Board of Directors & Faculty


- {/* GalleryCarousel Component - only changed to add name/position below images */}
- - {/* Mission & Vision Section - completely unchanged */}

Mission & Vision





@@ -308,8 +323,6 @@ const About = () => {
- - {/* Our Activities Section - completely unchanged */}

Our Activities



@@ -325,8 +338,7 @@ const About = () => {
-
- {/* Success Stories Section - completely unchanged */} +

Success Stories



@@ -338,9 +350,8 @@ const About = () => {
-
-
- {/* FAQ Section - completely unchanged */} +
+

Frequently Asked Questions


@@ -364,15 +375,11 @@ const About = () => {
- - {/* Join Us Button - completely unchanged */}
- - {/* Footer - completely unchanged */}

A.G. Patil Institute of Technology, Solapur, Maharashtra, India diff --git a/Frontend/src/components/About/about_members.tsx b/Frontend/src/components/About/about_members.tsx index 7cf936a..60effc3 100644 --- a/Frontend/src/components/About/about_members.tsx +++ b/Frontend/src/components/About/about_members.tsx @@ -2,7 +2,9 @@ import { useState, useEffect } from 'react'; import { ProgressiveBlur } from '@/components/ui/progressive-blur'; -import { motion } from 'motion/react'; +import { motion } from 'framer-motion'; +import axios from 'axios'; +import { BACKEND_URL } from '../../../config'; // Define interfaces for data interface Member { @@ -35,48 +37,98 @@ export function AboutMembers() { const [hoveredMemberId, setHoveredMemberId] = useState(null); const [hoveredImageId, setHoveredImageId] = useState(null); const [selectedBoard, setSelectedBoard] = useState("TY"); + const [loading, setLoading] = useState(true); + const [error, setError] = useState(null); + + const dummyMembers: Member[] = [ + { + id: 1, + name: "Roni Bhakta", + avatar: "https://media.licdn.com/dms/image/v2/D4D03AQEvEHK2KOMLwQ/profile-displayphoto-shrink_100_100/0/1705087348506", + email: "roni123@gmail.com", + linkedin: "https://linkedin.com/in/ronibhakta1", + role: "President", + domain: "Full Stack Development", + yearOfStudy: "3rd", + yearOfPassing: 2026, + bio: "Experienced full-stack developer passionate about building scalable web applications.", + social: { + github: "https://github.com/ronibhakta1", + portfolio: "https://ronibhakta1.dev", + }, + }, + ]; + + const dummyCarouselImages: CarouselImage[] = [ + { + id: 1, + image: "/default-image.jpg", + title: "Hackathon 2024", + tagline: "Innovate and Create", + }, + ]; useEffect(() => { const fetchMembers = async () => { + setLoading(true); + setError(null); try { - const fileName = `/club_members_${selectedBoard}.json`; - const response = await fetch(fileName); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); + const response = await axios.get(`${BACKEND_URL}/user/club-members/${selectedBoard}`, { + headers: { + Authorization: `Bearer ${localStorage.getItem("token")}`, + }, + }); + setMembers(response.data.members); + } catch (err: any) { + console.error("Error loading members from backend:", err); + setError("Failed to load members. Using default data."); + try { + const fileName = `/club_members_${selectedBoard}.json`; + const response = await fetch(fileName); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + const membersWithIds = data.map((member: Member, index: number) => ({ + ...member, + id: member.id || index, + })); + setMembers(membersWithIds); + } catch (jsonErr) { + console.error("Error loading members from JSON:", jsonErr); + setMembers(dummyMembers); } - - const data = await response.json(); - - // Add id to members if not present - const membersWithIds = data.map((member: Member, index: number) => ({ - ...member, - id: member.id || index - })); - - setMembers(membersWithIds); - } catch (err) { - console.error("Error loading members:", err); + } finally { + setLoading(false); } }; fetchMembers(); }, [selectedBoard]); - // Load carousel images from the JSON file useEffect(() => { const fetchCarouselImages = async () => { + setLoading(true); + setError(null); try { - const response = await fetch('/carousel_images.json'); - - if (!response.ok) { - throw new Error(`HTTP error! status: ${response.status}`); + const response = await axios.get(`${BACKEND_URL}/user/carousel-images`); + setCarouselImages(response.data.images); + } catch (err: any) { + console.error("Error loading carousel images from backend:", err); + setError("Failed to load carousel images. Using default data."); + try { + const response = await fetch('/carousel_images.json'); + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + const data = await response.json(); + setCarouselImages(data); + } catch (jsonErr) { + console.error("Error loading carousel images from JSON:", jsonErr); + setCarouselImages(dummyCarouselImages); } - - const data = await response.json(); - setCarouselImages(data); - } catch (err) { - console.error("Error loading carousel images:", err); + } finally { + setLoading(false); } }; @@ -87,12 +139,18 @@ export function AboutMembers() { setSelectedBoard(board); }; + if (loading) { + return ( +

+
Loading...
+
+ ); + } + return ( -
- {/* Carousel Images Section */} + {error &&
{error}
}
-
{carouselImages.map((item) => (
{item.tagline}
-
- ))} -
- -
- - {/* Team Members Section */}

Our Team

-
{members.map((member, index) => (
); -} +} \ No newline at end of file diff --git a/Frontend/src/components/Auth/Login.tsx b/Frontend/src/components/Auth/Login.tsx new file mode 100644 index 0000000..500919f --- /dev/null +++ b/Frontend/src/components/Auth/Login.tsx @@ -0,0 +1,118 @@ +"use client"; + +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; +import { Link } from "react-router-dom"; +import axios from "axios"; +import { BACKEND_URL } from "../../../config"; + +import { userSigninInput,UserSigninInput } from "@nasirnadaf/codeclubagpit-common"; + + +export default function Login() { + const navigate = useNavigate(); + const { + register, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ + resolver: zodResolver(userSigninInput), + }); + const [error, setError] = useState(null); + + const onSubmit = async (data: UserSigninInput) => { + setError(null); + try { + const response = await axios.post(`${BACKEND_URL}/signin`, data); + const token = response.data; // Hono router returns JWT as text + localStorage.setItem("token", token); + console.log("JWT:", token); + navigate("/dashboard"); + } catch (err: any) { + setError(err.response?.data?.message || "An error occurred during login"); + } + }; + + return ( +
+ + + Login +

Enter your credentials to access your account

+
+ + {error &&

{error}

} +
+
+ + +
+
+ + +
+
+ +
+
+ Don’t have an account?{" "} + + Sign up + +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/Frontend/src/components/Auth/Signup.tsx b/Frontend/src/components/Auth/Signup.tsx new file mode 100644 index 0000000..8a7ec63 --- /dev/null +++ b/Frontend/src/components/Auth/Signup.tsx @@ -0,0 +1,130 @@ +"use client"; + +import { useForm } from "react-hook-form"; +import { zodResolver } from "@hookform/resolvers/zod"; +import { useState } from "react"; +import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; +import { Input } from "@/components/ui/input"; +import { Button } from "@/components/ui/button"; +import { Label } from "@/components/ui/label"; +import { Link } from "react-router-dom"; +import axios from "axios"; +import { BACKEND_URL } from "../../../config"; +import { useNavigate } from "react-router-dom"; +import { userSignupInput, UserSignupInput } from "@nasirnadaf/codeclubagpit-common"; + + + +export default function Signup() { + const navigate = useNavigate(); + const { + register, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ + resolver: zodResolver(userSignupInput), + }); + const [error, setError] = useState(null); + + const onSubmit = async (data: UserSignupInput) => { + setError(null); + try { + const response = await axios.post(`${BACKEND_URL}/user/signup`, data); + const token = response.data; // Hono router returns JWT as text + localStorage.setItem("token", token); + console.log("JWT:", token); + navigate("/login"); + } catch (err: any) { + setError(err.response?.data?.message || "An error occurred during signup"); + } + }; + + return ( +
+ + + Create your account +

Join the club and get started today

+
+ + + {error &&

{error}

} +
+ {/* Name */} +
+ + +
+ + {/* Email */} +
+ + +
+ + {/* Password */} +
+ + +
+ + {/* Submit Button */} +
+ +
+ + {/* Sign In Link */} +
+ Already have an account?{" "} + + Sign in + +
+
+
+
+
+ ); +} \ No newline at end of file diff --git a/Frontend/src/components/ui/checkbox.tsx b/Frontend/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..d9bad94 --- /dev/null +++ b/Frontend/src/components/ui/checkbox.tsx @@ -0,0 +1,26 @@ +import * as React from "react"; +import { cva } from "class-variance-authority"; +import { cn } from "@/lib/utils"; + +export interface CheckboxProps extends React.InputHTMLAttributes {} + +const checkboxVariants = cva( + "peer h-4 w-4 shrink-0 rounded-sm border border-zinc-600 bg-transparent ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 checked:bg-white checked:text-zinc-900", +); + +const Checkbox = React.forwardRef( + ({ className, ...props }, ref) => { + return ( + + ); + } +); + +Checkbox.displayName = "Checkbox"; + +export { Checkbox }; diff --git a/Frontend/src/components/user_page/Userpage.tsx b/Frontend/src/components/user_page/Userpage.tsx index 45894e2..0a21c6e 100644 --- a/Frontend/src/components/user_page/Userpage.tsx +++ b/Frontend/src/components/user_page/Userpage.tsx @@ -14,11 +14,11 @@ import { BookOpen, Bot, SquareTerminal, -} from "lucide-react" +} from "lucide-react"; import { useLocation, useNavigate, Outlet } from "react-router-dom"; import { User } from "@/types/user"; - - +import axios from "axios"; +import { BACKEND_URL } from "../../../config"; const sectionTitles: Record = { main: "Profile", @@ -45,7 +45,12 @@ const BreadcrumbNav = ({ activeSection }: { activeSection: string }) => ( ); const UserPage = ({ section }: { section?: string }) => { - const [user, setUser] = React.useState({ + const [user, setUser] = React.useState(null); + const [loading, setLoading] = React.useState(true); + const [error, setError] = React.useState(null); + + // Dummy data as fallback + const dummyUser: User = { id: 1, name: "Roni Bhakta", avatar: "https://media.licdn.com/dms/image/v2/D4D03AQEvEHK2KOMLwQ/profile-displayphoto-shrink_100_100/profile-displayphoto-shrink_100_100/0/1705087348506?e=1748476800&v=beta&t=IVnehed4T53hvzHeeNxaKQdN9EJknAu4iM4tpBddSvE", @@ -66,7 +71,7 @@ const UserPage = ({ section }: { section?: string }) => { yearOfPursuing: "3rd", yearOfPassing: "2026", email: "roni123@gmail.com", - }); + }; const navMain = [ { @@ -79,7 +84,7 @@ const UserPage = ({ section }: { section?: string }) => { sectionKey: "clubinfo", icon: Bot, }, - ...(user.codeClubRole === "president" + ...(user?.codeClubRole === "president" ? [ { title: "Past Events", @@ -107,6 +112,33 @@ const UserPage = ({ section }: { section?: string }) => { setActiveSection(getSectionFromPath()); }, [location.pathname, section]); + // Fetch user data + React.useEffect(() => { + const fetchUser = async () => { + setLoading(true); + setError(null); + try { + const token = localStorage.getItem("token"); + if (!token) { + throw new Error("No token found"); + } + const response = await axios.get(`${BACKEND_URL}/user/profile`, { + headers: { + Authorization: `Bearer ${token}`, + }, + }); + setUser(response.data.user); + } catch (err: any) { + console.error("Failed to fetch user:", err); + setUser(dummyUser); // Fallback to dummy data + } finally { + setLoading(false); + } + }; + + fetchUser(); + }, []); + // Handle sidebar navigation const handleSectionChange = (sectionKey: string) => { setActiveSection(sectionKey); @@ -115,24 +147,40 @@ const UserPage = ({ section }: { section?: string }) => { else if (sectionKey === "pastevents") navigate("/users/pastevents"); }; + if (loading) { + return ( +
+
Loading...
+
+ ); + } + + if (!user) { + return ( +
+
Error: Unable to load user data
+
+ ); + } + return ( -
+
+ {error &&
{error}
} - +
- + - +
-
- {/* Only render nested route content here */} +