1. Tambah Kategori dan List Kategori
Pada materi ini, kita akan membuat endpoint untuk CRUD pada table kategori
1. Membuat Module, Controller, Service
terminal
npx nest g module app/kategori
npx nest g controller app/kategori
npx nest g service app/kategori
2. Membuat kategori.entity.ts
kategori.entity.ts
import {
BaseEntity,
Column,
Entity,
JoinColumn,
ManyToOne,
PrimaryGeneratedColumn,
} from 'typeorm';
import { User } from '../auth/auth.entity';
@Entity()
export class Kategori extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column({ nullable: false })
nama_kategori: string;
@ManyToOne(() => User)
@JoinColumn({ name: 'created_by' }) //buat relasi many to one dengan table user
created_by: User;
@ManyToOne(() => User)
@JoinColumn({ name: 'updated_by' }) //buat relasi many to one dengan table user
updated_by: User;
@Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
created_at: Date;
@Column({ type: 'datetime', default: () => 'CURRENT_TIMESTAMP' })
updated_at: Date;
}
3. Import Entity pada kategori module
app.produk.ts
import { Module } from '@nestjs/common';
import { KategoriService } from './kategori.service';
import { KategoriController } from './kategori.controller';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Kategori } from './kategori.entity';
@Module({
imports: [TypeOrmModule.forFeature([Kategori])],
providers: [KategoriService],
controllers: [KategoriController],
})
export class KategoriModule {}
4. Membuat DTO pada fitur kategori
kategori.dto.ts
import { OmitType } from '@nestjs/mapped-types';
import { IsInt, IsOptional, IsString } from 'class-validator';
import { PageRequestDto } from 'src/utils/dto/page.dto';
export class KategoriDto {
@IsInt()
id?: number;
@IsString()
nama_kategori: string;
}
export class CreateKategoriDto extends OmitType(KategoriDto, ['id']) {}
export class findAllKategori extends PageRequestDto {
@IsString()
@IsOptional()
nama_kategori: string;
}
5. Endopoint Menambah Kategori dan Menampilkan Kategori
Pada materi ini, kita akan membuat enpoint untuk,
- Menambakan kategori (CREATE)
- Menampilkan data pada tabel kategori dengan Pagination dan filter berdasarkan nama kategori
kategori.service.ts
import { HttpException, HttpStatus, Inject, Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import BaseResponse from 'src/utils/response/base.response';
import { Kategori } from './kategori.entity';
import { CreateKategoriDto, findAllKategori } from './kategori.dto';
import { ResponsePagination, ResponseSuccess } from 'src/interface/response';
import { Like, Repository } from 'typeorm';
import { REQUEST } from '@nestjs/core';
@Injectable()
export class KategoriService extends BaseResponse {
constructor(
@InjectRepository(Kategori)
private readonly kategoriRepository: Repository<Kategori>,
@Inject(REQUEST) private req: any, // inject request agar bisa mengakses req.user.id dari JWT token pada service
) {
super();
}
async create(payload: CreateKategoriDto): Promise<ResponseSuccess> {
try {
await this.kategoriRepository.save({
...payload,
created_by: {
id: this.req.user.id,
},
});
return this._success('OK', this.req.user.user_id);
} catch {
throw new HttpException('Ada Kesalahan', HttpStatus.UNPROCESSABLE_ENTITY);
}
}
async getAllCategory(query: findAllKategori): Promise<ResponsePagination> {
const { page, pageSize, limit, nama_kategori } = query;
const filterQuery = {}
if (nama_kategori) {
filterQuery.nama_kategori = Like(`%${nama_kategori}%`);
}
const total = await this.kategoriRepository.count({
where: filterQuery,
});
const result = await this.kategoriRepository.find({
where: filterQuery,
relations: ['created_by', 'updated_by'], // relasi yang aka ditampilkan saat menampilkan list kategori
select: { // pilih data mana saja yang akan ditampilkan dari tabel kategori
id: true,
nama_kategori: true,
created_by: {
id: true, // pilih field yang akan ditampilkan dari tabel user
nama: true,
},
updated_by: {
id: true, // pilih field yang akan ditampilkan dari tabel user
nama: true,
},
},
skip: limit,
take: pageSize,
});
return this._pagination('OK', result, total, page, pageSize);
}
}
kategori.controller.ts
import { Body, Controller, Get, Post, UseGuards } from '@nestjs/common';
import { KategoriService } from './kategori.service';
import { CreateKategoriDto, findAllKategori } from './kategori.dto';
import { JwtGuard } from '../auth/auth.guard';
import { Pagination } from 'src/utils/decorator/pagination.decorator';
@UseGuards(JwtGuard) // implementasikan global guard pada semua endpont kategori memerlukan authentikasi saat request
@Controller('kategori')
export class KategoriController {
constructor(private kategoriService: KategoriService) {}
@Post('create')
async create(@Body() payload: CreateKategoriDto) {
return this.kategoriService.create(payload);
}
@Get('list')
async getAllCategory(@Pagination() query: findAllKategori) { //gunakan custom decorator yang pernah kita buat
return this.kategoriService.getAllCategory(query);
}
}
6.Pengujian pada Postman
a. Testing create kategori pada postman
b. Testing list kategori tanpa filter
c. Testing list kategori dengan filter nama_kategori
Untuk Update, BulkCreate, Detail dam Delete Silahkan dikerjakan sebagai tugas, Semangat.
Note
Lihat contoh pada materi typeorm basic