From 3e9fff3822e44f8d855b0f9a8efdf7072283436b Mon Sep 17 00:00:00 2001 From: faris Aljohari <83524184+farisaljohari@users.noreply.github.com> Date: Sat, 11 May 2024 21:02:25 +0300 Subject: [PATCH] Add super admin configuration and service --- libs/common/src/config/index.ts | 3 +- libs/common/src/config/super.admin.config.ts | 9 +++ libs/common/src/helper/helper.module.ts | 25 ++++++- .../helper/services/super.admin.sarvice.ts | 72 +++++++++++++++++++ src/main.ts | 4 ++ 5 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 libs/common/src/config/super.admin.config.ts create mode 100644 libs/common/src/helper/services/super.admin.sarvice.ts diff --git a/libs/common/src/config/index.ts b/libs/common/src/config/index.ts index 94380ce..d4cbbdb 100644 --- a/libs/common/src/config/index.ts +++ b/libs/common/src/config/index.ts @@ -1,2 +1,3 @@ import emailConfig from './email.config'; -export default [emailConfig]; +import superAdminConfig from './super.admin.config'; +export default [emailConfig, superAdminConfig]; diff --git a/libs/common/src/config/super.admin.config.ts b/libs/common/src/config/super.admin.config.ts new file mode 100644 index 0000000..90a156e --- /dev/null +++ b/libs/common/src/config/super.admin.config.ts @@ -0,0 +1,9 @@ +import { registerAs } from '@nestjs/config'; + +export default registerAs( + 'super-admin', + (): Record => ({ + SUPER_ADMIN_EMAIL: process.env.SUPER_ADMIN_EMAIL, + SUPER_ADMIN_PASSWORD: process.env.SUPER_ADMIN_PASSWORD, + }), +); diff --git a/libs/common/src/helper/helper.module.ts b/libs/common/src/helper/helper.module.ts index 826883a..f5fc400 100644 --- a/libs/common/src/helper/helper.module.ts +++ b/libs/common/src/helper/helper.module.ts @@ -1,11 +1,30 @@ import { Global, Module } from '@nestjs/common'; import { HelperHashService } from './services'; +import { UserRepository } from '../modules/user/repositories'; +import { UserRepositoryModule } from '../modules/user/user.repository.module'; +import { UserRoleRepository } from '../modules/user-role/repositories'; +import { UserRoleRepositoryModule } from '../modules/user-role/user.role.repository.module'; +import { RoleTypeRepository } from '../modules/role-type/repositories'; +import { RoleTypeRepositoryModule } from '../modules/role-type/role.type.repository.module'; +import { ConfigModule } from '@nestjs/config'; +import { SuperAdminService } from './services/super.admin.sarvice'; @Global() @Module({ - providers: [HelperHashService], - exports: [HelperHashService], + providers: [ + HelperHashService, + SuperAdminService, + UserRepository, + UserRoleRepository, + RoleTypeRepository, + ], + exports: [HelperHashService, SuperAdminService], controllers: [], - imports: [], + imports: [ + ConfigModule.forRoot(), + UserRepositoryModule, + UserRoleRepositoryModule, + RoleTypeRepositoryModule, + ], }) export class HelperModule {} diff --git a/libs/common/src/helper/services/super.admin.sarvice.ts b/libs/common/src/helper/services/super.admin.sarvice.ts new file mode 100644 index 0000000..e9efbce --- /dev/null +++ b/libs/common/src/helper/services/super.admin.sarvice.ts @@ -0,0 +1,72 @@ +import { HelperHashService } from './helper.hash.service'; +import { Injectable } from '@nestjs/common'; +import { UserRepository } from '@app/common/modules/user/repositories'; +import { RoleType } from '@app/common/constants/role.type.enum'; +import { UserRoleRepository } from '@app/common/modules/user-role/repositories'; +import { RoleTypeRepository } from '@app/common/modules/role-type/repositories'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export class SuperAdminService { + constructor( + private readonly configService: ConfigService, + private readonly userRepository: UserRepository, + private readonly userRoleRepository: UserRoleRepository, + private readonly roleTypeRepository: RoleTypeRepository, + private readonly helperHashService: HelperHashService, + ) {} + + async createSuperAdminIfNotFound(): Promise { + try { + const superAdminData = await this.userRoleRepository.find({ + where: { roleType: { type: RoleType.SUPER_ADMIN } }, + relations: ['roleType'], + }); + + if (superAdminData.length <= 0) { + // Create the super admin user if not found + console.log('Creating super admin user...'); + + await this.createSuperAdmin(); + } + } catch (err) { + console.error('Error while checking super admin:', err); + throw err; + } + } + private async getRoleUuidByRoleType(roleType: string) { + const role = await this.roleTypeRepository.findOne({ + where: { type: roleType }, + }); + + return role.uuid; + } + private async createSuperAdmin(): Promise { + const salt = this.helperHashService.randomSalt(10); // Hash the password using bcrypt + const hashedPassword = await this.helperHashService.bcrypt( + this.configService.get('super-admin.SUPER_ADMIN_PASSWORD'), + salt, + ); + try { + const user = await this.userRepository.save({ + email: this.configService.get('super-admin.SUPER_ADMIN_EMAIL'), + password: hashedPassword, + firstName: 'Super', + lastName: 'Admin', + isUserVerified: true, + isActive: true, + }); + const defaultUserRoleUuid = await this.getRoleUuidByRoleType( + RoleType.SUPER_ADMIN, + ); + + await this.userRoleRepository.save({ + user: { uuid: user.uuid }, + roleType: { uuid: defaultUserRoleUuid }, + }); + } catch (err) { + console.error('Error while creating super admin:', err); + throw err; + } + } +} diff --git a/src/main.ts b/src/main.ts index 129f319..61dfb92 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,6 +4,7 @@ import rateLimit from 'express-rate-limit'; import helmet from 'helmet'; import { setupSwaggerAuthentication } from '../libs/common/src/util/user-auth.swagger.utils'; import { ValidationPipe } from '@nestjs/common'; +import { SuperAdminService } from '@app/common/helper/services/super.admin.sarvice'; async function bootstrap() { const app = await NestFactory.create(AuthModule); @@ -33,6 +34,9 @@ async function bootstrap() { }, }), ); + // Create super admin user + const superAdminService = app.get(SuperAdminService); + await superAdminService.createSuperAdminIfNotFound(); await app.listen(process.env.PORT || 4000); }