import type { ReqHandler } from "@ethicdevs/react-monolith";
import { AppRoute, AppRoutesParams } from "../../routes";
import LoginView, { LoginViewProps } from "../../views/auth/LoginView";
import { makeAuthService } from "../../services/auth";
const postLoginView: ReqHandler = async (request, reply) => {
const authService = makeAuthService({
cryptoService: request.cryptoService,
request,
});
const reqHandler = reply.makeRequestHandler(request, reply);
const { email_address: emailAddress, password } =
request.body as AppRoutesParams[AppRoute.AUTH_LOGIN_ACTION]["body"];
const initialValues = { emailAddress };
if (request.validationError != null) {
const { message: errorMessage } = request.validationError;
return reqHandler<LoginViewProps>(LoginView.name, {
errorMessage,
initialValues,
});
}
if (emailAddress.trim() === "") {
return reqHandler<LoginViewProps>(LoginView.name, {
errorMessage: "Please provide a non-empty email address.",
initialValues: { emailAddress },
});
}
if (password.trim() === "") {
return reqHandler<LoginViewProps>(LoginView.name, {
errorMessage: "Please provide a non-empty password.",
initialValues: { emailAddress },
});
}
if ((await authService.isExistingEmailAddress(emailAddress)) === false) {
return reqHandler<LoginViewProps>(LoginView.name, {
errorMessage:
"Invalid credentials. Please verify your input and try again.",
initialValues: { emailAddress },
});
}
const [isLoginAllowed, user] = await authService.shouldAllowUserLogin(
emailAddress,
password
);
if (isLoginAllowed === false || user == null) {
return reqHandler<LoginViewProps>(LoginView.name, {
errorMessage:
"Invalid credentials. Please verify your input and try again.",
initialValues: { emailAddress },
});
}
const { avatarUri, role, id: userId, username } = user;
request.session.data.authenticated = true;
request.session.data.curr_user_avatar_uri = avatarUri;
request.session.data.curr_user_role = role;
request.session.data.curr_user_uid = userId;
request.session.data.curr_user_username = username;
console.log(`Logged user with id: ${userId}`);
reply.redirect(request.namedViewsPathMap[AppRoute.HOME]);
return reply;
};
export default postLoginView;