File

src/core/interceptors/page.interceptor.ts

Description

Pagination-implementing interceptor

Index

Methods

Methods

intercept
intercept(context: ExecutionContext, next: CallHandler)

Override of intercept() method, specified in NestInterceptor interface

Parameters :
Name Type Optional
context ExecutionContext No
next CallHandler<any> No

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;
    // }
}

results matching ""

    No results matching ""