😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[Nest JS 둜 CRUD κ²Œμ‹œνŒ λ§Œλ“€κΈ°] (33) μžμ‹ μ΄ μƒμ„±ν•œ κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜κΈ° λ³Έλ¬Έ

πŸ‘©‍πŸ’» λ°±μ—”λ“œ(Back-End)/Nest js

[Nest JS 둜 CRUD κ²Œμ‹œνŒ λ§Œλ“€κΈ°] (33) μžμ‹ μ΄ μƒμ„±ν•œ κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜κΈ°

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 6. 10. 22:33
728x90
λ°˜μ‘ν˜•

<λ³Έ λΈ”λ‘œκ·ΈλŠ” John Ahn μ˜ 유튜브λ₯Ό μ°Έκ³ ν•΄μ„œ κ³΅λΆ€ν•˜λ©° μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€ :-)>

=> λ”°λΌν•˜λ©΄μ„œ λ°°μš°λŠ” NestJS

 

🧸 μžμ‹ μ΄ μƒμ„±ν•œ κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜κΈ° 

ν˜„μž¬λŠ”, κ²Œμ‹œλ¬Όμ„ κ°€μ Έμ˜¬ λ•Œ μ–΄λ– ν•œ μœ μ €μΈμ§€μ— 상관없이 λͺ¨λ“  κ²Œμ‹œλ¬Όμ„ κ°€μ Έμ˜΄

κ²Œμ‹œλ¬Όμ„ κ°€μ Έμ˜¬ λ•Œ ν•΄λ‹Ή μœ μ €κ°€ μƒμ„±ν•œ κ²Œμ‹œλ¬Όλ§Œ κ°€μ Έμ˜€λ„λ‘ ν•œλ‹€

 

πŸŽ€ boards.controller.ts

// λ“€μ–΄μ˜€λŠ” μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ— 응닡을 λ°˜ν™˜ν•¨
// @Controller λ°μ½”λ ˆμ΄ν„°λ‘œ 클래슀λ₯Ό λ°μ½”λ ˆμ΄μ…˜ν•˜μ—¬ μ •μ˜ν•¨
// Handler : @Get, @Post, @Delete λ“±κ³Ό 같은 λ°μ½”λ ˆμ΄ν„°λ‘œ μž₯식 된 컨트둀러 클래슀 λ‚΄μ˜ λ‹¨μˆœν•œ λ©”μ„œλ“œ
import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, UseGuards, UsePipes, ValidationPipe } from '@nestjs/common';
import { BoardsService } from './boards.service';
import { BoardStatus } from './board-status.enum';
import { CreateBoardDto } from './dto/create-board.dto';
import { BoardStatusValidationPipe } from './pipes/board-status-validation.pipe';
import { Board } from './board.entity';
import { AuthGuard } from '@nestjs/passport';
import { GetUser } from 'src/auth/get-decorator';
import { User } from 'src/auth/user.entity';

@Controller('boards')
// 인증된 μœ μ €λ§Œ κ²Œμ‹œλ¬Ό 보고 μ“Έ 수 있게 ν•˜κΈ° 
@UseGuards(AuthGuard())
export class BoardsController {
    constructor(private boardsService : BoardsService) {}
    
    // λͺ¨λ“  κ²Œμ‹œλ¬Ό μ‘°νšŒν•˜κΈ°
    @Get("/")
    getAllBoard(
        // ν•΄λ‹Ή μœ μ €μ˜ κ²Œμ‹œλ¬Όλ§Œ κ°€μ Έμ˜€κΈ° (getAllBoards)
        @GetUser() user: User
    ): Promise<Board[]> {
        return this.boardsService.getAllBoards(user);
    }

    // κ²Œμ‹œλ¬Ό μƒμ„±ν•˜κΈ° + μœ νš¨μ„± μ²΄ν¬ν•˜κΈ° 
    @Post()
    @UsePipes(ValidationPipe)
    createBoard(@Body() createBoardDto: CreateBoardDto,
    @GetUser() user:User): Promise<Board> {
        return this.boardsService.createBoard(createBoardDto, user)
    }
    // @Post()
    // @UsePipes(ValidationPipe)
    // createBoard(
    //     @Body() createBoardDto: CreateBoardDto
    // ): Board {
    //     return this.boardsService.createBoard(createBoardDto)
    // }
    
    // ID둜 νŠΉμ • κ²Œμ‹œλ¬Ό κ°€μ Έμ˜€κΈ°
    @Get("/:id")
    getBoardByID(@Param("id") id:number) : Promise<Board> {
        return this.boardsService.getBoardById(id);
    }
    // @Get("/:id")
    // getBoardByID(@Param("id") id: string): Board {
    //     return this.boardsService.getBoardById(id)
    // }

    // ID 둜 νŠΉμ • κ²Œμ‹œλ¬Ό μ‚­μ œν•˜κΈ°
    @Delete("/:id")
    deleteBoard(@Param("id",ParseIntPipe) id,
    // μžμ‹ μ΄ μƒμ„±ν•œ κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜κΈ° 
    @GetUser() user:User
        ): Promise<void> {
        return this.boardsService.deleteBoard(id, user);
    }
    // @Delete("/:id")
    // deleteBoard(@Param("id") id: string): void {
    //     this.boardsService.deleteBoard(id);
    // }

    // νŠΉμ • κ²Œμ‹œλ¬Όμ˜ μƒνƒœ μ—…λ°μ΄νŠΈ 
    @Patch("/:id/status")
    updateBoardStatus(
        @Param("id", ParseIntPipe) id: number,
        @Body('status', BoardStatusValidationPipe) status: BoardStatus
    ) {
        return this.boardsService.updateBoardStatus(id, status);
    }
}

 

πŸŽ€ boards.service.ts

// λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ—μ„œ 이 μ„œλΉ„μŠ€λ₯Ό μ‚¬μš©ν•  수 있게 λ§Œλ“€μ–΄μ€Œ
// @Injectable λ°μ½”λ ˆμ΄ν„°λ‘œ κ°μ‹Έμ Έμ„œ λͺ¨λ“ˆμ— 제곡

import { Injectable, NotFoundException } from '@nestjs/common';
import { BoardStatus } from './board-status.enum';
import { CreateBoardDto } from "./dto/create-board.dto";
import { v1 as uuid } from "uuid";
import { create } from 'domain';
import { statSync } from 'fs';
import { BoardRepository } from './board.repository';
import { InjectRepository } from '@nestjs/typeorm';
import { Board } from './board.entity';
import { User } from 'src/auth/user.entity';

@Injectable()
export class BoardsService {
    constructor(
        @InjectRepository(BoardRepository)
        private boardRepository: BoardRepository,
    ){}

    // λͺ¨λ“  κ²Œμ‹œλ¬Ό μ‘°νšŒν•˜κΈ°
    async getAllBoards(
        user: User
    ): Promise <Board[]> {
        // ν•΄λ‹Ή μœ μ €μ˜ κ²Œμ‹œλ¬Όλ§Œ κ°€μ Έμ˜€κΈ° (getAllBoards)
        const query = this.boardRepository.createQueryBuilder("board");
        query.where("board.userId = :userId", { userId: user.id});
        const boards = await query.getMany();
        
        return boards;
    }

    // κ²Œμ‹œλ¬Ό μƒμ„±ν•˜κΈ°
    async createBoard(createBoardDto: CreateBoardDto, user: User): Promise<Board> {
        return this.boardRepository.createBoard(createBoardDto, user);       
    }

    // ID둜 νŠΉμ • κ²Œμ‹œλ¬Ό κ°€μ Έμ˜€κΈ°
    async getBoardById(id: number): Promise <Board> {
        const found = await this.boardRepository.findOne(id);

        // νŠΉμ • κ²Œμ‹œλ¬Όμ„ 찾을 λ•Œ μ—†λŠ” 경우 κ²°κ³Όκ°’ μ²˜λ¦¬ν•˜κΈ° 
        // μ˜ˆμ™Έ μΈμŠ€ν„΄μŠ€ μƒμ„±ν•˜μ—¬ μ—λŸ¬ ν‘œμΆœ
        if (!found) {
            throw new NotFoundException(`Can't find Board with id ${id}`);
        }
        return found;
    }
    // getBoardById(id: string): Board {
    //     const found = this.boards.find((board) => board.id === id);
        
    //     // νŠΉμ • κ²Œμ‹œλ¬Όμ„ 찾을 λ•Œ μ—†λŠ” 경우 κ²°κ³Όκ°’ μ²˜λ¦¬ν•˜κΈ° 
    //     // μ˜ˆμ™Έ μΈμŠ€ν„΄μŠ€ μƒμ„±ν•˜μ—¬ μ—λŸ¬ ν‘œμΆœ
    //     if (!found) {
    //         throw new NotFoundException(`Can't find Board with id ${id}`);;
    //     }

    //     return found;
    // }

    // ID둜 νŠΉμ • κ²Œμ‹œλ¬Ό μ‚­μ œν•˜κΈ° (μžμ‹ μ΄ μƒμ„±ν•œ κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜κΈ°)
    async deleteBoard(id: number, user: User): Promise<void> {
        const result = await this.boardRepository.delete({id, user});

        // IDκ°€ μ‘΄μž¬ν•˜λŠ” κ²Œμ‹œλ¬Όμ΄λ‹ˆ?
        if (result.affected === 0) {
            throw new NotFoundException(`Can't find Board with id ${id}`);
        }
    }

    // deleteBoard(id: string): void {
    //     // μžˆλŠ” ID 의 κ²Œμ‹œλ¬ΌμΈμ§€ ν™•μΈν•˜κΈ°
    //     const found = this.getBoardById(id);
    //     this.boards = this.boards.filter((board) => board.id !== found.id);
    // }

    // νŠΉμ • κ²Œμ‹œλ¬Όμ˜ μƒνƒœ μ—…λ°μ΄νŠΈ 
    async updateBoardStatus(id: number, status: BoardStatus): Promise<Board> {
        const board = await this.getBoardById(id);
        board.status = status;
        await this.boardRepository.save(board);
        
        return board;
    }
    // updateBoardUpdate(id: string, status: BoardStatus): Board {
    //     // νŠΉμ • κ²Œμ‹œλ¬Ό μ°ΎκΈ°
    //     const board = this.getBoardById(id);
    //     board.status = status;
    //     return board;
    // }
}
728x90
λ°˜μ‘ν˜•
Comments