import { Body, Controller, Delete, Get, Param, Patch, Post, Query } from '@nestjs/common';
import { CreateProductDto } from './dto/create-product.dto';
import { ProductOutput, ProductsOutput } from './dto/output.dto';
import { UpdateProductDto } from './dto/update-product.dto';
import { ProductService } from './products.service';
@Controller('product')
export class ProductController {
constructor(private readonly productService: ProductService) {}
@Get()
getAll(@Query() query: getProductsDto): Promise<ProductsOutput> {
return this.productService.getAll(query.page, query.pageSize);
}
@Get('/:id')
getOne(@Param('id') productId: number): Promise<ProductOutput> {
return this.productService.getOne(productId);
}
@Post()
create(@Body() productData: CreateProductDto) {
return this.productService.create(productData);
}
@Delete('/:id')
remove(@Param('id') productId: number) {
return this.productService.deleteOne(productId);
}
@Patch('/:id')
patch(@Param('id') productId: number, @Body() updateData: UpdateProductDto) {
return this.productService.update(productId, updateData);
}
}
객체를 CRUD 하는 컨트롤러 작성
@Controller('product')
: localhost:3000/product 로 기본 베이스 매핑
import { Entity } from 'typeorm';
@Entity()
export class CoreOutput {
ok: boolean;
error?: string;
}
Error Handling과 Output DTO 객체들의 상속을 위한 부모 클래스 작성
import { CoreOutput } from 'src/common/dto/output.dto';
import { Entity } from 'typeorm';
import { Product } from '../entities/products.entity';
@Entity()
export class ProductsOutput extends CoreOutput {
data?: Product[];
}
@Entity()
export class ProductOutput extends CoreOutput {
data?: Product;
}
GetAll 에 쓰일 ProductsOutput 과
GetOne 에 쓰일 Product Output 작성
import { OmitType } from '@nestjs/mapped-types';
import { Product } from '../entities/products.entity';
export class CreateProductDto extends OmitType(Product, ['id']) {}
OmitType(Product, ['id'])
: Product 객체에서 'id' 값을 제외한 나머지 값을 정의 (id는 PrimaryGeneratedColumn이므로 입력하지 않아도 됨)
import { CreateProductDto } from './create-product.dto';
import { PartialType } from '@nestjs/mapped-types';
export class UpdateProductDto extends PartialType(CreateProductDto) {}
PartialType(CreateProductDto)
: Product 객체에서 특정 타입들만의 값을 정의 (Update 시 특정 부분만 수정 가능)
OmitType, PartialType 설치
npm i @nestjs/mapped-types
import { IsNumber, IsOptional } from 'class-validator';
export class getProductsDto {
@IsNumber()
@IsOptional()
page?: number;
@IsNumber()
@IsOptional()
pageSize?: number;
}
page, pageSize를 반환할 객체 클래스
Controller의 getAll(@Query() query: getProductsDto)
에 사용