///
import {docClient} from '../dynamoDb';
export default class Base {
_log: boolean = false;
tableName: string;
key?: Object;
item?: Object;
filterCondition?: dn.Condition;
whenCondition?: dn.Condition;
nameMap() { /* override in parent class */ }
valueMap() { /* override in parent class */ }
constructor(tableName: string) {
this.tableName = tableName;
}
_params() {
let params: dn.Params = {
TableName: this.tableName,
ReturnValues: 'NONE',
ReturnConsumedCapacity: 'NONE',
ReturnItemCollectionMetrics: 'NONE'
};
this._assignKey(params);
this._assignItem(params);
this._assignProjectionExpression(params);
this._assignFilterExpression(params);
this._assignConditionExpression(params);
this._assignUpdateExpression(params);
this._assignExpressionNameMap(params);
this._assignExpressionValueMap(params);
return params;
}
_assignKey(params: dn.Params) {
if (this.key) {
params.Key = this.key;
}
}
_assignItem(params: dn.Params): void{
if (this.item) {
params.Item = this.item;
}
}
_assignProjectionExpression(params: dn.Params): void{
if (this.pluckAttributes) {
params.ProjectionExpression = this.projectionExpression();
}
}
_assignFilterExpression(params: dn.Params): void{
if (this.filterCondition) {
params.FilterExpression = this.filterCondition.exprString();
}
}
_assignConditionExpression(params: dn.Params) {
if (this.whenCondition) {
params.ConditionExpression = this.whenCondition.exprString();
}
}
_assignUpdateExpression(params: dn.Params) {
const updateExpr = this.updateExpression && this.updateExpression();
if (updateExpr && updateExpr !== '') {
params.UpdateExpression = updateExpr;
}
}
_assignExpressionNameMap(params: dn.Params) {
const nameMap: dn.NameMap = this.nameMap();
if (Object.keys(nameMap).length > 0) {
params.ExpressionAttributeNames = nameMap;
}
}
_assignExpressionValueMap(params: dn.Params) {
const valueMap: dn.ValueMap = this.valueMap();
if (Object.keys(valueMap).length > 0) {
params.ExpressionAttributeValues = valueMap;
}
}
run(method: string): Promise {
if (this._log) {
console.log(this._params());
}
return new Promise((resolve, reject) => {
docClient[method](this._params(), (err, data) => {
if (err) {
reject(err);
} else {
resolve(data);
}
});
});
}
log() {
this._log = true;
return this;
}
}