.ts
TypeScript
(application/typescript)
// 3rd-party
import type { ReqHandler } from "@ethicdevs/react-monolith";
// app
import { AppRoute, AppRoutesParams } from "../../routes";
import RegisterView, { RegisterViewProps } from "../../views/auth/RegisterView";
import { makeAuthService } from "../../services/auth";

const postRegisterView: ReqHandler = async (request, reply) => {
  const authService = makeAuthService({ request });
  const reqHandler = reply.makeRequestHandler(request, reply);

  const {
    email_address: emailAddress,
    username,
    password,
  } = request.body as AppRoutesParams[AppRoute.AUTH_REGISTER_ACTION]["body"];

  const initialValues = { emailAddress, username };

  if (request.validationError != null) {
    const {
      message: errorMessage,
      validation,
      validationContext,
    } = request.validationError;

    console.log("validation:", validation);
    console.log("validationContext:", validationContext);

    return reqHandler<RegisterViewProps>(RegisterView.name, {
      errorMessage,
      initialValues,
    });
  }

  if (await authService.isExistingUsername(username)) {
    return reqHandler<RegisterViewProps>(RegisterView.name, {
      errorMessage: "This is username is already taken. Please choose another.",
      initialValues: { emailAddress, username },
    });
  }

  const newUser = await authService.createUser({
    emailAddress,
    username,
    password,
  });

  console.log(`Made new user with id: ${newUser.id}`);

  request.session.data.authenticated = true;
  request.session.data.curr_user_uid = newUser.id;
  request.session.data.curr_user_role = newUser.role;
  request.session.data.curr_user_username = newUser.username;
  request.session.data.curr_user_avatar_uri = newUser.avatarUri;

  reply.redirect(request.namedViewsPathMap[AppRoute.HOME]);
  return reply;
};

export default postRegisterView;