55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
|
|
import { prisma } from "../src/core/database/prisma";
|
||
|
|
import { BaseMobDefinitionSchema } from "../src/game/mobs/mobData";
|
||
|
|
|
||
|
|
async function run() {
|
||
|
|
if (!process.env.XATA_DB) {
|
||
|
|
console.error("XATA_DB not set — aborting");
|
||
|
|
process.exit(1);
|
||
|
|
}
|
||
|
|
console.log("Scanning mobs table for invalid definitions...");
|
||
|
|
const rows: any[] = await (prisma as any).mob.findMany();
|
||
|
|
const invalid: any[] = [];
|
||
|
|
for (const r of rows) {
|
||
|
|
const cfg =
|
||
|
|
r.metadata ??
|
||
|
|
r.stats ??
|
||
|
|
r.drops ??
|
||
|
|
r.config ??
|
||
|
|
r.definition ??
|
||
|
|
r.data ??
|
||
|
|
null;
|
||
|
|
try {
|
||
|
|
BaseMobDefinitionSchema.parse(cfg as any);
|
||
|
|
} catch (e) {
|
||
|
|
invalid.push({ id: r.id, error: (e as any)?.errors ?? e, row: r });
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if (invalid.length === 0) {
|
||
|
|
console.log("No invalid mob definitions found.");
|
||
|
|
process.exit(0);
|
||
|
|
}
|
||
|
|
console.log(
|
||
|
|
`Found ${invalid.length} invalid rows. Backing up and deleting...`
|
||
|
|
);
|
||
|
|
// backup
|
||
|
|
console.log("Backup file: invalid_mobs_backup.json");
|
||
|
|
require("fs").writeFileSync(
|
||
|
|
"invalid_mobs_backup.json",
|
||
|
|
JSON.stringify(invalid, null, 2)
|
||
|
|
);
|
||
|
|
for (const it of invalid) {
|
||
|
|
try {
|
||
|
|
await (prisma as any).mob.delete({ where: { id: it.id } });
|
||
|
|
console.log("Deleted invalid mob id=", it.id);
|
||
|
|
} catch (e) {
|
||
|
|
console.warn("Failed to delete id=", it.id, e);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
console.log("Cleanup complete. Review invalid_mobs_backup.json");
|
||
|
|
}
|
||
|
|
|
||
|
|
run().catch((e) => {
|
||
|
|
console.error(e);
|
||
|
|
process.exit(1);
|
||
|
|
});
|