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"; import { CreateAdminDto } from "./dto/create-Admin.dto"; import { LoginAdminDto } from "./dto/login-Admin.dto"; import { UpdateUserDto } from "./dto/update-user.dto"; @Injectable() export class AdminService { constructor( @InjectModel(Admin) private readonly adminModel: typeof Admin, private readonly jwtService: JwtService, private readonly configService: ConfigService, ) {} //register method async register(createAdminDto: CreateAdminDto): Promise { try { const existingAdmin = await this.adminModel.findOne({ where: { email: createAdminDto.email } }); if (existingAdmin) { throw new HttpException("Email is already registered.", HttpStatus.CONFLICT); } createAdminDto.password = await bcrypt.hash(createAdminDto.password, 10); const admin = await this.adminModel.create(createAdminDto); return admin; } catch (error) { console.log(error); if (error instanceof HttpException) { throw error; } throw new HttpException("An error occurred during registration.", HttpStatus.INTERNAL_SERVER_ERROR); } } //login method async login(loginAdminDto: LoginAdminDto): Promise<{ token: string }> { try { const admin = await this.adminModel.findOne({ where: { email: loginAdminDto.email } }); if (!admin) { throw new HttpException("Invalid email or password or username", HttpStatus.UNAUTHORIZED); } const isValidPassword = await bcrypt.compare(loginAdminDto.password, admin.password); if (!isValidPassword) { throw new HttpException("Invalid email or password or username", HttpStatus.UNAUTHORIZED); } const token = this.jwtService.sign( { id: admin.id, role: admin.role }, { secret: this.configService.get("JWT_SECRET"), expiresIn: this.configService.get("JWT_EXPIRES") || "1h", }, ); return { token }; } catch (error) { throw new HttpException(error.response, HttpStatus.INTERNAL_SERVER_ERROR); } } //edit admin profile method async editAdminProfile(userId: number, updateAdminDto: UpdateUserDto): Promise { try { const user = await this.adminModel.findOne({ where: { id: userId } }); if (!user) { throw new Error("Admin not found"); } await user.update(updateAdminDto); return user; } catch (error) { throw new Error(`An error occurred while updating admin: ${error.message}`); } } }