import { parse } from "csv-parse/sync"; import fs from "fs/promises"; import { NextResponse } from "next/server"; import path from "path"; import { PrismaClient } from "@prismaclient"; // CSV location const csvFilePath = path.resolve(process.cwd(), "public/artefacts.csv"); const prisma = new PrismaClient(); type CsvRow = { Type: string; Name: string; Description: string; WarehouseArea: string; EarthquakeId: string; Required?: string; ShopPrice?: string; PickedUp?: string; }; function stringToBool(val: string | undefined, defaultValue: boolean = false): boolean { if (!val) return defaultValue; return /^true$/i.test(val.trim()); } export async function POST() { try { // 1. Read file const fileContent = await fs.readFile(csvFilePath, "utf8"); // 2. Parse CSV const records: CsvRow[] = parse(fileContent, { columns: true, skip_empty_lines: true, }); // 3. Map records to artefact input const artefacts = records.map((row) => ({ name: row.Name, description: row.Description, type: row.Type, warehouseArea: row.WarehouseArea, // todo get earthquakeId where code === row.EarthquakeCode earthquakeId: parseInt(row.EarthquakeId, 10), required: stringToBool(row.Required, true), // default TRUE shopPrice: row.ShopPrice && row.ShopPrice !== "" ? parseFloat(row.ShopPrice) : null, pickedUp: stringToBool(row.PickedUp, false), // default FALSE // todo add random selection for creatorId creatorId: null, purchasedById: null, })); // 4. Bulk insert await prisma.artefact.createMany({ data: artefacts, }); return NextResponse.json({ success: true, count: artefacts.length, }); } catch (error: any) { console.error(error); return NextResponse.json({ success: false, error: error.message }, { status: 500 }); } finally { await prisma.$disconnect(); } }