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