Tengo la aplicación NestJS. Tengo que obtener la consulta de la URL. El problema es que mi fecha de creación es un objeto y no puedo obtenerlo como objeto anidado a través de @Query.
Aquí hay un ejemplo de la ruta:
xxx/yyy/orders?key1=value&key2=value&key3=value&createdAt[lte]=2021-07-01&createdAt[gte]=2011-03-30&orderBy=desc&limit=500Estoy tratando de obtener createdAt[lte] y createdAt[gte] como el objeto anidado
export interface QueryI { key1: string; key2: string; key3: string; key4: string; createdAt: { lte: string, gte: string, } orderBy: 'desc' | 'asc'; limit: number; }Aquí está mi controlador:
@Get('route') getAll( @Query() query: QueryI): Promise<void> { return this.myService.findAll(query); }pero esto me da el siguiente resultado
{ key1: 'value', key2: 'value', key3: 'value', key4: 'value', 'createdAt[lte]': 'some date', 'createdAt[gte]': 'some date', orderBy: 'desc', limit: '500' }Probé JSON.stringify y consulté preguntas similares en SOW pero no tuve suerte.
Gracias
Cambie QueryI de una interfaz a una clase.
Trabajando en NestJS 7.
URL utilizada para la prueba
http://localhost:3000/api/v1/store/search?nestedObj[key1]=yolo&nestedObj[key2]=sup%20bruh&el=test
DTO usado
export class TestDto { el: string; nestedObj: { key1: string; key2: string; }; }Controlador
@Controller('v1/store') @UsePipes(new ValidationPipe({ exceptionFactory: getFormattedErrors })) @UseFilters(DomainExceptionFilter) export class TestController{ @Get('search') public async searchStore(@Query() testDto: TestDto) { console.log(testDto); return 1; } } // Console log - { nestedObj: { key1: 'yolo', key2: 'sup bruh' }, el: 'test' }EDITAR
Al final, implementé diferentes clases y usé @Pipe para validar mi consulta: Aquí está el código:
pipa.ts
@Injectable() export class ValidateQueryPipe implements PipeTransform { transform(value: any, metadata: ArgumentMetadata) { let incomingQuery = value as IncomingQuery; let mappedQuery = new QueryParameters() mappedQuery.key1 = incomingQuery.key1 mappedQuery.key2= incomingQuery.key2 // other mapped valus mappedQuery.createdAt = new CreatedAt(incomingQuery['createdAt[lte]'], incomingQuery['createdAt[gte]']) return mappedQuery; }controlador.ts
@Get(':someurl/someurl') getAllOrders( @Query(ValidateQueryPipe) query: QueryParameters): Promise<Observable<any>> { return this.service.findAll(erpCode, query); }consulta-parámetros.ts
import { CreatedAt } from "./created-at"; export class QueryParameters { key1: string; key2: string; createdAt: CreatedAt; }creado-en.ts
export class CreatedAt { lte: string; gte: string; constructor(lte: string, gte: string){ this.lte = lte; this.gte = gte; }; }Bueno, he encontrado una solución parcial y la publicaré aquí hasta que aparezca una mejor respuesta: estoy extrayendo las propiedades anidadas en consultas separadas y creando mi modelo. No es perfecto, pero está haciendo el trabajo por ahora...
controlador.ts
getAllOrders( @Query() query, @Query('createdAt[lte]') lte: string, @Query('createdAt[gte]') gte: string): Promise<void> { const mappedObject = new QueryParameters(query, lte, gte) return this.orderService.findAll(erpCode, mappedObject); }creadoEnModelo.ts
export class CreatedAt { lte: string; gte: string; constructor(lte: string, gte: string){ this.lte = lte; this.gte = gte; }; }mi-modelo.ts
import { CreatedAt } from "./created-at"; export class QueryParameters { //other keys createdAt: CreatedAt; constructor(query, lte, gte){ //other keys this.createdAt = new CreatedAt(lte, gte) } }Estoy seguro de que la mejor respuesta radica en usar las tuberías de validación de NestJS, pero no logré encontrar la que me funciona.