@proofkit/cli
Version:
Create web application with the ProofKit stack
50 lines (43 loc) • 1.63 kB
text/typescript
"use server";
import { actionClient } from "@/server/safe-action";
import { signupSchema } from "./schema";
import { checkEmailAvailability, createUser } from "@/server/auth/utils/user";
import { verifyPasswordStrength } from "@/server/auth/utils/password";
import {
createSession,
setSessionTokenCookie,
} from "@/server/auth/utils/session";
import { generateSessionToken } from "@/server/auth/utils/session";
import { redirect } from "next/navigation";
import {
createEmailVerificationRequest,
sendVerificationEmail,
setEmailVerificationRequestCookie,
} from "@/server/auth/utils/email-verification";
export const signupAction = actionClient
.schema(signupSchema)
.action(async ({ parsedInput }) => {
const { email, password } = parsedInput;
const emailAvailable = await checkEmailAvailability(email);
if (!emailAvailable) {
return { error: "Email already in use" };
}
const passwordStrong = await verifyPasswordStrength(password);
if (!passwordStrong) {
return { error: "Password is too weak" };
}
const user = await createUser(email, password);
const emailVerificationRequest = await createEmailVerificationRequest(
user.id,
user.email
);
await sendVerificationEmail(
emailVerificationRequest.email,
emailVerificationRequest.code
);
await setEmailVerificationRequestCookie(emailVerificationRequest);
const sessionToken = generateSessionToken();
const session = await createSession(sessionToken, user.id);
setSessionTokenCookie(sessionToken, session.expiresAt);
return redirect("/auth/verify-email");
});