diff --git a/proto/scripts/migrate-content-to-payload.ts b/proto/scripts/migrate-content-to-payload.ts index 5c2bdab..8c12c3c 100644 --- a/proto/scripts/migrate-content-to-payload.ts +++ b/proto/scripts/migrate-content-to-payload.ts @@ -1,16 +1,18 @@ /** - * MITHOME-87: egyszeri migrációs script — a proto/src/content/pages/*.json + * MITHOME-87/88: egyszeri migrációs script — a proto/src/content/pages/*.json * + common.json tartalmát átemeli a Payload Globals-ekbe (Home, About, - * Services, Contact, Common) a Local API-n keresztül. + * Services, Contact, Common) és a LegalPages collection-be a Local API-n + * keresztül. * * Futtatás (proto/ mappából, futó MongoDB-vel és beállított env-ekkel): * node --env-file=.env.local --import tsx scripts/migrate-content-to-payload.ts * - * Idempotens: updateGlobal-t hív, tetszőlegesen többször futtatható — - * mindig a JSON az aktuális "forrás igazság", felülírja a Payload-ban - * lévő korábbi állapotot. NEM törli/nem érinti a JSON fájlokat. + * Idempotens: updateGlobal-t / slug-alapú upsert-et hív, tetszőlegesen + * többször futtatható — mindig a JSON az aktuális "forrás igazság", felül- + * írja a Payload-ban lévő korábbi állapotot. NEM törli/nem érinti a JSON + * fájlokat. */ -import { getPayload } from 'payload' +import { getPayload, type Payload } from 'payload' import config from '../src/payload.config' import homeJson from '../src/content/pages/home.json' @@ -18,6 +20,8 @@ import aboutJson from '../src/content/pages/about.json' import servicesJson from '../src/content/pages/services.json' import contactJson from '../src/content/pages/contact.json' import commonJson from '../src/content/common.json' +import adatvedelemJson from '../src/content/pages/adatvedelem.json' +import hasznalatiFeltetelekJson from '../src/content/pages/hasznalati-feltetelek.json' /** string[] -> [{ value: string }] — lásd src/globals/fields/stringArray.ts */ function toStringArray(items: readonly string[]): { value: string }[] { @@ -76,6 +80,35 @@ function buildServicesData(json: typeof servicesJson) { } } +type LegalPageJson = { + title: string + lastUpdated: string + sections: { id: string; title: string; content: string }[] +} + +/** Collections have no per-document "known slug" API like Globals do — + * find-by-slug, then update or create. Idempotent across re-runs. */ +async function upsertLegalPage(payload: Payload, slug: string, json: LegalPageJson) { + const existing = await payload.find({ + collection: 'legal-pages', + where: { slug: { equals: slug } }, + limit: 1, + }) + + if (existing.docs.length > 0) { + await payload.update({ + collection: 'legal-pages', + id: existing.docs[0].id, + data: { slug, ...json }, + }) + } else { + await payload.create({ + collection: 'legal-pages', + data: { slug, ...json }, + }) + } +} + async function run() { const payload = await getPayload({ config }) @@ -94,7 +127,13 @@ async function run() { await payload.updateGlobal({ slug: 'common', data: commonJson }) payload.logger.info('Common global migrálva') - payload.logger.info('MITHOME-87 migráció kész.') + await upsertLegalPage(payload, 'adatvedelem', adatvedelemJson) + payload.logger.info('LegalPages/adatvedelem migrálva') + + await upsertLegalPage(payload, 'hasznalati-feltetelek', hasznalatiFeltetelekJson) + payload.logger.info('LegalPages/hasznalati-feltetelek migrálva') + + payload.logger.info('MITHOME-87/88 migráció kész.') process.exit(0) } diff --git a/proto/src/collections/LegalPages.ts b/proto/src/collections/LegalPages.ts new file mode 100644 index 0000000..b3be2c0 --- /dev/null +++ b/proto/src/collections/LegalPages.ts @@ -0,0 +1,50 @@ +import type { CollectionConfig } from 'payload' + +/** + * Mirrors LegalPageContent (proto/src/content/types.ts) — MITHOME-88. + * Slug-alapú collection a jogi oldalaknak (adatvedelem, hasznalati-feltetelek). + * + * WHY `content` textarea és nem lexical richText: a jelenlegi frontend + * (proto/src/app/(frontend)/adatvedelem/page.tsx) a szekció-tartalmat egy + * kézzel írt regex-alapú "•"/"**bold**" -> HTML konverzióval rendereli, nem + * valódi Markdown- vagy richText-parserrel. Ugyanaz a döntés, mint a + * Contact global gdpr.label mezőjénél (MITHOME-87) — a bootstrap szinten + * nem vezetünk be külön szerializációt egy még nem létező render-rétegért. + */ +export const LegalPages: CollectionConfig = { + slug: 'legal-pages', + admin: { + useAsTitle: 'title', + group: 'Oldalak', + }, + fields: [ + { + name: 'slug', + type: 'text', + required: true, + unique: true, + admin: { + description: 'URL-azonosító, pl. "adatvedelem" vagy "hasznalati-feltetelek".', + }, + }, + { name: 'title', type: 'text', required: true }, + { + name: 'lastUpdated', + type: 'text', + required: true, + admin: { + description: 'Szabad szöveg (pl. "2026. augusztus 22."), nem dátum mező — így marad a JSON forrással kompatibilis.', + }, + }, + { + name: 'sections', + type: 'array', + required: true, + fields: [ + { name: 'id', type: 'text', required: true }, + { name: 'title', type: 'text', required: true }, + { name: 'content', type: 'textarea', required: true }, + ], + }, + ], +} diff --git a/proto/src/payload.config.ts b/proto/src/payload.config.ts index f7e89d9..9211fe1 100644 --- a/proto/src/payload.config.ts +++ b/proto/src/payload.config.ts @@ -7,7 +7,8 @@ * * MITHOME-87: Home/About/Services/Contact/Common Globals hozzáadva — ezek * tükrözik a proto/src/content/pages/*.json + common.json struktúráját. - * A LegalPages/Partners/Media collectionök a MITHOME-88..89-ben kerülnek be. + * MITHOME-88: LegalPages collection hozzáadva (adatvedelem, hasznalati- + * feltetelek). A Partners/Media collectionök a MITHOME-89-ben kerülnek be. */ import path from 'path' import { fileURLToPath } from 'url' @@ -17,6 +18,7 @@ import { lexicalEditor } from '@payloadcms/richtext-lexical' import sharp from 'sharp' import { Users } from './collections/Users' +import { LegalPages } from './collections/LegalPages' import { Home } from './globals/Home' import { About } from './globals/About' import { Services } from './globals/Services' @@ -35,7 +37,7 @@ export default buildConfig({ editor: lexicalEditor(), - collections: [Users], + collections: [Users, LegalPages], globals: [Home, About, Services, Contact, Common],