Converted more procedural programming to OOP
This commit is contained in:
104
src/http/controllers/auth.ts
Normal file
104
src/http/controllers/auth.ts
Normal file
@ -0,0 +1,104 @@
|
||||
import jwt from 'jsonwebtoken'
|
||||
import { Request, Response } from 'express'
|
||||
import { BaseController } from '#application/base/baseController'
|
||||
import UserService from '#services/userService'
|
||||
import config from '#application/config'
|
||||
import { loginAccountSchema, registerAccountSchema, resetPasswordSchema, newPasswordSchema } from '#application/zodTypes'
|
||||
|
||||
export class AuthController extends BaseController {
|
||||
private userService: UserService
|
||||
|
||||
constructor() {
|
||||
super()
|
||||
this.userService = new UserService()
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 this.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 this.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 this.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 this.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')
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user