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');
|
|
|
|
|
}
|
|
|
|
|
}
|