feat: refactor frontend auth error handling

This commit is contained in:
Lin, Hung-Shin committed 2023-11-02 11:36:42 +08:00
1 parent bcb9f1f803
commit b09aa0debf
1 file changed
+50 -80
+50 -80
View File
@@ -12,102 +12,72 @@ export async function isLoggedIn() {
return loggedIn return loggedIn
} }
export const login = async (username, password) => { function handleRequestError(err) {
try { if (!err.response) throw err // Not an axios error
await api.post('/auth/login', { username, password }) const { status } = err.response
return true if (status === 429) {
} catch (err) { throw new TooManyRequestsError(err.response.data.message)
if (!err.response) throw err
const { status } = err.response
switch (status) {
case 401:
throw new UnauthorizedError(err.response.data.message)
case 429:
throw new TooManyRequestsError(err.response.data.message)
case 400:
throw new ValidationError(err.response.data.message)
default:
throw err
}
} }
if (status === 401) {
throw new UnauthorizedError(err.response.data.message)
}
if (status === 400) {
const { errors } = err.response.data
if (Array.isArray(errors) && errors.length > 0) {
const { path, msg } = errors[0]
switch (path) {
case 'username':
throw new ValidationError('Username is already taken')
case 'email':
throw new ValidationError('Email is already taken')
case 'password':
throw new ValidationError('Password is too weak')
default:
throw new ValidationError(msg)
}
}
throw new ValidationError(err.response.data.message)
}
throw err
} }
export const register = async (username, email, password) => { export const login = (username, password) => {
try { return api
await api.post('/auth/register', { .post('/auth/login', { username, password })
.then(() => true)
.catch(handleRequestError)
}
export const register = (username, email, password) => {
return api
.post('/auth/register', {
username, username,
password, password,
email, email,
}) })
return true .then(() => true)
} catch (err) { .catch(handleRequestError)
if (!err.response) throw err
const { status } = err.response
if (status === 429) {
throw new TooManyRequestsError(err.response.data.message)
}
if (status === 401) {
throw new UnauthorizedError(err.response.data.message)
}
if (status === 400) {
const { errors } = err.response.data
if (Array.isArray(errors) && errors.length > 0) {
const { path, msg } = errors[0]
switch (path) {
case 'username':
throw new ValidationError('Username is already taken')
case 'email':
throw new ValidationError('Email is already taken')
case 'password':
throw new ValidationError('Password is too weak')
default:
throw new ValidationError(msg)
}
}
throw new ValidationError(err.response.data.message)
}
throw err
}
} }
export const checkUsername = async (username) => { export const checkUsername = async (username) => {
try { return api
await api.get('/auth/check-username', { .get('/auth/check-username', {
params: { username }, params: { username },
}) })
return true .then(() => true)
} catch (err) { .catch(handleRequestError)
if (!err.response) throw err
const { status } = err.response
if (status === 429) {
throw new TooManyRequestsError('Too many requests')
}
if (status === 409) {
throw new ValidationError('Username is already taken')
}
throw err
}
} }
export const chooseUsername = async (username) => { export const chooseUsername = async (username) => {
try { return api
await api.post('/auth/register-from-session', { username }) .post('/auth/register-from-session', { username })
} catch (err) { .then(() => true)
if (!err.response) throw err .catch(handleRequestError)
switch (err.response?.status) {
case 400:
throw new ValidationError('Username is already taken')
case 401:
throw new UnauthorizedError('You are not a new user')
default:
throw err
}
}
} }
export const logout = () => { export const logout = () => {
return api.post('/auth/logout') return api
.post('/auth/logout')
.then(() => true)
.catch(handleRequestError)
} }