CognxSafeTrack
Claude Sonnet 4.6
refactor(debt): resolve all 10 technical debt items from audit
a966957 Download apps/api/scripts/archive/migrate-json-to-sql.ts from safetrack/edtech: direct link, hf CLI and curl.
- Browser
- Download file 1.75 kB
-
https://huggingface.co/spaces/safetrack/edtech/resolve/main/apps/api/scripts/archive/migrate-json-to-sql.ts
- Command line
-
hf download hf://spaces/safetrack/edtech/apps/api/scripts/archive/migrate-json-to-sql.ts
-
curl -L -o migrate-json-to-sql.ts https://huggingface.co/spaces/safetrack/edtech/resolve/main/apps/api/scripts/archive/migrate-json-to-sql.ts
1.75 kB
| 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(); | |
| }); | |