Home Manual Reference Source Test Repository

src/channels/ChannelFinder.js

'use strict';

import ProvisionGenericFinder from '../ProvisionGenericFinder';

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

/**
 *   This class allow make get request to channel resource into Opengate North API.
 */
export default class ChannelFinder extends ProvisionGenericFinder {

    /**
     * Constructor
     * @param {InternalOpenGateAPI} ogapi - Reference to the API object.
     */
    constructor(ogapi) {
        super(ogapi, 'organizations', 'channel', 'Channel not found');
    }

    /**
     * Download a specific channel by its organization and id. This execute a GET http method
     * @test
     *   ogapi.newChannelFinder().findByOrganizationAndName('orgname', xxx-xx-xxx-xxx').then().catch();
     * @param {string} organization - channel organization .
     * @param {string} name - channel name.
     * @return {Promise} 
     */
    findByOrganizationAndName(organization, name) {
        this._organization = organization;
        this._name = name;
        return this._execute();
    }

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

    /**
     * Performs a get that returns channels related
     * @test
     *   ogapi.newChannelFinder().findByDomainAndWorkgroup('xxx-xx-xxx-xxx', 'xxxxx-xxxx-xxxx').then().catch();
     * @param {string} domain - domain 
     * @param {string} workgroup - workgroup.
     * @return {Promise} 
     */
    findByDomainAndWorkgroup(domain, workgroup) {
        this._domain = domain;

        this._workgroup = workgroup;
        let _error_not_found = this._error_not_found;

        let defered = q.defer();
        let promise = defered.promise;

        this._executeWorkgroupRelation().then(function (request) {
            if (request.statusCode === 204) {
                defered.reject({
                    data: _error_not_found,
                    statusCode: HttpStatus.NO_CONTENT
                });
            } else {
                let globalData = request.data;
                let finalData = [];

                for (let idx in globalData.channels) {
                    finalData.push({
                        "organization": globalData.channels[idx].organization,
                        "name": globalData.channels[idx].channel
                    });
                }

                defered.resolve({
                    data: finalData,
                    statusCode: request.statusCode
                });
            }
        }).catch(function (error) {
            defered.reject(error);
        });

        return promise;
    }

    /**
     * Performs a get that returns channels related
     * @test
     *   ogapi.newChannelFinder().findByDomainAndWorkgroupAndOrganization('xxx-xx-xxx-xxx', 'xxxxx-xxxx-xxxx', 'asdfasdfasdf').then().catch();
     * @param {string} domain - domain 
     * @param {string} workgroup - workgroup.
     * @param {string} organization - organization.
     * @return {Promise} 
     */
    findByDomainAndWorkgroupAndOrganization(domain, workgroup, organization) {
        var _this = this;
        _this._domain = domain;
        _this._workgroup = workgroup;
        _this._organization = organization;

        let _error_not_found = _this._error_not_found;

        let defered = q.defer();
        let promise = defered.promise;

        _this._executeWorkgroupRelation().then(function (request) {

            if (request.statusCode === 204) {
                defered.reject({
                    data: _error_not_found,
                    statusCode: HttpStatus.NOT_FOUND
                });
            } else {
                let globalData = request.data;
                let finalData = [];

                for (let idx in globalData.channels) {
                    if (_this._organization === globalData.channels[idx].organization) {
                        finalData.push({
                            "organization": globalData.channels[idx].organization,
                            "name": globalData.channels[idx].channel
                        });
                    }
                }

                if (finalData.length > 0) {
                    defered.resolve({
                        data: finalData,
                        statusCode: request.statusCode
                    });
                } else {
                    defered.reject({
                        data: _error_not_found,
                        statusCode: HttpStatus.NOT_FOUND
                    });
                }
            }
        }).catch(function (error) {
            defered.reject(error);
        });

        return promise;
    }

    /**
     * @return {Promise}
     * @private
     */
    _executeWorkgroupRelation() {

        let workgroupsRelationsUrl = "provision/domains/" + this._domain + "/workgroups/" + this._workgroup + "/relations";

        let defered = q.defer();
        let promise = defered.promise;

        let _error_not_found = this._error_not_found;
        this._api.get(workgroupsRelationsUrl, undefined, this._getExtraHeaders(), this._getUrlParameters())
            .then((req) => {
                if (req.statusCode === 204) {
                    defered.reject({
                        data: _error_not_found,
                        statusCode: HttpStatus.NOT_FOUND
                    });
                } else {
                    defered.resolve({
                        data: req.body.workgroupRelation,
                        statusCode: req.statusCode
                    });
                }
            })
            .catch((error) => {
                defered.reject(error);
            });
        return promise;
    }

}