sunilksamanta/node-mongoose-setup

View on GitHub
system/helpers/HttpResponse.js

Summary

Maintainability
A
35 mins
Test Coverage
'use strict';
const defaultExcludedItemsFromResponse = [ '__v', 'password' ];

class HttpResponse {

    /**
     * @author Sunil Kumar Samanta
     * @param data : Object | Array | String
     * @param options : {totalCount: Number, statusCode: Number, deleted: Boolean}
     */
    error = false;
    responseTimestamp = new Date();

    constructor( data, options = { 'totalCount': 0, 'statusCode': 200, 'deleted': null } ) {
        this.statusCode = options.statusCode || 200;
        let filteredData = data;

        if ( typeof ( filteredData ) === 'object' ) {
            filteredData = this.filterData( JSON.parse( JSON.stringify( filteredData ) ) );
        }
        if ( options.deleted ) {
            this.deleted = options.deleted;
        }
        if ( Array.isArray( filteredData ) ) {
            this.data = [ ...filteredData ];
            this.totalCount = options.totalCount || undefined;
        } else if ( typeof ( filteredData ) === 'object' ) {
            this.data = { ...filteredData };
        } else {
            this.data = data;
        }
    }

    filterData( data ) {
        if ( Array.isArray( data ) ) {
            data.map( ( x, index ) => {
                Object.keys( x ).forEach( ( key ) => {
                    if ( defaultExcludedItemsFromResponse.includes( key ) ) {
                        delete data[ index ][ key ];
                    }
                } );
            } );
        } else if ( typeof ( data ) === 'object' ) {
            Object.keys( data ).forEach( ( key ) => {
                if ( defaultExcludedItemsFromResponse.includes( key ) ) {
                    delete data[ key ];
                }
            } );
        }
        return data;
    }
}

module.exports = { HttpResponse };