async _getEventHistoryPage()

in source/services/api/event/lib/event.js [325:409]


  async _getEventHistoryPage(userId, lastevalkey, deviceId, eventType, length, recursive) {
    // Gets whole events
    let _keyConditionExpression = 'userId = :uid';
    let _expressionAttributeValues = {
      ':uid': userId,
    };
    let _expressionAttributeNames = '';

    /**
     * DynamoDB FilterExpression
     * If there are query parameters, add the value to the filter expression.
     */
    let _filterExpression = '';

    // Filters with device ID
    if (deviceId !== undefined
      && deviceId.trim() !== '') {
      _filterExpression = 'deviceId = :deviceId';
      _expressionAttributeValues[':deviceId'] = deviceId.trim();
    }

    // Filters with event type
    if (eventType !== undefined
      && eventType.trim() !== '') {
      if (_filterExpression === '') {
        _filterExpression = '#type = :eventType';
      } else {
        _filterExpression = `${_filterExpression} and #type = :eventType`;
      }
      _expressionAttributeValues[':eventType'] = eventType.trim();
      _expressionAttributeNames = {
        '#type': 'type'
      };
    }

    let params = this.commonUtils.generateDynamoDBQueryParams(
      process.env.EVENTS_TBL,
      _keyConditionExpression,
      _expressionAttributeValues,
      _expressionAttributeNames,
      _filterExpression,
      'userId-timestamp-index',
      false,
      lastevalkey
    );

    let events = [];
    let docClient = new AWS.DynamoDB.DocumentClient(this.dynamoConfig);
    try {
      let result = await docClient.query(params).promise();
      events = result.Items;
      length += events.length;

      // In case the result is less than 20 in total due to FilterExpression, call the method again with LastEvaluatedKey.
      if (length < 20
        && result.LastEvaluatedKey) {
        lastevalkey = result.LastEvaluatedKey;
        try {
          let data = await this._getEventHistoryPage(userId, lastevalkey, deviceId, eventType, length, true);
          events = [...events, ...data.Items];
          result.LastEvaluatedKey = data.LastEvaluatedKey;
        } catch (err) {
          return Promise.reject(err);
        }
      }

      // If recursive is false, add device name to the result.
      if (!recursive) {
        events = await this._putDeviceName(userId, events);
      }

      result.Items = events;
      result.deviceId = deviceId;
      result.eventType = eventType;

      return Promise.resolve(result);
    } catch (err) {
      Logger.error(Logger.levels.INFO, err);
      return Promise.reject({
        code: 500,
        error: 'EventHistoryQueryFailure',
        message: 'Error occurred while attempting to retrieve event history.',
      });
    }
  }