dbmedialab/reader-critics

View on GitHub
src/app/util/pagination.ts

Summary

Maintainability
A
0 mins
Test Coverage
//
// LESERKRITIKK v2 (aka Reader Critics)
// Copyright (C) 2017 DB Medialab/Aller Media AS, Oslo, Norway
// https://github.com/dbmedialab/reader-critics/
//
// This program is free software: you can redistribute it and/or modify it under
// the terms of the GNU General Public License as published by the Free Software
// Foundation, either version 3 of the License, or (at your option) any later
// version.
//
// This program is distributed in the hope that it will be useful, but WITHOUT
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
// FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License along with
// this program. If not, see <http://www.gnu.org/licenses/>.
//
import {
    Request
} from 'express';

import {
    defaultLimit,
    defaultSortField,
    defaultSortOrder,
} from '../services/BasicPersistingService';

const defaultPage = 1;

/*
 *    Responds with skip, limit and sort parameters
 *    If nothing came from request default will be used
 */
export default function(requ: Request) {
    let skip: number;
    const page: number = requ.query.page && requ.query.page > 0
                            ? parseInt(requ.query.page)
                            : defaultPage;
    const limit: number = parseInt(requ.query.limit) || defaultLimit;

    if (page === 1) {
        skip = 0;
    } else {
        skip = limit * (page - 1);
    }

    const sort  = getSort(requ);

    return { skip, limit, sort };
}

function getSort(requ: Request) {
    const {sort: sortFieldString, sortOrder: sortOrderString} = requ.query;
    const sortField: string = sortFieldString || null;
    const sortOrderVal: number = sortOrderString ? parseInt(sortOrderString) : null;
    const sortOrder: number = [1, -1].includes(sortOrderVal) ? sortOrderVal: null;

    const sort : Object = {};

    if (sortField && sortOrder) {
        sort[sortField] = sortOrder;
    } else if (sortField && !sortOrder) {
        sort[sortField] = defaultSortOrder;
    } else if (!sortField && sortOrder) {
        sort[defaultSortField] = sortOrder;
    } else {
        sort[defaultSortField] = defaultSortOrder;
    }

    return sort;
}