in typescript/src/link/deleteLink.ts [74:134]
export async function handler(event: DynamoDBStreamEvent): Promise<any> {
const ttlEvents = event.Records.filter((dynamoEvent) => {
return (
dynamoEvent.eventName === 'REMOVE' &&
dynamoEvent.userIdentity?.type === 'Service' &&
dynamoEvent.userIdentity?.principalId === 'dynamodb.amazonaws.com' &&
dynamoEvent.dynamodb?.OldImage?.subscriptionId?.S
);
});
const subscriptions = ttlEvents.map((event) => event.dynamodb?.OldImage);
let records = 0;
let rows = 0;
let softOptInSuccessCount = 0;
for (const subscription of subscriptions) {
// We're guaranteed to have a truthy subscription ID here as we filtered
// out Dynamo record events without it above.
const subscriptionId = subscription?.subscriptionId?.S!;
const userLinksIterator = await getUserLinks(subscriptionId);
const userSubscriptions: UserSubscription[] = [];
for await (const userLink of userLinksIterator) {
userSubscriptions.push(userLink);
}
if (userSubscriptions.length === 0) {
console.log(
`No user links to delete for subscriptionId: ${subscriptionId}`,
);
} else {
rows += await deleteUserSubscription(userSubscriptions);
try {
const platform = subscription?.platform?.S;
await disableSoftOptIns(userSubscriptions, subscriptionId, platform);
softOptInSuccessCount++;
} catch (e) {
handleSoftOptInsError(
`Soft opt-in message send failed for subscriptionId: ${subscriptionId}. ${e}`,
);
}
}
records++;
}
console.log(
`Processed ${records} records from dynamo stream to delete ${rows} rows`,
);
console.log(
`Processed ${records} records from dynamo stream to disable soft opt-ins for ${softOptInSuccessCount} users`,
);
return {
recordCount: records,
rowCount: rows,
};
}