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

Pagination nest y DTO



Descripcion

Realizar una paginacion con nest mongo y los DTO

Nota1


0. conectar nest con mongo:
	https://tecnolobo.com/editarCodigo/2468
1. primero se debe tener una servicio que retorne registros "PokemonService".
2. crear un DTO encargado de validar los parametros que se envian en la peticion.
3. Aplicar los pipes para convertir los parametros a los tipos del DTO
	nota: todos los parametros enviados por URL son de tipo VARCHAR y por lo tanto los DTO generar un error
    con lo cual debemos convertir los parametros enviados en la peticion en los tipo de datos que espera en DTO
	para esto se debe continuar con el PASO 4    

4. En main se debe parametrizar en este metodo que aplica todos los pipes(Converciones) a todos los metodos
	para decirle a los pipes que tomen los datos y los convirtan a los mismo datos de los DTO se debe poner 
    las siguiente propiedades: 
	app.useGlobalPipes(
      new ValidationPipe({
		
      })
    );
						

Modulo


//DTO para manejar las validaciones de la peticion de paginacion . recibira los parametros
// limit y el offset de tipo numericos
import { IsOptional, IsPort, IsPositive, Min } from "class-validator";

export class PaginationDto{

  @IsOptional()
  @IsPositive()
  @Min(1)
  limit:number;

  @IsOptional()
  @IsPositive()
  offset:number;

}
						

Servicio


import { Injectable, Body, Post, Controller, BadRequestException, InternalServerErrorException, NotFoundException } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose/dist/common';
import { Pokemon } from './entities/pokemon.entity';
import { PaginationDto } from '../common/dto/pagination.dto';

@Injectable()
export class PokemonService {

  constructor(
    @InjectModel(Pokemon.name)
    private readonly PokemonModel:Model<Pokemon>){

  }

async findAll({limit=10,offset=0}:PaginationDto) {
  
    return await this.PokemonModel.find()
    .limit(limit)
    .skip(offset)
    .sort({ //Ordenamos por la columna no
      no:1
    })
    .select('-__v') //Eliminamos la columna __v 
    ;
  }
 
}

						

Controlador


import { Controller, Get, Query } from '@nestjs/common';
import { PokemonService } from './pokemon.service';
import { PaginationDto } from '../common/dto/pagination.dto';

@Controller('pokemon')
export class PokemonController {
  constructor(private readonly pokemonService: PokemonService) {}


	
  @Get()
  findAll(@Query() queryParameters:PaginationDto) { //Usamos el @Query() para atrapar todos los pamarametros de la peticion get y los atraparemos en un parametros
    //que se llamara queryParameters de tipo paginationDTO la cual es una clase que se encargada de validar los parametros.
    return this.pokemonService.findAll(queryParameters);
  }

}

						

Main


import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common/pipes';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.setGlobalPrefix('api/v2');
  //Se hace uso de los pipes que se van usar en cualquier request
  app.useGlobalPipes(
    new ValidationPipe({
	transform:true, //Para tralizar la conversiones de tipo de dato
    transformOptions:{
      enableImplicitConversion:true //Y que realice la trasnformacion de tipo automatica.
    }
    })
  );
  await app.listen(3000);
}
bootstrap();