Skip to content

Commit

Permalink
feat: add createMany API to aws-dynamodb
Browse files Browse the repository at this point in the history
  • Loading branch information
vighnesh153 committed Nov 2, 2024
1 parent a07f2d0 commit fdc8037
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 5 deletions.
2 changes: 1 addition & 1 deletion tools-deno/tools-server/deno.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@vighnesh153/tools-server",
"version": "0.1.1",
"version": "0.1.2",
"exports": {
"./aws_dynamodb": "./src/aws_dynamodb/mod.ts"
},
Expand Down
8 changes: 8 additions & 0 deletions tools-deno/tools-server/src/aws_dynamodb/dynamodb_table.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ export type OptionalCreateOne = { error: null } | {
error: { message: "CREATION_FAILED"; errorObject: unknown };
};

export type OptionalCreateMany = { error: null } | {
error: { message: "CREATION_FAILED"; errorObject: unknown };
};

export interface DynamoDBTable<T extends TableMetadata> {
queryOne: <
TKey extends keyof T["fields"],
Expand All @@ -33,6 +37,10 @@ export interface DynamoDBTable<T extends TableMetadata> {
data: { [key in TField]: DynamoTypeMap[T["fields"][key]] };
}): Promise<OptionalCreateOne>;

createMany<TField extends keyof T["fields"]>(params: {
data: { [key in TField]: DynamoTypeMap[T["fields"][key]] }[];
}): Promise<OptionalCreateOne>;

scanOne: <
TKey extends keyof T["fields"],
TFilterBy extends keyof T["fields"],
Expand Down
26 changes: 22 additions & 4 deletions tools-deno/tools-server/src/aws_dynamodb/dynamodb_table_impl.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
import { PutCommand, QueryCommand, ScanCommand } from "@aws-sdk/lib-dynamodb";
import {
BatchWriteCommand,
QueryCommand,
ScanCommand,
} from "@aws-sdk/lib-dynamodb";
import type { DynamoTypeMap, TableMetadata } from "./table_metadata.ts";
import type {
DynamoDBTable,
Expand Down Expand Up @@ -48,14 +52,28 @@ export class DynamoDBTableImpl<T extends TableMetadata>
return this.fetchOne(params, "scan");
}

// deno-lint-ignore require-await
async createOne<TField extends keyof T["fields"]>(params: {
data: { [key in TField]: DynamoTypeMap[T["fields"][key]] };
}): Promise<OptionalCreateOne> {
return this.createMany({
data: [params.data],
});
}

async createMany<TField extends keyof T["fields"]>(params: {
data: { [key in TField]: DynamoTypeMap[T["fields"][key]] }[];
}): Promise<OptionalCreateOne> {
try {
await this.client.send(
new PutCommand({
TableName: this.tableMetadata.tableName,
Item: params.data,
new BatchWriteCommand({
RequestItems: {
[this.tableMetadata.tableName]: params.data.map((item) => ({
PutRequest: {
Item: item,
},
})),
},
}),
);
return { error: null };
Expand Down
10 changes: 10 additions & 0 deletions tools-deno/tools-server/src/aws_dynamodb/fake_dynamodb_table.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type {
DynamoDBTable,
OptionalCreateMany,
OptionalCreateOne,
OptionalGetOne,
} from "./dynamodb_table.ts";
Expand All @@ -24,6 +25,9 @@ export class FakeDynamoDBTable<T extends TableMetadata>
createOneResult: OptionalCreateOne = { error: null };
createOneCalledTimes = 0;

createManyResult: OptionalCreateMany = { error: null };
createManyCalledTimes = 0;

// deno-lint-ignore require-await
async queryOne<TKey extends keyof T["fields"]>(): Promise<
OptionalGetOne<{ [key in TKey]: DynamoTypeMap[T["fields"][key]] }>
Expand All @@ -45,4 +49,10 @@ export class FakeDynamoDBTable<T extends TableMetadata>
this.createOneCalledTimes += 1;
return this.createOneResult;
}

// deno-lint-ignore require-await
async createMany(): Promise<OptionalCreateMany> {
this.createManyCalledTimes += 1;
return this.createManyResult;
}
}
1 change: 1 addition & 0 deletions tools-deno/tools-server/src/aws_dynamodb/table_metadata.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Descriptors: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypeDescriptors
export type DynamoTypeMap = {
string: string;
number: number;
Expand Down

0 comments on commit fdc8037

Please sign in to comment.