Skip to content

C. Membuat Base Response

Untuk membuat penulisan response menjadi sederhana saat return dalam service, kita akan membuat class Base Response pada folder utils seperti gambar di bawah.

Alt text

utils/response/base.response.ts
import { ResponseSuccess, ResponsePagination } from "src/interface/response";

class BaseResponse {
  _success(message: string, data?: any): ResponseSuccess {
    return {
      status: "Success",
      message: message,
      data: data || {},
    };
  }

  _pagination(
    message: string,
    data: any,
    totalData: number,
    page: number,
    pageSize: number
  ): ResponsePagination {
    return {
      status: "Success",
      message: message,
      data: data,
      pagination: {
        total: totalData,
        page: page,
        pageSize: pageSize,
      },
    };
  }
}

export default BaseResponse;

Kemudian class tersebut kita extends pada book.service.ts

book.service.ts
import {
  HttpException,
  HttpStatus,
  Injectable,
  NotFoundException,
} from '@nestjs/common';
import { ResponsePagination, ResponseSuccess } from 'src/interface/response';
import { CreateBookDto, FindBookDto, UpdateBookDto } from './book.dto';
import { InjectRepository } from '@nestjs/typeorm';
import { Book } from './book.entity';
import { Between, Like, Repository } from 'typeorm';
import BaseResponse from 'src/utils/response/base.response'; //import class Base Response

@Injectable()
export class BookService extends BaseResponse { //extend class BaseResponse
  constructor(
    @InjectRepository(Book) private readonly bookRepository: Repository<Book>,
  ) {
    super(); // karena BookService menjadi sub class dari BaseResponse maka harus diberkan super()
  }

 ...

}

Setelah kita extends BaseResponse, selanjutkan kita impelementasikan pada return setiap method service di book.service.ts

book.service.ts
async getAllBooks(query: FindBookDto): Promise<ResponsePagination> {
    const { page, pageSize, limit, title, author, from_year, to_year } = query;

    console.log('q', query);
    const total = await this.bookRepository.count();

    const filter: {
      [key: string]: any;
    } = {};

    if (title) {
      filter.title = Like(`%${title}%`);
    }
    if (author) {
      filter.author = Like(`%${author}%`);
    }

    if (from_year && to_year) {
      filter.year = Between(from_year, to_year);
    }

    if (from_year && !!to_year === false) {
      filter.year = Between(from_year, from_year);
    }

    const result = await this.bookRepository.find({
      where: filter,

      skip: limit,
      take: pageSize,
    });

    return this._pagination('OK', result, total, page, pageSize); // implementasi method _pagination disini
  }

  async createBook(createBookDto: CreateBookDto): Promise<ResponseSuccess> {
    const { title, author, year } = createBookDto;

    try {
      await this.bookRepository.save({
        title: title,
        author: author,
        year: year,
      });
      return this._success('OK'); // implementasi method _success disini
    } catch (err) {
      throw new HttpException('Ada Kesalahan', HttpStatus.BAD_REQUEST);
    }
  }

Pengujian pada Postman create

Alt text

Pengujian pada Postman get all dengan filter

Alt text

Selanjutkan silahkan implementasikan pada method-method lain pada book.service.ts