Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Create, update y delete

13/24
Recursos
// src/products/services/products.service.ts
...

@Injectable()
export class ProductsService {
  ...

  create(data: CreateProductDto) {  // 👈
    const newProduct = new this.productModel(data);
    return newProduct.save();
  }

  update(id: string, changes: UpdateProductDto) {  // 👈
    const product = this.productModel
      .findByIdAndUpdate(id, { $set: changes }, { new: true })
      .exec();
    if (!product) {
      throw new NotFoundException(`Product #${id} not found`);
    }
    return product;
  }

  remove(id: string) {  // 👈
    return this.productModel.findByIdAndDelete(id);
  }
}
// src/products/controllers/products.controller.ts

@Controller('products')
export class ProductsController {
   ...

  @Post()
  create(@Body() payload: CreateProductDto) {
    return this.productsService.create(payload);  // 👈
  }

  @Put(':id')
  update(@Param('id') id: string, @Body() payload: UpdateProductDto) {
    return this.productsService.update(id, payload);  // 👈
  }

  @Delete(':id')
  delete(@Param('id') id: string) {
    return this.productsService.remove(id);  // 👈
  }
}

Revisa que uses el ApiProperty en todos los attrs del Dto para que se haga la actualización correctamente.

// src/products/dtos/products.dtos.ts
import { ApiProperty, PartialType } from '@nestjs/swagger';

export class CreateProductDto {
  @IsString()
  @IsNotEmpty()
  @ApiProperty({ description: `product's name` }) // 👈 use ApiProperty
  readonly name: string; 

  @IsString()
  @IsNotEmpty()
  @ApiProperty() // 👈 use ApiProperty
  readonly description: string;

  @IsNumber()
  @IsNotEmpty()
  @IsPositive()
  @ApiProperty() // 👈 use ApiProperty
  readonly price: number;

  @IsNumber()
  @IsNotEmpty()
  @ApiProperty() // 👈 use ApiProperty
  readonly stock: number;

  @IsUrl()
  @IsNotEmpty()
  @ApiProperty() // 👈 use ApiProperty
  readonly image: string;
}

export class UpdateProductDto extends PartialType(CreateProductDto) {}

Aportes 4

Preguntas 5

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

En este momento, los throw new NotFoundException dejaron de funcionar. Para solucionarlo debemos resolver la promesa que regresa productModel usando async / await por ejemplo.

De otra forma, el modelo siempre retornara algo, retornara “Promise { <pending> }” sin importar que exista o no el producto en la base de datos.

async findOne(id: string) { 
    const product = await this.productModel.findById(id).exec(); 
    if (!product) {
      throw new NotFoundException(`Product #${id} not found`);
    }
    
    return product;
  }

el metodo para borrar es

findByIdAndRemove

Algo que no te mencionan es agregar todos los servicios de manera asíncrona, esto es debido a:

  1. Mayor manejo y respuestas de los servidores.
  2. Manejo de errores en caso de error.
  3. Espera de las consultas a la base de datos y que no colapse.

Espero que ayude el aporte.

No me funcionaba la solución para cuando no existe el id de un producto, por lo que diseñe esta solución espero me comenten que les parece saludos.

En el product.service.

findOne(id: string): Promise<any> {
    return this.productModel
      .findById(id)
      .then((userDB) => {
        if (!userDB) throw new NotFoundException(`Product #${id} not found`);

        return {
          ok: true,
          userDB,
        };
      })
      .catch((err) => {
        throw new NotFoundException(`Product #${id} not found ${err}`);
      });
  }