import { Controller, Get, Post, Body, Patch, Param, Delete, Query, UseGuards } from '@nestjs/common'; import { ProductService } from '../providers/product.service'; import { CreateproductDto } from '../dto/create-product.dto'; import { UpdateproductDto } from '../dto/update-product.dto'; import { FindproductsDto } from '../dto/find-products.dto'; import { ApiTags, ApiOperation, ApiQuery, ApiBody, ApiParam, ApiBearerAuth, ApiHeader, } from '@nestjs/swagger'; import { AdminAuthGuard } from 'src/modules/auth/guards/adminAuth.guard'; import { UserId } from 'src/common/decorators'; import { AuthGuard } from 'src/modules/auth/guards/auth.guard'; import { Permission } from 'src/common/enums/permission.enum'; import { Permissions } from 'src/common/decorators/permissions.decorator'; import { CreateCategoryDto } from '../dto/create-category.dto'; import { CategoryService } from '../providers/category.service'; import { FindCategoriesDto } from '../dto/find-categories.dto'; import { UpdateCategoryDto } from '../dto/update-category.dto'; import { AttributeService } from '../providers/attribute.service'; import { CreateAttributeDto } from '../dto/create-attribute.dto'; import { UpdateAttributeDto } from '../dto/update-attribute.dto'; import { CreateAttributeValueDto } from '../dto/create-attribute-value.dto'; import { AttributeValueService } from '../providers/attribute-value.service'; import { UpdateAttributeValueDto } from '../dto/update-attribute-value.dto'; @ApiTags('products') @Controller() export class productController { constructor( private readonly productService: ProductService, private readonly categoryService: CategoryService, private readonly attributeService: AttributeService, private readonly attributeValueService: AttributeValueService, ) { } /*====================CATEGORY =========================*/ @Post('admin/category') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Create a new category' }) @ApiBody({ type: CreateCategoryDto }) createCategory(@Body() createproductDto: CreateCategoryDto) { return this.categoryService.create(createproductDto); } @Get('admin/category') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Get a paginated list of Categories' }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) @ApiQuery({ name: 'search', required: false, type: String }) @ApiQuery({ name: 'orderBy', required: false, type: String }) @ApiQuery({ name: 'order', required: false, enum: ['asc', 'desc'] }) @ApiQuery({ name: 'isActive', required: false, type: Boolean }) async findAllCategories(@Query() dto: FindCategoriesDto) { const result = await this.categoryService.findAll(dto); return result; } @Get('admin/category/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Get a category by id' }) @ApiParam({ name: 'id', required: true }) findCategoryById(@Param('id') id: string) { return this.categoryService.findById(+id); } @Patch('admin/category/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Update a category' }) @ApiParam({ name: 'id', required: true }) @ApiBody({ type: UpdateCategoryDto }) updateCategory(@Param('id') id: string, @Body() dto: UpdateCategoryDto) { return this.categoryService.update(+id, dto); } @Delete('admin/category/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Delete (soft) a category' }) @ApiParam({ name: 'id', required: true }) removeCategory(@Param('id') id: string,) { return this.categoryService.remove(+id); } /* =============================== PRODUCT ================================= */ @Get('public/products') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Get list of products' }) async findAllAsUser() { const result = await this.productService.findAll({ limit: 1000 }); return result; } @Post('admin/product') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Create a new product' }) @ApiBody({ type: CreateproductDto }) create(@Body() createproductDto: CreateproductDto) { return this.productService.create(createproductDto); } @Get('admin/products') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Get a paginated list of products' }) @ApiQuery({ name: 'page', required: false, type: Number }) @ApiQuery({ name: 'limit', required: false, type: Number }) @ApiQuery({ name: 'search', required: false, type: String }) @ApiQuery({ name: 'orderBy', required: false, type: String }) @ApiQuery({ name: 'order', required: false, enum: ['asc', 'desc'] }) @ApiQuery({ name: 'categoryId', required: false, type: String }) @ApiQuery({ name: 'isActive', required: false, type: Boolean }) async findAll(@Query() dto: FindproductsDto) { const result = await this.productService.findAll(dto); return result; } @Get('admin/products/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Get a product by id' }) @ApiParam({ name: 'id', required: true }) findById(@Param('id') id: string,) { return this.productService.findById(id); } @Patch('admin/products/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Update a product' }) @ApiParam({ name: 'id', required: true }) @ApiBody({ type: UpdateproductDto }) update(@Param('id') id: string, @Body() updateproductDto: UpdateproductDto) { return this.productService.update(id, updateproductDto); } @Delete('admin/products/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Delete (soft) a product' }) @ApiParam({ name: 'id', required: true }) remove(@Param('id') id: string,) { return this.productService.remove(id); } /*=============================== Attibute ==========================*/ @Post('admin/product/:id/attribute') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Create a new attribute' }) @ApiParam({ name: 'id', required: true }) @ApiBody({ type: CreateAttributeDto }) createAttribute(@Param('id') id: string, @Body() dto: CreateAttributeDto) { return this.attributeService.create(+id, dto); } @Get('admin/products/:id/attributes') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiParam({ name: 'id', required: true }) @ApiOperation({ summary: 'Get list of product attributes' }) async findProductAttributes(@Param('id') id: string) { return this.attributeService.findAll(+id); } @Get('admin/products/attributes/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Get a attribute by id' }) @ApiParam({ name: 'id', required: true }) findAttributeById(@Param('id') id: string) { return this.attributeService.findById(+id); } @Patch('admin/products/attributes/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Update a attribute' }) @ApiParam({ name: 'id', required: true }) @ApiBody({ type: UpdateAttributeDto }) updateProductAttribute(@Param('id') id: string, @Body() dto: UpdateAttributeDto) { return this.attributeService.update(+id, dto); } @Delete('admin/products/attributes/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Delete (soft) a attribute' }) @ApiParam({ name: 'id', required: true }) removeAttribute(@Param('id') id: string,) { return this.attributeService.remove(+id); } /*=========================== Attibute Values==========================*/ @Post('admin/product/attribute/:id/value') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Create a new attribute value' }) @ApiParam({ name: 'id', required: true }) @ApiBody({ type: CreateAttributeValueDto }) createAttributeValue(@Param('id') id: string, @Body() dto: CreateAttributeValueDto) { return this.attributeValueService.create(+id, dto); } @Get('admin/products/attributes/:id/values') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiParam({ name: 'id', required: true }) @ApiOperation({ summary: 'Get list of attribute values' }) async findtAttributeValue(@Param('id') id: string) { return this.attributeValueService.findAll(+id); } @Get('admin/products/attributes/value/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Get a attribute value by id' }) @ApiParam({ name: 'id', required: true }) findAttributeValueById(@Param('id') id: string) { return this.attributeValueService.findById(+id); } @Patch('admin/products/attributes/value/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Update a attribute value' }) @ApiParam({ name: 'id', required: true }) @ApiBody({ type: UpdateAttributeValueDto }) updateAttributeValue(@Param('id') id: string, @Body() dto: UpdateAttributeValueDto) { return this.attributeValueService.update(+id, dto); } @Delete('admin/products/attributes/value/:id') // @UseGuards(AdminAuthGuard) @ApiBearerAuth() @Permissions(Permission.MANAGE_PRODUCTS) @ApiOperation({ summary: 'Delete (soft) a attribute value' }) @ApiParam({ name: 'id', required: true }) removeAttributeValue(@Param('id') id: string,) { return this.attributeValueService.remove(+id); } }