File

src/models/product/product.controller.ts

Prefix

product

Description

Exposes product CRUD endpoints

Index

Methods

Methods

create
create(createProductDto: CreateProductDto)
Decorators :
@ApiOperation({summary: 'Admin creates a new product'})
@IsAdmin()
@Post()

Creates a new product, only for admins

Parameters :
Name Type Optional
createProductDto CreateProductDto No
Returns : Promise<Product>
findAll
findAll(findAllProductsDto: FindProductsDto)
Decorators :
@ApiOperation({summary: 'Returns all products'})
@Public()
@Get()

Returns all products with pagination

Default is starting on page 1 showing 10 results per page, searching and ordering by name

Parameters :
Name Type Optional
findAllProductsDto FindProductsDto No
Returns : Promise<Product[]>
findOneById
findOneById(id: string)
Decorators :
@ApiOperation({summary: 'Admin gets product by ID'})
@IsAdmin()
@Get('/id/:id')

Find product by ID, only for admins

Parameters :
Name Type Optional
id string No
Returns : Promise<Product>
findOneByUrlName
findOneByUrlName(urlName: string)
Decorators :
@ApiOperation({summary: 'Gets product by urlName'})
@Public()
@Get(':urlName')

Find product by Url Name

Parameters :
Name Type Optional
urlName string No
Returns : Promise<Product>
remove
remove(id: string)
Decorators :
@ApiOperation({summary: 'Admin deletes product'})
@IsAdmin()
@Delete(':id')
@HttpCode(HttpStatus.NO_CONTENT)

Deletes product from database, only for admins

Parameters :
Name Type Optional
id string No
Returns : Promise<void>
update
update(id: string, updateProductDto: UpdateProductDto)
Decorators :
@ApiOperation({summary: 'Admin updates product'})
@IsAdmin()
@Patch(':id')

Updates product information, only for admins

Parameters :
Name Type Optional
id string No
updateProductDto UpdateProductDto No
Returns : Promise<Product>
uploadPhoto
uploadPhoto(id: string, file: File)
Decorators :
@ApiOperation({summary: 'Admin uploads a new product picture'})
@IsAdmin()
@FileUpload()
@Patch('picture/:id')

Admin uploads a new picture for the product. Needs to be type jpeg, jpg or png and maximum 3MB.

Check multerUploadConfig file in the docs.

Parameters :
Name Type Optional
id string No
file File No
Returns : Promise<Product>
import {
  Body,
  Controller,
  Delete,
  Get,
  HttpCode,
  HttpStatus,
  Param,
  Patch,
  Post,
  Query,
  UploadedFile,
} from '@nestjs/common';
import { ApiOperation, ApiTags } from '@nestjs/swagger';
import { Public } from 'src/auth/public.decorator';
import { FileUpload } from 'src/common/decorators/file-upload.decorator';
import { IsAdmin } from 'src/common/decorators/is-admin.decorator';
import { CreateProductDto } from './dto/create-product.dto';
import { FindProductsDto } from './dto/find-products.dto';
import { UpdateProductDto } from './dto/update-product.dto';
import { Product } from './entities/product.entity';
import { ProductService } from './product.service';
import { File } from './types/file';

/** Exposes product CRUD endpoints */
@ApiTags('product')
@Controller('product')
export class ProductController {
  /** Exposes product CRUD endpoints
   *
   * Instantiate class and ProductService dependency
   */
  constructor(private readonly productService: ProductService) {}

  /** Creates a new product, only for admins */
  @ApiOperation({ summary: 'Admin creates a new product' })
  @IsAdmin()
  @Post()
  create(@Body() createProductDto: CreateProductDto): Promise<Product> {
    return this.productService.create(createProductDto);
  }

  /** Returns all products with pagination
   *
   * Default is starting on page 1 showing 10 results per page,
   * searching and ordering by name
   */
  @ApiOperation({ summary: 'Returns all products' })
  @Public()
  @Get()
  findAll(@Query() findAllProductsDto: FindProductsDto): Promise<Product[]> {
    return this.productService.findAll(findAllProductsDto);
  }

  /** Find product by ID, only for admins */
  @ApiOperation({ summary: 'Admin gets product by ID' })
  @IsAdmin()
  @Get('/id/:id')
  findOneById(@Param('id') id: string): Promise<Product> {
    return this.productService.findOneById(id);
  }

  /** Find product by Url Name */
  @ApiOperation({ summary: 'Gets product by urlName' })
  @Public()
  @Get(':urlName')
  findOneByUrlName(@Param('urlName') urlName: string): Promise<Product> {
    return this.productService.findOneByUrlName(urlName);
  }

  /**
   * Admin uploads a new picture for the product.
   * Needs to be type jpeg, jpg or png and maximum 3MB.
   *
   * Check <a href="https://alvaromrveiga.github.io/ecommerce-backend/miscellaneous/variables.html#multerUploadConfig">
   * multerUploadConfig</a> file in the docs.
   */
  @ApiOperation({ summary: 'Admin uploads a new product picture' })
  @IsAdmin()
  @FileUpload()
  @Patch('picture/:id')
  uploadPhoto(
    @Param('id') id: string,
    @UploadedFile() file: File,
  ): Promise<Product> {
    return this.productService.uploadPicture(id, file);
  }

  /** Updates product information, only for admins */
  @ApiOperation({ summary: 'Admin updates product' })
  @IsAdmin()
  @Patch(':id')
  update(
    @Param('id') id: string,
    @Body() updateProductDto: UpdateProductDto,
  ): Promise<Product> {
    return this.productService.update(id, updateProductDto);
  }

  /** Deletes product from database, only for admins */
  @ApiOperation({ summary: 'Admin deletes product' })
  @IsAdmin()
  @Delete(':id')
  @HttpCode(HttpStatus.NO_CONTENT)
  remove(@Param('id') id: string): Promise<void> {
    return this.productService.remove(id);
  }
}

results matching ""

    No results matching ""