File size: 1,750 Bytes
a966957 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | import { PrismaClient } from '@repo/database';
import { logger } from '../logger';
import * as dotenv from 'dotenv';
import * as path from 'path';
// Root .env contains the real Neon URL
dotenv.config({ path: path.join(__dirname, '../../../../.env') });
const prisma = new PrismaClient();
async function migrate() {
logger.info('๐ Starting JSON to SQL Migration (Neon)...');
// 1. Migrate Badges (UserProgress.badges -> UserBadge)
const progressWithBadges = await prisma.userProgress.findMany({
where: {
badges: { not: undefined }
}
});
logger.info(`Found ${progressWithBadges.length} UserProgress records with badges JSON.`);
for (const progress of progressWithBadges) {
const badges = progress.badges as any;
if (Array.isArray(badges)) {
for (const badgeName of badges) {
if (typeof badgeName !== 'string') continue;
const existing = await (prisma as any).userBadge.findFirst({
where: {
userProgressId: progress.id,
name: badgeName
}
});
if (!existing) {
await (prisma as any).userBadge.create({
data: {
userProgressId: progress.id,
name: badgeName
}
});
logger.info(`Migrated badge "${badgeName}" for UserProgress ${progress.id}`);
}
}
}
}
/*
// 2. Migrate Team Members (BusinessProfile.teamMembers -> TeamMember)
// DEPRECATED: Field removed from schema
...
*/
logger.info('โ
Neon data migration completed successfully!');
}
migrate()
.catch(err => {
logger.error('โ Migration failed:', err);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});
|