feat: Add equipment level data and update script
All checks were successful
Deploy Dimension47 / deploy (push) Successful in 34s
All checks were successful
Deploy Dimension47 / deploy (push) Successful in 34s
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
1
server/prisma/data/equipmentlevel.json
Normal file
1
server/prisma/data/equipmentlevel.json
Normal file
File diff suppressed because one or more lines are too long
108
server/prisma/update-equipment-levels.ts
Normal file
108
server/prisma/update-equipment-levels.ts
Normal file
@@ -0,0 +1,108 @@
|
||||
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 project root
|
||||
const dataPath = path.join(__dirname, '..', '..', '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();
|
||||
Reference in New Issue
Block a user