Advanced Usage

Request & Delimiters

Inspect parsed query parameters and customize array value delimiters with ApiQueryBuilderRequest.

Under the hood, @eienjs/adonisjs-api-query wraps the AdonisJS HttpRequest in an ApiQueryBuilderRequest instance to parse filter, sort, include, fields, and append parameters consistently.

Accessing ApiQueryBuilderRequest

You can create an ApiQueryBuilderRequest directly from an HttpRequest or access it on any ModelQueryBuilder instance via the $apiQueryBuilderRequest getter:

import { ApiQueryBuilderRequest } from '@eienjs/adonisjs-api-query';

// Directly from HttpRequest:
const apiRequest = ApiQueryBuilderRequest.fromRequest(request);
// or: new ApiQueryBuilderRequest(request)

const filters = apiRequest.filters(); // Record<string, unknown>
const sorts = apiRequest.sorts(); // string[]
const includes = apiRequest.includes(); // string[]
const fields = apiRequest.fields(); // Record<string, string[]>
const appends = apiRequest.appends(); // string[]

// Or from a ModelQueryBuilder:
const query = User.query().withRequest(request);
const parsedFilters = query.$apiQueryBuilderRequest.filters();

Automatic Value Parsing in filters()

When ApiQueryBuilderRequest parses filter values from the query string:

  • String 'true' and 'false' are converted to boolean true and false.
  • Strings containing the filter array delimiter (, by default) are split into string arrays (e.g., ?filter[status]=active,pending becomes ['active', 'pending']).
  • undefined and null become null.
  • Unsafe object prototype keys (__proto__, constructor, prototype) are automatically stripped to prevent prototype pollution.

Customizing Array Value Delimiters

By default, comma (,) is used to split multiple values in filter, sort, include, fields, and append parameters (for example, ?filter[id]=1,2,3 or ?include=posts,profile).

If your filter values naturally contain commas (such as addresses or titles), you can change the delimiter globally or for specific parameter types.

Per-Filter Array Delimiter

All AllowedFilter factory methods (exact, partial, beginsWithStrict, endsWithStrict, callback, scope, custom, operator) accept an optional arrayValueDelimiter parameter:

import { AllowedFilter } from '@eienjs/adonisjs-api-query';

// GET /users?filter[location]=New York, NY;Los Angeles, CA
const users = await User.query()
  .withRequest(request)
  .allowedFilters([
    AllowedFilter.exact('location', undefined, true, ';'),
  ]);

Global Delimiter Methods on ApiQueryBuilderRequest

You can also configure delimiters via static methods on ApiQueryBuilderRequest (or AllowedFilter.setFilterArrayValueDelimiter()):

import { ApiQueryBuilderRequest } from '@eienjs/adonisjs-api-query';

// Set delimiter for all parameter types at once (includes, appends, fields, sorts, filters)
ApiQueryBuilderRequest.setArrayValueDelimiter(';');

// Or configure each parameter type individually:
ApiQueryBuilderRequest.setFilterArrayValueDelimiter('|');
ApiQueryBuilderRequest.setIncludesArrayValueDelimiter(',');
ApiQueryBuilderRequest.setSortsArrayValueDelimiter(',');
ApiQueryBuilderRequest.setFieldsArrayValueDelimiter(',');
ApiQueryBuilderRequest.setAppendsArrayValueDelimiter(',');

// Reset all delimiters back to ','
ApiQueryBuilderRequest.resetDelimiters();