From bc95947fd1f5cd6c9b8deeaf3d9a053a05d6ede0 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Thu, 29 Feb 2024 17:11:07 -0800 Subject: [PATCH] Adding flash message to login redirects. --- package.json | 10 +- pnpm-lock.yaml | 94 +++++++++---------- src/lib/flashMessages.ts | 1 + src/lib/validations/zod-schemas.ts | 1 - .../(app)/(protected)/admin/+layout.server.ts | 14 ++- .../(protected)/collection/+page.server.ts | 12 ++- .../collection/add/+page.server.ts | 8 +- .../password/change/+page.server.ts | 31 ++++-- .../(protected)/password/change/+page.svelte | 15 ++- .../(app)/(protected)/profile/+page.server.ts | 22 +++-- .../(app)/(protected)/profile/+page.svelte | 7 +- .../(protected)/wishlist/+page.server.ts | 20 ++-- src/routes/(auth)/+layout.server.ts | 9 +- src/routes/(auth)/logout/+page.server.ts | 9 +- src/routes/(auth)/sign-up/+page.server.ts | 22 ++++- 15 files changed, 169 insertions(+), 106 deletions(-) create mode 100644 src/lib/flashMessages.ts diff --git a/package.json b/package.json index f309e3c..079b530 100644 --- a/package.json +++ b/package.json @@ -27,14 +27,14 @@ "devDependencies": { "@melt-ui/pp": "^0.3.0", "@melt-ui/svelte": "^0.74.3", - "@playwright/test": "^1.41.2", + "@playwright/test": "^1.42.0", "@resvg/resvg-js": "^2.6.0", "@sveltejs/adapter-auto": "^3.1.1", "@sveltejs/enhanced-img": "^0.1.8", "@sveltejs/kit": "^2.5.2", "@sveltejs/vite-plugin-svelte": "^3.0.2", "@types/cookie": "^0.6.0", - "@types/node": "^20.11.20", + "@types/node": "^20.11.24", "@types/pg": "^8.11.2", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", @@ -51,13 +51,13 @@ "postcss-load-config": "^5.0.3", "postcss-preset-env": "^9.4.0", "prettier": "^3.2.5", - "prettier-plugin-svelte": "^3.2.1", + "prettier-plugin-svelte": "^3.2.2", "prisma": "^5.9.1", "sass": "^1.71.1", "satori": "^0.10.13", "satori-html": "^0.3.2", "svelte": "^4.2.12", - "svelte-check": "^3.6.5", + "svelte-check": "^3.6.6", "svelte-meta-tags": "^3.1.0", "svelte-preprocess": "^5.1.3", "svelte-sequential-preprocessor": "^2.0.1", @@ -106,7 +106,7 @@ "just-kebab-case": "^4.2.0", "loader": "^2.1.1", "lucia": "3.0.1", - "lucide-svelte": "^0.341.0", + "lucide-svelte": "^0.343.0", "mysql2": "^3.9.2", "nanoid": "^5.0.6", "open-props": "^1.6.20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1397c78..c68b83e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -87,8 +87,8 @@ dependencies: specifier: 3.0.1 version: 3.0.1 lucide-svelte: - specifier: ^0.341.0 - version: 0.341.0(svelte@4.2.12) + specifier: ^0.343.0 + version: 0.343.0(svelte@4.2.12) mysql2: specifier: ^3.9.2 version: 3.9.2 @@ -137,8 +137,8 @@ devDependencies: specifier: ^0.74.3 version: 0.74.3(svelte@4.2.12) '@playwright/test': - specifier: ^1.41.2 - version: 1.41.2 + specifier: ^1.42.0 + version: 1.42.0 '@resvg/resvg-js': specifier: ^2.6.0 version: 2.6.0 @@ -158,8 +158,8 @@ devDependencies: specifier: ^0.6.0 version: 0.6.0 '@types/node': - specifier: ^20.11.20 - version: 20.11.20 + specifier: ^20.11.24 + version: 20.11.24 '@types/pg': specifier: ^8.11.2 version: 8.11.2 @@ -209,8 +209,8 @@ devDependencies: specifier: ^3.2.5 version: 3.2.5 prettier-plugin-svelte: - specifier: ^3.2.1 - version: 3.2.1(prettier@3.2.5)(svelte@4.2.12) + specifier: ^3.2.2 + version: 3.2.2(prettier@3.2.5)(svelte@4.2.12) prisma: specifier: ^5.9.1 version: 5.9.1 @@ -227,8 +227,8 @@ devDependencies: specifier: ^4.2.12 version: 4.2.12 svelte-check: - specifier: ^3.6.5 - version: 3.6.5(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.1)(svelte@4.2.12) + specifier: ^3.6.6 + version: 3.6.6(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.1)(svelte@4.2.12) svelte-meta-tags: specifier: ^3.1.0 version: 3.1.0(svelte@4.2.12)(typescript@5.3.3) @@ -252,7 +252,7 @@ devDependencies: version: 3.4.1(ts-node@10.9.2) ts-node: specifier: ^10.9.2 - version: 10.9.2(@types/node@20.11.20)(typescript@5.3.3) + version: 10.9.2(@types/node@20.11.24)(typescript@5.3.3) tslib: specifier: ^2.6.1 version: 2.6.2 @@ -264,10 +264,10 @@ devDependencies: version: 5.3.3 vite: specifier: ^5.1.4 - version: 5.1.4(@types/node@20.11.20)(sass@1.71.1) + version: 5.1.4(@types/node@20.11.24)(sass@1.71.1) vitest: specifier: ^1.3.1 - version: 1.3.1(@types/node@20.11.20)(sass@1.71.1) + version: 1.3.1(@types/node@20.11.24)(sass@1.71.1) zod: specifier: ^3.22.4 version: 3.22.4 @@ -2660,12 +2660,12 @@ packages: engines: {node: '>=16'} dev: false - /@playwright/test@1.41.2: - resolution: {integrity: sha512-qQB9h7KbibJzrDpkXkYvsmiDJK14FULCCZgEcoe2AvFAS64oCirWTwzTlAYEbKaRxWs5TFesE1Na6izMv3HfGg==} + /@playwright/test@1.42.0: + resolution: {integrity: sha512-2k1HzC28Fs+HiwbJOQDUwrWMttqSLUVdjCqitBOjdCD0svWOMQUVqrXX6iFD7POps6xXAojsX/dGBpKnjZctLA==} engines: {node: '>=16'} hasBin: true dependencies: - playwright: 1.41.2 + playwright: 1.42.0 dev: true /@polka/url@1.0.0-next.24: @@ -3264,7 +3264,7 @@ packages: sirv: 2.0.4 svelte: 4.2.12 tiny-glob: 0.2.9 - vite: 5.1.4(@types/node@20.11.20)(sass@1.71.1) + vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) /@sveltejs/vite-plugin-svelte-inspector@2.0.0(@sveltejs/vite-plugin-svelte@3.0.2)(svelte@4.2.12)(vite@5.1.4): resolution: {integrity: sha512-gjr9ZFg1BSlIpfZ4PRewigrvYmHWbDrq2uvvPB1AmTWKuM+dI1JXQSUu2pIrYLb/QncyiIGkFDFKTwJ0XqQZZg==} @@ -3277,7 +3277,7 @@ packages: '@sveltejs/vite-plugin-svelte': 3.0.2(svelte@4.2.12)(vite@5.1.4) debug: 4.3.4 svelte: 4.2.12 - vite: 5.1.4(@types/node@20.11.20)(sass@1.71.1) + vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) transitivePeerDependencies: - supports-color @@ -3295,7 +3295,7 @@ packages: magic-string: 0.30.5 svelte: 4.2.12 svelte-hmr: 0.15.3(svelte@4.2.12) - vite: 5.1.4(@types/node@20.11.20)(sass@1.71.1) + vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) vitefu: 0.2.5(vite@5.1.4) transitivePeerDependencies: - supports-color @@ -3338,22 +3338,22 @@ packages: /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - /@types/node@20.11.20: - resolution: {integrity: sha512-7/rR21OS+fq8IyHTgtLkDK949uzsa6n8BkziAKtPVpugIkO6D+/ooXMvzXxDnZrmtXVfjb1bKQafYpb8s89LOg==} + /@types/node@20.11.24: + resolution: {integrity: sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==} dependencies: undici-types: 5.26.5 /@types/pg@8.11.2: resolution: {integrity: sha512-G2Mjygf2jFMU/9hCaTYxJrwdObdcnuQde1gndooZSOHsNSaCehAuwc7EIuSA34Do8Jx2yZ19KtvW8P0j4EuUXw==} dependencies: - '@types/node': 20.11.20 + '@types/node': 20.11.24 pg-protocol: 1.6.0 pg-types: 4.0.2 /@types/pg@8.6.6: resolution: {integrity: sha512-O2xNmXebtwVekJDD+02udOncjVcMZQuTEQEMpKJ0ZRf5E7/9JJX3izhKUcUifBkyKpljyUM6BTgy2trmviKlpw==} dependencies: - '@types/node': 20.11.20 + '@types/node': 20.11.24 pg-protocol: 1.6.0 pg-types: 2.2.0 dev: false @@ -5494,8 +5494,8 @@ packages: oslo: 1.0.1 dev: false - /lucide-svelte@0.341.0(svelte@4.2.12): - resolution: {integrity: sha512-RdLUlxgm97pKGS5dKchdhLuxmYBpwpcLvZ5XQH3HPO5rZZU8JvfzFs8vnbZH/tsDeA0UeSzdzZyOYbWkOAbarA==} + /lucide-svelte@0.343.0(svelte@4.2.12): + resolution: {integrity: sha512-TkNQBnKU2+4gJFKZJtYmYt+uSIzqwCJf3x/MemMJyv/1WGW+1sej2aYuxoiIwqy5+0txw+OcGeNJF5sbHd6nxA==} peerDependencies: svelte: ^3 || ^4 || ^5.0.0-next.42 dependencies: @@ -6066,18 +6066,18 @@ packages: pathe: 1.1.2 dev: true - /playwright-core@1.41.2: - resolution: {integrity: sha512-VaTvwCA4Y8kxEe+kfm2+uUUw5Lubf38RxF7FpBxLPmGe5sdNkSg5e3ChEigaGrX7qdqT3pt2m/98LiyvU2x6CA==} + /playwright-core@1.42.0: + resolution: {integrity: sha512-0HD9y8qEVlcbsAjdpBaFjmaTHf+1FeIddy8VJLeiqwhcNqGCBe4Wp2e8knpqiYbzxtxarxiXyNDw2cG8sCaNMQ==} engines: {node: '>=16'} hasBin: true dev: true - /playwright@1.41.2: - resolution: {integrity: sha512-v0bOa6H2GJChDL8pAeLa/LZC4feoAMbSQm1/jF/ySsWWoaNItvrMP7GEkvEEFyCTUYKMxjQKaTSg5up7nR6/8A==} + /playwright@1.42.0: + resolution: {integrity: sha512-Ko7YRUgj5xBHbntrgt4EIw/nE//XBHOKVKnBjO1KuZkmkhlbgyggTe5s9hjqQ1LpN+Xg+kHsQyt5Pa0Bw5XpvQ==} engines: {node: '>=16'} hasBin: true dependencies: - playwright-core: 1.41.2 + playwright-core: 1.42.0 optionalDependencies: fsevents: 2.3.2 dev: true @@ -6308,7 +6308,7 @@ packages: dependencies: lilconfig: 2.1.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.11.20)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.24)(typescript@5.3.3) yaml: 1.10.2 dev: true @@ -6326,7 +6326,7 @@ packages: dependencies: lilconfig: 3.0.0 postcss: 8.4.35 - ts-node: 10.9.2(@types/node@20.11.20)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.11.24)(typescript@5.3.3) yaml: 2.3.4 /postcss-load-config@5.0.3(postcss@8.4.35): @@ -6607,8 +6607,8 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@3.2.1(prettier@3.2.5)(svelte@4.2.12): - resolution: {integrity: sha512-ENAPbIxASf2R79IZwgkG5sBdeNA9kLRlXVvKKmTXh79zWTy0KKoT86XO2pHrTitUPINd+iXWy12MRmgzKGVckA==} + /prettier-plugin-svelte@3.2.2(prettier@3.2.5)(svelte@4.2.12): + resolution: {integrity: sha512-ZzzE/wMuf48/1+Lf2Ffko0uDa6pyCfgHV6+uAhtg2U0AAXGrhCSW88vEJNAkAxW5qyrFY1y1zZ4J8TgHrjW++Q==} peerDependencies: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 @@ -7106,8 +7106,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.6.5(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.1)(svelte@4.2.12): - resolution: {integrity: sha512-5aLgoQEdadvp8ypvKQ2avhnQ+V9YPQQaWrTFlXFw5g/v8xIQBvo+X/WqxTyD+V/ItDqXg3+abUA53rdDHgUjCA==} + /svelte-check@3.6.6(postcss-load-config@5.0.3)(postcss@8.4.35)(sass@1.71.1)(svelte@4.2.12): + resolution: {integrity: sha512-b9q9rOHOMYF3U8XllK7LmXTq1LeWQ98waGfEJzrFutViadkNl1tgdEtxIQ8yuPx+VQ4l7YrknYol+0lfZocaZw==} hasBin: true peerDependencies: svelte: ^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0 @@ -7491,7 +7491,7 @@ packages: /ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - /ts-node@10.9.2(@types/node@20.11.20)(typescript@5.3.3): + /ts-node@10.9.2(@types/node@20.11.24)(typescript@5.3.3): resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -7510,7 +7510,7 @@ packages: '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 - '@types/node': 20.11.20 + '@types/node': 20.11.24 acorn: 8.11.2 acorn-walk: 8.3.0 arg: 4.1.3 @@ -7670,7 +7670,7 @@ packages: - rollup dev: true - /vite-node@1.3.1(@types/node@20.11.20)(sass@1.71.1): + /vite-node@1.3.1(@types/node@20.11.24)(sass@1.71.1): resolution: {integrity: sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7679,7 +7679,7 @@ packages: debug: 4.3.4 pathe: 1.1.2 picocolors: 1.0.0 - vite: 5.1.4(@types/node@20.11.20)(sass@1.71.1) + vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) transitivePeerDependencies: - '@types/node' - less @@ -7691,7 +7691,7 @@ packages: - terser dev: true - /vite@5.1.4(@types/node@20.11.20)(sass@1.71.1): + /vite@5.1.4(@types/node@20.11.24)(sass@1.71.1): resolution: {integrity: sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7719,7 +7719,7 @@ packages: terser: optional: true dependencies: - '@types/node': 20.11.20 + '@types/node': 20.11.24 esbuild: 0.19.12 postcss: 8.4.35 rollup: 4.12.0 @@ -7735,9 +7735,9 @@ packages: vite: optional: true dependencies: - vite: 5.1.4(@types/node@20.11.20)(sass@1.71.1) + vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) - /vitest@1.3.1(@types/node@20.11.20)(sass@1.71.1): + /vitest@1.3.1(@types/node@20.11.24)(sass@1.71.1): resolution: {integrity: sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -7762,7 +7762,7 @@ packages: jsdom: optional: true dependencies: - '@types/node': 20.11.20 + '@types/node': 20.11.24 '@vitest/expect': 1.3.1 '@vitest/runner': 1.3.1 '@vitest/snapshot': 1.3.1 @@ -7780,8 +7780,8 @@ packages: strip-literal: 2.0.0 tinybench: 2.6.0 tinypool: 0.8.2 - vite: 5.1.4(@types/node@20.11.20)(sass@1.71.1) - vite-node: 1.3.1(@types/node@20.11.20)(sass@1.71.1) + vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) + vite-node: 1.3.1(@types/node@20.11.24)(sass@1.71.1) why-is-node-running: 2.2.2 transitivePeerDependencies: - less diff --git a/src/lib/flashMessages.ts b/src/lib/flashMessages.ts new file mode 100644 index 0000000..2276f46 --- /dev/null +++ b/src/lib/flashMessages.ts @@ -0,0 +1 @@ +export const notSignedInMessage = { type: 'error', message: 'You are not signed in' } as const; \ No newline at end of file diff --git a/src/lib/validations/zod-schemas.ts b/src/lib/validations/zod-schemas.ts index 395fe10..1ce5e80 100644 --- a/src/lib/validations/zod-schemas.ts +++ b/src/lib/validations/zod-schemas.ts @@ -24,7 +24,6 @@ export const userSchema = z.object({ email: z.string() .trim() .max(64, { message: 'Email must be less than 64 characters' }) - .email({ message: 'Please enter a valid email address' }) .optional(), username: z .string() diff --git a/src/routes/(app)/(protected)/admin/+layout.server.ts b/src/routes/(app)/(protected)/admin/+layout.server.ts index 9c04c6c..aab85c0 100644 --- a/src/routes/(app)/(protected)/admin/+layout.server.ts +++ b/src/routes/(app)/(protected)/admin/+layout.server.ts @@ -1,6 +1,12 @@ -import { redirect } from '@sveltejs/kit'; -import type { PageServerData } from './$types'; +import { redirect } from 'sveltekit-flash-message/server' +import type { PageServerLoad } from './$types'; +import { notSignedInMessage } from '$lib/flashMessages'; -export const load: PageServerData = async function ({ locals }) { - if (!locals?.user?.role?.includes('admin')) redirect(302, '/'); +export async function load(event) { + const { locals } = event; + if (!locals?.user?.role?.includes('admin')) { + redirect(302, '/login', notSignedInMessage, event); + } + + return {} }; diff --git a/src/routes/(app)/(protected)/collection/+page.server.ts b/src/routes/(app)/(protected)/collection/+page.server.ts index cd432a8..e743aca 100644 --- a/src/routes/(app)/(protected)/collection/+page.server.ts +++ b/src/routes/(app)/(protected)/collection/+page.server.ts @@ -1,17 +1,19 @@ -import { type Actions, error, fail, redirect } from '@sveltejs/kit'; +import { type Actions, error, fail } from '@sveltejs/kit'; import { and, eq } from 'drizzle-orm'; import { superValidate } from 'sveltekit-superforms/server'; import { zod } from 'sveltekit-superforms/adapters'; -import { modifyListGameSchema, type ListGame } from '$lib/config/zod-schemas.js'; +import { redirect } from 'sveltekit-flash-message/server' +import { modifyListGameSchema, type ListGame } from '$lib/validations/zod-schemas'; import { search_schema } from '$lib/zodValidation.js'; -import type { PageServerLoad } from './$types'; import db from '$lib/drizzle'; import { collection_items, collections, games } from '../../../../schema'; +import { notSignedInMessage } from '$lib/flashMessages'; -export const load: PageServerLoad = async ({ fetch, url, locals }) => { +export async function load(event) { + const { url, locals } = event; const user = locals.user; if (!user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } // console.log('locals load', locals); diff --git a/src/routes/(app)/(protected)/collection/add/+page.server.ts b/src/routes/(app)/(protected)/collection/add/+page.server.ts index 9388402..5245b71 100644 --- a/src/routes/(app)/(protected)/collection/add/+page.server.ts +++ b/src/routes/(app)/(protected)/collection/add/+page.server.ts @@ -1,11 +1,13 @@ import { redirect } from "@sveltejs/kit"; import type { PageServerLoad } from "../$types"; +import { notSignedInMessage } from "$lib/flashMessages"; -export const load: PageServerLoad = async ({ locals, fetch }) => { +export async function load(event) { + const { locals } = event; const user = locals.user; if (!user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } - + return {} } \ No newline at end of file diff --git a/src/routes/(app)/(protected)/password/change/+page.server.ts b/src/routes/(app)/(protected)/password/change/+page.server.ts index 99f4f88..34fb670 100644 --- a/src/routes/(app)/(protected)/password/change/+page.server.ts +++ b/src/routes/(app)/(protected)/password/change/+page.server.ts @@ -1,20 +1,22 @@ -import { fail, redirect, type Actions } from "@sveltejs/kit"; +import { fail, type Actions } from "@sveltejs/kit"; import { eq } from "drizzle-orm"; import { zod } from 'sveltekit-superforms/adapters'; import { setError, superValidate } from 'sveltekit-superforms/server'; +import { redirect } from 'sveltekit-flash-message/server' import { Argon2id } from "oslo/password"; import db from "$lib/drizzle"; -import { changeUserPasswordSchema } from '$lib/config/zod-schemas.js'; +import { changeUserPasswordSchema } from '$lib/validations/account'; import { lucia } from '$lib/server/auth.js'; import type { PageServerLoad } from "./$types"; import { users } from "../../../../../schema"; +import { notSignedInMessage } from "$lib/flashMessages"; export const load: PageServerLoad = async (event) => { const form = await superValidate(event, zod(changeUserPasswordSchema)); const user = event.locals.user; if (!user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } form.data = { @@ -39,7 +41,7 @@ export const actions: Actions = { console.log('updating profile'); if (!event.locals.user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } const user = event.locals.user; @@ -61,7 +63,7 @@ export const actions: Actions = { const currentPasswordVerified = await new Argon2id().verify(dbUser.hashed_password, form.data.current_password); if (!currentPasswordVerified) { - return setError(form, 'current_password', 'Your password is incorrect.'); + return setError(form, 'current_password', 'Your password is incorrect'); } try { @@ -78,13 +80,22 @@ export const actions: Actions = { country: event.locals.session?.ip, }); const sessionCookie = lucia.createSessionCookie(session.id); - return new Response(null, { + redirect({ status: 302, - headers: { - Location: '/login', - 'Set-Cookie': sessionCookie.serialize() - } + location: '/login', + message: { + type: 'success', + text: 'Password changed successfully' + }, + event: sessionCookie.serialize() }); + // return new Response(null, { + // status: 302, + // headers: { + // Location: '/login', + // 'Set-Cookie': sessionCookie.serialize() + // } + // }); } else { return setError( form, diff --git a/src/routes/(app)/(protected)/password/change/+page.svelte b/src/routes/(app)/(protected)/password/change/+page.svelte index c9d232e..51de1f0 100644 --- a/src/routes/(app)/(protected)/password/change/+page.svelte +++ b/src/routes/(app)/(protected)/password/change/+page.svelte @@ -1,17 +1,26 @@ diff --git a/src/routes/(app)/(protected)/profile/+page.server.ts b/src/routes/(app)/(protected)/profile/+page.server.ts index 2a67b51..bd0f2e0 100644 --- a/src/routes/(app)/(protected)/profile/+page.server.ts +++ b/src/routes/(app)/(protected)/profile/+page.server.ts @@ -1,17 +1,18 @@ import { fail, type Actions } from '@sveltejs/kit'; +import { z } from 'zod'; import { eq } from 'drizzle-orm'; import { zod } from 'sveltekit-superforms/adapters'; import { message, setError, superValidate } from 'sveltekit-superforms/server'; import { redirect } from 'sveltekit-flash-message/server'; import { changeEmailSchema, profileSchema } from '$lib/validations/account'; +import { notSignedInMessage } from '$lib/flashMessages'; +import db from '$lib/drizzle'; import type { PageServerLoad } from './$types'; import { users } from '../../../../schema'; -import db from '$lib/drizzle'; export const load: PageServerLoad = async (event) => { if (!event.locals.user) { - const message = { type: 'error', message: 'You are not signed in' } as const; - throw redirect(302, '/login', message, event); + redirect(302, '/login', notSignedInMessage, event); } const { user } = event.locals; @@ -41,6 +42,13 @@ export const load: PageServerLoad = async (event) => { }; }; +const changeEmailIfNotEmpty = z.object({ + email: z.string() + .trim() + .max(64, { message: 'Email must be less than 64 characters' }) + .email({ message: 'Please enter a valid email' }) + }); + export const actions: Actions = { profileUpdate: async (event) => { const form = await superValidate(event, zod(profileSchema)); @@ -51,7 +59,7 @@ export const actions: Actions = { }); } if (!event.locals.user) { - throw redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } try { @@ -94,14 +102,14 @@ export const actions: Actions = { const form = await superValidate(event, zod(changeEmailSchema)); const newEmail = form.data?.email; - if (!form.valid || !newEmail || newEmail === '') { + if (!form.valid || !newEmail || (newEmail !== '' && changeEmailIfNotEmpty.safeParse(form.data).success === false)) { return fail(400, { form }); } if (!event.locals.user) { - throw redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } const user = event.locals.user; @@ -110,7 +118,7 @@ export const actions: Actions = { }); if (existingUser && existingUser.id !== user.id) { - return setError(form, 'email', { type: 'error', message: 'That email is already taken' }); + return setError(form, 'email', 'That email is already taken'); } await db diff --git a/src/routes/(app)/(protected)/profile/+page.svelte b/src/routes/(app)/(protected)/profile/+page.svelte index 4957247..d524bb4 100644 --- a/src/routes/(app)/(protected)/profile/+page.svelte +++ b/src/routes/(app)/(protected)/profile/+page.svelte @@ -26,7 +26,12 @@ const { form: emailForm, errors: emailErrors, enhance: emailEnhance } = superForm(data.emailForm, { taintedMessage: null, validators: zodClient(changeEmailSchema), - delayMs: 0 + delayMs: 500, + multipleSubmits: 'prevent', + syncFlashMessage: true, + flashMessage: { + module: flashModule, + } }); diff --git a/src/routes/(app)/(protected)/wishlist/+page.server.ts b/src/routes/(app)/(protected)/wishlist/+page.server.ts index 42dbf10..6e7012d 100644 --- a/src/routes/(app)/(protected)/wishlist/+page.server.ts +++ b/src/routes/(app)/(protected)/wishlist/+page.server.ts @@ -1,14 +1,17 @@ -import { error, redirect, type Actions } from '@sveltejs/kit'; +import { error, type Actions } from '@sveltejs/kit'; import { zod } from 'sveltekit-superforms/adapters'; import { superValidate } from 'sveltekit-superforms/server'; -import { modifyListGameSchema } from '$lib/config/zod-schemas.js'; +import { redirect } from 'sveltekit-flash-message/server'; +import { modifyListGameSchema } from '$lib/validations/zod-schemas'; import db from '$lib/drizzle.js'; import { and, eq } from 'drizzle-orm'; import { games, wishlist_items, wishlists } from '../../../../schema.js'; +import { notSignedInMessage } from '$lib/flashMessages.js'; -export async function load({ params, locals }) { +export async function load(event) { + const { params, locals } = event; if (!locals.user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } console.log('Wishlist load User id', locals.user.id); @@ -54,7 +57,7 @@ export const actions: Actions = { try { if (!locals.user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } const game = await db.query.games.findFirst({ @@ -96,9 +99,10 @@ export const actions: Actions = { } }, // Create new wishlist - create: async ({ locals }) => { + create: async (event) => { + const { locals } = event; if (!locals.user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } return error(405, 'Method not allowed'); }, @@ -116,7 +120,7 @@ export const actions: Actions = { try { if (!locals.user) { - redirect(302, '/login'); + redirect(302, '/login', notSignedInMessage, event); } const game = await db.query.games.findFirst({ diff --git a/src/routes/(auth)/+layout.server.ts b/src/routes/(auth)/+layout.server.ts index 84402fc..78c3b0d 100644 --- a/src/routes/(auth)/+layout.server.ts +++ b/src/routes/(auth)/+layout.server.ts @@ -1,9 +1,10 @@ -import { redirect } from '@sveltejs/kit'; -import type { LayoutServerLoad } from './$types'; +import { redirect } from 'sveltekit-flash-message/server'; +import { notSignedInMessage } from '$lib/flashMessages'; -export const load: LayoutServerLoad = async ({ url, locals }) => { +export async function load(event) { + const { url, locals } = event; if (locals.user) { - redirect(302, '/'); + redirect(302, '/', notSignedInMessage, event); } return { diff --git a/src/routes/(auth)/logout/+page.server.ts b/src/routes/(auth)/logout/+page.server.ts index 9f6098a..9fdfe9b 100644 --- a/src/routes/(auth)/logout/+page.server.ts +++ b/src/routes/(auth)/logout/+page.server.ts @@ -1,9 +1,12 @@ -import { redirect, fail } from '@sveltejs/kit'; +import { fail } from '@sveltejs/kit'; import { lucia } from '$lib/server/auth'; import type { Actions } from "./$types"; +import { redirect } from 'sveltekit-flash-message/server'; +import { notSignedInMessage } from '$lib/flashMessages'; export const actions: Actions = { - default: async ({ locals, cookies }) => { + default: async (event) => { + const { locals, cookies } = event; console.log('Signing out user'); if (!locals.session) { return fail(401); @@ -14,6 +17,6 @@ export const actions: Actions = { path: '.', ...sessionCookie.attributes }); - return redirect(302, '/login'); + return redirect(302, '/login', notSignedInMessage, event); } }; diff --git a/src/routes/(auth)/sign-up/+page.server.ts b/src/routes/(auth)/sign-up/+page.server.ts index 19027fe..009b203 100644 --- a/src/routes/(auth)/sign-up/+page.server.ts +++ b/src/routes/(auth)/sign-up/+page.server.ts @@ -2,15 +2,25 @@ import { fail, error, type Actions, redirect } from '@sveltejs/kit'; import { Argon2id } from 'oslo/password'; import { eq } from 'drizzle-orm'; import { nanoid } from 'nanoid'; -import { setError, superValidate } from 'sveltekit-superforms/server'; +import { zod } from 'sveltekit-superforms/adapters'; +import { message, setError, superValidate } from 'sveltekit-superforms/server'; import type { PageServerLoad } from './$types'; import { lucia } from '$lib/server/auth'; -import { signUpSchema } from '$lib/config/zod-schemas'; +import { signUpSchema } from '$lib/validations/auth'; import { add_user_to_role } from '$server/roles'; -import type { Message } from '$lib/types.js'; import db from '$lib/drizzle'; import { collections, users, wishlists } from '../../../schema'; +const signUpDefaults = { + firstName: '', + lastName: '', + email: '', + username: '', + password: '', + confirm_password: '', + terms: true +}; + export const load: PageServerLoad = async (event) => { console.log('sign up load event', event); // const session = await event.locals.auth.validate(); @@ -18,13 +28,15 @@ export const load: PageServerLoad = async (event) => { // throw redirect(302, '/'); // } return { - form: await superValidate(event, signUpSchema) + form: await superValidate(zod(signUpSchema), { + defaults: signUpDefaults + }) }; }; export const actions: Actions = { default: async (event) => { - const form = await superValidate(event, signUpSchema); + const form = await superValidate(event, zod(signUpSchema)); if (!form.valid) { form.data.password = ''; form.data.confirm_password = '';