Files
rustycms/scripts/post-add-created-from-export.mjs

126 lines
3.5 KiB
JavaScript

#!/usr/bin/env node
/**
* Liest contentful-export.json und trägt sys.createdAt der Post-Einträge
* als Feld "created" in die bestehenden Dateien unter content/de/post/ ein.
*
* Zuordnung: Unser _slug = "post-" + slugify(fields.slug ohne führendes /)
* Aufruf: node scripts/post-add-created-from-export.mjs [Pfad-zum-Export]
* Default: ../www.windwiderstand.de/contentful-export.json
*/
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
const __dirname = path.dirname(fileURLToPath(import.meta.url));
const ROOT = path.resolve(__dirname, "..");
const POST_DIR = path.join(ROOT, "content", "de", "post");
const DEFAULT_EXPORT = path.join(ROOT, "..", "www.windwiderstand.de", "contentful-export.json");
function slugify(value) {
if (value == null || value === "") return "";
return String(value)
.replace(/^\//, "")
.replace(/\//g, "-")
.replace(/[^a-zA-Z0-9_-]+/g, "-")
.replace(/-+/g, "-")
.replace(/^-|-$/g, "") || "untitled";
}
function postSlugFromEntry(entry) {
const f = entry?.fields || {};
const slugRaw = f.slug ?? f.id ?? "";
const base = slugify(slugRaw);
return base ? `post-${base}` : null;
}
function main() {
const exportPath = process.argv[2] || DEFAULT_EXPORT;
if (!fs.existsSync(exportPath)) {
console.error("Export nicht gefunden:", exportPath);
process.exit(1);
}
const data = JSON.parse(fs.readFileSync(exportPath, "utf8"));
const items = data?.byType?.post?.items ?? [];
const slugToCreated = new Map();
for (const entry of items) {
const slug = postSlugFromEntry(entry);
const createdAt = entry?.sys?.createdAt;
if (slug && createdAt) slugToCreated.set(slug, createdAt);
}
console.log("Export: %d Posts mit createdAt, %d eindeutige Slugs", items.length, slugToCreated.size);
if (!fs.existsSync(POST_DIR)) {
console.error("Verzeichnis nicht gefunden:", POST_DIR);
process.exit(1);
}
const files = fs.readdirSync(POST_DIR).filter((f) => f.endsWith(".json5"));
let updated = 0;
let skipped = 0;
for (const file of files) {
const filePath = path.join(POST_DIR, file);
const raw = fs.readFileSync(filePath, "utf8");
let obj;
try {
obj = JSON.parse(raw);
} catch (e) {
console.warn("Überspringe (kein gültiges JSON):", file);
skipped++;
continue;
}
const _slug = obj._slug;
if (!_slug) {
console.warn("Kein _slug in:", file);
skipped++;
continue;
}
const created = slugToCreated.get(_slug);
if (!created) {
skipped++;
continue;
}
if (obj.created === created) {
skipped++;
continue;
}
obj.created = created;
const keys = Object.keys(obj);
const order = [
"_slug",
"slug",
"linkName",
"headline",
"subheadline",
"excerpt",
"created",
"postImage",
"postTag",
"important",
"date",
"content",
"showCommentSection",
"row1JustifyContent",
"row1AlignItems",
"row1Content",
"seoTitle",
"seoDescription",
"seoMetaRobots",
];
const ordered = {};
for (const k of order) {
if (k in obj) ordered[k] = obj[k];
}
for (const k of keys) {
if (!(k in ordered)) ordered[k] = obj[k];
}
fs.writeFileSync(filePath, JSON.stringify(ordered, null, 2) + "\n", "utf8");
console.log(" + created: %s -> %s", _slug, created);
updated++;
}
console.log("Fertig: %d aktualisiert, %d übersprungen.", updated, skipped);
}
main();