Home Manual Reference Source Test Repository

src/collection/devices/DeviceMessage.js

'use strict';

import q from 'q';
import Event from './collect/Event';
import Datastream from '../devices/collect/Datastreams';
/**
 * This is a base object contains methods to send unstructured IoT information to be processed & collected by the platform.
 */
export default class DeviceMessage extends Event {

    /**
     * Constructor
     * @param {InternalOpenGateAPI} Reference to the API object.
     */
    constructor(ogapi, resource, timeout) {
        super();
        this._ogapi = ogapi;
        this._resource = 'devices';
        this._iotMessage = undefined;
        this._dmmMessage = undefined;
        this._id = undefined;
        this._version = undefined;
        this._dataStreamVersion = undefined;
        this._deviceId = undefined;
        this._datastreams = [];
    }


    /**
     * Set the id attribute
     * @param {string} id - required field
     * @return {deviceMessages}
     */
    withId(id) {
        if (typeof id !== 'string' || id.length > 50)
            throw new Error({ message: "OGAPI_STRING_PARAMETER_MAX_LENGTH_50", parameter: 'id' });
        this._id = id;
        return this;
    }

    /**
     * Set the dataStream version attribute
     * @param {string} version - required field
     * @return {deviceMessages}
     */
    withDataStreamVersion(version) {
        if (typeof version !== 'string' || version.length > 50)
            throw new Error({ message: "OGAPI_STRING_PARAMETER_MAX_LENGTH_50", parameter: 'version' });
        this._dataStreamVersion = version;
        return this;
    }

    /**
     * Set the version attribute
     * @param {string} version - required field
     * @return {deviceMessages}
     */
    withDmmVersion(version) {
        if (typeof version !== 'string' || version.length > 50)
            throw new Error({ message: "OGAPI_STRING_PARAMETER_MAX_LENGTH_50", parameter: 'version' });
        this._version = version;
        return this;
    }

    /**
     * Set the deviceId attribute
     * @param {string} deviceId - optional field
     * @return {deviceMessages}
     */
    withDeviceId(deviceId) {
        if (typeof deviceId !== 'string' || deviceId.length > 50)
            throw new Error({ message: "OGAPI_STRING_PARAMETER_MAX_LENGTH_50", parameter: 'device' });
        this._deviceId = deviceId;
        return this;
    }



    /**
     * Set the datastream attribute
     * @param {Datastream} datastream - required field
     * @return {deviceMessages}
     */
    withDataStream(datastream) {
        if (datastream instanceof Datastream) {
            this._datastreams.push(datastream.composeElement());
        }
        return this;
    }



    _buildIotURL() {
        if (this._id === undefined)
            throw new Error('Parameters id must be defined');
        let url = this._resource + "/" + this._id + "/collect/iot";
        return url;

    }

    _buildDmmURL() {
        if (this._id === undefined)
            throw new Error('Parameters id must be defined');
        let url = this._resource + "/" + this._id + "/collect/dmm";
        return url;

    }

    _composeIotMessage() {
        if (this._datastreams === undefined || this._dataStreamVersion === undefined) {
            throw new Error('Parameters datastreams and version must be defined');
        }
        var iotMessage = {
            'version': this._dataStreamVersion,
            'device': this._deviceId,
            'datastreams': this._datastreams
        };
        return iotMessage;

    }

    _composeDmmMessage() {
        if (this._version === undefined) {
            throw new Error('Parameters id must be defined');
        }
        var event = super.composeElement();
        var dmmMessage = {
            'version': this._version,
            'event': event
        };
        return dmmMessage;

    }

    create() {
        var defered = q.defer();
        var promises = defered.promise;

        let boxPromises = [];
        if (this._datastreams.length > 0) {
            boxPromises.push(this._ogapi.Sapi.post(this._buildIotURL(), this._composeIotMessage()).then(function (res) {
                if (res.statusCode !== 201) {
                    throw new Error("IOT NOT CREATED");
                }
            }));
        }
        if (this._version !== undefined) {

            boxPromises.push(this._ogapi.Sapi.post(this._buildDmmURL(), this._composeDmmMessage()).then(function (res) {
                if (res.statusCode !== 201) {
                    throw new Error("DMM NOT CREATED");
                }
            }));
        }

        q.all(boxPromises).catch(function (errores) {
            defered.reject({ errors: errores, statusCode: 400 });
        }).done(function (response) {
            defered.resolve({ statusCode: 201 });
        });
        return promises;
    }

}