User: Add login/register/profile form handling

This commit is contained in:
2024-12-12 04:41:13 +01:00
parent 27620fc70e
commit 1410811167

View File

@ -0,0 +1,75 @@
import {
form_data_clean,
form_data_ensure_keys,
form_data_get_and_remove_id,
} from "$lib/forms";
import { error, redirect } from "@sveltejs/kit";
import type { Actions } from "./$types";
export const actions = {
create: async ({ cookies, request, locals }) => {
const data = form_data_clean(await request.formData());
form_data_ensure_keys(data, ["username", "password"]);
// TODO: Errrr passwordConfirm... How to integrate it into the unified login-/register-UI?
const record = await locals.pb.collection("users").create({
username: data.get("username")?.toString(),
password: data.get("password")?.toString(),
passwordConfirm: data.get("password")?.toString(),
admin: false,
});
// Directly login after registering
await locals.pb
.collection("users")
.authWithPassword(
data.get("username")?.toString(),
data.get("password")?.toString(),
);
redirect(303, "/");
},
// TODO: PocketBase API rule: Only the active user should be able to modify itself
update: async ({ cookies, request, locals }) => {
const data = form_data_clean(await request.formData());
const id = form_data_get_and_remove_id(data);
const record = await locals.pb.collection("users").update(id, data);
redirect(303, "/");
},
login: async ({ cookies, request, locals }) => {
if (locals.user) {
console.log("Already logged in!");
return;
}
const data = form_data_clean(await request.formData());
form_data_ensure_keys(data, ["username", "password"]);
try {
await locals.pb
.collection("users")
.authWithPassword(
data.get("username")?.toString(),
data.get("password")?.toString(),
);
} catch (err) {
console.log(`Failed to login: ${err}`);
error(400, "Failed to login!");
}
// TODO: Would be better to redirect to previous page somehow...
redirect(303, "/");
},
logout: async ({ cookies, request, locals }) => {
locals.pb.authStore.clear();
locals.user = undefined;
// TODO: Would be better to redirect to previous page somehow...
redirect(303, "/");
},
} satisfies Actions;