99 lines
2.8 KiB
TypeScript

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')
}
}
}