zerobyte/app/server/modules/lifecycle/migrations/00007-require-recovery-key-redownload.ts

43 lines
1.3 KiB
TypeScript

import { and, eq, inArray } from "drizzle-orm";
import { logger } from "@zerobyte/core/node";
import { db } from "../../../db/db";
import { account, member, usersTable } from "../../../db/schema";
import { toMessage } from "~/server/utils/errors";
const execute = async () => {
const errors: Array<{ name: string; error: string }> = [];
try {
const affectedUsers = await db
.select({ id: usersTable.id })
.from(usersTable)
.innerJoin(account, and(eq(account.userId, usersTable.id), eq(account.providerId, "credential")))
.innerJoin(member, and(eq(member.userId, usersTable.id), inArray(member.role, ["owner", "admin"])))
.where(eq(usersTable.hasDownloadedResticPassword, true));
const affectedUserIds = [...new Set(affectedUsers.map((user) => user.id))];
if (affectedUserIds.length > 0) {
await db
.update(usersTable)
.set({ hasDownloadedResticPassword: false })
.where(inArray(usersTable.id, affectedUserIds));
}
logger.info(
`Migration 00007-require-recovery-key-redownload marked ${affectedUserIds.length} users for recovery key re-download.`,
);
} catch (error) {
errors.push({
name: "recovery-key-redownload",
error: toMessage(error),
});
}
return { success: errors.length === 0, errors };
};
export const v00007 = {
execute,
id: "00007-require-recovery-key-redownload",
type: "maintenance" as const,
};