import { Request, Response } from 'express' import jwt from 'jsonwebtoken' import { BaseController } from '#application/base/baseController' import config from '#application/config' import { loginAccountSchema, registerAccountSchema, resetPasswordSchema, newPasswordSchema } from '#application/zodTypes' import UserService from '#services/userService' export class AuthController extends BaseController { /** * Login user * @param req * @param res */ public async login(req: Request, res: Response) { const { username, password } = req.body try { loginAccountSchema.parse({ username, password }) 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 this.sendSuccess(res, { token }) } return this.sendError(res, 'Invalid credentials') } catch (error: any) { return this.sendError(res, error.errors?.[0]?.message || 'Validation error') } } /** * Register user * @param req * @param res */ public async register(req: Request, res: Response) { const { username, email, password } = req.body try { registerAccountSchema.parse({ username, email, password }) const user = await UserService.register(username, email, password) if (user) { return this.sendSuccess(res, null, 'User registered successfully') } return this.sendError(res, 'Failed to register user') } catch (error: any) { return this.sendError(res, error.errors?.[0]?.message || 'Validation error') } } /** * Request password reset * @param req * @param res */ public async requestPasswordReset(req: Request, res: Response) { const { email } = req.body try { resetPasswordSchema.parse({ email }) const sentEmail = await UserService.requestPasswordReset(email) if (sentEmail) { return this.sendSuccess(res, null, 'Password reset email sent') } return this.sendError(res, 'Failed to send password reset request') } catch (error: any) { return this.sendError(res, error.errors?.[0]?.message || 'Validation error') } } /** * Reset password * @param req * @param res */ public async resetPassword(req: Request, res: Response) { const { urlToken, password } = req.body try { newPasswordSchema.parse({ urlToken, password }) const resetPassword = await UserService.resetPassword(urlToken, password) if (resetPassword) { return this.sendSuccess(res, null, 'Password has been reset') } return this.sendError(res, 'Failed to reset password') } catch (error: any) { return this.sendError(res, error.errors?.[0]?.message || 'Validation error') } } }