Implement authentication functionality with login server action
- Created loginUser server action with credential validation - Implemented password verification using bcrypt (via NextAuth authorize) - Session creation on successful login handled by NextAuth - Invalid credentials handled with appropriate error messages - Added comprehensive unit tests for login functionality - All tests passing (11/11) Requirements: 2.1, 2.2
This commit is contained in:
@@ -12,10 +12,19 @@ const registerSchema = z.object({
|
||||
name: z.string().optional(),
|
||||
})
|
||||
|
||||
const loginSchema = z.object({
|
||||
email: z.string().email({ message: 'Invalid email address' }),
|
||||
password: z.string().min(1, { message: 'Password is required' }),
|
||||
})
|
||||
|
||||
export type RegisterResult =
|
||||
| { success: true; userId: string }
|
||||
| { success: false; error: string }
|
||||
|
||||
export type LoginResult =
|
||||
| { success: true }
|
||||
| { success: false; error: string }
|
||||
|
||||
/**
|
||||
* Register a new user with email and password
|
||||
* Requirements: 1.1, 1.2, 1.3, 1.4, 1.5
|
||||
@@ -81,3 +90,45 @@ export async function registerUser(
|
||||
return { success: false, error: 'Registration failed. Please try again.' }
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Login user with email and password
|
||||
* Requirements: 2.1, 2.2
|
||||
*/
|
||||
export async function loginUser(
|
||||
email: string,
|
||||
password: string
|
||||
): Promise<LoginResult> {
|
||||
try {
|
||||
// Validate input (Requirement 2.1 - credential validation)
|
||||
const validation = loginSchema.safeParse({ email, password })
|
||||
|
||||
if (!validation.success) {
|
||||
const errors = validation.error.issues.map((issue) => issue.message).join(', ')
|
||||
return { success: false, error: errors }
|
||||
}
|
||||
|
||||
const { email: validEmail, password: validPassword } = validation.data
|
||||
|
||||
// Attempt to sign in (Requirement 2.1 - authenticate and create session)
|
||||
// The authorize function in auth.ts handles:
|
||||
// - Querying user from database
|
||||
// - Password verification with bcrypt
|
||||
// - Session creation on success
|
||||
await signIn('credentials', {
|
||||
email: validEmail,
|
||||
password: validPassword,
|
||||
redirect: false,
|
||||
})
|
||||
|
||||
// If signIn doesn't throw an error, authentication was successful
|
||||
return { success: true }
|
||||
} catch (error) {
|
||||
// Handle invalid credentials (Requirement 2.2)
|
||||
// NextAuth throws an error for invalid credentials
|
||||
console.error('Login error:', error)
|
||||
|
||||
// Return generic error message to avoid revealing whether email exists
|
||||
return { success: false, error: 'Invalid email or password' }
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user