Home Manual Reference Source Test Repository

src/GenericFinder.js

'use strict';

import q from 'q';
import HttpStatus from 'http-status-codes';

/**
 *   This class allow make get request to user resource into Opengate North API.
 */
export default class GenericFinder {

    /**
     * Constructor
     * @param {InternalOpenGateAPI} ogapi - Reference to the API object.
     * @param {string} source - Relative url where is located the resource.
     * @param {string} reponseJsonData - Relative url where is located the resource. Can be null
     * @param {string} error_not_found - String error which will be thrown on not_found error.
     * @param {string} serviceBaseURL - base of the uri petition
     */
    constructor(ogapi, source, entity, error_not_found, serviceBaseURL) {
        this._api = ogapi.Napi;
        this._apiSouth = ogapi.Sapi;
        this._baseUrl = source;
        this._entity = entity;
        this._error_not_found = error_not_found;
        this._id = undefined;
        this._headers = undefined;
        this._urlParameters = undefined;
        this._serviceBaseURL = serviceBaseURL;
    }

    /**
     * @return {String} This returns a string with the URL of the request.
     * @private
     */
    _composeUrl() {
        return this._baseUrl + "/" + this._id;
    }

    _withId(_id) {
        this._id = _id;
        return this;
    }

    _getExtraHeaders() {
        return this._headers;
    }

    _setExtraHeaders(headers) {
        if (this._headers) {
            var keys = Object.keys(headers);
            for (var i = 0; i < keys.length; i++) {
                var key = keys[i];
                this._headers[key] = headers[key];
            }
        } else {
            this._headers = headers;
        }
    }

    _getUrlParameters() {
        return this._urlParameters;
    }

    _setUrlParameters(parameters) {
        if (this.parameters) {
            var keys = Object.keys(parameters);
            for (var i = 0; i < keys.length; i++) {
                var key = keys[i];
                this._urlParameters[key] = parameters[key];
            }
        } else {
            this._urlParameters = parameters;
        }
    }

    /**
     * @return {Promise}
     * @private
     */
    _execute(south) {
        let _api = this._api
        if (south) {
            _api = this._apiSouth
        }
        let defered = q.defer();
        let promise = defered.promise;
        let _entity = this._entity;
        let _error_not_found = this._error_not_found;
        this._api.get(this._composeUrl(), undefined, this._getExtraHeaders(), this._getUrlParameters(), false, this._getServiceBaseURL())
            .then((req) => {
                if (req.statusCode === 204) {
                    defered.reject({
                        error: _error_not_found,
                        statusCode: HttpStatus.NOT_FOUND
                    });
                } else {
                    if (req.body) {
                        var data = req.body[_entity] && req.body.provision ? req.body : req.body[_entity];
                        defered.resolve({
                            data: data ? data : req.body,
                            statusCode: req.statusCode
                        });
                    } else {
                        defered.resolve({
                            data: req.text,
                            statusCode: req.statusCode
                        });
                    }

                    // }
                }
            })
            .catch((error) => {
                // BUG RELACIONADO (http://cm.amplia.es/jira/browse/OGODM-3250)
                if (error.statusCode === 400) {
                    error.statusCode = HttpStatus.NOT_FOUND;
                }

                defered.reject(error);
            });
        return promise;
    }

    _downloadUrl() {
        return this._composeUrl();
    }

    /**
     * @return {Promise}* @private
     */
    _download(noBlob) {
        let defered = q.defer();
        let promise = defered.promise;
        let _error_not_found = this._error_not_found;
        this._api.get(this._downloadUrl(), undefined, this._getExtraHeaders(), this._getUrlParameters(), (noBlob ? false : true), this._getServiceBaseURL())
            .then((req) => {
                if (req.statusCode === 204) {
                    defered.reject({
                        data: _error_not_found,
                        statusCode: HttpStatus.NOT_FOUND
                    });
                } else {
                    defered.resolve({
                        data: req,
                        statusCode: req.statusCode
                    });
                }
            })
            .catch((error) => {
                defered.reject(error);
            });
        return promise;
    }

    _getServiceBaseURL() {
        return this._serviceBaseURL;
    }

}