diff --git a/src/lib/server/prisma/migrations/20231010021216_add_settings_to_user/migration.sql b/src/lib/server/prisma/migrations/20231010021216_add_settings_to_user/migration.sql new file mode 100644 index 0000000..fd666e5 --- /dev/null +++ b/src/lib/server/prisma/migrations/20231010021216_add_settings_to_user/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "settings" JSONB NOT NULL DEFAULT '{}'; diff --git a/src/lib/server/prisma/schema.prisma b/src/lib/server/prisma/schema.prisma index 9d9e6f8..c99f935 100644 --- a/src/lib/server/prisma/schema.prisma +++ b/src/lib/server/prisma/schema.prisma @@ -17,6 +17,7 @@ model User { password String name String verified Boolean @default(false) + settings Json @default("{}") pastes Paste[] AuthToken AuthToken[] } diff --git a/src/lib/types.ts b/src/lib/types.ts index 8040292..828149d 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -37,3 +37,11 @@ export interface PastePatchResponse { }; error?: string; } + +export interface UserSettings { + defaults?: { + encrypted?: boolean; + burnAfterRead?: boolean; + expiresAfterSeconds?: number; + }; +} diff --git a/src/lib/utils/time.ts b/src/lib/utils/time.ts new file mode 100644 index 0000000..3d23de6 --- /dev/null +++ b/src/lib/utils/time.ts @@ -0,0 +1,18 @@ +export function secondsToDHM(seconds: number) { + const days = Math.floor(seconds / (3600 * 24)); + const hours = Math.floor((seconds % (3600 * 24)) / 3600); + const minutes = Math.floor((seconds % 3600) / 60); + return { days, hours, minutes }; +} + +export function DHMToSeconds({ + days, + hours, + minutes +}: { + days?: number; + hours?: number; + minutes?: number; +}) { + return (days ?? 0) * 3600 * 24 + (hours ?? 0) * 3600 + (minutes ?? 0) * 60; +} diff --git a/src/routes/(auth)/logout/+page.server.ts b/src/routes/(auth)/logout/+page.server.ts index 638c546..089ff75 100644 --- a/src/routes/(auth)/logout/+page.server.ts +++ b/src/routes/(auth)/logout/+page.server.ts @@ -1,4 +1,4 @@ -import { redirect, type Actions, type RequestHandler } from '@sveltejs/kit'; +import { redirect, type Actions } from '@sveltejs/kit'; import type { PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ cookies }) => { diff --git a/src/routes/+page.server.ts b/src/routes/+page.server.ts index b5527f0..9e266e1 100644 --- a/src/routes/+page.server.ts +++ b/src/routes/+page.server.ts @@ -1,6 +1,19 @@ import { getUserIdFromCookie } from '$lib/server/auth'; +import type { UserSettings } from '$lib/types'; +import prisma from '@db'; export async function load({ cookies }) { const userId = await getUserIdFromCookie(cookies); - return { loggedIn: !!userId }; + + let settings: UserSettings | undefined; + + if (userId) { + const user = await prisma.user.findUnique({ + where: { id: userId }, + select: { settings: true } + }); + settings = user?.settings as UserSettings; + } + + return { loggedIn: !!userId, settings }; } diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 9187fca..828147a 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,13 +1,14 @@ + +
diff --git a/src/routes/dashboard/settings/+page.server.ts b/src/routes/dashboard/settings/+page.server.ts new file mode 100644 index 0000000..e77ec59 --- /dev/null +++ b/src/routes/dashboard/settings/+page.server.ts @@ -0,0 +1,40 @@ +import { getUserIdFromCookie } from '$lib/server/auth'; +import { redirect, type Actions } from '@sveltejs/kit'; +import type { PageServerLoad } from './$types'; +import prisma from '@db'; +import type { UserSettings } from '$lib/types'; + +export const load: PageServerLoad = async ({ cookies }) => { + const userId = await getUserIdFromCookie(cookies); + if (!userId) throw redirect(303, '/login'); + + const user = await prisma.user.findUnique({ + where: { id: userId }, + select: { settings: true } + }); + + return { settings: user?.settings as UserSettings }; +}; + +export const actions: Actions = { + defaults: async ({ cookies, request }) => { + const userId = await getUserIdFromCookie(cookies); + if (!userId) throw redirect(303, '/login'); + + const formData = await request.formData(); + const expiresAfterSeconds = parseInt(formData.get('expires-after-seconds')?.toString() ?? '0'); + const data = { + encrypted: formData.get('encrypted') === 'on', + burnAfterRead: formData.get('burn-after-read') === 'on', + expiresAfterSeconds: Math.max(0, Math.min(365 * 24 * 3600, expiresAfterSeconds)) + }; + + const user = await prisma.user.update({ + where: { id: userId }, + data: { settings: { defaults: data } }, + select: { settings: true } + }); + + return { defaultsForm: { success: true, settings: user.settings as UserSettings } }; + } +}; diff --git a/src/routes/dashboard/settings/+page.svelte b/src/routes/dashboard/settings/+page.svelte new file mode 100644 index 0000000..ef45050 --- /dev/null +++ b/src/routes/dashboard/settings/+page.svelte @@ -0,0 +1,115 @@ + + +