diff --git a/classquiz/routers/users.py b/classquiz/routers/users.py index f2b4466..03c5ce7 100644 --- a/classquiz/routers/users.py +++ b/classquiz/routers/users.py @@ -27,7 +27,7 @@ async def create_user(user: route_user, background_task: BackgroundTasks) -> Use res = await User.objects.filter((User.email == user.email) | (User.username == user.username)).all() if len(res) != 0: - raise HTTPException(status_code=400, detail="User already exists") + raise HTTPException(status_code=409, detail="User already exists") user.password = get_password_hash(user.password) if len(user.username) == 32: diff --git a/frontend/package.json b/frontend/package.json index c2baffd..74a1071 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,15 +12,20 @@ "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ." }, "devDependencies": { + "@felte/validator-yup": "^1.0.1", "@sveltejs/adapter-auto": "next", "@sveltejs/kit": "next", "@types/luxon": "^2.0.9", + "@types/yup": "^0.29.13", "@typescript-eslint/eslint-plugin": "^5.10.1", "@typescript-eslint/parser": "^5.10.1", "autoprefixer": "^10.4.2", + "cookie": "^0.4.2", "eslint": "^7.32.0", "eslint-config-prettier": "^8.3.0", "eslint-plugin-svelte3": "^3.2.1", + "felte": "^1.0.1", + "js-cookie": "^3.0.1", "luxon": "^2.3.1", "postcss": "^8.4.5", "postcss-load-config": "^3.1.1", @@ -32,7 +37,8 @@ "svelte-preprocess": "^4.10.1", "tailwindcss": "^3.0.12", "tslib": "^2.3.1", - "typescript": "~4.5.4" + "typescript": "~4.5.4", + "yup": "^0.32.11" }, "type": "module" } diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index 26fd500..19d86e5 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -1,15 +1,20 @@ lockfileVersion: 5.3 specifiers: + '@felte/validator-yup': ^1.0.1 '@sveltejs/adapter-auto': next '@sveltejs/kit': next '@types/luxon': ^2.0.9 + '@types/yup': ^0.29.13 '@typescript-eslint/eslint-plugin': ^5.10.1 '@typescript-eslint/parser': ^5.10.1 autoprefixer: ^10.4.2 + cookie: ^0.4.2 eslint: ^7.32.0 eslint-config-prettier: ^8.3.0 eslint-plugin-svelte3: ^3.2.1 + felte: ^1.0.1 + js-cookie: ^3.0.1 luxon: ^2.3.1 postcss: ^8.4.5 postcss-load-config: ^3.1.1 @@ -22,17 +27,23 @@ specifiers: tailwindcss: ^3.0.12 tslib: ^2.3.1 typescript: ~4.5.4 + yup: ^0.32.11 devDependencies: + '@felte/validator-yup': 1.0.1_yup@0.32.11 '@sveltejs/adapter-auto': 1.0.0-next.29 '@sveltejs/kit': 1.0.0-next.287_svelte@3.46.4 '@types/luxon': 2.0.9 + '@types/yup': 0.29.13 '@typescript-eslint/eslint-plugin': 5.12.1_78ba2542c270c83b2a80bb1c125195b6 '@typescript-eslint/parser': 5.12.1_eslint@7.32.0+typescript@4.5.5 autoprefixer: 10.4.2_postcss@8.4.7 + cookie: 0.4.2 eslint: 7.32.0 eslint-config-prettier: 8.4.0_eslint@7.32.0 eslint-plugin-svelte3: 3.4.1_eslint@7.32.0+svelte@3.46.4 + felte: 1.0.1_svelte@3.46.4 + js-cookie: 3.0.1 luxon: 2.3.1 postcss: 8.4.7 postcss-load-config: 3.1.3 @@ -45,6 +56,7 @@ devDependencies: tailwindcss: 3.0.23_autoprefixer@10.4.2 tslib: 2.3.1 typescript: 4.5.5 + yup: 0.32.11 packages: @@ -68,6 +80,13 @@ packages: js-tokens: 4.0.0 dev: true + /@babel/runtime/7.17.2: + resolution: {integrity: sha512-hzeyJyMA1YGdJTuWU0e/j4wKXrU4OMFvY2MSlaI9B7VQb0r5cxTE3EAIS2Q7Tn2RIcDkRvTA/v2JsAEhxe99uw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.9 + dev: true + /@eslint/eslintrc/0.4.3: resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -85,6 +104,28 @@ packages: - supports-color dev: true + /@felte/common/1.0.1: + resolution: {integrity: sha512-P905IdJzdiawo+YsnM5Cg2ziou5VHBDCCiVHXqGFBrEmq/RyxSdOfuRbOBKAz3l5eigQl8QGK26b3rVLz7mxRQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /@felte/core/1.0.1: + resolution: {integrity: sha512-wrdiiQIfw4fDTVN9THowqSQcckkwrW8EN92mIKqqa+wbcYz7cSBAi3GtgNWJcZuEV631ij2nnygQnxV/8hhdnA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + '@felte/common': 1.0.1 + dev: true + + /@felte/validator-yup/1.0.1_yup@0.32.11: + resolution: {integrity: sha512-lylJ5FlzZeUh3/NJJyPPF0uBlj4Fi4YmCdt3M7saPOrGZJsr09AD8o+fXQr4aUllwbIFbjN3z6zkSpYE1wYAqA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + yup: ^0.32.9 + dependencies: + '@felte/common': 1.0.1 + yup: 0.32.11 + dev: true + /@humanwhocodes/config-array/0.5.0: resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==} engines: {node: '>=10.10.0'} @@ -215,6 +256,10 @@ packages: resolution: {integrity: sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==} dev: true + /@types/lodash/4.14.179: + resolution: {integrity: sha512-uwc1x90yCKqGcIOAT6DwOSuxnrAbpkdPsUOZtwrXb4D/6wZs+6qG7QnIawDuZWg0sWpxl+ltIKCaLoMlna678w==} + dev: true + /@types/luxon/2.0.9: resolution: {integrity: sha512-ZuzIc7aN+i2ZDMWIiSmMdubR9EMMSTdEzF6R+FckP4p6xdnOYKqknTo/k+xXQvciSXlNGIwA4OPU5X7JIFzYdA==} dev: true @@ -237,6 +282,10 @@ packages: '@types/node': 17.0.21 dev: true + /@types/yup/0.29.13: + resolution: {integrity: sha512-qRyuv+P/1t1JK1rA+elmK1MmCL1BapEzKKfbEhDBV/LMMse4lmhZ/XbgETI39JveDJRpLjmToOI6uFtMW/WR2g==} + dev: true + /@typescript-eslint/eslint-plugin/5.12.1_78ba2542c270c83b2a80bb1c125195b6: resolution: {integrity: sha512-M499lqa8rnNK7mUv74lSFFttuUsubIRdAbHcVaP93oFcKkEmHmLqy2n7jM9C8DVmFMYK61ExrZU6dLYhQZmUpw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -590,6 +639,11 @@ packages: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} dev: true + /cookie/0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: true + /cosmiconfig/7.0.1: resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==} engines: {node: '>=10'} @@ -1122,6 +1176,16 @@ packages: reusify: 1.0.4 dev: true + /felte/1.0.1_svelte@3.46.4: + resolution: {integrity: sha512-fGz9KUBbBzv+QTgocHx2lGiRCNQXoXnBOfPvkVi4JWnofQCbKAYKQ80ytqAvqv+NphAZp6Zb/+luToIfqJ+Q2w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + svelte: ^3.31.0 + dependencies: + '@felte/core': 1.0.1 + svelte: 3.46.4 + dev: true + /file-entry-cache/6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -1326,6 +1390,11 @@ packages: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} dev: true + /js-cookie/3.0.1: + resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} + engines: {node: '>=12'} + dev: true + /js-tokens/4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -1376,6 +1445,10 @@ packages: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true + /lodash-es/4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + dev: true + /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -1384,6 +1457,10 @@ packages: resolution: {integrity: sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=} dev: true + /lodash/4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -1446,6 +1523,10 @@ packages: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true + /nanoclone/0.2.1: + resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==} + dev: true + /nanoid/3.3.1: resolution: {integrity: sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -1626,6 +1707,10 @@ packages: engines: {node: '>=0.4.0'} dev: true + /property-expr/2.0.5: + resolution: {integrity: sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==} + dev: true + /punycode/2.1.1: resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==} engines: {node: '>=6'} @@ -1647,6 +1732,10 @@ packages: picomatch: 2.3.1 dev: true + /regenerator-runtime/0.13.9: + resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==} + dev: true + /regexpp/3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -2012,6 +2101,10 @@ packages: is-number: 7.0.0 dev: true + /toposort/2.0.2: + resolution: {integrity: sha1-riF2gXXRVZ1IvvNUILL0li8JwzA=} + dev: true + /tslib/1.14.1: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true @@ -2138,3 +2231,16 @@ packages: /yeast/0.1.2: resolution: {integrity: sha1-AI4G2AlDIMNy28L47XagymyKxBk=} dev: true + + /yup/0.32.11: + resolution: {integrity: sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.17.2 + '@types/lodash': 4.14.179 + lodash: 4.17.21 + lodash-es: 4.17.21 + nanoclone: 0.2.1 + property-expr: 2.0.5 + toposort: 2.0.2 + dev: true diff --git a/frontend/src/routes/account/login.svelte b/frontend/src/routes/account/login.svelte new file mode 100644 index 0000000..e924d16 --- /dev/null +++ b/frontend/src/routes/account/login.svelte @@ -0,0 +1,310 @@ + + + + +
+
+ + + +
+
+

ClassQuiz

+ +

+ Welcome Back +

+ +

+ Login or create account +

+ +
+
+
+
+ + +
+
+
+
+ + +
+
+ +
+ Forgot Password? + + +
+
+
+
+ +
+ Don't have an account? + + + Register +
+
+
+
+ +