import { Controller, Get, Post, Put, Delete, Body, Param, Query, HttpCode, HttpStatus, BadRequestException, NotFoundException, InternalServerErrorException } from '@nestjs/common'; import { CategoriesService } from './categories.service'; import { CreateCategoryDto } from './dto/create-category.dto'; import { UpdateCategoryDto } from './dto/update-category.dto'; import { Category } from './entities/category.entity'; @Controller('categories') export class CategoriesController { constructor(private readonly categoriesService: CategoriesService) { } @Get() @HttpCode(HttpStatus.OK) public async find(@Query() filters: GetCategoryFilters): Promise { const ids = Array.isArray(filters.ids) ? filters.ids : filters.ids ? [filters.ids] : []; const categories = Array.isArray(filters.categories) ? filters.categories : filters.categories ? [filters.categories] : []; const sort = filters.sort?.toLowerCase() === 'desc' ? 'desc' : 'asc'; return await this.categoriesService.find({ ids, categories, sort}); } @Get(':id') @HttpCode(HttpStatus.OK) public async findOne(@Param('id') id: string): Promise { if (!id) { throw new BadRequestException('No ID provided.'); } try { return await this.categoriesService.findById(id); } catch (error) { throw new NotFoundException(error); } } @Post() @HttpCode(HttpStatus.CREATED) public async create(@Body() category: CreateCategoryDto): Promise { if (!category.name) { throw new BadRequestException('Category name cannot be empty.'); } try { return await this.categoriesService.create(category); } catch (error) { throw new InternalServerErrorException(error); } } @Put() @HttpCode(HttpStatus.OK) public async update(@Body() category: UpdateCategoryDto): Promise { if (!category.id) { throw new BadRequestException('Category ID cannot be empty.'); } return await this.categoriesService.update(category); } @Delete(':id') @HttpCode(HttpStatus.NO_CONTENT) public async remove(@Param('id') id: string): Promise { return await this.categoriesService.remove(id); } } export interface GetCategoryFilters { ids?: string[]; categories?: string[]; sort?: 'asc' | 'desc'; }