91 lines
2.7 KiB
TypeScript
91 lines
2.7 KiB
TypeScript
import { Router, Request, Response } from 'express'
|
|
import UserService from '#services/userService'
|
|
import jwt from 'jsonwebtoken'
|
|
import config from '#application/config'
|
|
import { loginAccountSchema, registerAccountSchema, resetPasswordSchema, newPasswordSchema } from '#application/zodTypes'
|
|
|
|
const router = Router()
|
|
|
|
// Login endpoint
|
|
router.post('/login', async (req: Request, res: Response) => {
|
|
const { username, password } = req.body
|
|
|
|
try {
|
|
loginAccountSchema.parse({ username, password })
|
|
} catch (error: any) {
|
|
return res.status(400).json({ message: error.errors[0]?.message })
|
|
}
|
|
|
|
const userService = new UserService()
|
|
const user = await userService.login(username, password)
|
|
|
|
if (user && typeof user !== 'boolean') {
|
|
const token = jwt.sign({ id: user.getId() }, config.JWT_SECRET, { expiresIn: '4h' })
|
|
return res.status(200).json({ token })
|
|
}
|
|
|
|
return res.status(400).json({ message: 'Failed to login' })
|
|
})
|
|
|
|
// Register endpoint
|
|
router.post('/register', async (req: Request, res: Response) => {
|
|
const { username, email, password } = req.body
|
|
|
|
try {
|
|
registerAccountSchema.parse({ username, email, password })
|
|
} catch (error: any) {
|
|
return res.status(400).json({ message: error.errors[0]?.message })
|
|
}
|
|
|
|
const userService = new UserService()
|
|
const user = await userService.register(username, email, password)
|
|
|
|
if (user) {
|
|
return res.status(200).json({ message: 'User registered' })
|
|
}
|
|
|
|
return res.status(400).json({ message: 'Failed to register user' })
|
|
})
|
|
|
|
// Reset password endpoint
|
|
router.post('/reset-password', async (req: Request, res: Response) => {
|
|
const { email } = req.body
|
|
|
|
try {
|
|
resetPasswordSchema.parse({ email })
|
|
} catch (error: any) {
|
|
return res.status(400).json({ message: error.errors[0]?.message })
|
|
}
|
|
|
|
const userService = new UserService()
|
|
const sentEmail = await userService.requestPasswordReset(email)
|
|
|
|
if (sentEmail) {
|
|
return res.status(200).json({ message: 'Email has been sent' })
|
|
}
|
|
|
|
return res.status(400).json({ message: 'Failed to send password reset request. Perhaps one has already been sent recently, check your spam folder.' })
|
|
})
|
|
|
|
// New password endpoint
|
|
router.post('/new-password', async (req: Request, res: Response) => {
|
|
const { urlToken, password } = req.body
|
|
|
|
try {
|
|
newPasswordSchema.parse({ urlToken, password })
|
|
} catch (error: any) {
|
|
return res.status(400).json({ message: error.errors[0]?.message })
|
|
}
|
|
|
|
const userService = new UserService()
|
|
const resetPassword = await userService.resetPassword(urlToken, password)
|
|
|
|
if (resetPassword) {
|
|
return res.status(200).json({ message: 'Password has been reset' })
|
|
}
|
|
|
|
return res.status(400).json({ message: 'Failed to set new password' })
|
|
})
|
|
|
|
export default router
|