CRUD en NestJS

 ¡Claro! Vamos a construir un CRUD en NestJS paso a paso, desde cero y de forma sencilla. Usaremos PostgreSQL (con TypeORM) como base de datos, pero puedes adaptarlo a MySQL o SQLite si prefieres.


📌 Paso 1: Instalación y Configuración

1. Instalar NestJS CLI (si no lo tienes):

bash
Copy
Download
npm install -g @nestjs/cli

2. Crear un nuevo proyecto:

bash
Copy
Download
nest new proyecto-crud
cd proyecto-crud

3. Instalar TypeORM y PostgreSQL:

bash
Copy
Download
npm install @nestjs/typeorm typeorm pg

4. Configurar la base de datos

Edita src/app.module.ts:

typescript
Copy
Download
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';

@Module({
  imports: [
    TypeOrmModule.forRoot({
      type: 'postgres',
      host: 'localhost',
      port: 5432,
      username: 'tu_usuario',
      password: 'tu_contraseña',
      database: 'nest_crud',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: true, // ¡OJO! Solo para desarrollo.
    }),
  ],
})
export class AppModule {}

📌 Paso 2: Crear una Entidad (Modelo)

Vamos a crear una entidad Product (producto).
Crea src/products/product.entity.ts:

typescript
Copy
Download
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class Product {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  price: number;

  @Column()
  description: string;
}

📌 Paso 3: Crear un Módulo, Servicio y Controlador

1. Generar el módulo de productos:

bash
Copy
Download
nest generate module products
nest generate service products
nest generate controller products

2. Configurar el módulo (src/products/products.module.ts):

typescript
Copy
Download
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { Product } from './product.entity';
import { ProductsService } from './products.service';
import { ProductsController } from './products.controller';

@Module({
  imports: [TypeOrmModule.forFeature([Product])],
  providers: [ProductsService],
  controllers: [ProductsController],
})
export class ProductsModule {}

📌 Paso 4: Implementar el CRUD en el Servicio

Edita src/products/products.service.ts:

typescript
Copy
Download
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { Product } from './product.entity';

@Injectable()
export class ProductsService {
  constructor(
    @InjectRepository(Product)
    private productRepository: Repository<Product>,
  ) {}

  // CREATE
  async create(product: Product): Promise<Product> {
    return this.productRepository.save(product);
  }

  // READ (ALL)
  async findAll(): Promise<Product[]> {
    return this.productRepository.find();
  }

  // READ (ONE)
  async findOne(id: number): Promise<Product> {
    return this.productRepository.findOne({ where: { id } });
  }

  // UPDATE
  async update(id: number, product: Product): Promise<void> {
    await this.productRepository.update(id, product);
  }

  // DELETE
  async remove(id: number): Promise<void> {
    await this.productRepository.delete(id);
  }
}

📌 Paso 5: Implementar el Controlador

Edita src/products/products.controller.ts:

typescript
Copy
Download
import { Controller, Get, Post, Body, Param, Put, Delete } from '@nestjs/common';
import { ProductsService } from './products.service';
import { Product } from './product.entity';

@Controller('products')
export class ProductsController {
  constructor(private readonly productsService: ProductsService) {}

  @Post()
  create(@Body() product: Product): Promise<Product> {
    return this.productsService.create(product);
  }

  @Get()
  findAll(): Promise<Product[]> {
    return this.productsService.findAll();
  }

  @Get(':id')
  findOne(@Param('id') id: number): Promise<Product> {
    return this.productsService.findOne(id);
  }

  @Put(':id')
  update(@Param('id') id: number, @Body() product: Product): Promise<void> {
    return this.productsService.update(id, product);
  }

  @Delete(':id')
  remove(@Param('id') id: number): Promise<void> {
    return this.productsService.remove(id);
  }
}

📌 Paso 6: Probar la API con Postman o cURL

1. Iniciar el servidor:

bash
Copy
Download
npm run start:dev

2. Endpoints disponibles:

MétodoRutaDescripción
POST/productsCrear producto
GET/productsObtener todos
GET/products/:idObtener uno
PUT/products/:idActualizar producto
DELETE/products/:idEliminar producto

Ejemplo con cURL:

bash
Copy
Download
# Crear producto
curl -X POST -H "Content-Type: application/json" -d '{"name":"Laptop", "price":999, "description":"Una laptop potente"}' http://localhost:3000/products

# Obtener todos
curl http://localhost:3000/products

# Obtener uno
curl http://localhost:3000/products/1

# Actualizar
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Laptop Pro"}' http://localhost:3000/products/1

# Eliminar
curl -X DELETE http://localhost:3000/products/1

🎉 ¡Listo!

Ahora tienes un CRUD completo en NestJS con PostgreSQL. Si quieres profundizar, puedes agregar:

  • Validación de datos (class-validator).

  • Manejo de errores personalizados.

  • Autenticación (JWT).

Comentarios

Entradas más populares de este blog

48. ValidationPipe - Class Validator y Class Transformer

32-Modulos

49. Pipes Globales - A nivel de Aplicación