[nestjs] restapi + prisma 02

in #kr2 years ago

출처

PART1 - Building a REST API with NestJS and Prisma

이전 글

Articles 모듈에 Prisma Client 추가

// src/articles/articles.module.ts

import { Module } from '@nestjs/common';
import { ArticlesService } from './articles.service';
import { ArticlesController } from './articles.controller';
import { PrismaModule } from 'src/prisma/prisma.module';

@Module({
  controllers: [ArticlesController],
  providers: [ArticlesService],
  imports: [PrismaModule],
})
export class ArticlesModule {}
// src/articles/articles.service.ts

import { Injectable } from '@nestjs/common';
import { CreateArticleDto } from './dto/create-article.dto';
import { UpdateArticleDto } from './dto/update-article.dto';
import { PrismaService } from 'src/prisma/prisma.service';

@Injectable()
export class ArticlesService {
  constructor(private prisma: PrismaService) {}

  // CRUD operations
}
// src/articles/articles.service.ts

@Injectable()
export class ArticlesService {
  constructor(private prisma: PrismaService) {}

  create(createArticleDto: CreateArticleDto) {
    return 'This action adds a new article';
  }

  findAll() {

    return this.prisma.article.findMany({ where: { published: true } });
  }

Draft 목록 가져오기 기능 추가

service 에 drafts 메소드 추가 후, controller 에 drafts 메소드를 추가

중요 컨트롤러에서 :id 와 맵핑되는 메소드보다 위쪽에 drafts 메소드를 위치 시켜야 한다.
(순차적으로 인식하기 때문)

// src/articles/articles.controller.ts

@Controller('articles')
export class ArticlesController {
  constructor(private readonly articlesService: ArticlesService) {}

  @Post()
  create(@Body() createArticleDto: CreateArticleDto) {
    return this.articlesService.create(createArticleDto);
  }

  @Get('drafts')
  findDrafts() {
    return this.articlesService.findDrafts();
  }

  // ...
}

// src/articles/articles.service.ts

@Injectable()
export class ArticlesService {
  constructor(private prisma: PrismaService) {}

  create(createArticleDto: CreateArticleDto) {
    return 'This action adds a new article';
  }

  findDrafts() {
    return this.prisma.article.findMany({ where: { published: false } });
  }

  // ...
}

단건조회 기능 추가

// src/articles/articles.service.ts
@Injectable()
export class ArticlesService {
  constructor(private prisma: PrismaService) {}

  create(createArticleDto: CreateArticleDto) {
    return 'This action adds a new article';
  }

  findAll() {
    return this.prisma.article.findMany({ where: { published: true } });
  }

  findOne(id: number) {
    return this.prisma.article.findUnique({ where: { id } });
  }
}

Articles 등록하기

article 생성용 DTO

// src/articles/dto/create-article.dto.ts

import { ApiProperty } from '@nestjs/swagger';

export class CreateArticleDto {
  @ApiProperty()
  title: string;

  @ApiProperty({ required: false })
  description?: string;

  @ApiProperty()
  body: string;

  @ApiProperty({ required: false, default: false })
  published?: boolean = false;
}

unary plus ( 단항 더하기 )

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Unary_plus

입력받은 값을 숫자로 변환 ( 함수=> NaN, null => 0, [] => 0 기타 자세한 내용은 위 링크 참조 )

수정하기

PartialType 을 통해 DTO 를 확장하여 업데이트 DTO 를 만들 수 있다.
CreateArticleDto 의 값의 일부만 가지고 ( 요청 정보에 따라 ) 값을 업데이트 처리 할 수 있다.

update 시 id 값 기준으로(PK) 특정 영역의 값을 업데이트 한다

// src/articles/dto/update-article.dto.ts

import { PartialType } from '@nestjs/swagger';
import { CreateArticleDto } from './create-article.dto';

export class UpdateArticleDto extends PartialType(CreateArticleDto) {}

// src/articles/articles.service.ts

@Injectable()
export class ArticlesService {
  constructor(private prisma: PrismaService) {}

  // ...

  update(id: number, updateArticleDto: UpdateArticleDto) {
    return this.prisma.article.update({
      where: { id },
      data: updateArticleDto,
    });
  }

  // ...
}
@Delete(':id')
remove(@Param('id') id: string) {
  return this.articlesService.remove(+id);
}

swagger 에서 API 그룹 설정

컨트롤러에서 @ApiTags('articles') 를 추가하면 swagger 에서 API 그룹을 설정할 수 있다.

// src/articles/articles.controller.ts

import { ApiTags } from '@nestjs/swagger';

@Controller('articles')
@ApiTags('articles')
export class ArticlesController {
  // ...
}

스웨거 응답정보 (response) 설정

엔티티 정보 지정 후,

컨트롤러에서 ApiCreateResponse ( 201 ), ApiOkResponse ( 200 ) 등과 같은 어노테이션을 사용하여 응답 정보를 설정할 수 있다.

기타 nestjs 에서 사용하는 응답 데코레이터 정보는 아래 링크를 참조

// src/articles/entities/article.entity.ts

import { Article } from '@prisma/client';
import { ApiProperty } from '@nestjs/swagger';

export class ArticleEntity implements Article {
  @ApiProperty()
  id: number;

  @ApiProperty()
  title: string;

  @ApiProperty({ required: false, nullable: true })
  description: string | null;

  @ApiProperty()
  body: string;

  @ApiProperty()
  published: boolean;

  @ApiProperty()
  createdAt: Date;

  @ApiProperty()
  updatedAt: Date;
}

// src/articles/articles.controller.ts

import { ApiCreatedResponse, ApiOkResponse, ApiTags } from '@nestjs/swagger';
import { ArticleEntity } from './entities/article.entity';

@Controller('articles')
@ApiTags('articles')
export class ArticlesController {
  constructor(private readonly articlesService: ArticlesService) {}

  @Post()
  @ApiCreatedResponse({ type: ArticleEntity })
  create(@Body() createArticleDto: CreateArticleDto) {
    return this.articlesService.create(createArticleDto);
  }

  @Get()
  @ApiOkResponse({ type: ArticleEntity, isArray: true })
  findAll() {
    return this.articlesService.findAll();
  }

  @Get('drafts')
  @ApiOkResponse({ type: ArticleEntity, isArray: true })
  findDrafts() {
    return this.articlesService.findDrafts();
  }

  @Get(':id')
  @ApiOkResponse({ type: ArticleEntity })
  findOne(@Param('id') id: string) {
    return this.articlesService.findOne(+id);
  }

  @Patch(':id')
  @ApiOkResponse({ type: ArticleEntity })
  update(@Param('id') id: string, @Body() updateArticleDto: UpdateArticleDto) {
    return this.articlesService.update(+id, updateArticleDto);
  }

  @Delete(':id')
  @ApiOkResponse({ type: ArticleEntity })
  remove(@Param('id') id: string) {
    return this.articlesService.remove(+id);
  }
}

PART1 끝

축하해요! NestJS를 사용하여 기본적인 REST API를 구축했습니다.

Sort:  

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.