users.service.ts
import { Injectable } from '@nestjs/common';
import {Repository} from 'typeorm';
import { InjectRepository } from '@nestjs/typeorm';
import { User } from './user.entity';
@Injectable()
export class UsersService {
// InjectRepository(Entity) private repositoryName: Repository<entityName>
constructor(@InjectRepository(User) private repo: Repository<User>) {}
// Create
create(email:string, password:string) {
// create와 save가 나누어 진 이유는,
// 1.DB에 저장되는 데이터는 Validation test를 통과한 이후에 저장되어야 하기 때문이다.
// 2.entity(DTO)에 저장된 Hooks를 사용해야 하기 때문이다.
const user = this.repo.create({email,password});
return this.repo.save(user);
}
// Read
findOne(id: number) {
// 하나만 찾을 때 findOneBy, 값이 없다면 return null
return this.repo.findOneBy({ id });
}
find(email: string) {
// 복수의 값을 찾을 때 find, 값이 없다면 empty array []
return this.repo.find({where: { email } })
}
// Update
// 유연하게 업데이트 할 수 있는 유형 정의 : Partial + class-validation의 @IsOptional
async update(id: number, attrs: Partial<User>) {
const user = await this.findOne(id);
if(!user) {
throw new Error('user not found');
}
Object.assign(user, attrs);
return this.repo.save(user);
}
// Delete
async remove(id: number) {
const user = await this.findOne(id);
if(!user) {
throw new Error('user not found');
}
return this.repo.remove(user);
}
}
users.controller.ts
import { Body, Controller, Post, Get, Patch, Param, Query,Delete } from '@nestjs/common';
import { CreateUserDto } from './dtos/create-user.dto';
import { UpdateUserDto } from './dtos/update-user.dto';
import { UsersService } from './users.service';
@Controller('auth')
export class UsersController {
constructor(private usersService:UsersService){}
@Post('/signup')
createUser(@Body() body:CreateUserDto) {
this.usersService.create(body.email,body.password);
}
// param은 모두 string으로 받는다.
@Get('/:id')
findUser(@Param('id') id: string) {
return this.usersService.findOne(parseInt(id));
}
@Get()
findAllUsers(@Query('email') email: string){
return this.usersService.find(email);
}
@Delete('/:id')
removeUser(@Param('id') id:string){
return this.usersService.remove(parseInt(id));
}
@Patch('/:id')
updateUser(@Param('id') id:string, @Body() body:UpdateUserDto) {
return this.usersService.update(parseInt(id),body);
}
}
update-user.dto.ts
import { IsEmail, IsString, IsOptional } from "class-validator";
export class UpdateUserDto {
@IsEmail()
@IsOptional()
email:string
@IsString()
@IsOptional()
password: string;
}