Files
classroomio/packages/db/src/utils/seed/users.ts
T

52 lines
1.5 KiB
TypeScript
Raw Normal View History

2025-12-25 05:09:27 +01:00
import { db, user } from '@db/drizzle';
2026-03-09 11:18:22 +01:00
type TUserSeedData = {
id: string;
email: string;
name?: string | null;
emailVerified?: boolean;
profile_fullname?: string | null;
/** Supabase auth: when set, email is confirmed */
email_confirmed_at?: string | null;
confirmed_at?: string | null;
};
const isEmailVerified = (u: TUserSeedData): boolean => u.emailVerified ?? !!(u.email_confirmed_at ?? u.confirmed_at);
const resolveDisplayName = (seedUser: TUserSeedData) => {
if (seedUser.name && seedUser.name.trim().length > 0) {
return seedUser.name;
}
if (seedUser.profile_fullname && seedUser.profile_fullname.trim().length > 0) {
return seedUser.profile_fullname;
}
return seedUser.email.split('@')[0];
};
export async function seedUsers({ usersData }: { usersData: TUserSeedData[] }) {
2025-12-25 05:09:27 +01:00
const existingUsers = await db.select().from(user);
const existingUserIds = existingUsers.map((u) => u.id);
const usersToInsert = usersData
.map((userData) => ({
id: userData.id,
2026-03-09 11:18:22 +01:00
name: resolveDisplayName(userData),
2025-12-25 05:09:27 +01:00
email: userData.email,
2026-03-09 11:18:22 +01:00
emailVerified: isEmailVerified(userData),
2025-12-25 05:09:27 +01:00
image: null,
role: null,
banned: false,
isAnonymous: false
}))
.filter((u) => !existingUserIds.includes(u.id));
if (usersToInsert.length > 0) {
await db.insert(user).values(usersToInsert);
console.log(` ✓ Inserted ${usersToInsert.length} user(s)`);
} else {
console.log(' ✓ Users already exist, skipping');
}
}