33import { signIn } from "@/lib/auth"
44import { prisma } from "@/lib/prisma"
55import bcrypt from "bcryptjs"
6+ import { z } from "zod"
7+
8+ // Only allow emails
9+ const ALLOWED_DOMAINS = [ "gmail.com" , "hevs.ch" , "hes-so.ch" , "edu.vs.ch" ]
10+
11+ // Define Zod schema for validating sign-up form data
12+ const SignupSchema = z . object ( {
13+ email : z . string ( ) . email ( ) . refine ( ( val : string ) => {
14+ return ALLOWED_DOMAINS . some ( domain => val . endsWith ( `@${ domain } ` ) ) ;
15+ } ) . withMessage ( "Email must be from an allowed domain." ) ,
16+ password : z . string ( ) . min ( 8 , "8 characters minimum" ) . max ( 100 , "100 characters maximum" ) ,
17+ } ) ;
618
719type ActionResponse = string | null | undefined ;
820
@@ -18,31 +30,45 @@ type ActionResponse = string | null | undefined;
1830 */
1931export async function signUpAction ( prevState : ActionResponse , formData : FormData ) : Promise < ActionResponse > {
2032 try {
21- const email = formData . get ( "email" ) as string
22- const password = formData . get ( "password" ) as string
33+
34+ // Validate form data using Zod schema
35+ const validatedFields = SignupSchema . safeParse (
36+ Object . fromEntries ( formData . entries ( ) )
37+ ) ;
38+
39+ // If validation fails, return the first error message
40+ if ( ! validatedFields . success ) {
41+
42+ return validatedFields . error . issues [ 0 ] . message ;
43+ }
44+
45+ // Extract validated email and password
46+ const { email, password } = validatedFields . data ;
2347
2448 const existingUser = await prisma . user . findUnique ( {
2549 where : { email }
26- } )
50+ } ) ;
2751
52+ // Verify if the email is already registered
2853 if ( existingUser ) {
29- return "User already exists."
54+ return "User already registered." ;
3055 }
3156
32- const hashedPassword = await bcrypt . hash ( password , 10 )
57+ const hashedPassword = await bcrypt . hash ( password , 10 ) ;
3358
3459 await prisma . user . create ( {
3560 data : {
3661 email,
3762 password : hashedPassword ,
3863 } ,
39- } )
64+ } ) ;
65+
4066
4167 await signIn ( "credentials" , {
4268 email,
4369 password,
4470 redirectTo : "/dashboard"
45- } )
71+ } ) ;
4672
4773 } catch ( error ) {
4874 if ( error instanceof Error && error . message . includes ( "NEXT_REDIRECT" ) ) {
0 commit comments