export async function handler()

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,
  };
}