From 2eee00a20d813c79073e8d530141c453564c5679 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Fri, 6 Sep 2024 17:35:16 -0700 Subject: [PATCH] Moving around settings and security, fixing left nav to static list, fixing recovery codes generation. --- components.json | 24 +- drizzle.config.ts | 2 +- package.json | 6 +- pnpm-lock.yaml | 58 ++-- src/lib/components/Header.svelte | 30 +- src/lib/components/LeftNav.svelte | 16 +- src/lib/components/ui/badge/badge.svelte | 4 +- src/lib/components/ui/badge/index.ts | 19 +- src/lib/server/api/common/config.ts | 38 +++ src/{ => lib/server/api/common}/env.ts | 2 - src/lib/server/api/common/types/config.ts | 23 +- src/lib/server/api/configs/config.ts | 15 - .../server/api/controllers/mfa.controller.ts | 5 +- src/lib/server/api/databases/migrate.ts | 2 +- src/lib/server/api/databases/seed.ts | 2 +- src/lib/server/api/databases/seeds/users.ts | 6 +- .../api/databases/tables/credentials.table.ts | 2 +- src/lib/server/api/index.ts | 4 +- src/lib/server/api/packages/drizzle.ts | 2 +- .../server/api/providers/redis.provider.ts | 2 +- .../repositories/recovery-codes.repository.ts | 5 + .../api/repositories/wishlists.repository.ts | 10 +- .../server/api/services/drizzle.service.ts | 18 +- src/lib/server/api/services/lucia.service.ts | 2 +- src/lib/server/api/services/mailer.service.ts | 2 +- .../api/services/recovery-codes.service.ts | 7 +- src/lib/server/api/services/redis.service.ts | 2 +- src/lib/types.ts | 276 +++++++++--------- src/lib/utils/ui.ts | 61 ++-- src/lib/validations/account.ts | 109 +++---- .../(protected)/collections/+page.server.ts | 33 ++- .../collections/[cuid]/+page.server.ts | 37 ++- .../collections/add/+page.server.ts | 17 +- .../collections/add/bgg/+page.server.ts | 29 +- .../(protected)/list/[id]/+page.server.ts | 34 ++- .../profile/security/+layout.server.ts | 3 - .../profile/security/+layout.svelte | 15 - .../profile/security/mfa/+page.svelte | 83 ------ .../(app)/(protected)/settings/+layout.svelte | 15 + .../(protected)/settings/+page.server.ts | 8 + .../{ => settings}/profile/+page.server.ts | 12 +- .../{ => settings}/profile/+page.svelte | 34 +-- .../(protected)/settings/profile/schemas.ts | 20 ++ .../settings/security/+page.server.ts | 18 ++ .../settings/security/+page.svelte | 30 ++ .../security/change/password}/+page.server.ts | 6 +- .../security/change/password}/+page.svelte | 30 +- .../security/change/password/schemas.ts | 81 +++++ .../settings/security/mfa/+page.server.ts | 25 ++ .../settings/security/mfa/+page.svelte | 57 ++++ .../mfa/recovery-codes/+page.server.ts | 0 .../security/mfa/recovery-codes/+page.svelte | 0 .../security/mfa/totp}/+page.server.ts | 8 +- .../settings/security/mfa/totp/+page.svelte | 83 ++++++ .../settings/security/mfa/totp/schemas.ts | 14 + .../(protected)/wishlists/+page.server.ts | 18 +- .../wishlists/[cuid]/+page.server.ts | 40 +-- src/routes/(auth)/login/+page.server.ts | 4 +- .../(auth)/password/reset/+page.server.ts | 59 ++-- src/routes/(auth)/totp/+page.server.ts | 2 +- svelte.config.js | 1 + 61 files changed, 902 insertions(+), 668 deletions(-) create mode 100644 src/lib/server/api/common/config.ts rename src/{ => lib/server/api/common}/env.ts (95%) delete mode 100644 src/lib/server/api/configs/config.ts delete mode 100644 src/routes/(app)/(protected)/profile/security/+layout.server.ts delete mode 100644 src/routes/(app)/(protected)/profile/security/+layout.svelte delete mode 100644 src/routes/(app)/(protected)/profile/security/mfa/+page.svelte create mode 100644 src/routes/(app)/(protected)/settings/+layout.svelte create mode 100644 src/routes/(app)/(protected)/settings/+page.server.ts rename src/routes/(app)/(protected)/{ => settings}/profile/+page.server.ts (88%) rename src/routes/(app)/(protected)/{ => settings}/profile/+page.svelte (73%) create mode 100644 src/routes/(app)/(protected)/settings/profile/schemas.ts create mode 100644 src/routes/(app)/(protected)/settings/security/+page.server.ts create mode 100644 src/routes/(app)/(protected)/settings/security/+page.svelte rename src/routes/(app)/(protected)/{profile/security/password/change => settings/security/change/password}/+page.server.ts (94%) rename src/routes/(app)/(protected)/{profile/security/password/change => settings/security/change/password}/+page.svelte (67%) create mode 100644 src/routes/(app)/(protected)/settings/security/change/password/schemas.ts create mode 100644 src/routes/(app)/(protected)/settings/security/mfa/+page.server.ts create mode 100644 src/routes/(app)/(protected)/settings/security/mfa/+page.svelte rename src/routes/(app)/(protected)/{profile => settings}/security/mfa/recovery-codes/+page.server.ts (100%) rename src/routes/(app)/(protected)/{profile => settings}/security/mfa/recovery-codes/+page.svelte (100%) rename src/routes/(app)/(protected)/{profile/security/mfa => settings/security/mfa/totp}/+page.server.ts (95%) create mode 100644 src/routes/(app)/(protected)/settings/security/mfa/totp/+page.svelte create mode 100644 src/routes/(app)/(protected)/settings/security/mfa/totp/schemas.ts diff --git a/components.json b/components.json index 767bdc4..8d5d8e6 100644 --- a/components.json +++ b/components.json @@ -1,14 +1,14 @@ { - "$schema": "https://shadcn-svelte.com/schema.json", - "style": "default", - "tailwind": { - "config": "tailwind.config.js", - "css": "src/app.postcss", - "baseColor": "slate" - }, - "aliases": { - "components": "$lib/components", - "utils": "$lib/utils" - }, + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "default", + "tailwind": { + "config": "tailwind.config.js", + "css": "src/lib/styles/app.pcss", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils/ui" + }, "typescript": true -} \ No newline at end of file +} diff --git a/drizzle.config.ts b/drizzle.config.ts index 3f213c5..b90a261 100644 --- a/drizzle.config.ts +++ b/drizzle.config.ts @@ -1,6 +1,6 @@ import 'dotenv/config' +import env from '$lib/server/api/common/env' import { defineConfig } from 'drizzle-kit' -import env from './src/env' export default defineConfig({ dialect: 'postgresql', diff --git a/package.json b/package.json index 68033c1..e4997a2 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "@faker-js/faker": "^8.4.1", "@melt-ui/pp": "^0.3.2", "@melt-ui/svelte": "^0.83.0", - "@playwright/test": "^1.46.1", + "@playwright/test": "^1.47.0", "@sveltejs/adapter-auto": "^3.2.4", "@sveltejs/enhanced-img": "^0.3.4", "@sveltejs/kit": "^2.5.26", @@ -41,7 +41,7 @@ "drizzle-kit": "^0.23.2", "eslint": "^8.57.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-svelte": "^2.43.0", + "eslint-plugin-svelte": "2.36.0-next.13", "just-clone": "^6.2.0", "just-debounce-it": "^3.2.0", "lucia": "3.2.0", @@ -95,7 +95,7 @@ "arctic": "^1.9.2", "bits-ui": "^0.21.13", "boardgamegeekclient": "^1.9.1", - "bullmq": "^5.12.13", + "bullmq": "^5.12.14", "class-variance-authority": "^0.7.0", "clsx": "^2.1.1", "cookie": "^0.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1dc57a..c00d4b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,8 +66,8 @@ importers: specifier: ^1.9.1 version: 1.9.1 bullmq: - specifier: ^5.12.13 - version: 5.12.13 + specifier: ^5.12.14 + version: 5.12.14 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 @@ -181,8 +181,8 @@ importers: specifier: ^0.83.0 version: 0.83.0(svelte@5.0.0-next.175) '@playwright/test': - specifier: ^1.46.1 - version: 1.46.1 + specifier: ^1.47.0 + version: 1.47.0 '@sveltejs/adapter-auto': specifier: ^3.2.4 version: 3.2.4(@sveltejs/kit@2.5.26(@sveltejs/vite-plugin-svelte@3.1.2(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.5)(sass@1.78.0)))(svelte@5.0.0-next.175)(vite@5.4.3(@types/node@20.16.5)(sass@1.78.0))) @@ -223,8 +223,8 @@ importers: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) eslint-plugin-svelte: - specifier: ^2.43.0 - version: 2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) + specifier: 2.36.0-next.13 + version: 2.36.0-next.13(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) just-clone: specifier: ^6.2.0 version: 6.2.0 @@ -1706,8 +1706,8 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.46.1': - resolution: {integrity: sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==} + '@playwright/test@1.47.0': + resolution: {integrity: sha512-SgAdlSwYVpToI4e/IH19IHHWvoijAYH5hu2MWSXptRypLSnzj51PcGD+rsOXFayde4P9ZLi+loXVwArg6IUkCA==} engines: {node: '>=18'} hasBin: true @@ -2295,8 +2295,8 @@ packages: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} - bullmq@5.12.13: - resolution: {integrity: sha512-bFk0s1U9eQ8vKrhH9zYg/1H0+puSLVXuuq/pIW2jxgUmtLebRUBZr0cHJx35azTf2oPUJ+xXfpfHWaUtm4ZveA==} + bullmq@5.12.14: + resolution: {integrity: sha512-mcSQHq9EY+DKtAP6XSmkP+0f1ifFithcpLTwo8WmUauArE9dxk45Gae3Fls1Nwf0Er9MoaDhPcglfe6LV/XCOg==} bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} @@ -2769,12 +2769,12 @@ packages: peerDependencies: eslint: '>=7.0.0' - eslint-plugin-svelte@2.43.0: - resolution: {integrity: sha512-REkxQWvg2pp7QVLxQNa+dJ97xUqRe7Y2JJbSWkHSuszu0VcblZtXkPBPckkivk99y5CdLw4slqfPylL2d/X4jQ==} + eslint-plugin-svelte@2.36.0-next.13: + resolution: {integrity: sha512-N4bLGdFkGbbAQiKvX17kLfBgnZ+Em00khOY3AReppO7fkP9jaSxwjdgTCcWf+Q5/uZWor58g4GleRqHcb2Dk2w==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.191 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.73 peerDependenciesMeta: svelte: optional: true @@ -3212,8 +3212,8 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.34.0: - resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + known-css-properties@0.30.0: + resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} @@ -3673,13 +3673,13 @@ packages: pkg-types@1.2.0: resolution: {integrity: sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==} - playwright-core@1.46.1: - resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==} + playwright-core@1.47.0: + resolution: {integrity: sha512-1DyHT8OqkcfCkYUD9zzUTfg7EfTd+6a8MkD/NWOvjo0u/SCNd5YmY/lJwFvUZOxJbWNds+ei7ic2+R/cRz/PDg==} engines: {node: '>=18'} hasBin: true - playwright@1.46.1: - resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==} + playwright@1.47.0: + resolution: {integrity: sha512-jOWiRq2pdNAX/mwLiwFYnPHpEZ4rM+fRSQpRHwEwZlP2PUANvL3+aJOF/bvISMhFD30rqMxUB4RJx9aQbfh4Ww==} engines: {node: '>=18'} hasBin: true @@ -5888,9 +5888,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.46.1': + '@playwright/test@1.47.0': dependencies: - playwright: 1.46.1 + playwright: 1.47.0 '@polka/url@1.0.0-next.25': {} @@ -6508,7 +6508,7 @@ snapshots: builtin-modules@3.3.0: {} - bullmq@5.12.13: + bullmq@5.12.14: dependencies: cron-parser: 4.9.0 ioredis: 5.4.1 @@ -6936,14 +6936,15 @@ snapshots: dependencies: eslint: 8.57.0 - eslint-plugin-svelte@2.43.0(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): + eslint-plugin-svelte@2.36.0-next.13(eslint@8.57.0)(svelte@5.0.0-next.175)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) '@jridgewell/sourcemap-codec': 1.5.0 + debug: 4.3.6 eslint: 8.57.0 eslint-compat-utils: 0.5.1(eslint@8.57.0) esutils: 2.0.3 - known-css-properties: 0.34.0 + known-css-properties: 0.30.0 postcss: 8.4.45 postcss-load-config: 3.1.4(postcss@8.4.45)(ts-node@10.9.2(@types/node@20.16.5)(typescript@5.5.4)) postcss-safe-parser: 6.0.0(postcss@8.4.45) @@ -6953,6 +6954,7 @@ snapshots: optionalDependencies: svelte: 5.0.0-next.175 transitivePeerDependencies: + - supports-color - ts-node eslint-scope@7.2.2: @@ -7479,7 +7481,7 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.34.0: {} + known-css-properties@0.30.0: {} levn@0.4.1: dependencies: @@ -7882,11 +7884,11 @@ snapshots: mlly: 1.7.1 pathe: 1.1.2 - playwright-core@1.46.1: {} + playwright-core@1.47.0: {} - playwright@1.46.1: + playwright@1.47.0: dependencies: - playwright-core: 1.46.1 + playwright-core: 1.47.0 optionalDependencies: fsevents: 2.3.2 diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte index 5768ad5..f614316 100644 --- a/src/lib/components/Header.svelte +++ b/src/lib/components/Header.svelte @@ -1,20 +1,20 @@
@@ -40,10 +40,10 @@ Account - + - Profile + Settings diff --git a/src/lib/components/LeftNav.svelte b/src/lib/components/LeftNav.svelte index 40f2ac0..5117a72 100644 --- a/src/lib/components/LeftNav.svelte +++ b/src/lib/components/LeftNav.svelte @@ -1,20 +1,20 @@ +
+

Settings

+
+