Skip to content
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
*.d.ts
handler/node_modules
handler/*.js
handler.zip
handler/*.d.ts
.idea
node_modules
33 changes: 32 additions & 1 deletion handler/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ export interface CountResolverEvent {
context: any;
dynamo: DynamoFilter | null;
tableName: string;
indexName: string | undefined | null;
}

interface Context {
Expand Down Expand Up @@ -78,14 +79,44 @@ export function makeScanInput(
};
}

export function makeScanInputFromIndex(
event: CountResolverEvent,
startKey: ScanCommandInput["ExclusiveStartKey"]
): ScanCommandInput {
return {
Select: "COUNT",
TableName: event.tableName,
ExclusiveStartKey: startKey,
FilterExpression:
event.dynamo && event.dynamo.expression.length > 0
? event.dynamo?.expression
: undefined,
ExpressionAttributeNames: notEmptyObject(event.dynamo?.expressionNames)
? event.dynamo?.expressionNames
: undefined,
ExpressionAttributeValues: notEmptyObject(event.dynamo?.expressionValues)
? primitivesToString(event.dynamo?.expressionValues)
: undefined,
};
}

export const handler = async (event: CountResolverEvent) => {
debug("Incoming event data from AppSync: %o", event);
const dbClient = new DynamoDB({});

const indexName = event.indexName;

let count = 0;
let startKey = undefined;
while (true) {
const scanArgs = makeScanInput(event, startKey);
let scanArgs!: ScanCommandInput;

if (!indexName) {
scanArgs = makeScanInputFromIndex(event, startKey);
} else {
scanArgs = makeScanInput(event, startKey);
}

debug("Executing the following Dynamo scan: %o", scanArgs);
const res: ScanCommandOutput = await dbClient.scan(scanArgs);
count += res.Count || 0;
Expand Down
Loading