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.',
});
}
}