forked from UKSOURCE/ipv6
90 lines
2.4 KiB
TypeScript
90 lines
2.4 KiB
TypeScript
/**
|
|
* Idempotent seed: upserts rows from app/data/admin.json, then optional legacy data/user-submissions.json.
|
|
* Run: npm run db:seed
|
|
* Requires MONGODB_URI in .env or .env.local
|
|
*/
|
|
import { config } from "dotenv";
|
|
import { existsSync, readFileSync } from "fs";
|
|
import path from "path";
|
|
|
|
config({ path: path.join(process.cwd(), ".env.local") });
|
|
config({ path: path.join(process.cwd(), ".env") });
|
|
|
|
import connectDB from "../lib/mongodb";
|
|
import SummitRequest from "../models/SummitRequest";
|
|
import type { AdminRequestRow } from "../types/admin-submission";
|
|
|
|
type AdminJson = { requests: AdminRequestRow[] };
|
|
|
|
function loadJsonRequests(): AdminRequestRow[] {
|
|
const adminPath = path.join(process.cwd(), "app", "data", "admin.json");
|
|
const raw = JSON.parse(readFileSync(adminPath, "utf-8")) as AdminJson;
|
|
return raw.requests ?? [];
|
|
}
|
|
|
|
function loadLegacyFileRequests(): AdminRequestRow[] {
|
|
const p = path.join(process.cwd(), "data", "user-submissions.json");
|
|
if (!existsSync(p)) return [];
|
|
try {
|
|
const raw = JSON.parse(readFileSync(p, "utf-8")) as unknown;
|
|
return Array.isArray(raw) ? (raw as AdminRequestRow[]) : [];
|
|
} catch {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
function rowToInsert(row: AdminRequestRow) {
|
|
return {
|
|
publicId: row.id,
|
|
submittedAt: row.submittedAt,
|
|
displayDate: row.displayDate,
|
|
fullName: row.fullName,
|
|
jobTitle: row.jobTitle ?? "",
|
|
company: row.company ?? "",
|
|
segment: row.segment,
|
|
email: row.email ?? "",
|
|
phone: row.phone ?? "",
|
|
status: row.status,
|
|
notes: row.notes ?? "",
|
|
source: row.source,
|
|
};
|
|
}
|
|
|
|
async function upsertRow(row: AdminRequestRow) {
|
|
return SummitRequest.updateOne(
|
|
{ publicId: row.id },
|
|
{ $setOnInsert: rowToInsert(row) },
|
|
{ upsert: true },
|
|
);
|
|
}
|
|
|
|
async function main() {
|
|
await connectDB();
|
|
|
|
let inserted = 0;
|
|
let skipped = 0;
|
|
|
|
const fromAdmin = loadJsonRequests();
|
|
for (const row of fromAdmin) {
|
|
const res = await upsertRow(row);
|
|
if (res.upsertedCount) inserted++;
|
|
else skipped++;
|
|
}
|
|
|
|
const fromLegacy = loadLegacyFileRequests();
|
|
for (const row of fromLegacy) {
|
|
const res = await upsertRow(row);
|
|
if (res.upsertedCount) inserted++;
|
|
else skipped++;
|
|
}
|
|
|
|
console.log(
|
|
`Seed finished. admin.json: ${fromAdmin.length} rows, legacy file: ${fromLegacy.length} rows. New documents: ${inserted}, already existed: ${skipped}.`,
|
|
);
|
|
}
|
|
|
|
main().catch((err) => {
|
|
console.error(err);
|
|
process.exit(1);
|
|
});
|