diff --git a/README.md b/README.md index f631ecd..f5ca6b3 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,7 @@ const tsynamoClient = new Tsynamo({ ```ts await tsynamoClient - .getItemFrom("UserEvents") + .getItem("UserEvents") .keys({ userId: "123", eventId: 222, diff --git a/src/queryBuilders/deleteItemQueryBuilder.integration.test.ts b/src/queryBuilders/deleteItemQueryBuilder.integration.test.ts index 39a6c8b..916cfa1 100644 --- a/src/queryBuilders/deleteItemQueryBuilder.integration.test.ts +++ b/src/queryBuilders/deleteItemQueryBuilder.integration.test.ts @@ -23,7 +23,7 @@ describe("DeleteItemQueryBuilder", () => { .execute(); const itemBeforeDeletion = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: "1", dataTimestamp: 2 }) .execute(); @@ -41,10 +41,49 @@ describe("DeleteItemQueryBuilder", () => { expect(deleteResponse).toMatchSnapshot(); const itemAfterDeletion = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: "1", dataTimestamp: 2 }) .execute(); expect(itemAfterDeletion).toBeUndefined(); }); + + it("handles a delete query with a ConditionExpression", async () => { + await tsynamoClient + .putItem("myTable") + .item({ + userId: "1", + dataTimestamp: 2, + tags: ["meow"], + someBoolean: true, + }) + .execute(); + + expect( + tsynamoClient + .deleteItem("myTable") + .keys({ + userId: "1", + dataTimestamp: 2, + }) + .conditionExpression("NOT", (qb) => { + return qb.expression("tags", "contains", "meow"); + }) + .execute() + ).rejects.toMatchInlineSnapshot( + `[ConditionalCheckFailedException: The conditional request failed]` + ); + + const res = await tsynamoClient + .deleteItem("myTable") + .keys({ userId: "1", dataTimestamp: 2 }) + .conditionExpression("NOT", (qb) => { + return qb.expression("tags", "contains", "meow"); + }) + .orConditionExpression("someBoolean", "attribute_exists") + .returnValues("ALL_OLD") + .execute(); + + expect(res).toBeDefined(); + }); }); diff --git a/src/queryBuilders/deleteItemQueryBuilder.ts b/src/queryBuilders/deleteItemQueryBuilder.ts index 8060711..01c0a09 100644 --- a/src/queryBuilders/deleteItemQueryBuilder.ts +++ b/src/queryBuilders/deleteItemQueryBuilder.ts @@ -96,7 +96,7 @@ export interface DeleteItemQueryBuilderInterface< } /** - * @todo support ConditionExpression + * @todo support ReturnValuesOnConditionCheckFailure */ export class DeleteItemQueryBuilder< DDB, diff --git a/src/queryBuilders/getItemQueryBuilder.integration.test.ts b/src/queryBuilders/getItemQueryBuilder.integration.test.ts index b64551c..4590c61 100644 --- a/src/queryBuilders/getItemQueryBuilder.integration.test.ts +++ b/src/queryBuilders/getItemQueryBuilder.integration.test.ts @@ -15,7 +15,7 @@ describe("GetItemQueryBuilder", () => { it("handles a basic get item command", async () => { const data = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: TEST_DATA[1].userId, dataTimestamp: TEST_DATA[1].dataTimestamp, @@ -27,7 +27,7 @@ describe("GetItemQueryBuilder", () => { it("handles selecting specific attributes", async () => { const data = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: TEST_DATA[0].userId, dataTimestamp: TEST_DATA[0].dataTimestamp, @@ -43,7 +43,7 @@ describe("GetItemQueryBuilder", () => { it("handles selecting nested attributes", async () => { const data = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: TEST_DATA[4].userId, dataTimestamp: TEST_DATA[4].dataTimestamp, @@ -59,7 +59,7 @@ describe("GetItemQueryBuilder", () => { it("handles selecting deeply nested attributes", async () => { const data = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: TEST_DATA[8].userId, dataTimestamp: TEST_DATA[8].dataTimestamp, @@ -77,7 +77,7 @@ describe("GetItemQueryBuilder", () => { it("handles selecting attributes from arrays", async () => { const data = await tsynamoClient - .getItemFrom("myOtherTable") + .getItem("myOtherTable") .keys({ userId: TEST_DATA[6].userId, stringTimestamp: "123", @@ -92,7 +92,7 @@ describe("GetItemQueryBuilder", () => { }); it("handles selecting attributes from tuples", async () => { const data = await tsynamoClient - .getItemFrom("myOtherTable") + .getItem("myOtherTable") .keys({ userId: TEST_DATA[6].userId, stringTimestamp: "123", @@ -106,7 +106,7 @@ describe("GetItemQueryBuilder", () => { }); it("handles selecting multiple attributes from tuples", async () => { const data = await tsynamoClient - .getItemFrom("myOtherTable") + .getItem("myOtherTable") .keys({ userId: TEST_DATA[6].userId, stringTimestamp: "123", @@ -123,7 +123,7 @@ describe("GetItemQueryBuilder", () => { expect( async () => await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: TEST_DATA[0].userId, dataTimestamp: TEST_DATA[0].dataTimestamp, diff --git a/src/queryBuilders/putItemQueryBuilder.integration.test.ts b/src/queryBuilders/putItemQueryBuilder.integration.test.ts index 43a4d84..cf06626 100644 --- a/src/queryBuilders/putItemQueryBuilder.integration.test.ts +++ b/src/queryBuilders/putItemQueryBuilder.integration.test.ts @@ -21,7 +21,7 @@ describe("PutItemQueryBuilder", () => { it("handles a simple put query", async () => { let result = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: itemToPut.userId, dataTimestamp: itemToPut.dataTimestamp, @@ -33,7 +33,7 @@ describe("PutItemQueryBuilder", () => { await tsynamoClient.putItem("myTable").item(itemToPut).execute(); result = await tsynamoClient - .getItemFrom("myTable") + .getItem("myTable") .keys({ userId: "333", dataTimestamp: 222, diff --git a/src/queryBuilders/putItemQueryBuilder.ts b/src/queryBuilders/putItemQueryBuilder.ts index d826439..b638264 100644 --- a/src/queryBuilders/putItemQueryBuilder.ts +++ b/src/queryBuilders/putItemQueryBuilder.ts @@ -86,9 +86,6 @@ export interface PutItemQueryBuilderInterface { execute(): Promise[] | undefined>; } -/** - * @todo support ConditionExpression - */ export class PutItemQueryBuilder< DDB, Table extends keyof DDB, diff --git a/src/queryCreator.ts b/src/queryCreator.ts index 4244a8f..e105f81 100644 --- a/src/queryCreator.ts +++ b/src/queryCreator.ts @@ -25,7 +25,7 @@ export class QueryCreator { * @see https://docs.aws.amazon.com/cli/latest/reference/dynamodb/get-item.html * @see https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/client/dynamodb/command/GetItemCommand/ */ - getItemFrom( + getItem
( table: Table ): GetQueryBuilder { return new GetQueryBuilder({