Skip to content

B. DTO dan Response Type

1. Membuat Response Type

Pada materi kali ini, kita akan membuat response type agar response dari rest api yang kita bikin standar dan menjaga agar tetap konsisten di semua response pada api.

createBook(
    title: string,
    author: string,
    year: number,
  ): {
    status: string;
    message: string;
  } {
    this.books.push({
      id: new Date().getTime(),
      title: title,
      author: author,
      year: year,
    });

    return {
      status: 'Success',
      message: 'Berhasil menambakan buku',
    };
  }

  updateBook(
    id: number,
    title: string,
    author: string,
    year: number,
  ): {
    status: string;
    message: string;
  } {
    const bookIndex = this.books.findIndex((book) => book.id === id);
    this.books[bookIndex].title = title;
    this.books[bookIndex].author = author;
    this.books[bookIndex].year = year;

    return {
      status: 'Success',
      message: 'Berhasil update buku',
    };
  }

Perhatikan pada koding di atas, kita sudah menjaga agar response nya tetap konsisten, yaitu pada return harus sebuah object yang memiliki property status dan message. Namun kita lihat pada tiap service kita harus mendefiniskan kembali type data response nya. Tentu hal ini tidak efektif karena kita harus membuatnya berkali-kali.

Untuk membuat efektif kode kita maka kita harus membuat type/interface response , sehingga kita cukup memanggil pada setiap service.

Membuat Interface ResponseSuccess

Pertama , bualah folder baru dengan nama interface seperti gambar berikut

Alt text

Kedua, buatlah folder response dalam folder interface yang didalamnya terdapat file index.ts dan response.interface.ts

response.inteface.ts

export interface ResponseSuccess {
  status: string;
  message: string;
  data?: any;
}

index.ts

export * from "./response.interface";

Impelementasi Response Success pada Service

Pada contoh di atas kita membuat bahwa setiap response success harus memiliki property status dan message , kemudian untuk data bersifat optional dengan tipe data any.

Kemudian kita akan mencoba bagaimana mengimplementasikannya pada book.service.ts

import { Injectable, NotFoundException } from '@nestjs/common';
import { ResponseSuccess } from 'src/interface/response';

...
getAllBooks(): ResponseSuccess {
    return {
      status: 'Success',
      message: 'List Buku ditermukan',
      data: this.books,
    };
  }
  getDetail(id: number): ResponseSuccess {
    const bookIndex = this.findBookById(id);
    const book = this.books[bookIndex];
    return {
      status: 'Success',
      message: 'List Buku ditermukan',
      data: book,
    };
  }

createBook(title: string, author: string, year: number): ResponseSuccess {
    this.books.push({
      id: new Date().getTime(),
      title: title,
      author: author,
      year: year,
    });

    return {
      status: 'Success',
      message: 'Berhasil menambakan buku',
    };
  }

  updateBook(
    id: number,
    title: string,
    author: string,
    year: number,
  ): ResponseSuccess {
    const bookIndex = this.books.findIndex((book) => book.id === id);
    this.books[bookIndex].title = title;
    this.books[bookIndex].author = author;
    this.books[bookIndex].year = year;

    return {
      status: 'Success',
      message: 'Berhasil update buku',
    };
  }

   deleteBook(id: number): ResponseSuccess {
    const bookIndex = this.findBookById(id);
    this.books.splice(bookIndex, 1);
    return {
      status: `Success ${bookIndex}`,
      message: 'Berhasil menghapus buku',
    };
  }

...

2. Membuat DTO (Data Transfer Object)

DTO merupakan class yang berisi type data yang bisa digunakan sebagai interface dari data yang dikirim oleh client. Dengan membuat DTO kita bisa mendefinisikan type data yang dikirim oleh client pada contoller dan service. Dengan membuat DTO kita bisa memastikan bahwa data yang dikirim oleh client sesuai dengan kriteria yang sudah ditentukan.

Instalasi @nestjs/mapped-types

npm i --save @nestjs/mapped-types

Membuat book.dto.ts

import { OmitType } from "@nestjs/mapped-types";
export class BookDto {
  id: number;
  title: string;
  author: string;
  year: number;
}

export class CreateBookDto extends OmitType(BookDto, ["id"]) {}
export class UpdateBookDto extends OmitType(BookDto, ["id"]) {}

Pada contoh di atas kita membuat BookDto untuk mendefinikasi seluruh property yang ada pada service book. Kemudian kita membuat CreateBookDto dengan mengecualikan id pada property CreateBookDto dengan OmitType. Kalau kita definisikan dengan cara biasa maka akan seperti di bawah.

export class CreateBookDto {
  title: string;
  author: string;
  year: number;
}

Implementasikan DTO pada controller

Pada Bagian ini akan coba implementasikan CreateBookDto pada book.controller.ts

book.controller.ts

import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
} from '@nestjs/common';
import { BookService } from './book.service';
import { CreateBookDto } from './book.dto';

@Controller('book')
export class BookController {
  constructor(private bookService: BookService) {}

  ...
  @Post('/create')
  createBook(@Body() payload: CreateBookDto) {
    return this.bookService.createBook(payload);
  }

  ...
}

Implementasikan DTO pada service

Pada Bagian ini akan coba implementasikan CreateBookDto pada book.controller.ts

book.service.ts

import { Injectable, NotFoundException } from '@nestjs/common';
import { ResponseSuccess } from 'src/interface/response';
import { CreateBookDto } from './book.dto';

@Injectable()
export class BookService {
  private books: {
    id?: number;
    title: string;
    author: string;
    year: number;
  }[] = [
    {
      id: 1,
      title: 'HTML CSS',
      author: 'ihsanabuhanifah',
      year: 2023,
    },
  ];


  createBook(createBookDto: CreateBookDto): ResponseSuccess {
    const { title, author, year } = createBookDto;
    this.books.push({
      id: new Date().getTime(),
      title: title,
      author: author,
      year: year,
    });

    return {
      status: 'Success',
      message: 'Berhasil menambakan buku',
    };
  }
  ...
}