import { Handlers, PageProps } from "$fresh/server.ts"; import { Page } from "../components/Page.tsx"; import { PostgresError, query } from "../db.ts"; import { hash } from "https://deno.land/x/bcrypt@v0.4.1/mod.ts"; type UserID = string; interface RegistrationError { message: string; } export const handler: Handlers = { async POST(request, context) { const formData = (await request.formData()); const username = formData.get("username"); const password = formData.get("password"); if (!username) { return await context.render({ message: "no username provided" }); } if (!password) { return await context.render({ message: "no password provided" }); } const hashed_password = await hash(password.toString()); try { const result = await query<{ id: string }>( `insert into "user" (username, hashed_password) values ($1, $2) returning id`, [username, hashed_password], ); console.debug(result); if (!result) throw "insert failed"; const { rows: [{ id }] } = result; return await context.render(id); } catch (err) { if ( err instanceof PostgresError && err.fields.code == "23505" && err.fields.constraint == "user_username_key" ) { return await context.render({ message: `A user with username '${username}' already exists`, }); } throw err; } }, }; export default function Register( { data: userId }: PageProps, ) { if (typeof userId == "string") { return RegistrationSuccessful(userId); } else { return RegistrationForm(userId); } } function RegistrationSuccessful(_userId: UserID) { return (

You're all signed up! Let's go log in!

); } function RegistrationForm(props?: RegistrationError | null) { console.log(props); return (

Register your account

{props != null && (

Error: {props.message}

)}
); }