diff --git a/src/product/controllers/index.ts b/src/product/controllers/index.ts new file mode 100644 index 0000000..eead553 --- /dev/null +++ b/src/product/controllers/index.ts @@ -0,0 +1 @@ +export * from './product.controller'; diff --git a/src/product/controllers/product.controller.ts b/src/product/controllers/product.controller.ts new file mode 100644 index 0000000..f5fdf53 --- /dev/null +++ b/src/product/controllers/product.controller.ts @@ -0,0 +1,27 @@ +import { Controller, Get, UseGuards } from '@nestjs/common'; +import { ApiTags, ApiBearerAuth, ApiOperation } from '@nestjs/swagger'; +import { JwtAuthGuard } from '@app/common/guards/jwt.auth.guard'; +import { EnableDisableStatusEnum } from '@app/common/constants/days.enum'; +import { BaseResponseDto } from '@app/common/dto/base.response.dto'; +import { ControllerRoute } from '@app/common/constants/controller-route'; +import { ProductService } from '../services'; + +@ApiTags('Product Module') +@Controller({ + version: EnableDisableStatusEnum.ENABLED, + path: ControllerRoute.PRODUCT.ROUTE, +}) +export class ProductController { + constructor(private readonly productService: ProductService) {} + + @ApiBearerAuth() + @UseGuards(JwtAuthGuard) + @Get() + @ApiOperation({ + summary: ControllerRoute.PRODUCT.ACTIONS.LIST_PRODUCT_SUMMARY, + description: ControllerRoute.PRODUCT.ACTIONS.LIST_PRODUCT_DESCRIPTION, + }) + async getProducts(): Promise { + return await this.productService.list(); + } +} diff --git a/src/product/index.ts b/src/product/index.ts new file mode 100644 index 0000000..8b3162c --- /dev/null +++ b/src/product/index.ts @@ -0,0 +1 @@ +export * from './product.module'; diff --git a/src/product/product.module.ts b/src/product/product.module.ts new file mode 100644 index 0000000..e5ffd25 --- /dev/null +++ b/src/product/product.module.ts @@ -0,0 +1,10 @@ +import { Module } from '@nestjs/common'; +import { ProductService } from './services'; +import { ProductRepository } from '@app/common/modules/product/repositories'; +import { ProductController } from './controllers'; + +@Module({ + controllers: [ProductController], + providers: [ProductService, ProductRepository], +}) +export class ProductModule {} diff --git a/src/product/services/index.ts b/src/product/services/index.ts new file mode 100644 index 0000000..59832ef --- /dev/null +++ b/src/product/services/index.ts @@ -0,0 +1 @@ +export * from './product.service'; diff --git a/src/product/services/product.service.ts b/src/product/services/product.service.ts new file mode 100644 index 0000000..cebf9ba --- /dev/null +++ b/src/product/services/product.service.ts @@ -0,0 +1,24 @@ +import { BaseResponseDto } from '@app/common/dto/base.response.dto'; +import { SuccessResponseDto } from '@app/common/dto/success.response.dto'; +import { ProductRepository } from '@app/common/modules/product/repositories'; +import { HttpException, HttpStatus, Injectable } from '@nestjs/common'; + +@Injectable() +export class ProductService { + constructor(private readonly productRepository: ProductRepository) {} + + async list(): Promise { + const products = await this.productRepository.find(); + + if (!products) { + throw new HttpException( + `No products found in the system`, + HttpStatus.NOT_FOUND, + ); + } + return new SuccessResponseDto({ + data: products, + message: 'List of products retrieved successfully', + }); + } +}