import { Inject, Injectable } from '@nestjs/common'; import { SALT_ROUNDS } from 'src/constants'; import { UserAdminResponseDto, mapUserAdmin } from 'src/dtos/user.dto'; import { ICryptoRepository } from 'src/interfaces/crypto.interface'; import { ILoggerRepository } from 'src/interfaces/logger.interface'; import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.interface'; import { IUserRepository } from 'src/interfaces/user.interface'; import { BaseService } from 'src/services/base.service'; @Injectable() export class CliService extends BaseService { constructor( @Inject(ICryptoRepository) private cryptoRepository: ICryptoRepository, @Inject(ISystemMetadataRepository) systemMetadataRepository: ISystemMetadataRepository, @Inject(IUserRepository) private userRepository: IUserRepository, @Inject(ILoggerRepository) logger: ILoggerRepository, ) { super(systemMetadataRepository, logger); this.logger.setContext(CliService.name); } async listUsers(): Promise { const users = await this.userRepository.getList({ withDeleted: true }); return users.map((user) => mapUserAdmin(user)); } async resetAdminPassword(ask: (admin: UserAdminResponseDto) => Promise) { const admin = await this.userRepository.getAdmin(); if (!admin) { throw new Error('Admin account does not exist'); } const providedPassword = await ask(mapUserAdmin(admin)); const password = providedPassword || this.cryptoRepository.newPassword(24); const hashedPassword = await this.cryptoRepository.hashBcrypt(password, SALT_ROUNDS); await this.userRepository.update(admin.id, { password: hashedPassword }); return { admin, password, provided: !!providedPassword }; } async disablePasswordLogin(): Promise { const config = await this.getConfig({ withCache: false }); config.passwordLogin.enabled = false; await this.updateConfig(config); } async enablePasswordLogin(): Promise { const config = await this.getConfig({ withCache: false }); config.passwordLogin.enabled = true; await this.updateConfig(config); } async disableOAuthLogin(): Promise { const config = await this.getConfig({ withCache: false }); config.oauth.enabled = false; await this.updateConfig(config); } async enableOAuthLogin(): Promise { const config = await this.getConfig({ withCache: false }); config.oauth.enabled = true; await this.updateConfig(config); } }