Skip to content

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

Alt text

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

Alt text