[nestjs] restapi + prisma 02

in kr •  last year 

출처

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를 구축했습니다.

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

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

image.png

Upvoted! Thank you for supporting witness @jswit.