Files
zhuiguang-ai/scripts/cleanup-non-ai.mjs
T

55 lines
2.0 KiB
JavaScript

import { PrismaClient } from "@prisma/client";
import { PrismaMariaDb } from "@prisma/adapter-mariadb";
import "dotenv/config";
const base = process.env.DATABASE_URL || "mysql://localhost:3306/zhuiguang_ai?charset=utf8mb4";
const sep = base.includes("?") ? "&" : "?";
const connectionString = `${base}${sep}connection_limit=20&pool_timeout=30`;
const adapter = new PrismaMariaDb(connectionString);
const prisma = new PrismaClient({ adapter });
const NON_AI_PATTERNS = [
"book", "guide", "tutorial", "awesome", "interview",
"notes", "handbook", "cheatsheet", "cheat-sheet", "roadmap",
"everything you need to know",
"StableDiffusionBook",
"Claude-Code-Everything-You-Need-to-Know",
"Snailclimb/JavaGuide",
"pathwaycom/pathway",
"Shubhamsaboo/awesome-llm-apps",
];
async function main() {
console.log("🧹 清理误入库的非AI技能数据\n");
const skills = await prisma.skill.findMany({
select: { id: true, name: true, sourceUrl: true, status: true },
});
let cleaned = 0;
for (const skill of skills) {
const name = skill.name.toLowerCase();
const isNonAI = NON_AI_PATTERNS.some((p) => name.includes(p.toLowerCase()));
if (isNonAI && skill.status === "draft") {
await prisma.skillReview.deleteMany({ where: { skillId: skill.id } });
await prisma.reviewGenerationLog.deleteMany({ where: { skillId: skill.id } });
await prisma.skill.delete({ where: { id: skill.id } });
console.log(`🗑️ 已删除: ${skill.name}`);
cleaned++;
} else if (isNonAI) {
await prisma.skill.update({
where: { id: skill.id },
data: { status: "draft" },
});
console.log(`📝 已标记为draft: ${skill.name}`);
cleaned++;
}
}
if (cleaned === 0) console.log("✅ 没有需要清理的误入数据");
else console.log(`\n✅ 已清理 ${cleaned} 条数据`);
}
main()
.catch((e) => { console.error("💥 清理失败:", e.message); process.exit(1); })
.finally(() => prisma.$disconnect());