Categorias
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();