A. Tambah Konsumen dan List Konsumen
Pada materi ini , kita akan membuat endpoint untuk CRUD pada tabel konsumen
1. Membuat Module, Controller, Service
terminal
npx nest g module app/konsumen
npx nest g controller app/konsumen
npx nest g service app/konsumen
2. Membuat konsumen.entity.ts
konsumen.entity.ts
import { User } from 'src/app/auth/auth.entity';
import {
Entity,
BaseEntity,
PrimaryGeneratedColumn,
Column,
ManyToOne,
JoinColumn,
} from 'typeorm';
@Entity()
export class Konsumen extends BaseEntity {
@PrimaryGeneratedColumn()
id: number;
@Column({ nullable: false })
nama_konsumen: string;
@Column({ type: 'text', nullable: false })
alamat_konsumen: string;
@Column({ unique: true, nullable: false })
email: string;
@Column({ nullable: false })
nomor_handphone: string;
@ManyToOne(() => User)
@JoinColumn({ name: 'created_by' })
created_by: User;
@ManyToOne(() => User)
@JoinColumn({ name: 'updated_by' })
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 konsumen module
app.konsumen.ts
import { Module } from '@nestjs/common';
import { KonsumenController } from './konsumen.controller';
import { KonsumenService } from './konsumen.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Konsumen } from './konsumen.entity';
@Module({
imports: [TypeOrmModule.forFeature([Konsumen])],
controllers: [KonsumenController],
providers: [KonsumenService],
})
export class KonsumenModule {}
4. Membuat DTO pada fitur konsumen
konsumen.dto.ts
import { OmitType } from '@nestjs/mapped-types';
import { Type } from 'class-transformer';
import {
IsArray,
IsEmail,
IsInt,
IsNotEmpty,
IsObject,
IsOptional,
IsString,
MaxLength,
MinLength,
ValidateNested,
} from 'class-validator';
import { PageRequestDto } from 'src/utils/dto/page.dto';
import { IsExists } from 'src/utils/validator/exist.validator';
import { Konsumen } from './konsumen.entity';
export class KonsumenDto {
@IsInt()
id: number;
@IsString()
@IsNotEmpty()
nama_konsumen: string;
@IsString()
@IsNotEmpty()
alamat_konsumen: string;
@IsString()
@IsEmail()
@IsExists([Konsumen, 'email'])
email: string;
@IsString()
@IsNotEmpty()
@MaxLength(13)
@MinLength(9)
nomor_handphone: string;
@IsObject()
@IsOptional()
updated_by: { id: number };
@IsObject()
@IsOptional()
created_by: { id: number };
}
export class CreateKonsumenDto extends OmitType(KonsumenDto, [
'id',
'updated_by',
]) {}
export class UpdateKonsumenDto extends OmitType(KonsumenDto, ['created_by']) {}
export class CreateKonsumenArrayDto {
@IsArray()
@ValidateNested({ each: true })
@Type(() => CreateKonsumenDto)
data: CreateKonsumenDto[];
}
export class findAllKonsumenDto extends PageRequestDto {
@IsString()
@IsOptional()
nama_Konsumen: string;
@IsString()
@IsOptional()
email: string;
@IsString()
@IsOptional()
nomor_handphone: string;
@IsString()
@IsOptional()
keyword: string;
}
5. Endpoint menambah konsumen secara dan Menampilkan Produk
Pada materi ini, kita akan membuat enpoint untuk,
- Menambakan konsumen baru pada tabel
- Menampilkan daftar konsumen yang terdaftar dengan Pagination dan memberikan fitur searching dengan param keyword
konsumen.service.ts
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
import BaseResponse from 'src/utils/response/base.response';
import { Konsumen } from './konsumen.entity';
import { InjectRepository } from '@nestjs/typeorm';
import { Like, Repository } from 'typeorm';
import { ResponsePagination, ResponseSuccess } from 'src/interface/response';
import { CreateKonsumenDto, findAllKonsumenDto } from './konsumen.dto';
@Injectable()
export class KonsumenService extends BaseResponse {
constructor(
@InjectRepository(Konsumen)
private readonly konsumenRepository: Repository<Konsumen>,
) {
super();
}
async create(payload: CreateKonsumenDto): Promise<ResponseSuccess> {
try {
await this.konsumenRepository.save(payload);
return this._success('OK');
} catch (err) {
console.log('err', err);
throw new HttpException('Ada Kesalahan', HttpStatus.UNPROCESSABLE_ENTITY);
}
}
async findAll(query: findAllKonsumenDto): Promise<ResponsePagination> {
const { page, pageSize, limit, keyword } = query;
const filterKeyword = [];
if (keyword) {
filterKeyword.push(
{
nama_konsumen: Like(`%${keyword}%`),
},
{
alamat_konsumen: Like(`%${keyword}%`),
},
{
email: Like(`%${keyword}%`),
},
{
nomor_handphone: Like(`%${keyword}%`),
},
);
}
const total = await this.konsumenRepository.count({
where: filterKeyword,
});
const result = await this.konsumenRepository.find({
where: filterKeyword,
relations: ['created_by', 'updated_by'],
select: {
id: true,
nama_konsumen: true,
email: true,
nomor_handphone: true,
alamat_konsumen: true,
created_by: {
id: true,
nama: true,
},
updated_by: {
id: true,
nama: true,
},
},
skip: limit,
take: pageSize,
});
return this._pagination('OK', result, total, page, pageSize);
}
}
konsumen.controller.ts
import { Controller, Get, Post, Query, UseGuards } from '@nestjs/common';
import { KonsumenService } from './konsumen.service';
import { InjectCreatedBy } from 'src/utils/decorator/inject-created_by.decorator'; //import disini
import { CreateKonsumenDto, findAllKonsumenDto } from './konsumen.dto';
import { JwtGuard } from 'src/app/auth/auth.guard';
import { query } from 'express';
@UseGuards(JwtGuard)
@Controller('konsumen')
export class KonsumenController {
constructor(private konsumenService: KonsumenService) {}
@Post('create')
async create(@InjectCreatedBy() payload: CreateKonsumenDto) {
return this.konsumenService.create(payload);
}
@Get('list')
async findAll(@Query() query: findAllKonsumenDto) {
return this.konsumenService.findAll(query);
}
}
6.Pengujian pada Postman
a. Testing create konsumen pada postman
payload
{
"nama_konsumen" : "Nafisa Amatullah",
"alamat_konsumen" : "Kp. Kebonjati Rt. 002",
"email" : "nafisaamatullah@gmail.com",
"nomor_handphone" : "0895320050324"
}
b. Testing list konsumen
Pada list di konsumen , kita akan tambahkan fitur pencarian berdasrkan nama konsumen, alamat, email, dan nomor handphone