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