35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import { fail, redirect } from '@sveltejs/kit';
|
|
import { redeemOtp } from '$lib/server/member-otp';
|
|
import { slugify, handle } from '@shared/slugify';
|
|
import { setSessionCookie, clearLegacyCookies } from '$lib/server/session';
|
|
|
|
export const actions = {
|
|
default: async (event) => {
|
|
const fd = await event.request.formData();
|
|
const famName = (fd.get('family') || '').toString().trim();
|
|
const name = (fd.get('name') || '').toString().trim();
|
|
const otp = (fd.get('otp') || '').toString().trim();
|
|
|
|
if (!famName) return fail(400, { error: 'Enter your family name.', famName, name, otp });
|
|
if (!name) return fail(400, { error: 'Enter your name.', famName, name, otp });
|
|
if (!otp) return fail(400, { error: 'Enter the code shown by your parent.', famName, name, otp });
|
|
|
|
const famSlug = slugify(famName);
|
|
try {
|
|
const token = await redeemOtp({ famSlug, username: name, otp });
|
|
clearLegacyCookies(event.cookies);
|
|
setSessionCookie(event.cookies, token);
|
|
} catch (e) {
|
|
return fail(400, {
|
|
error: e instanceof Error ? e.message : 'Join failed',
|
|
famName,
|
|
name,
|
|
otp
|
|
});
|
|
}
|
|
|
|
const handleName = handle(name);
|
|
throw redirect(303, `/${famSlug}/${encodeURIComponent(handleName)}`);
|
|
}
|
|
};
|