nestjs-rest-querynestjs-rest-query

TypeORM Adapter

Use nestjs-rest-query with TypeORM - the default adapter.

TypeORM is the default adapter. If you already use TypeORM and @nestjs/typeorm, everything works without extra configuration.

Install

pnpm add typeorm
# ou
npm install typeorm

If you do not have TypeORM installed yet, the library will pull it automatically (it is a peer dependency).

Module setup

app.module.ts
import { Module } from '@nestjs/common';
import { DynamicQueryBuilderModule } from 'nestjs-rest-query';

@Module({
  imports: [
    DynamicQueryBuilderModule.forRoot({
      pagination: { defaultPerPage: 20, maxPerPage: 100 },
    }),
  ],
})
export class AppModule {}

No adapter configuration is required - TypeORM is the default. If you want to be explicit:

import { TypeOrmAdapter } from 'nestjs-rest-query/typeorm';

DynamicQueryBuilderModule.forRoot({
  adapter: new TypeOrmAdapter(),
  pagination: { defaultPerPage: 20, maxPerPage: 100 },
});

Usage

users.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import {
  ApiDynamicQuery,
  QueryRules,
  QueryBuilderService,
  RulesConfig,
  QueryInput,
} from 'nestjs-rest-query';
import { User } from './user.entity';

const rules: RulesConfig = {
  alias: 'user',
  filters: ['email', 'name', 'createdAt', 'status'],
  sorts: ['name', 'createdAt'],
  fields: ['id', 'name', 'email'],
  includes: ['company'],
  search: ['name', 'email'],
};

@Controller('users')
export class UsersController {
  constructor(
    @InjectRepository(User) private readonly users: Repository<User>,
    private readonly qb: QueryBuilderService
  ) {}

  @Get()
  @ApiDynamicQuery(rules)
  list(@Query() query: QueryInput, @QueryRules() endpointRules = rules) {
    return this.qb.execute(this.users, query, endpointRules);
  }
}

Result

{
  "data": [
    {
      "id": "u_1",
      "name": "Ana",
      "email": "ana@acme.com",
      "company": { "id": "c_1", "name": "Acme" }
    }
  ],
  "page": 1,
  "perPage": 20,
  "total": 42,
  "lastPage": 3
}

Next steps

If you want to switch to Drizzle, see the Drizzle Adapter.

For a complete guide to parameters and operators, see the Usage Guide.

Edit this page on GitHub

On this page