59 lines
1.6 KiB
TypeScript
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
|
|
}
|
|
} |