duenamodb
Version:
Simple, strongly-typed helpers around the AWS SDK DynamoDB client.
92 lines • 3.62 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 object_1 = require("./object");
const createUpdateItem = (options) => {
const { tablename, pkName, skName } = options;
return async (item, options = {}) => {
const { dynamodbOptions = {}, removeKeys = [] } = options;
const updateOptions = createUpdateOptions(pkName, skName, item, options);
if (!updateOptions) {
return item;
}
const updatedItemSuccess = await (0, exports.updateItem)(tablename, {
...dynamodbOptions,
...updateOptions,
});
if (!updatedItemSuccess) {
return undefined;
}
for (const key of removeKeys) {
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;
function createUpdateOptions(pkName, skName, 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];
return acc;
}, {}))),
}
: {};
const UpdateUpdateExpression = (0, exports.createUpdateExpression)(updateKeys) ?? "";
const RemoveUpdateExpression = (0, exports.createRemoveExpression)(removeKeys) ?? "";
const key = updatedObject[pkName];
const sortKey = skName ? updatedObject[skName] : undefined;
return {
Key: {
[pkName]: (0, util_dynamodb_1.convertToAttr)(key),
...(0, object_1.maybeMerge)(skName, (0, object_1.maybeConvertToAttr)(sortKey)),
},
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