58 lines
2.0 KiB
TypeScript
58 lines
2.0 KiB
TypeScript
|
|
import 'dotenv/config';
|
|
import { getDatabase } from '../src/lib/database';
|
|
import { clerkClient } from '@clerk/nextjs/server';
|
|
|
|
async function syncAllUsers() {
|
|
console.log('Starting full user sync...');
|
|
const db = await getDatabase();
|
|
|
|
// Fetch all users from Clerk
|
|
// Note: pagination might be needed for large user bases, but for prototype this is fine.
|
|
const client = await clerkClient();
|
|
const response = await client.users.getUserList({ limit: 100 });
|
|
const clerkUsers = response.data;
|
|
|
|
console.log(`Found ${clerkUsers.length} users in Clerk.`);
|
|
|
|
for (const clerkUser of clerkUsers) {
|
|
const userId = clerkUser.id;
|
|
const email = clerkUser.emailAddresses[0]?.emailAddress;
|
|
|
|
if (!email) {
|
|
console.warn(`User ${userId} has no email, skipping.`);
|
|
continue;
|
|
}
|
|
|
|
const existingUser = await db.getUserById(userId);
|
|
if (existingUser) {
|
|
console.log(`User ${email} (${userId}) already exists.`);
|
|
// Optional: Update details if needed
|
|
continue;
|
|
}
|
|
|
|
// Check by email to handle ID mismatches (e.g. from seeding)
|
|
const existingByEmail = await db.getUserByEmail(email);
|
|
if (existingByEmail) {
|
|
console.log(`User ${email} found with old ID ${existingByEmail.id}. Migrating to ${userId}...`);
|
|
await db.migrateUserId(existingByEmail.id, userId);
|
|
continue;
|
|
}
|
|
|
|
console.log(`Creating new user ${email} (${userId})...`);
|
|
await db.createUser({
|
|
id: userId,
|
|
email,
|
|
firstName: clerkUser.firstName || '',
|
|
lastName: clerkUser.lastName || '',
|
|
password: '', // Managed by Clerk
|
|
phone: clerkUser.phoneNumbers[0]?.phoneNumber || undefined,
|
|
role: (clerkUser.publicMetadata.role as 'admin' | 'client' | 'superAdmin') || 'client'
|
|
});
|
|
}
|
|
|
|
console.log('Sync complete.');
|
|
}
|
|
|
|
syncAllUsers().catch(console.error);
|