You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
2.3 KiB
69 lines
2.3 KiB
import { HttpException, HttpStatus, Injectable } from "@nestjs/common"; |
|
import { InjectModel } from "@nestjs/sequelize"; |
|
import { Admin } from "./entities/admin.entity"; |
|
import * as bcrypt from "bcrypt"; |
|
import { JwtService } from "@nestjs/jwt"; |
|
import { ConfigService } from "@nestjs/config"; |
|
@Injectable() |
|
export class AdminService { |
|
constructor( |
|
@InjectModel(Admin) private readonly adminModel: typeof Admin, |
|
private readonly jwtService: JwtService, |
|
private readonly configService: ConfigService, |
|
) {} |
|
async register(email: string, password: string): Promise<Admin> { |
|
try { |
|
if (!email) { |
|
throw new HttpException("Email should be entered.", HttpStatus.BAD_REQUEST); |
|
} |
|
|
|
if (!password) { |
|
throw new HttpException("Password should be entered.", HttpStatus.BAD_REQUEST); |
|
} |
|
|
|
const existingAdmin = await this.adminModel.findOne({ where: { email } }); |
|
if (existingAdmin) { |
|
throw new HttpException("Email is already registered.", HttpStatus.CONFLICT); |
|
} |
|
|
|
const hashedPassword = await bcrypt.hash(password, 10); |
|
|
|
const admin = await this.adminModel.create({ |
|
email, |
|
password: hashedPassword, |
|
role: "admin", |
|
}); |
|
|
|
return admin; |
|
} catch (error) { |
|
if (error instanceof HttpException) { |
|
throw error; |
|
} |
|
throw new HttpException("An error occurred during registration.", HttpStatus.INTERNAL_SERVER_ERROR); |
|
} |
|
} |
|
|
|
async login(email: string, password: string): Promise<{ token: string }> { |
|
try { |
|
const admin = await this.adminModel.findOne({ where: { email } }); |
|
if (!admin) { |
|
throw new HttpException("Invalid email or password", HttpStatus.UNAUTHORIZED); |
|
} |
|
const isValidPassword = await bcrypt.compare(password, admin.password); |
|
if (!isValidPassword) { |
|
throw new HttpException("Invalid email or password", HttpStatus.UNAUTHORIZED); |
|
} |
|
const token = this.jwtService.sign( |
|
{ id: admin.id, role: admin.role }, |
|
{ |
|
secret: this.configService.get<string>("JWT_SECRET"), |
|
expiresIn: this.configService.get<string | number>("JWT_EXPIRES") || "1h", |
|
}, |
|
); |
|
return { token }; |
|
} catch (error) { |
|
console.log(error); |
|
throw new HttpException("An error occurred during login.", HttpStatus.INTERNAL_SERVER_ERROR); |
|
} |
|
} |
|
}
|
|
|