diff --git a/src/lib/avatars.ts b/src/lib/avatars.ts index 48803b4..b474eaa 100644 --- a/src/lib/avatars.ts +++ b/src/lib/avatars.ts @@ -298,3 +298,10 @@ export async function createNewAvatar( return time } + +export function deleteAvatar(id: string) { + const targetAvatarDirectory = join(avatarDirectory, id) + return prisma.avatar + .delete({ where: { id } }) + .then(_ => rm(targetAvatarDirectory, { recursive: true, force: true })) +} diff --git a/src/lib/components/StatusBanner.svelte b/src/lib/components/StatusBanner.svelte index 051f2ec..9227e29 100644 --- a/src/lib/components/StatusBanner.svelte +++ b/src/lib/components/StatusBanner.svelte @@ -12,29 +12,15 @@ } .error { - --color: #d20f39; + --color: var(--red); } .warn { - --color: #df8e1d; + --color: var(--yellow); } .success { - --color: #40a02b; - } - - @media (prefers-color-scheme: dark) { - .error { - --color: #f38ba8; - } - - .warn { - --color: #f9e2af; - } - - .success { - --color: #a6e3a1; - } + --color: var(--green); }
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 2e5c739..dd46cfd 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -21,15 +21,23 @@ --link: #333; --background: white; --crust: #eee; + --red: #d20f39; + --yellow: #df8e1d; + --green: #40a02b; } + @media (prefers-color-scheme:dark) { :root { --text: white; --link: #aaa; --background: #111; --crust: #333; + --red: #f38ba8; + --yellow: #f9e2af; + --green: #a6e3a1 } } + html { background: var(--background); } diff --git a/src/routes/avatars/[id]/+page.server.ts b/src/routes/avatars/[id]/+page.server.ts index 03322b7..415b418 100644 --- a/src/routes/avatars/[id]/+page.server.ts +++ b/src/routes/avatars/[id]/+page.server.ts @@ -1,9 +1,10 @@ import { getRequestUser, launchLogin } from "$lib/oidc" import configuration from "$lib/configuration.js" -import { fail, redirect } from "@sveltejs/kit" +import { error, fail, redirect } from "@sveltejs/kit" import { avatarDirectory, createNewAvatar, + deleteAvatar, getMetadataForUserId, } from "$lib/avatars.js" import { join } from "path" @@ -12,9 +13,16 @@ export async function load({ request, parent, url, params: { id } }) { const { user } = await parent() if (!user) return launchLogin(url.toString()) + let avatar = await prisma.avatar.findUnique({ + where: { id, userId: user.sub }, + }) + + if (!avatar) + throw error(404, "Avatar is not owned by you or does not exist") + return { url: url.toString(), - avatar: await prisma.avatar.findUnique({ where: { id } }), + avatar, } } @@ -23,20 +31,34 @@ export const actions = { let user = await getRequestUser(request, cookies) if (!user) return fail(401, { error: "unauthenticated" }) - let { altText, source } = Object.fromEntries( + if ( + !(await prisma.avatar.findUnique({ + where: { id, userId: user.sub }, + })) + ) + return fail(404, { + error: "Avatar is not owned by you or does not exist", + }) + + let { action, altText, source } = Object.fromEntries( (await request.formData()).entries() ) - await prisma.avatar.update({ - where: { - id, - }, - data: { - altText: altText instanceof File ? undefined : altText, - source: source instanceof File ? undefined : source, - }, - }) + if (action == "Save") { + await prisma.avatar.update({ + where: { + id, + }, + data: { + altText: altText instanceof File ? undefined : altText, + source: source instanceof File ? undefined : source, + }, + }) - return redirect(302, "/set") + return redirect(302, "/set") + } else if (action == "Delete") { + await deleteAvatar(id) + return redirect(302, "/set") + } }, } diff --git a/src/routes/avatars/[id]/+page.svelte b/src/routes/avatars/[id]/+page.svelte index 017a72f..4560a95 100644 --- a/src/routes/avatars/[id]/+page.svelte +++ b/src/routes/avatars/[id]/+page.svelte @@ -58,6 +58,12 @@ form textarea:disabled { color: var(--link); } + form input[type="submit"][value="Delete"] { + border: 1px solid var(--red); + background-color: color-mix(in srgb, var(--red) 20%, var(--background) 80%); + color: var(--red); + margin-right: auto; + } @@ -82,6 +88,7 @@
+
\ No newline at end of file