src/core/interceptors/page.interceptor.ts
Pagination-implementing interceptor
Methods |
intercept | |||||||||
intercept(context: ExecutionContext, next: CallHandler
|
|||||||||
Defined in src/core/interceptors/page.interceptor.ts:21
|
|||||||||
Override of intercept() method, specified in NestInterceptor interface
Parameters :
Returns :
Observable<PageDto<object>>
Page with content and metadata |
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from "@nestjs/common";
import { MetadataScanner } from "@nestjs/core";
import { Observable, map } from "rxjs";
import { PageDto } from "../domain/dtos";
import { SearchQueryDto } from "../domain/dtos/search-q.dto";
import { SearchResultDto } from "../domain/dtos/search-result.dto";
import { Order } from "../domain/enums/page-order.enum";
import { PageMeta } from "../domain/interfaces";
/**
* Pagination-implementing interceptor
*/
@Injectable()
export class PageInterceptor implements NestInterceptor {
/**
* Override of intercept() method, specified in NestInterceptor interface
* @param context
* @param next
* @returns Page with content and metadata
*/
intercept(context: ExecutionContext, next: CallHandler<any>): Observable<PageDto<object>> {
const request = context.switchToHttp().getRequest();
const query: SearchQueryDto = request.query;
return next.handle().pipe(
map((res) => {
let meta: PageMeta = {
total: res.total.value,
pagenum: !query?.page ? 1 : query.page,
order: query?.order?.toUpperCase() === Order.ASC ? Order.ASC : Order.DESC,
hasNext: false,
hasPrev: false,
pagesize: !query?.limit ? 10 : query.limit,
};
meta.hasNext = res.hits[meta.pagenum * meta.pagesize] ? true : false;
meta.hasPrev = res.hits[(meta.pagenum - 1) * meta.pagesize - 1] ? true: false;
const data = res.hits.slice((meta.pagenum - 1) * meta.pagesize, meta.pagenum * meta.pagesize);
return new PageDto(data, meta);
})
);
}
// getQueryParams(str: string): any {
// let parameters: object = {};
// let pairs: string[] = str.split(',');
// parameters['main'] = pairs[0];
// pairs.shift();
// if(!pairs || pairs[0] === '') return parameters;
// for (const pair of pairs) {
// const key: string = pair.substring(0, pair.indexOf('='));
// const value: string = pair.substring(pair.indexOf('=') + 1);
// parameters[key] = value;
// }
// return parameters;
// }
}