Files
linux-odyssey/server/src/api/controllers/authController.js
T
Lin, Hung-Shin f1510df13e feat: enhance checkUser api
* determine whether it's email or username, and if it exists
2023-09-14 17:43:07 +08:00

78 lines
1.7 KiB
JavaScript

import User from '../../models/user.js'
import {
genJWT,
hashPassword,
isValidEmail,
isValidUsername,
} from '../../utils/auth.js'
export async function issueToken(req, res) {
const { user } = req
const token = await genJWT({
_id: user.id,
username: user.username,
email: user.email,
})
res.json({ token })
}
export async function checkUsername(req, res) {
const { username } = req.query
if (isValidEmail(username)) {
if (await User.exists({ email: username })) {
res.status(409).json({
type: 'email',
message: `"${username}" already exists`,
})
return
}
res.status(200).json({
type: 'email',
message: `"${username}" is available`,
})
return
}
if (isValidUsername(username)) {
if (await User.exists({ username })) {
res.status(409).json({
type: 'username',
message: `"${username}" already exists`,
})
return
}
res.status(200).json({
type: 'username',
message: `"${username}" is available`,
})
return
}
res.status(400).json({
message: 'invalid username or email',
})
}
export async function register(req, res, next) {
const { username, password, email } = req.body
if (!(username && password && email)) {
res.status(400).json({
message: 'username, password, and email are required',
})
return
}
if (await User.exists({ $or: [{ username }, { email }] })) {
res.status(409).json({
message: 'username or email already exists',
})
return
}
const user = new User({
username,
email,
})
user.hashedPassword = await hashPassword(password)
await user.save()
req.user = user
res.status(201)
next()
}