TECNOLOBO

No recuerdas tu codigo?
Se te olvido como se hace?

Aqui podras guardar lo que necesiten
Y cuando sea necesesario

Creado por julian gomez
iiiiii

DTO Data Trasfer Object



Descripcion

Validar los tipos de objetos que recibe Nest

Nota1



un DTO no es mas que una clase exportada para validar el tipo de objeto que espera recibir el backet. 
se podria decri que es una interface pero esta si obliga en el backend a usar la estructura de los objetos
cumplan con esa estrucutra creada en el DTO.
Documentacion:https://www.npmjs.com/package/class-validator


1. se va hacer DTO en nest es necesario usar las siguientes librerias que crea y espone muchos pipes para usar
	yarn add class-validator class-transformer

	//IsOptional IsPositive IsMongoId
	//IsArray    IsString   IsUUID
	//IsDecimal  IsDate     IsDateString
	//IsBoolean  IsEmail    IsUrl

2. se crea una clase(CreateCardDto) y se exporta
	2.1 se le dice que estructura se debe seguir y que tipo de datos son y si son obligatorios
3. se aplica el decorador  @UsePipes(ValidationPipe) en el metodo o clase "Tanbien se puede global" para decirle que va a validar la estrucutura que llegue
como parametro del tipo de clase que se le puso a la funcion "crarCarro"
4. enviar una peticion http de tipo post sin enviarle un parametro. SE RECIBITA UN ERROR sino tiene la estrucutra espesificada en el DTO


NOTA: 
el uso del @UsePipes(ValidationPipe) se puede espesificar en diferentes partes. se puede usar en el controlador
para que todos los metodos que usen los DTO puedan realizar las validaciones.
Tambien se puede poner a nivel de aplicacion.

PONERLO GLOBALMENTE:
//ir a main.js
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  
  //Se hace uso de los pipes que se van usar en cualquier request
  app.useGlobalPipes(
    new ValidationPipe({
    whitelist: true, //Esto indica que va eliminar las propiedades que no lucen como las clases a las que deben ser semejantes
    forbidNonWhitelisted: true, //Esto le dice las propiedades dentro del request tiene que venir exactamente iguales que las calses DTO
    })
  );

  await app.listen(3000);
}
bootstrap();


						

Modulo


//Classe
import { IsString,IsOptional } from "class-validator";
export class CreateCardDto{
	
  //la caracteriscas es que deben ser readonlu
  //@IsString({message:'Mensaje personalziado'}) 
  @IsString() //Se hace uso de los decoradores de paquete class-validator para espesificar cual es obligatorio strin etc
  //@IsOptional() para hacerlo opcional
  readonly brand:string; //cuando sean opcionales tambien seria conveniente ponerlas brand?: para que typescrip sepa que son opcionales
  @IsString()
  readonly model:string;

 


}
						

Controlador


import { Body, Controller, Post, ValidationPipe } from '@nestjs/common';
import { CarsService } from './cars.service';
import { CreateCardDto } from './dto/create-car.dto';
//@UsePipes(ValidationPipe) se puede poner aqui para que todos los metodos que usen DTO puedan manejar las validaciones
@Controller('cars')
export class CarsController {
 
  constructor(
    private readonly carsService:CarsService
  ){

  }


  @Post()
  @UsePipes(ValidationPipe) //Aqui usamos el validator pipe que se usa para hacer la diferentes validaciones y hacer el DTO
  crarCarro(@Body() createCardDto:CreateCardDto){
    return {
      createCardDto
    }
  }





}

						

Entity


import { Injectable, NotFoundException } from '@nestjs/common';
import { Car } from './interfaces/car.interface';
import {v4 as uuid} from 'uuid';

@Injectable()
export class CarsService {

  private cars:Car[]=[
    {
      id:uuid(),
      brand:'bran',
      model:'Corolla'
    },
    {
      id:uuid(),
      brand:'Honda',
      model:'Sid'
    },
    {
      id:uuid(),
      brand:'Jeep',
      model:'Otra'
    }
  ];

  findAll(){
    return this.cars;
  }

  findById(id:string){    
    const cart = this.cars.find(car=>car.id===id);
    if(!cart) throw new NotFoundException(`el carro con el id=${id} no existe`); //Estos puede enviar el mensaje personalizado si asi se dese por parametro
   
    return cart;
  }


}

						

App.module


a
						

Main


a