component-dbs-core
Version:
DTO objects shared among device backend
119 lines • 5.77 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DynamodbUtils = void 0;
const common_1 = require("@nestjs/common");
const aws_sdk_1 = __importDefault(require("aws-sdk"));
let DynamodbUtils = class DynamodbUtils {
constructor() {
this.convertTimestampFilter = (filter, type) => {
const jFilter = JSON.parse(filter);
const input = {
TableName: '',
ExpressionAttributeValues: {},
};
const values = aws_sdk_1.default.DynamoDB.Converter.unmarshall(jFilter.expressionValues);
if (':timestampFilter_gt' in jFilter.expressionValues &&
':timestampFilter_lt' in jFilter.expressionValues) {
input.KeyConditionExpression =
'#type BETWEEN :timestampFilter_gt AND :timestampFilter_lt';
}
else if (':timestampFilter_gt' in jFilter.expressionValues) {
input.KeyConditionExpression = '#type > :timestampFilter_gt';
}
else if (':timestampFilter_lt' in jFilter.expressionValues) {
input.KeyConditionExpression = '#type < :timestampFilter_lt';
}
else if (':timestampFilter_between_start' in jFilter.expressionValues &&
':timestampFilter_between_end' in jFilter.expressionValues) {
input.KeyConditionExpression =
'(#type BETWEEN :timestampFilter_between_start AND :timestampFilter_between_end)';
}
const valueEntries = Object.entries(values);
valueEntries.forEach(([key, value]) => {
const time = new Date(value).getTime();
if (typeof input.ExpressionAttributeValues !== 'undefined') {
input.ExpressionAttributeValues[key] = `${type}.${time}`;
}
});
return input;
};
/**
* create a last year time window if the request doesn't have timestamp in the filter
*/
this.createLastYearQuery = () => {
const now = new Date();
const lastYear = new Date();
lastYear.setFullYear(lastYear.getFullYear() - 1);
const tFilter = {
expression: '#timestampFilter < :timestampFilter_lt AND #timestampFilter > :timestampFilter_gt',
expressionNames: { '#timestampFilter': 'timestamp' },
expressionValues: {
':timestampFilter_gt': { S: lastYear.toISOString() },
':timestampFilter_lt': { S: now.toISOString() },
},
};
return JSON.stringify(tFilter);
};
}
convertDbItemToDto(item, dbToDtoNameMapping, attributesToDelete) {
let dto = {};
const mapValue = {};
Object.keys(item)
.filter((key) => !key.startsWith('aws:rep'))
.forEach((key) => {
dto[key] = item[key];
if (key in dbToDtoNameMapping) {
mapValue[dbToDtoNameMapping[key]] = item[key];
}
});
if (typeof attributesToDelete !== 'undefined' &&
attributesToDelete.length > 0) {
attributesToDelete.forEach((key) => {
if (key in dto) {
delete dto[key];
}
});
}
dto = Object.assign(Object.assign({}, dto), mapValue);
return dto;
}
/**
*
* @param params This is the QueryInput parameter that will be populated with the provided arguments
* @param timestampFilter
* @param filter
* @param nextToken
*/
prepareMultiQueryParams(queryInput, type, timestampFilter, nextToken, filter) {
const params = queryInput;
if (nextToken) {
params.ExclusiveStartKey = nextToken;
}
// add timestamp
const timestampExpression = this.convertTimestampFilter(timestampFilter, type);
params.KeyConditionExpression += ` AND ${timestampExpression.KeyConditionExpression}`;
params.ExpressionAttributeValues = Object.assign(Object.assign({}, params.ExpressionAttributeValues), timestampExpression.ExpressionAttributeValues);
params.ExpressionAttributeNames = Object.assign(Object.assign({}, params.ExpressionAttributeNames), timestampExpression.ExpressionAttributeNames);
if (filter) {
const jfilter = JSON.parse(filter);
params.FilterExpression = jfilter.expression;
params.ExpressionAttributeValues = Object.assign(Object.assign({}, params.ExpressionAttributeValues), aws_sdk_1.default.DynamoDB.Converter.unmarshall(jfilter.expressionValues));
params.ExpressionAttributeNames = Object.assign(Object.assign({}, params.ExpressionAttributeNames), jfilter.expressionNames);
}
return params;
}
};
DynamodbUtils = __decorate([
common_1.Injectable()
], DynamodbUtils);
exports.DynamodbUtils = DynamodbUtils;
//# sourceMappingURL=dynamodbUtils.js.map