export async function migrateItemsAndLastItemSeenByUser()

in shared/database/local/runDatabaseMigration.ts [53:109]


export async function migrateItemsAndLastItemSeenByUser(
  sql: Sql,
  itemTableName: string,
  lastItemSeenByUserTableName: string
) {
  const items = await getDynamoRows(itemTableName);
  const lastItemSeenByUsers = await getDynamoRows(lastItemSeenByUserTableName);
  if ((await sql`SELECT COUNT(*) AS count FROM "Item"`)[0].count > 0) {
    throw new Error("The 'Item' table is not empty. Aborting migration.");
  }
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  //@ts-ignore
  items.sort((a, b) => a.timestamp - b.timestamp);
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
  //@ts-ignore
  // eslint-disable-next-line @typescript-eslint/no-unused-vars -- see https://github.com/eslint/eslint/issues/4880
  for (const { id, timestamp, user, seenBy, ...item } of items) {
    if (!item.userEmail) {
      continue;
    }
    const newStyleID = (
      await sql`
        INSERT INTO "Item" ${sql({
          ...item,
          // eslint-disable-next-line @typescript-eslint/ban-ts-comment
          //@ts-ignore
          timestamp: new Date(timestamp * 1000),
        })}
        ON CONFLICT ("id") DO NOTHING
        RETURNING "id"
    `
    )[0].id;
    console.log(
      "migrated Item with id",
      id,
      "- now has new style id",
      newStyleID
    );
    const matchingLastItemSeenByUsers = lastItemSeenByUsers.filter(
      ({ itemID }) => itemID === id
    );
    console.log(
      await Promise.all(
        matchingLastItemSeenByUsers.map(
          (lastItemSeenByUser) =>
            sql`
        INSERT INTO "LastItemSeenByUser" ${sql({
          ...lastItemSeenByUser,
          seenAt: new Date(lastItemSeenByUser.seenAt * 1000),
          itemID: newStyleID,
        })}
      `
        )
      )
    );
  }
}