Module 생성
$ nest g module boards
app module에서 불러오기
// app.module.ts
@Module ({
imports: [boards]
})
Controller 생성
$ nest g controller boards
Module에서 Controller 불러오기
// boards.module.ts
import { BoardsController } from './boards.controller';
@Module({
controllers: [BoardsController]
})
Service 생성
$ nest g service boards
Controller에서 Service/Provider 불러오기
// boards.module.ts
import { BoardsService } from './boards.service';
@Module({
providers: [BoardsService]
})
CRUD
// boards.service.ts
import { Injectable, NotFoundException } from '@nestjs/common';
import { Board, BoardStatus } from './board.model';
import { v1 as uuid } from 'uuid';
import { CreateBoardDto } from './dto/create-board.dto';
@Injectable()
export class BoardsService {
private boards: Board[] = [];
getAllBoards(): Board[] {
return this.boards;
}
createBoard(createBoardDto: CreateBoardDto) {
const { title, description } = createBoardDto;
const board: Board = {
id: uuid(),
title,
description,
status: BoardStatus.PUBLIC,
};
this.boards.push(board);
return board;
}
getBoardById(id: string): Board {
const found = this.boards.find((board) => board.id === id);
if (!found) throw new NotFoundException(`Cannot`);
return found;
}
deleteBoard(id: string): void {
const found = this.getBoardById(id);
this.boards = this.boards.filter((board) => board.id !== found.id);
}
updateBoardStatus(id: string, status: BoardStatus): Board {
const board = this.getBoardById(id);
board.status = status;
return board;
}
}
// boards.controller.ts
import {
Body,
Controller,
Get,
Post,
Param,
Delete,
Patch,
ValidationPipe,
UsePipes,
} from '@nestjs/common';
import { BoardsService } from './boards.service';
import { Board, BoardStatus } from './board.model';
import { CreateBoardDto } from './dto/create-board.dto';
import { BoardStatusValidationPipe } from './pipes/board-status-validation.pipe';
@Controller('boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
@Get()
getAllBoard(): Board[] {
return this.boardsService.getAllBoards();
}
@Get('/:id')
getBoardById(@Param('id') id: string): Board {
return this.boardsService.getBoardById(id);
}
@UsePipes(ValidationPipe)
@Post()
createBoard(@Body() createBoardDto: CreateBoardDto): Board {
return this.boardsService.createBoard(createBoardDto);
}
@Delete('/:id')
deleteBoard(@Param('id') id: string): void {
return this.boardsService.deleteBoard(id);
}
@Patch('/:id/status')
updateBoardStatus(
@Param('id') id: string,
@Body('status', BoardStatusValidationPipe) status: BoardStatus,
): Board {
return this.boardsService.updateBoardStatus(id, status);
}
}
// board.model.ts
export interface Board {
id: string;
title: string;
description: string;
status: BoardStatus;
}
export enum BoardStatus {
PUBLIC = 'PUBLIC',
PRIVATE = 'PRIVATE',
}
// dto/create-board.dto.ts
import { IsNotEmpty } from 'class-validator';
export class CreateBoardDto {
@IsNotEmpty()
title: string;
@IsNotEmpty()
description: string;
}
// pipes/board-status-validation.pipe.ts
import {
PipeTransform,
ArgumentMetadata,
BadRequestException,
} from '@nestjs/common';
import { BoardStatus } from '../board.model';
export class BoardStatusValidationPipe implements PipeTransform {
readonly StatusOption = [BoardStatus.PUBLIC, BoardStatus.PRIVATE];
transform(value: any, metadata: ArgumentMetadata) {
value = value.toUpperCase();
if (!this.isStatusValid(value)) {
throw new BadRequestException(`${value} not valid`);
}
return value;
}
private isStatusValid(status: any) {
return this.StatusOption.find((e) => e === status);
}
}
'Study > Backend' 카테고리의 다른 글
token 인증 방식 (0) | 2021.12.25 |
---|---|
[Nest.js] CRUD with TypeORM, Postgres (0) | 2021.12.22 |
[Cheer.io] iframe/script tag 안의 요소 접근하기 (0) | 2021.12.15 |
[Node.js] 웹 크롤링 하기 (puppteer) (0) | 2021.11.15 |
[Node.js] js로 콘솔 입력 받기 (inquirer) (0) | 2021.11.15 |
Comment