91 lines
2.9 KiB
JavaScript
91 lines
2.9 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* Seed Existing JSON Data into Turso
|
|
*
|
|
* Reads the existing plants.json and diseases.json files and inserts them
|
|
* into the Turso database via Drizzle ORM.
|
|
*
|
|
* Usage:
|
|
* cd apps/web && npx tsx scripts/seed-existing.ts
|
|
*
|
|
* Environment: DATABASE_URL and DATABASE_TOKEN from .env.development
|
|
*/
|
|
|
|
import "dotenv/config";
|
|
import { readFileSync } from "fs";
|
|
import { resolve } from "path";
|
|
import { sql } from "drizzle-orm";
|
|
import { getDb, closeDb } from "../src/lib/db/index";
|
|
import { plants, diseases } from "../src/lib/db/schema";
|
|
import type { Plant, Disease } from "../src/lib/types";
|
|
|
|
// ─── Load JSON data ──────────────────────────────────────────────────────────
|
|
|
|
const __dirname = resolve(new URL(".", import.meta.url).pathname);
|
|
|
|
const plantsPath = resolve(__dirname, "../src/data/plants.json");
|
|
const diseasesPath = resolve(__dirname, "../src/data/diseases.json");
|
|
|
|
const rawPlants = JSON.parse(readFileSync(plantsPath, "utf-8")) as Plant[];
|
|
const rawDiseases = JSON.parse(readFileSync(diseasesPath, "utf-8")) as Disease[];
|
|
|
|
// ─── Seed ────────────────────────────────────────────────────────────────────
|
|
|
|
async function main() {
|
|
const db = getDb();
|
|
|
|
console.log(`Seeding ${rawPlants.length} plants...`);
|
|
for (const p of rawPlants) {
|
|
await db
|
|
.insert(plants)
|
|
.values({
|
|
id: p.id,
|
|
commonName: p.commonName,
|
|
scientificName: p.scientificName,
|
|
family: p.family,
|
|
category: p.category,
|
|
careSummary: p.careSummary,
|
|
imageUrl: p.imageUrl,
|
|
})
|
|
.onConflictDoNothing();
|
|
}
|
|
console.log(`✅ ${rawPlants.length} plants inserted`);
|
|
|
|
console.log(`Seeding ${rawDiseases.length} diseases...`);
|
|
for (const d of rawDiseases) {
|
|
await db
|
|
.insert(diseases)
|
|
.values({
|
|
id: d.id,
|
|
plantId: d.plantId,
|
|
name: d.name,
|
|
scientificName: d.scientificName,
|
|
causalAgentType: d.causalAgentType,
|
|
description: d.description,
|
|
symptoms: d.symptoms,
|
|
causes: d.causes,
|
|
treatment: d.treatment,
|
|
prevention: d.prevention,
|
|
lookalikeIds: d.lookalikeDiseaseIds,
|
|
severity: d.severity,
|
|
sourceUrl: "",
|
|
})
|
|
.onConflictDoNothing();
|
|
}
|
|
console.log(`✅ ${rawDiseases.length} diseases inserted`);
|
|
|
|
// Verify
|
|
const [plantCount] = await db.select({ count: sql<number>`COUNT(*)` }).from(plants);
|
|
const [diseaseCount] = await db.select({ count: sql<number>`COUNT(*)` }).from(diseases);
|
|
console.log(`\n📊 Database now has:`);
|
|
console.log(` ${plantCount.count} plants`);
|
|
console.log(` ${diseaseCount.count} diseases`);
|
|
|
|
closeDb();
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error("❌ Seed failed:", err);
|
|
process.exit(1);
|
|
});
|