create-user.dto
create user dto를 만들어서 받을 데이터 타입을 정해주었다. dto에서는 class-validor를 이용해 데이터가 email인지, string인지 자동으로 검증해 줄 수 있다.
아이디와 닉네임이 이미 존재 할 경우 UnauthorizedExeption 에러를 throw하도록 하였다.
던져진 에러는 어플 전체에 global로 exeption filter를 이용해 적절한 에러 메세지를 리턴하도록 하였다.
// users.controller.ts
@Controller('api/users')
export class UsersController {
constructor(private readonly usersService: UsersService) {}
@ApiOperation({ summary: '회원 가입' })
@Post('/signup')
async signup(@Body() data: CreateUserDto) {
await this.usersService.createUser(
data.email,
data.nickname,
data.password,
);
}
...
// users.service.ts
@Injectable()
export class UsersService {
constructor(
@InjectRepository(Users)
private usersRepository: Repository<Users>,
) {}
async createUser(email: string, nickname: string, password: string) {
const foundEmail = await this.usersRepository.findOne({ where: { email } });
if (foundEmail) {
throw new UnauthorizedException('이미 해당하는 아이디가 존재합니다');
}
const foundNick = await this.usersRepository.findOne({
where: { nickname },
});
if (foundNick) {
throw new UnauthorizedException('이미 해당하는 닉네임이 존재합니다');
}
const hashedPassword = await bcrypt.hash(
password,
parseInt(process.env.BCRYPT_SALT_ROUNDS),
);
await this.usersRepository.save({
email,
nickname,
password: hashedPassword,
});
}
}
// usrs.module.ts
@Module({
imports: [TypeOrmModule.forFeature([Users])],
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}