All checks were successful
Deploy Dimension47 / deploy (push) Successful in 39s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
109 lines
3.0 KiB
TypeScript
109 lines
3.0 KiB
TypeScript
import 'dotenv/config';
|
|
import * as fs from 'fs';
|
|
import * as path from 'path';
|
|
import { PrismaClient } from '../src/generated/prisma/client.js';
|
|
import { PrismaPg } from '@prisma/adapter-pg';
|
|
|
|
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
|
|
const prisma = new PrismaClient({ adapter });
|
|
|
|
interface EquipmentLevel {
|
|
name: string;
|
|
level: string;
|
|
}
|
|
|
|
async function updateEquipmentLevels() {
|
|
// Read the JSON file from prisma/data
|
|
const dataPath = path.join(__dirname, 'data', 'equipmentlevel.json');
|
|
|
|
if (!fs.existsSync(dataPath)) {
|
|
console.error('❌ equipmentlevel.json not found at:', dataPath);
|
|
process.exit(1);
|
|
}
|
|
|
|
const data: EquipmentLevel[] = JSON.parse(fs.readFileSync(dataPath, 'utf-8'));
|
|
console.log(`📦 Found ${data.length} equipment entries with levels`);
|
|
|
|
let updated = 0;
|
|
let notFound = 0;
|
|
let errors = 0;
|
|
|
|
// Process in batches for better performance
|
|
const batchSize = 100;
|
|
for (let i = 0; i < data.length; i += batchSize) {
|
|
const batch = data.slice(i, i + batchSize);
|
|
|
|
await Promise.all(
|
|
batch.map(async (item) => {
|
|
try {
|
|
// Parse level - handle "-1", "0", "1", etc.
|
|
const level = parseInt(item.level, 10);
|
|
if (isNaN(level)) {
|
|
console.warn(`⚠️ Invalid level for "${item.name}": ${item.level}`);
|
|
errors++;
|
|
return;
|
|
}
|
|
|
|
// Update equipment by name
|
|
const result = await prisma.equipment.updateMany({
|
|
where: { name: item.name },
|
|
data: { level },
|
|
});
|
|
|
|
if (result.count > 0) {
|
|
updated++;
|
|
} else {
|
|
// Try case-insensitive search
|
|
const equipment = await prisma.equipment.findFirst({
|
|
where: {
|
|
name: {
|
|
equals: item.name,
|
|
mode: 'insensitive',
|
|
},
|
|
},
|
|
});
|
|
|
|
if (equipment) {
|
|
await prisma.equipment.update({
|
|
where: { id: equipment.id },
|
|
data: { level },
|
|
});
|
|
updated++;
|
|
} else {
|
|
notFound++;
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.error(`❌ Error updating "${item.name}":`, err);
|
|
errors++;
|
|
}
|
|
})
|
|
);
|
|
|
|
// Progress update
|
|
const progress = Math.min(i + batchSize, data.length);
|
|
process.stdout.write(`\r⏳ Processing: ${progress}/${data.length} (${Math.round(progress / data.length * 100)}%)`);
|
|
}
|
|
|
|
console.log('\n');
|
|
console.log('✅ Update complete!');
|
|
console.log(` Updated: ${updated}`);
|
|
console.log(` Not found in DB: ${notFound}`);
|
|
console.log(` Errors: ${errors}`);
|
|
}
|
|
|
|
async function main() {
|
|
console.log('🔄 Updating equipment levels from equipmentlevel.json...\n');
|
|
|
|
try {
|
|
await updateEquipmentLevels();
|
|
} catch (error) {
|
|
console.error('Fatal error:', error);
|
|
process.exit(1);
|
|
} finally {
|
|
await prisma.$disconnect();
|
|
}
|
|
}
|
|
|
|
main();
|