nestjs) CRUD with sqlite

김명성·2022년 11월 19일
0
post-custom-banner

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시 주의점

    기존에 사용하던 create-user DTO는 update를 사용할 때 정의한 것과는 다르게 required인 email,password가 optional로 들어오기에, 그에 맞는 DTO를 정의 해 주어야 한다.

update-user.dto.ts

import { IsEmail, IsString, IsOptional } from "class-validator";

export class UpdateUserDto {

  @IsEmail()
  @IsOptional()
  email:string

  @IsString()
  @IsOptional()
  password: string;
}
post-custom-banner

0개의 댓글