mirror of
https://github.com/linux-odyssey/linux-odyssey.git
synced 2026-11-06 03:20:13 +08:00
* put new registered social login user to session data * ask to choose username * simplify checkUsername functions
175 lines
3.4 KiB
JavaScript
175 lines
3.4 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 })
|
|
}
|
|
|
|
async function invalidUsername(username) {
|
|
return !isValidUsername(username) || User.exists({ username })
|
|
}
|
|
|
|
async function invalidEmail(email) {
|
|
return !isValidEmail(email) || User.exists({ email })
|
|
}
|
|
|
|
export async function checkUsername(req, res) {
|
|
const { username, email } = req.query
|
|
const cred = username || email
|
|
if (!cred) {
|
|
res.status(400).json({
|
|
message: 'username or email is required',
|
|
})
|
|
return
|
|
}
|
|
|
|
if (isValidEmail(cred)) {
|
|
res.json({
|
|
type: 'email',
|
|
available: !(await User.exists({ email: cred })),
|
|
})
|
|
return
|
|
}
|
|
if (isValidUsername(cred)) {
|
|
res.json({
|
|
type: 'username',
|
|
available: !(await User.exists({ username: cred })),
|
|
})
|
|
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 invalidUsername(username)) {
|
|
res.status(409).json({
|
|
type: 'username',
|
|
message: 'Invalid username',
|
|
})
|
|
return
|
|
}
|
|
|
|
if (await invalidEmail(email)) {
|
|
res.status(409).json({
|
|
type: 'email',
|
|
message: 'Invalid email',
|
|
})
|
|
return
|
|
}
|
|
|
|
const user = new User({
|
|
username,
|
|
email,
|
|
})
|
|
try {
|
|
user.hashedPassword = await hashPassword(password)
|
|
await user.save()
|
|
req.user = user
|
|
req.login(user, (err) => {
|
|
if (err) {
|
|
next(err)
|
|
return
|
|
}
|
|
res.status(201).json({
|
|
message: 'user created',
|
|
})
|
|
})
|
|
} catch (err) {
|
|
console.error(err)
|
|
res.status(500).json({
|
|
message: 'error registering user',
|
|
})
|
|
}
|
|
}
|
|
|
|
export function logout(req, res) {
|
|
req.logout((err) => {
|
|
if (err) {
|
|
console.error(err)
|
|
res.status(500).json({
|
|
message: 'error logging out',
|
|
})
|
|
return
|
|
}
|
|
res.status(200).json({
|
|
message: 'logged out',
|
|
})
|
|
})
|
|
}
|
|
|
|
export function checkSession(req, res) {
|
|
res.json({
|
|
loggedIn: req.isAuthenticated() && !req.session.newUser,
|
|
})
|
|
}
|
|
|
|
export async function socialLogin(req, res) {
|
|
const { newUser } = req.user
|
|
if (newUser) {
|
|
req.session.newUser = newUser
|
|
res.redirect('/choose-username')
|
|
return
|
|
}
|
|
res.redirect('/')
|
|
}
|
|
|
|
export async function registerFromSession(req, res) {
|
|
const { username } = req.body
|
|
const { newUser } = req.session
|
|
|
|
if (!newUser) {
|
|
res.status(400).json({
|
|
message: 'no new user found',
|
|
})
|
|
return
|
|
}
|
|
|
|
if (await invalidUsername(username)) {
|
|
res.status(409).json({
|
|
type: 'username',
|
|
message: 'Invalid username',
|
|
})
|
|
return
|
|
}
|
|
|
|
newUser.username = username
|
|
const user = new User(newUser)
|
|
|
|
await user.save()
|
|
|
|
req.login(user, (err) => {
|
|
if (err) {
|
|
console.error(err)
|
|
res.status(500).json({
|
|
message: 'error logging in',
|
|
})
|
|
return
|
|
}
|
|
delete req.session.newUser
|
|
res.status(201).json({
|
|
message: 'user created',
|
|
})
|
|
})
|
|
}
|