Files
comroots-backend/src/utils/validateLogin.ts
T
2026-06-24 14:10:53 +02:00

59 lines
1.6 KiB
TypeScript

import { isValidEmail } from '.'
import { FieldError } from '../graphql-types'
interface LoginValidation {
input: 'Email' | 'Username'
errors: FieldError[] | null
}
export const validateLogin = (emailOrUsername: string, password: string): LoginValidation => {
const result: LoginValidation = {
input: 'Email',
errors: []
}
if (emailOrUsername.includes('@')) { // email provided
if (!isValidEmail(emailOrUsername)) {
result.errors!.push({
field: 'emailOrUsername',
message: 'Invalid email.'
})
}
}
else { // username provided
result.input = 'Username'
if (emailOrUsername.length <= 2) {
result.errors!.push({
field: 'emailOrUsername',
message: 'Username must be longer than 2 characters.'
})
}
if (emailOrUsername.length > 32) {
result.errors!.push({
field: 'emailOrUsername',
message: 'Username must not be longer than 32 characters.'
})
}
if (!/^[A-Za-z0-9_-]*$/.test(emailOrUsername)) {
result.errors!.push({
field: 'emailOrUsername',
message: 'Username must contain only letters, numbers, underscores and dashes.'
})
}
}
if (password.length < 8) {
result.errors!.push({
field: 'password',
message: 'Password must be at least 8 characters.'
})
}
if (password.length > 128) {
result.errors!.push({
field: 'password',
message: 'Password must not be longer than 128 characters.'
})
}
return {
input: result.input,
errors: result.errors!.length > 0 ? result.errors : null
}
}