products.controller.ts
nest.js/03-advanced/code/products/products.controller.ts
import {
Controller,
Get,
Post,
Put,
Delete,
Body,
Param,
Query,
HttpCode,
HttpStatus,
UseInterceptors,
CacheInterceptor,
CacheKey,
CacheTTL,
} from '@nestjs/common';
import { ProductsService } from './products.service';
import { CreateProductDto } from './dto/create-product.dto';
import { ApiTags, ApiOperation, ApiResponse, ApiQuery } from '@nestjs/swagger';
import { CurrentUser } from '../common/decorators/current-user.decorator';
@ApiTags('Products')
@Controller('products')
export class ProductsController {
constructor(private readonly productsService: ProductsService) {}
@Get()
@UseInterceptors(CacheInterceptor)
@CacheKey('products:all')
@CacheTTL(300)
@ApiOperation({ summary: 'Get all products' })
@ApiQuery({ name: 'category', required: false, description: 'Filter by category' })
@ApiResponse({ status: 200, description: 'List of products' })
async findAll(@Query('category') category?: string) {
if (category) {
return this.productsService.findByCategory(category);
}
return this.productsService.findAll();
}
@Get(':id')
@UseInterceptors(CacheInterceptor)
@CacheKey('products')
@CacheTTL(300)
@ApiOperation({ summary: 'Get a product by ID' })
@ApiResponse({ status: 200, description: 'Product details' })
@ApiResponse({ status: 404, description: 'Product not found' })
findOne(@Param('id') id: string) {
return this.productsService.findOne(id);
}
@Post()
@HttpCode(HttpStatus.CREATED)
@ApiOperation({ summary: 'Create a new product' })
@ApiResponse({ status: 201, description: 'Product created' })
@ApiResponse({ status: 400, description: 'Validation error' })
@ApiResponse({ status: 409, description: 'Product already exists' })
create(@Body() createProductDto: CreateProductDto, @CurrentUser() user: any) {
return {
message: 'Product created successfully',
data: this.productsService.create(createProductDto),
createdBy: user?.email || 'system',
};
}
@Put(':id')
@ApiOperation({ summary: 'Update a product' })
@ApiResponse({ status: 200, description: 'Product updated' })
@ApiResponse({ status: 404, description: 'Product not found' })
update(
@Param('id') id: string,
@Body() updateProductDto: Partial<CreateProductDto>,
) {
return {
message: 'Product updated successfully',
data: this.productsService.update(id, updateProductDto),
};
}
@Delete(':id')
@HttpCode(HttpStatus.NO_CONTENT)
@ApiOperation({ summary: 'Delete a product' })
@ApiResponse({ status: 204, description: 'Product deleted' })
@ApiResponse({ status: 404, description: 'Product not found' })
async remove(@Param('id') id: string) {
await this.productsService.remove(id);
return {
message: 'Product deleted successfully',
};
}
}
Artículos relacionados
app.controller.ts
app.controller.ts — typescript source code from the nest.js learning materials (nest.js/01-beginner/code/app.controller.ts).
Leer artículo →app.module.ts
app.module.ts — typescript source code from the nest.js learning materials (nest.js/01-beginner/code/app.module.ts).
Leer artículo →app.service.ts
app.service.ts — typescript source code from the nest.js learning materials (nest.js/01-beginner/code/app.service.ts).
Leer artículo →main.ts
main.ts — typescript source code from the nest.js learning materials (nest.js/01-beginner/code/main.ts).
Leer artículo →todos.controller.ts
todos.controller.ts — typescript source code from the nest.js learning materials (nest.js/01-beginner/code/todos/todos.controller.ts).
Leer artículo →todos.module.ts
todos.module.ts — typescript source code from the nest.js learning materials (nest.js/01-beginner/code/todos/todos.module.ts).
Leer artículo →