async getDeviceStatus()

in source/services/api/status/lib/status.js [47:128]


  async getDeviceStatus(ticket, deviceId) {
    const {sub} = ticket;

    try {
      let validRegistration = await this._validateUserDeviceRegistration(
        deviceId,
        sub
      );
      if (validRegistration) {
        const iot = new AWS.Iot({
          region: process.env.AWS_REGION,
        });
        const _endP = await iot.describeEndpoint().promise();
        const iotdata = new AWS.IotData({
          endpoint: _endP.endpointAddress,
          apiVersion: '2015-05-28',
        });

        // Gets thing shadow
        const _shadow = await iotdata
          .getThingShadow({thingName: deviceId})
          .promise();
        Logger.log(
          Logger.levels.ROBUST,
          JSON.stringify(`current shadow document: ${_shadow.payload}`)
        );

        let payload = _shadow.payload;
        if (typeof _shadow.payload === 'string') {
          payload = JSON.parse(_shadow.payload);
        }

        // Gets thing connectivity status
        const queryString = `thingName:${deviceId}`;
        const params = {
          queryString: queryString,
          indexName: 'AWS_Things',
        };

        let result = await iot.searchIndex(params).promise();
        let things = result.things;

        if (things.length === 0) {
          payload['connected'] = false;
        } else {
          payload['connected'] = things[0].connectivity.connected;
        }

        _shadow.payload = payload;

        //returning sample status temporarily
        return Promise.resolve(_shadow.payload);
      } else {
        Logger.error(
          Logger.levels.INFO,
          `[MissingRegistration] No registration found for device ${deviceId}.`
        );
        return Promise.reject({
          code: 400,
          error: 'MissingRegistration',
          message: `No registration found for device "${deviceId}".`,
        });
      }
    } catch (err) {
      Logger.error(Logger.levels.INFO, err);
      Logger.error(
        Logger.levels.INFO,
        `Error occurred while attempting to retrieve status for device ${deviceId}.`
      );

      // If the thing shadow is not created, return an empty data.
      if (err.code === 'ResourceNotFoundException') {
        return Promise.resolve({});
      }

      return Promise.reject({
        code: 500,
        error: 'StatusRetrieveFailure',
        message: `Error occurred while attempting to retrieve status for device "${deviceId}".`,
      });
    }
  }