duenamodb
Version:
Simple DynamoDB client written in TypeScript.
81 lines • 3.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.updateItem = exports.createUpdateOptions = exports.createRemoveExpression = exports.createUpdateExpression = exports.createUpdateItem = void 0;
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
const util_dynamodb_1 = require("@aws-sdk/util-dynamodb");
const client_1 = require("./client");
const expression_1 = require("./expression");
const createUpdateItem = (tablename, partitionKeyName) => {
return async (item, options) => {
const updateOptions = (0, exports.createUpdateOptions)(partitionKeyName, item, options);
if (!updateOptions) {
return item;
}
const updatedItemSuccess = await (0, exports.updateItem)(tablename, {
...options.dynamodbOptions,
...updateOptions,
});
if (!updatedItemSuccess) {
return undefined;
}
const removeKeys = options.removeKeys ?? [];
removeKeys.forEach(key => delete item[key]);
return item;
};
};
exports.createUpdateItem = createUpdateItem;
const createUpdateExpression = (keys) => {
if (keys.length === 0) {
return;
}
const exp = keys.map(key => `${(0, expression_1.expressionAttributeNameKey)(key)} = ${(0, expression_1.expressionAttributeValueKey)(key)}`);
return `SET ${exp.join(' , ')}`;
};
exports.createUpdateExpression = createUpdateExpression;
const createRemoveExpression = (keys) => {
if (keys.length === 0) {
return;
}
const expression = keys.map(expression_1.expressionAttributeNameKey);
return `REMOVE ${expression.join(' , ')}`;
};
exports.createRemoveExpression = createRemoveExpression;
const createUpdateOptions = (partitionKeyName, updatedObject, options) => {
if (!options.removeKeys && !options.updateKeys) {
return;
}
const updateKeys = options.updateKeys ?? [];
const removeKeys = options.removeKeys ?? [];
const ExpressionAttributeNames = (0, expression_1.expressionAttributeNames)([
...updateKeys,
...removeKeys,
]);
const ExpressionAttributeValues = updateKeys.length > 0
? {
ExpressionAttributeValues: (0, util_dynamodb_1.marshall)((0, expression_1.expressionAttributeValues)(updateKeys.reduce((acc, key) => ({ ...acc, [key]: updatedObject[key] }), {}))),
}
: {};
const UpdateUpdateExpression = (0, exports.createUpdateExpression)(updateKeys) ?? '';
const RemoveUpdateExpression = (0, exports.createRemoveExpression)(removeKeys) ?? '';
const key = updatedObject[partitionKeyName];
return {
Key: { [partitionKeyName]: (0, util_dynamodb_1.convertToAttr)(key) },
ExpressionAttributeNames,
UpdateExpression: `${UpdateUpdateExpression} ${RemoveUpdateExpression}`,
...ExpressionAttributeValues,
};
};
exports.createUpdateOptions = createUpdateOptions;
const updateItem = async (tableName, input) => {
const command = new client_dynamodb_1.UpdateItemCommand({
...input,
TableName: tableName,
});
const res = await client_1.DDBClient.instance.send(command);
if (res.$metadata.httpStatusCode !== 200) {
throw res;
}
return true;
};
exports.updateItem = updateItem;
//# sourceMappingURL=update.js.map