ohmyform-api/src/service/user/user.create.service.ts

67 lines
1.8 KiB
TypeScript

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { Model } from 'mongoose';
import { PinoLogger } from 'nestjs-pino/dist';
import {rolesType} from '../../config/roles'
import { UserCreateInput } from '../../dto/user/user.create.input';
import { UserDocument, UserSchemaName } from '../../schema/user.schema';
import { PasswordService } from '../auth/password.service';
import { MailService } from '../mail.service';
import {SettingService} from '../setting.service'
@Injectable()
export class UserCreateService {
constructor(
@InjectModel(UserSchemaName) private userModel: Model<UserDocument>,
private readonly mailerService: MailService,
private readonly logger: PinoLogger,
private readonly passwordService: PasswordService,
private readonly settingService: SettingService,
) {}
private async getDefaultRoles(): Promise<rolesType> {
const roleSetting = await this.settingService.getByKey('DEFAULT_ROLE')
switch (roleSetting.value) {
case 'superuser':
return ['superuser', 'admin', 'user']
case 'admin':
return ['admin', 'user']
}
return ['user']
}
async create(user: UserCreateInput): Promise<UserDocument> {
// TODO check for uniqueness of email & username!
const entry = new this.userModel({
...user,
roles: await this.getDefaultRoles(),
passwordHash: await this.passwordService.hash(user.password),
})
await entry.save({
validateBeforeSave: true,
})
const sent = await this.mailerService.send(
entry.email,
'user/created',
{
username: entry.username,
confirm: 'https://www.google.com', // TODO confirm url
}
)
// so send email
if (!sent) {
this.logger.warn('failed to send email for user creation')
}
return entry
}
}