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 = '';