Merge branch 'develop'

This commit is contained in:
Martin Porwoll 2025-12-27 00:28:49 +00:00
commit 7dad1e09ef
30 changed files with 180 additions and 68899 deletions

View file

@ -27,25 +27,24 @@
"prepare": "test -d .git && (ln -sf ../../scripts/detect-secrets.sh .git/hooks/pre-commit 2>/dev/null || true) || true" "prepare": "test -d .git && (ln -sf ../../scripts/detect-secrets.sh .git/hooks/pre-commit 2>/dev/null || true) || true"
}, },
"dependencies": { "dependencies": {
"@payloadcms/db-postgres": "3.68.4", "@payloadcms/db-postgres": "3.69.0",
"@payloadcms/next": "3.68.4", "@payloadcms/next": "3.69.0",
"@payloadcms/plugin-form-builder": "3.68.4", "@payloadcms/plugin-form-builder": "3.69.0",
"@payloadcms/plugin-multi-tenant": "3.68.4", "@payloadcms/plugin-multi-tenant": "3.69.0",
"@payloadcms/plugin-nested-docs": "3.68.4", "@payloadcms/plugin-nested-docs": "3.69.0",
"@payloadcms/plugin-redirects": "3.68.4", "@payloadcms/plugin-redirects": "3.69.0",
"@payloadcms/plugin-seo": "3.68.4", "@payloadcms/plugin-seo": "3.69.0",
"@payloadcms/richtext-lexical": "3.68.4", "@payloadcms/richtext-lexical": "3.69.0",
"@payloadcms/translations": "3.68.4", "@payloadcms/translations": "3.69.0",
"@payloadcms/ui": "3.68.4", "@payloadcms/ui": "3.69.0",
"bullmq": "^5.65.1", "bullmq": "^5.65.1",
"cross-env": "^7.0.3", "cross-env": "^7.0.3",
"dotenv": "16.4.7", "dotenv": "16.4.7",
"graphql": "^16.8.1",
"ioredis": "^5.8.2", "ioredis": "^5.8.2",
"next": "15.5.9", "next": "15.5.9",
"node-cron": "^4.2.1", "node-cron": "^4.2.1",
"nodemailer": "^7.0.11", "nodemailer": "^7.0.11",
"payload": "3.68.4", "payload": "3.69.0",
"payload-oapi": "^0.2.5", "payload-oapi": "^0.2.5",
"react": "19.2.3", "react": "19.2.3",
"react-dom": "19.2.3", "react-dom": "19.2.3",
@ -54,7 +53,6 @@
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.3.3", "@eslint/eslintrc": "^3.3.3",
"@playwright/test": "1.57.0", "@playwright/test": "1.57.0",
"@testing-library/react": "16.3.0",
"@types/node": "^22.10.2", "@types/node": "^22.10.2",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"@types/nodemailer": "^7.0.4", "@types/nodemailer": "^7.0.4",
@ -67,7 +65,6 @@
"eslint-config-next": "15.5.9", "eslint-config-next": "15.5.9",
"jsdom": "26.1.0", "jsdom": "26.1.0",
"playwright": "1.57.0", "playwright": "1.57.0",
"playwright-core": "1.57.0",
"prettier": "^3.7.4", "prettier": "^3.7.4",
"typescript": "5.9.3", "typescript": "5.9.3",
"vite-tsconfig-paths": "6.0.0", "vite-tsconfig-paths": "6.0.0",

View file

@ -9,35 +9,35 @@ importers:
.: .:
dependencies: dependencies:
'@payloadcms/db-postgres': '@payloadcms/db-postgres':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3)) version: 3.69.0(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))
'@payloadcms/next': '@payloadcms/next':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) version: 3.69.0(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
'@payloadcms/plugin-form-builder': '@payloadcms/plugin-form-builder':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) version: 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
'@payloadcms/plugin-multi-tenant': '@payloadcms/plugin-multi-tenant':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(@payloadcms/ui@3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3)) version: 3.69.0(@payloadcms/ui@3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))
'@payloadcms/plugin-nested-docs': '@payloadcms/plugin-nested-docs':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3)) version: 3.69.0(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))
'@payloadcms/plugin-redirects': '@payloadcms/plugin-redirects':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3)) version: 3.69.0(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))
'@payloadcms/plugin-seo': '@payloadcms/plugin-seo':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) version: 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
'@payloadcms/richtext-lexical': '@payloadcms/richtext-lexical':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(@faceless-ui/modal@3.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@payloadcms/next@3.68.4(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)(yjs@13.6.27) version: 3.69.0(@faceless-ui/modal@3.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@payloadcms/next@3.69.0(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)(yjs@13.6.27)
'@payloadcms/translations': '@payloadcms/translations':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4 version: 3.69.0
'@payloadcms/ui': '@payloadcms/ui':
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) version: 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
bullmq: bullmq:
specifier: ^5.65.1 specifier: ^5.65.1
version: 5.65.1 version: 5.65.1
@ -47,9 +47,6 @@ importers:
dotenv: dotenv:
specifier: 16.4.7 specifier: 16.4.7
version: 16.4.7 version: 16.4.7
graphql:
specifier: ^16.8.1
version: 16.12.0
ioredis: ioredis:
specifier: ^5.8.2 specifier: ^5.8.2
version: 5.8.2 version: 5.8.2
@ -63,11 +60,11 @@ importers:
specifier: ^7.0.11 specifier: ^7.0.11
version: 7.0.11 version: 7.0.11
payload: payload:
specifier: 3.68.4 specifier: 3.69.0
version: 3.68.4(graphql@16.12.0)(typescript@5.9.3) version: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
payload-oapi: payload-oapi:
specifier: ^0.2.5 specifier: ^0.2.5
version: 0.2.5(@types/json-schema@7.0.15)(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3)) version: 0.2.5(@types/json-schema@7.0.15)(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))
react: react:
specifier: 19.2.3 specifier: 19.2.3
version: 19.2.3 version: 19.2.3
@ -84,9 +81,6 @@ importers:
'@playwright/test': '@playwright/test':
specifier: 1.57.0 specifier: 1.57.0
version: 1.57.0 version: 1.57.0
'@testing-library/react':
specifier: 16.3.0
version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@types/node': '@types/node':
specifier: ^22.10.2 specifier: ^22.10.2
version: 22.19.1 version: 22.19.1
@ -123,9 +117,6 @@ importers:
playwright: playwright:
specifier: 1.57.0 specifier: 1.57.0
version: 1.57.0 version: 1.57.0
playwright-core:
specifier: 1.57.0
version: 1.57.0
prettier: prettier:
specifier: ^3.7.4 specifier: ^3.7.4
version: 3.7.4 version: 3.7.4
@ -419,6 +410,12 @@ packages:
react: '>=16.8.0' react: '>=16.8.0'
react-dom: '>=16.8.0' react-dom: '>=16.8.0'
'@dnd-kit/modifiers@9.0.0':
resolution: {integrity: sha512-ybiLc66qRGuZoC20wdSSG6pDXFikui/dCNGthxv4Ndy8ylErY0N3KVxY2bgo7AWwIbxDmXDg3ylAFmnrjcbVvw==}
peerDependencies:
'@dnd-kit/core': ^6.3.0
react: '>=16.8.0'
'@dnd-kit/sortable@7.0.2': '@dnd-kit/sortable@7.0.2':
resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==} resolution: {integrity: sha512-wDkBHHf9iCi1veM834Gbk1429bd4lHX4RpAwT0y2cHLf246GAvU2sVw/oxWNpPKQNQRQaeGXhAVgrOl1IT+iyA==}
peerDependencies: peerDependencies:
@ -1225,81 +1222,81 @@ packages:
peerDependencies: peerDependencies:
openapi-types: '*' openapi-types: '*'
'@payloadcms/db-postgres@3.68.4': '@payloadcms/db-postgres@3.69.0':
resolution: {integrity: sha512-MZxocw87eC9Z7IwXPkzlJW4DPexx8ohVYwtTyHyIceoLydH1FcSEPOcmbHLEUo+nT5L7T/D3DyGN3ogkkaUchw==} resolution: {integrity: sha512-Fz/hjP0z88zrsYz1UzaqnoM3L+yHymH+yWUIJnIf7jMCtnfi/ws5XBX/0DHILvxoVsCNc5XSx3fTjcBCJoYylw==}
peerDependencies: peerDependencies:
payload: 3.68.4 payload: 3.69.0
'@payloadcms/drizzle@3.68.4': '@payloadcms/drizzle@3.69.0':
resolution: {integrity: sha512-i3zAnHTAOW5Qnw61IbBCGCgPkNokOuTSrqeQQomQj1gS/FfJ/Xx9DGgPZAH7QpKZXes+R47/XYlSr6cYxvAxbw==} resolution: {integrity: sha512-Fsvij6ruoN7S7q1OfGYs/SSLy3s7wFd4E/efXHmRLjw53xtlRiGXIejmhiUEdNK4d5RHi0yjIblQsbTKnBvirw==}
peerDependencies: peerDependencies:
payload: 3.68.4 payload: 3.69.0
'@payloadcms/graphql@3.68.4': '@payloadcms/graphql@3.69.0':
resolution: {integrity: sha512-EE4zWGMqCxYHd/J8nSAhtsFPndNRzYiXlLlx3zqRgi5Hhq96z4aYwcxHnk//syQKn3tKBCVjDvP41t0mTSBUaw==} resolution: {integrity: sha512-VRFacg4EneV7U9jqerQfNVL/O788WlZbdnMGSwds0mVwC5qPW3sktZhHxJCAksvAFJ+XXtx4GCMv/YK8DgEfxw==}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
graphql: ^16.8.1 graphql: ^16.8.1
payload: 3.68.4 payload: 3.69.0
'@payloadcms/next@3.68.4': '@payloadcms/next@3.69.0':
resolution: {integrity: sha512-UXBR7iVrC+ilj6UZ8M/+CF655Y5gZSokVFCz4sNrpIJX84K5MUaTGCuz1WTCoTj3Xbap5OlZVlGEZaO63cqVuw==} resolution: {integrity: sha512-rkj/wvTDcbOkb8+v4jkZVdoJm2tvPUQL62CWoGnysy/ST+ZUwMr/70veLB7Ztr3uj6HKi6dU+31H+gG94UaMZg==}
engines: {node: ^18.20.2 || >=20.9.0} engines: {node: ^18.20.2 || >=20.9.0}
peerDependencies: peerDependencies:
graphql: ^16.8.1 graphql: ^16.8.1
next: ^15.4.10 next: ^15.4.10
payload: 3.68.4 payload: 3.69.0
'@payloadcms/plugin-form-builder@3.68.4': '@payloadcms/plugin-form-builder@3.69.0':
resolution: {integrity: sha512-Xc+MsB4kmneEe/KdIwZj4Ev1p3kiIiWL5FxosYtPY+4OYW8gCeHTRNf8kdDVBqaX24pwsyjHdz7x9BM+2rVMCg==} resolution: {integrity: sha512-4ezzO6+pnQBqTx9TPr3Aer3Tnnpkv8+wB2hZqgAohdByTaejf7+N0JIIwTiZSS+FPf8itrjkEPjJ6e/h2RXfdQ==}
peerDependencies: peerDependencies:
payload: 3.68.4 payload: 3.69.0
react: ^19.0.1 || ^19.1.2 || ^19.2.1 react: ^19.0.1 || ^19.1.2 || ^19.2.1
react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1
'@payloadcms/plugin-multi-tenant@3.68.4': '@payloadcms/plugin-multi-tenant@3.69.0':
resolution: {integrity: sha512-4EuNmf6Sql1mkv8mS1yWSUKjt3uAWWuF+aoBok2AOcy09UPwt0AspL/GHsMjBCkYNmojwsnjSGRtfEeYLg+jIg==} resolution: {integrity: sha512-0uoOmmfMfr9xOMn94Xh1osmSeaYaLzmkUbtx2uNxT+IZqSX4xi9YMq8Qrag5j738294H6MlDYW3LjHFmYDSFXw==}
peerDependencies: peerDependencies:
'@payloadcms/ui': 3.68.4 '@payloadcms/ui': 3.69.0
payload: 3.68.4 payload: 3.69.0
'@payloadcms/plugin-nested-docs@3.68.4': '@payloadcms/plugin-nested-docs@3.69.0':
resolution: {integrity: sha512-QEZ1mvhT2G5gCIoREaMIxoMKZuNR9y6iEUeQxc8w7OIvV8DuxZkgBBNlh3k46qMSqY6rrcQAHVL2Q2M71uIsug==} resolution: {integrity: sha512-Ch6OBcS+hUen9Q6cMxpI7aOueJdwv/bFDZOh/0DyoY4jLcCjIG2n+ZNslZ6gzA4CtKJAGziif4iyPD5iAaRFPA==}
peerDependencies: peerDependencies:
payload: 3.68.4 payload: 3.69.0
'@payloadcms/plugin-redirects@3.68.4': '@payloadcms/plugin-redirects@3.69.0':
resolution: {integrity: sha512-rnZFbYwRll7+IpUIeQc1nDhzFk7M/ksTWyO9YU2sQV3F/SLZVZ8AN15vOypoh0byRAkXDfepq7ADcVGWkRolaw==} resolution: {integrity: sha512-cBTyVCatT+ejDGsdTz04mLiolM54UHlRqBQ8nGoSmeMDSP987pqR84FeLiStj+IKFW5GMHFDY9ueD5yN30BSIQ==}
peerDependencies: peerDependencies:
payload: 3.68.4 payload: 3.69.0
'@payloadcms/plugin-seo@3.68.4': '@payloadcms/plugin-seo@3.69.0':
resolution: {integrity: sha512-VsJarN426yQtCoqHoHGnsKWFQIx2CtOlG2ZkikbtxMjD1JKb/e3ryxvH9bUMMI0ekfzPyJg54LW1iihP2UumRw==} resolution: {integrity: sha512-jbcbXx4PdV/psZZsOiVqfbDb15jGnCy/LuVBlO/DsMhe2/1DiMO2PfWNGBhFIAn94mB9UjnNoi0P+JBtuEYNhw==}
peerDependencies: peerDependencies:
payload: 3.68.4 payload: 3.69.0
react: ^19.0.1 || ^19.1.2 || ^19.2.1 react: ^19.0.1 || ^19.1.2 || ^19.2.1
react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1
'@payloadcms/richtext-lexical@3.68.4': '@payloadcms/richtext-lexical@3.69.0':
resolution: {integrity: sha512-HA9F1QrIUeWN/dCkhwF5pSXJDdFVbSr0N8iUkJk/WpqCTJiTTeIGR/BsQXkQ9V1AHSQAOv8kNWF8DzsOp1XFrw==} resolution: {integrity: sha512-NwyTN3GY1FOFTP0V3gm+M0FxK4GDWL2R0p2DrirIi7nZOH2rw6P+FfvMvzobT/nxUsQYntBnjoGDWhqN+uq3lg==}
engines: {node: ^18.20.2 || >=20.9.0} engines: {node: ^18.20.2 || >=20.9.0}
peerDependencies: peerDependencies:
'@faceless-ui/modal': 3.0.0 '@faceless-ui/modal': 3.0.0
'@faceless-ui/scroll-info': 2.0.0 '@faceless-ui/scroll-info': 2.0.0
'@payloadcms/next': 3.68.4 '@payloadcms/next': 3.69.0
payload: 3.68.4 payload: 3.69.0
react: ^19.0.1 || ^19.1.2 || ^19.2.1 react: ^19.0.1 || ^19.1.2 || ^19.2.1
react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1
'@payloadcms/translations@3.68.4': '@payloadcms/translations@3.69.0':
resolution: {integrity: sha512-1LbClkAlvWKWVD8a8RuNYS109Ga/RwSA5X5nohmBNNAp10E4auM2PhQXcSHh5gvVDUuA1puVJUL9cEVwY0E0gg==} resolution: {integrity: sha512-/27JphlweOy0FhkH9H5dRHpi6bHjqdKFkLciURsxyEXJFLsd9w/07e6clD48Lvr8SPdCmr09KLJKdXTjjT1ypQ==}
'@payloadcms/ui@3.68.4': '@payloadcms/ui@3.69.0':
resolution: {integrity: sha512-RLbCFsKzmAwV5QNb+RxQU1CI2XaGYLh6KeLqOzGfkC/bsdZoTl4FKX702e6DLFRfmYLG8Jf7Vkdk4E4ZMeQsew==} resolution: {integrity: sha512-R/CFV9IF3LTHwBm+gFESpSYYqLejJgRijJarGFot5I1Kxa18mwNp+xUYHVUcJgGZ1xQ1iYzGuElEJwy1cJhMxg==}
engines: {node: ^18.20.2 || >=20.9.0} engines: {node: ^18.20.2 || >=20.9.0}
peerDependencies: peerDependencies:
next: ^15.2.8 || ^15.3.8 || ^15.4.10 || ^15.5.9 next: ^15.2.8 || ^15.3.8 || ^15.4.10 || ^15.5.9
payload: 3.68.4 payload: 3.69.0
react: ^19.0.1 || ^19.1.2 || ^19.2.1 react: ^19.0.1 || ^19.1.2 || ^19.2.1
react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1 react-dom: ^19.0.1 || ^19.1.2 || ^19.2.1
@ -1608,25 +1605,6 @@ packages:
'@swc/helpers@0.5.15': '@swc/helpers@0.5.15':
resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==}
'@testing-library/dom@10.4.1':
resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==}
engines: {node: '>=18'}
'@testing-library/react@16.3.0':
resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==}
engines: {node: '>=18'}
peerDependencies:
'@testing-library/dom': ^10.0.0
'@types/react': ^18.0.0 || ^19.0.0
'@types/react-dom': ^18.0.0 || ^19.0.0
react: ^18.0.0 || ^19.0.0
react-dom: ^18.0.0 || ^19.0.0
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
'@tokenizer/token@0.3.0': '@tokenizer/token@0.3.0':
resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==} resolution: {integrity: sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==}
@ -1636,9 +1614,6 @@ packages:
'@types/acorn@4.0.6': '@types/acorn@4.0.6':
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
'@types/aria-query@5.0.4':
resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
'@types/babel__core@7.20.5': '@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@ -1950,10 +1925,6 @@ packages:
ajv@8.17.1: ajv@8.17.1:
resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==}
ansi-regex@5.0.1:
resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
engines: {node: '>=8'}
ansi-regex@6.2.2: ansi-regex@6.2.2:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -1962,10 +1933,6 @@ packages:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'} engines: {node: '>=8'}
ansi-styles@5.2.0:
resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
engines: {node: '>=10'}
ansi-styles@6.2.3: ansi-styles@6.2.3:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'} engines: {node: '>=12'}
@ -1977,9 +1944,6 @@ packages:
argparse@2.0.1: argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
aria-query@5.3.2: aria-query@5.3.2:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'} engines: {node: '>= 0.4'}
@ -2313,9 +2277,6 @@ packages:
resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
dom-accessibility-api@0.5.16:
resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
dom-helpers@5.2.1: dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
@ -3158,8 +3119,8 @@ packages:
lexical@0.35.0: lexical@0.35.0:
resolution: {integrity: sha512-3VuV8xXhh5xJA6tzvfDvE0YBCMkIZUmxtRilJQDDdCgJCc+eut6qAv2qbN+pbqvarqcQqPN1UF+8YvsjmyOZpw==} resolution: {integrity: sha512-3VuV8xXhh5xJA6tzvfDvE0YBCMkIZUmxtRilJQDDdCgJCc+eut6qAv2qbN+pbqvarqcQqPN1UF+8YvsjmyOZpw==}
lib0@0.2.114: lib0@0.2.116:
resolution: {integrity: sha512-gcxmNFzA4hv8UYi8j43uPlQ7CGcyMJ2KQb5kZASw6SnAKAf10hK12i2fjrS3Cl/ugZa5Ui6WwIu1/6MIXiHttQ==} resolution: {integrity: sha512-4zsosjzmt33rx5XjmFVYUAeLNh+BTeDTiwGdLt4muxiir2btsc60Nal0EvkvDRizg+pnlK1q+BtYi7M+d4eStw==}
engines: {node: '>=16'} engines: {node: '>=16'}
hasBin: true hasBin: true
@ -3199,10 +3160,6 @@ packages:
resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==} resolution: {integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==}
engines: {node: '>=12'} engines: {node: '>=12'}
lz-string@1.5.0:
resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
hasBin: true
magic-string@0.30.21: magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
@ -3516,8 +3473,8 @@ packages:
peerDependencies: peerDependencies:
payload: ^3.0.0 payload: ^3.0.0
payload@3.68.4: payload@3.69.0:
resolution: {integrity: sha512-4iqHkyCm6oYxGVG399Qt2BhE96/304rok47GIPIhbuaXz2RDdN+lXo8yroWb0TOcr+bXdp2ga7IHgviIRgIpvw==} resolution: {integrity: sha512-LiIybFUjAYYVYN2kSaieqDyQDglGeYuyPtP0xqkvIF5EOAGdNMMLSPmGHquV1kPeeUvzgv/CVoNIMEOuRF9wmg==}
engines: {node: ^18.20.2 || >=20.9.0} engines: {node: ^18.20.2 || >=20.9.0}
hasBin: true hasBin: true
peerDependencies: peerDependencies:
@ -3628,8 +3585,8 @@ packages:
resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==} resolution: {integrity: sha512-nAUSGfSDGOaOAEGwqsRY27GPOea7CNipJPOA7lPbdEpx5Kg3qzdP0AaWC5MlhTWV9s4hFX39nomVZ+C4tnGOJQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
postgres-bytea@1.0.0: postgres-bytea@1.0.1:
resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
postgres-bytea@3.0.0: postgres-bytea@3.0.0:
@ -3664,10 +3621,6 @@ packages:
engines: {node: '>=14'} engines: {node: '>=14'}
hasBin: true hasBin: true
pretty-format@27.5.1:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
prismjs@1.30.0: prismjs@1.30.0:
resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==} resolution: {integrity: sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -3699,6 +3652,10 @@ packages:
quick-format-unescaped@4.0.4: quick-format-unescaped@4.0.4:
resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
range-parser@1.2.1:
resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
engines: {node: '>= 0.6'}
react-datepicker@7.6.0: react-datepicker@7.6.0:
resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==} resolution: {integrity: sha512-9cQH6Z/qa4LrGhzdc3XoHbhrxNcMi9MKjZmYgF/1MNNaJwvdSjv3Xd+jjvrEEbKEf71ZgCA3n7fQbdwd70qCRw==}
peerDependencies: peerDependencies:
@ -3729,9 +3686,6 @@ packages:
react-is@16.13.1: react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
react-refresh@0.17.0: react-refresh@0.17.0:
resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -5011,6 +4965,13 @@ snapshots:
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
tslib: 2.8.1 tslib: 2.8.1
'@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)':
dependencies:
'@dnd-kit/core': 6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@dnd-kit/utilities': 3.2.2(react@19.2.3)
react: 19.2.3
tslib: 2.8.1
'@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)': '@dnd-kit/sortable@7.0.2(@dnd-kit/core@6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)':
dependencies: dependencies:
'@dnd-kit/core': 6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@dnd-kit/core': 6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -5717,14 +5678,14 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- '@types/json-schema' - '@types/json-schema'
'@payloadcms/db-postgres@3.68.4(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))': '@payloadcms/db-postgres@3.69.0(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))':
dependencies: dependencies:
'@payloadcms/drizzle': 3.68.4(@types/pg@8.10.2)(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(pg@8.16.3) '@payloadcms/drizzle': 3.69.0(@types/pg@8.10.2)(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(pg@8.16.3)
'@types/pg': 8.10.2 '@types/pg': 8.10.2
console-table-printer: 2.12.1 console-table-printer: 2.12.1
drizzle-kit: 0.31.7 drizzle-kit: 0.31.7
drizzle-orm: 0.44.7(@types/pg@8.10.2)(pg@8.16.3) drizzle-orm: 0.44.7(@types/pg@8.10.2)(pg@8.16.3)
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
pg: 8.16.3 pg: 8.16.3
prompts: 2.4.2 prompts: 2.4.2
to-snake-case: 1.0.0 to-snake-case: 1.0.0
@ -5760,12 +5721,12 @@ snapshots:
- sqlite3 - sqlite3
- supports-color - supports-color
'@payloadcms/drizzle@3.68.4(@types/pg@8.10.2)(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(pg@8.16.3)': '@payloadcms/drizzle@3.69.0(@types/pg@8.10.2)(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(pg@8.16.3)':
dependencies: dependencies:
console-table-printer: 2.12.1 console-table-printer: 2.12.1
dequal: 2.0.3 dequal: 2.0.3
drizzle-orm: 0.44.7(@types/pg@8.10.2)(pg@8.16.3) drizzle-orm: 0.44.7(@types/pg@8.10.2)(pg@8.16.3)
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
prompts: 2.4.2 prompts: 2.4.2
to-snake-case: 1.0.0 to-snake-case: 1.0.0
uuid: 9.0.0 uuid: 9.0.0
@ -5800,23 +5761,25 @@ snapshots:
- sql.js - sql.js
- sqlite3 - sqlite3
'@payloadcms/graphql@3.68.4(graphql@16.12.0)(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(typescript@5.9.3)': '@payloadcms/graphql@3.69.0(graphql@16.12.0)(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(typescript@5.9.3)':
dependencies: dependencies:
graphql: 16.12.0 graphql: 16.12.0
graphql-scalars: 1.22.2(graphql@16.12.0) graphql-scalars: 1.22.2(graphql@16.12.0)
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
pluralize: 8.0.0 pluralize: 8.0.0
ts-essentials: 10.0.3(typescript@5.9.3) ts-essentials: 10.0.3(typescript@5.9.3)
tsx: 4.20.6 tsx: 4.20.6
transitivePeerDependencies: transitivePeerDependencies:
- typescript - typescript
'@payloadcms/next@3.68.4(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': '@payloadcms/next@3.69.0(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)':
dependencies: dependencies:
'@dnd-kit/core': 6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@dnd-kit/core': 6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@payloadcms/graphql': 3.68.4(graphql@16.12.0)(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(typescript@5.9.3) '@dnd-kit/modifiers': 9.0.0(@dnd-kit/core@6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)
'@payloadcms/translations': 3.68.4 '@dnd-kit/sortable': 7.0.2(@dnd-kit/core@6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(react@19.2.3)
'@payloadcms/ui': 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@payloadcms/graphql': 3.69.0(graphql@16.12.0)(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(typescript@5.9.3)
'@payloadcms/translations': 3.69.0
'@payloadcms/ui': 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
busboy: 1.6.0 busboy: 1.6.0
dequal: 2.0.3 dequal: 2.0.3
file-type: 19.3.0 file-type: 19.3.0
@ -5826,7 +5789,7 @@ snapshots:
http-status: 2.1.0 http-status: 2.1.0
next: 15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4) next: 15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4)
path-to-regexp: 6.3.0 path-to-regexp: 6.3.0
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
qs-esm: 7.0.2 qs-esm: 7.0.2
sass: 1.77.4 sass: 1.77.4
uuid: 10.0.0 uuid: 10.0.0
@ -5838,11 +5801,11 @@ snapshots:
- supports-color - supports-color
- typescript - typescript
'@payloadcms/plugin-form-builder@3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': '@payloadcms/plugin-form-builder@3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)':
dependencies: dependencies:
'@payloadcms/ui': 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@payloadcms/ui': 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
escape-html: 1.0.3 escape-html: 1.0.3
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
react: 19.2.3 react: 19.2.3
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
transitivePeerDependencies: transitivePeerDependencies:
@ -5852,25 +5815,25 @@ snapshots:
- supports-color - supports-color
- typescript - typescript
'@payloadcms/plugin-multi-tenant@3.68.4(@payloadcms/ui@3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))': '@payloadcms/plugin-multi-tenant@3.69.0(@payloadcms/ui@3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))':
dependencies: dependencies:
'@payloadcms/ui': 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@payloadcms/ui': 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
'@payloadcms/plugin-nested-docs@3.68.4(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))': '@payloadcms/plugin-nested-docs@3.69.0(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))':
dependencies: dependencies:
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
'@payloadcms/plugin-redirects@3.68.4(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))': '@payloadcms/plugin-redirects@3.69.0(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))':
dependencies: dependencies:
'@payloadcms/translations': 3.68.4 '@payloadcms/translations': 3.69.0
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
'@payloadcms/plugin-seo@3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': '@payloadcms/plugin-seo@3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)':
dependencies: dependencies:
'@payloadcms/translations': 3.68.4 '@payloadcms/translations': 3.69.0
'@payloadcms/ui': 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@payloadcms/ui': 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
react: 19.2.3 react: 19.2.3
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
transitivePeerDependencies: transitivePeerDependencies:
@ -5880,7 +5843,7 @@ snapshots:
- supports-color - supports-color
- typescript - typescript
'@payloadcms/richtext-lexical@3.68.4(@faceless-ui/modal@3.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@payloadcms/next@3.68.4(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)(yjs@13.6.27)': '@payloadcms/richtext-lexical@3.69.0(@faceless-ui/modal@3.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@faceless-ui/scroll-info@2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3))(@payloadcms/next@3.69.0(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3))(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)(yjs@13.6.27)':
dependencies: dependencies:
'@faceless-ui/modal': 3.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@faceless-ui/modal': 3.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@faceless-ui/scroll-info': 2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@faceless-ui/scroll-info': 2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -5895,9 +5858,9 @@ snapshots:
'@lexical/selection': 0.35.0 '@lexical/selection': 0.35.0
'@lexical/table': 0.35.0 '@lexical/table': 0.35.0
'@lexical/utils': 0.35.0 '@lexical/utils': 0.35.0
'@payloadcms/next': 3.68.4(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@payloadcms/next': 3.69.0(@types/react@19.2.7)(graphql@16.12.0)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
'@payloadcms/translations': 3.68.4 '@payloadcms/translations': 3.69.0
'@payloadcms/ui': 3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3) '@payloadcms/ui': 3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)
'@types/uuid': 10.0.0 '@types/uuid': 10.0.0
acorn: 8.12.1 acorn: 8.12.1
bson-objectid: 2.0.4 bson-objectid: 2.0.4
@ -5909,7 +5872,7 @@ snapshots:
mdast-util-from-markdown: 2.0.2 mdast-util-from-markdown: 2.0.2
mdast-util-mdx-jsx: 3.1.3 mdast-util-mdx-jsx: 3.1.3
micromark-extension-mdx-jsx: 3.0.1 micromark-extension-mdx-jsx: 3.0.1
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
qs-esm: 7.0.2 qs-esm: 7.0.2
react: 19.2.3 react: 19.2.3
react-dom: 19.2.3(react@19.2.3) react-dom: 19.2.3(react@19.2.3)
@ -5924,11 +5887,11 @@ snapshots:
- typescript - typescript
- yjs - yjs
'@payloadcms/translations@3.68.4': '@payloadcms/translations@3.69.0':
dependencies: dependencies:
date-fns: 4.1.0 date-fns: 4.1.0
'@payloadcms/ui@3.68.4(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)': '@payloadcms/ui@3.69.0(@types/react@19.2.7)(monaco-editor@0.55.1)(next@15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4))(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.9.3)':
dependencies: dependencies:
'@date-fns/tz': 1.2.0 '@date-fns/tz': 1.2.0
'@dnd-kit/core': 6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@dnd-kit/core': 6.0.8(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -5938,14 +5901,14 @@ snapshots:
'@faceless-ui/scroll-info': 2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@faceless-ui/scroll-info': 2.0.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@faceless-ui/window-info': 3.0.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@faceless-ui/window-info': 3.0.1(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@monaco-editor/react': 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@monaco-editor/react': 4.7.0(monaco-editor@0.55.1)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
'@payloadcms/translations': 3.68.4 '@payloadcms/translations': 3.69.0
bson-objectid: 2.0.4 bson-objectid: 2.0.4
date-fns: 4.1.0 date-fns: 4.1.0
dequal: 2.0.3 dequal: 2.0.3
md5: 2.3.0 md5: 2.3.0
next: 15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4) next: 15.5.9(@babel/core@7.28.5)(@playwright/test@1.57.0)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(sass@1.77.4)
object-to-formdata: 4.5.1 object-to-formdata: 4.5.1
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
qs-esm: 7.0.2 qs-esm: 7.0.2
react: 19.2.3 react: 19.2.3
react-datepicker: 7.6.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-datepicker: 7.6.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -6321,27 +6284,6 @@ snapshots:
dependencies: dependencies:
tslib: 2.8.1 tslib: 2.8.1
'@testing-library/dom@10.4.1':
dependencies:
'@babel/code-frame': 7.27.1
'@babel/runtime': 7.28.4
'@types/aria-query': 5.0.4
aria-query: 5.3.0
dom-accessibility-api: 0.5.16
lz-string: 1.5.0
picocolors: 1.1.1
pretty-format: 27.5.1
'@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)':
dependencies:
'@babel/runtime': 7.28.4
'@testing-library/dom': 10.4.1
react: 19.2.3
react-dom: 19.2.3(react@19.2.3)
optionalDependencies:
'@types/react': 19.2.7
'@types/react-dom': 19.2.3(@types/react@19.2.7)
'@tokenizer/token@0.3.0': {} '@tokenizer/token@0.3.0': {}
'@tybys/wasm-util@0.10.1': '@tybys/wasm-util@0.10.1':
@ -6353,8 +6295,6 @@ snapshots:
dependencies: dependencies:
'@types/estree': 1.0.8 '@types/estree': 1.0.8
'@types/aria-query@5.0.4': {}
'@types/babel__core@7.20.5': '@types/babel__core@7.20.5':
dependencies: dependencies:
'@babel/parser': 7.28.5 '@babel/parser': 7.28.5
@ -6697,16 +6637,12 @@ snapshots:
json-schema-traverse: 1.0.0 json-schema-traverse: 1.0.0
require-from-string: 2.0.2 require-from-string: 2.0.2
ansi-regex@5.0.1: {}
ansi-regex@6.2.2: {} ansi-regex@6.2.2: {}
ansi-styles@4.3.0: ansi-styles@4.3.0:
dependencies: dependencies:
color-convert: 2.0.1 color-convert: 2.0.1
ansi-styles@5.2.0: {}
ansi-styles@6.2.3: {} ansi-styles@6.2.3: {}
anymatch@3.1.3: anymatch@3.1.3:
@ -6716,10 +6652,6 @@ snapshots:
argparse@2.0.1: {} argparse@2.0.1: {}
aria-query@5.3.0:
dependencies:
dequal: 2.0.3
aria-query@5.3.2: {} aria-query@5.3.2: {}
array-buffer-byte-length@1.0.2: array-buffer-byte-length@1.0.2:
@ -7068,8 +7000,6 @@ snapshots:
dependencies: dependencies:
esutils: 2.0.3 esutils: 2.0.3
dom-accessibility-api@0.5.16: {}
dom-helpers@5.2.1: dom-helpers@5.2.1:
dependencies: dependencies:
'@babel/runtime': 7.28.4 '@babel/runtime': 7.28.4
@ -7304,8 +7234,8 @@ snapshots:
'@typescript-eslint/parser': 8.49.0(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/parser': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
eslint: 9.39.2 eslint: 9.39.2
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2)
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2)
eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.2)
eslint-plugin-react: 7.37.5(eslint@9.39.2) eslint-plugin-react: 7.37.5(eslint@9.39.2)
eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2) eslint-plugin-react-hooks: 5.2.0(eslint@9.39.2)
@ -7324,7 +7254,7 @@ snapshots:
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2): eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2):
dependencies: dependencies:
'@nolyfill/is-core-module': 1.0.39 '@nolyfill/is-core-module': 1.0.39
debug: 4.4.3 debug: 4.4.3
@ -7335,22 +7265,22 @@ snapshots:
tinyglobby: 0.2.15 tinyglobby: 0.2.15
unrs-resolver: 1.11.1 unrs-resolver: 1.11.1
optionalDependencies: optionalDependencies:
eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-module-utils@2.12.1(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2): eslint-module-utils@2.12.1(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2):
dependencies: dependencies:
debug: 3.2.7 debug: 3.2.7
optionalDependencies: optionalDependencies:
'@typescript-eslint/parser': 8.49.0(eslint@9.39.2)(typescript@5.9.3) '@typescript-eslint/parser': 8.49.0(eslint@9.39.2)(typescript@5.9.3)
eslint: 9.39.2 eslint: 9.39.2
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.2) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2): eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2):
dependencies: dependencies:
'@rtsao/scc': 1.1.0 '@rtsao/scc': 1.1.0
array-includes: 3.1.9 array-includes: 3.1.9
@ -7361,7 +7291,7 @@ snapshots:
doctrine: 2.1.0 doctrine: 2.1.0
eslint: 9.39.2 eslint: 9.39.2
eslint-import-resolver-node: 0.3.9 eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.2) eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.49.0(eslint@9.39.2)(typescript@5.9.3))(eslint@9.39.2))(eslint@9.39.2))(eslint@9.39.2)
hasown: 2.0.2 hasown: 2.0.2
is-core-module: 2.16.1 is-core-module: 2.16.1
is-glob: 4.0.3 is-glob: 4.0.3
@ -8036,7 +7966,7 @@ snapshots:
lexical@0.35.0: {} lexical@0.35.0: {}
lib0@0.2.114: lib0@0.2.116:
dependencies: dependencies:
isomorphic.js: 0.2.5 isomorphic.js: 0.2.5
@ -8068,8 +7998,6 @@ snapshots:
luxon@3.7.2: {} luxon@3.7.2: {}
lz-string@1.5.0: {}
magic-string@0.30.21: magic-string@0.30.21:
dependencies: dependencies:
'@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/sourcemap-codec': 1.5.5
@ -8526,20 +8454,20 @@ snapshots:
pathe@2.0.3: {} pathe@2.0.3: {}
payload-oapi@0.2.5(@types/json-schema@7.0.15)(payload@3.68.4(graphql@16.12.0)(typescript@5.9.3)): payload-oapi@0.2.5(@types/json-schema@7.0.15)(payload@3.69.0(graphql@16.12.0)(typescript@5.9.3)):
dependencies: dependencies:
'@openapi-contrib/json-schema-to-openapi-schema': 4.3.0(@types/json-schema@7.0.15)(openapi-types@12.1.3) '@openapi-contrib/json-schema-to-openapi-schema': 4.3.0(@types/json-schema@7.0.15)(openapi-types@12.1.3)
mutative: 1.3.0 mutative: 1.3.0
openapi-types: 12.1.3 openapi-types: 12.1.3
payload: 3.68.4(graphql@16.12.0)(typescript@5.9.3) payload: 3.69.0(graphql@16.12.0)(typescript@5.9.3)
util: 0.12.5 util: 0.12.5
transitivePeerDependencies: transitivePeerDependencies:
- '@types/json-schema' - '@types/json-schema'
payload@3.68.4(graphql@16.12.0)(typescript@5.9.3): payload@3.69.0(graphql@16.12.0)(typescript@5.9.3):
dependencies: dependencies:
'@next/env': 15.5.9 '@next/env': 15.5.9
'@payloadcms/translations': 3.68.4 '@payloadcms/translations': 3.69.0
'@types/busboy': 1.5.4 '@types/busboy': 1.5.4
ajv: 8.17.1 ajv: 8.17.1
bson-objectid: 2.0.4 bson-objectid: 2.0.4
@ -8563,6 +8491,7 @@ snapshots:
pino-pretty: 13.1.2 pino-pretty: 13.1.2
pluralize: 8.0.0 pluralize: 8.0.0
qs-esm: 7.0.2 qs-esm: 7.0.2
range-parser: 1.2.1
sanitize-filename: 1.6.3 sanitize-filename: 1.6.3
scmp: 2.1.0 scmp: 2.1.0
ts-essentials: 10.0.3(typescript@5.9.3) ts-essentials: 10.0.3(typescript@5.9.3)
@ -8596,7 +8525,7 @@ snapshots:
dependencies: dependencies:
pg-int8: 1.0.1 pg-int8: 1.0.1
postgres-array: 2.0.0 postgres-array: 2.0.0
postgres-bytea: 1.0.0 postgres-bytea: 1.0.1
postgres-date: 1.0.7 postgres-date: 1.0.7
postgres-interval: 1.2.0 postgres-interval: 1.2.0
@ -8694,7 +8623,7 @@ snapshots:
postgres-array@3.0.4: {} postgres-array@3.0.4: {}
postgres-bytea@1.0.0: {} postgres-bytea@1.0.1: {}
postgres-bytea@3.0.0: postgres-bytea@3.0.0:
dependencies: dependencies:
@ -8716,12 +8645,6 @@ snapshots:
prettier@3.7.4: {} prettier@3.7.4: {}
pretty-format@27.5.1:
dependencies:
ansi-regex: 5.0.1
ansi-styles: 5.2.0
react-is: 17.0.2
prismjs@1.30.0: {} prismjs@1.30.0: {}
process-warning@5.0.0: {} process-warning@5.0.0: {}
@ -8750,6 +8673,8 @@ snapshots:
quick-format-unescaped@4.0.4: {} quick-format-unescaped@4.0.4: {}
range-parser@1.2.1: {}
react-datepicker@7.6.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3): react-datepicker@7.6.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
dependencies: dependencies:
'@floating-ui/react': 0.27.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@floating-ui/react': 0.27.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@ -8779,8 +8704,6 @@ snapshots:
react-is@16.13.1: {} react-is@16.13.1: {}
react-is@17.0.2: {}
react-refresh@0.17.0: {} react-refresh@0.17.0: {}
react-select@5.9.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): react-select@5.9.0(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
@ -9252,7 +9175,7 @@ snapshots:
tsx@4.20.3: tsx@4.20.3:
dependencies: dependencies:
esbuild: 0.25.12 esbuild: 0.25.12
get-tsconfig: 4.13.0 get-tsconfig: 4.8.1
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
@ -9576,7 +9499,7 @@ snapshots:
yjs@13.6.27: yjs@13.6.27:
dependencies: dependencies:
lib0: 0.2.114 lib0: 0.2.116
yocto-queue@0.1.0: {} yocto-queue@0.1.0: {}

View file

@ -27,6 +27,7 @@ import { BoldFeatureClient as BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864
import { ItalicFeatureClient as ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from '@payloadcms/richtext-lexical/client' import { ItalicFeatureClient as ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864 } from '@payloadcms/richtext-lexical/client'
import { TenantSelector as TenantSelector_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' import { TenantSelector as TenantSelector_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc'
import { TenantSelectionProvider as TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc' import { TenantSelectionProvider as TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 } from '@payloadcms/plugin-multi-tenant/rsc'
import { CollectionCards as CollectionCards_ab83ff7e88da8d3530831f296ec4756a } from '@payloadcms/ui/rsc'
export const importMap = { export const importMap = {
"@payloadcms/plugin-multi-tenant/client#TenantField": TenantField_1d0591e3cf4f332c83a86da13a0de59a, "@payloadcms/plugin-multi-tenant/client#TenantField": TenantField_1d0591e3cf4f332c83a86da13a0de59a,
@ -57,5 +58,6 @@ export const importMap = {
"@payloadcms/richtext-lexical/client#BoldFeatureClient": BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864, "@payloadcms/richtext-lexical/client#BoldFeatureClient": BoldFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
"@payloadcms/richtext-lexical/client#ItalicFeatureClient": ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864, "@payloadcms/richtext-lexical/client#ItalicFeatureClient": ItalicFeatureClient_e70f5e05f09f93e00b997edb1ef0c864,
"@payloadcms/plugin-multi-tenant/rsc#TenantSelector": TenantSelector_d6d5f193a167989e2ee7d14202901e62, "@payloadcms/plugin-multi-tenant/rsc#TenantSelector": TenantSelector_d6d5f193a167989e2ee7d14202901e62,
"@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider": TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62 "@payloadcms/plugin-multi-tenant/rsc#TenantSelectionProvider": TenantSelectionProvider_d6d5f193a167989e2ee7d14202901e62,
"@payloadcms/ui/rsc#CollectionCards": CollectionCards_ab83ff7e88da8d3530831f296ec4756a
} }

View file

@ -1,196 +0,0 @@
/**
* Custom Login Page
*
* Komplett eigene Login-Seite um den Redirect-Loop-Bug in Payload zu umgehen.
* Diese Seite rendert ein einfaches Login-Formular das direkt mit der Payload API kommuniziert.
*/
import { headers, cookies } from 'next/headers'
import { redirect } from 'next/navigation'
import { getPayload } from 'payload'
import configPromise from '@payload-config'
type SearchParams = {
redirect?: string
error?: string
}
export default async function LoginPage({
searchParams,
}: {
searchParams: Promise<SearchParams>
}) {
const resolvedParams = await searchParams
const payload = await getPayload({ config: configPromise })
// Prüfe ob User bereits eingeloggt ist
const headersList = await headers()
const cookieStore = await cookies()
const token = cookieStore.get('payload-token')?.value
if (token) {
try {
const { user } = await payload.auth({ headers: headersList })
if (user) {
// User ist eingeloggt - weiterleiten
const redirectTo = resolvedParams.redirect || '/admin'
// Verhindere Redirect-Loop
if (!redirectTo.includes('/login')) {
redirect(redirectTo)
}
redirect('/admin')
}
} catch {
// Token ungültig - weiter zum Login
}
}
// Bestimme Redirect-Ziel (verhindere Loop)
let redirectTarget = resolvedParams.redirect || '/admin'
if (redirectTarget.includes('/login')) {
redirectTarget = '/admin'
}
const error = resolvedParams.error
return (
<html lang="de">
<head>
<meta charSet="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Anmelden - Payload</title>
<style>{`
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
background: #0f0f0f;
color: #fff;
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
.login-container {
background: #1a1a1a;
padding: 2rem;
border-radius: 8px;
width: 100%;
max-width: 400px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
}
.logo {
text-align: center;
margin-bottom: 2rem;
}
.logo svg {
width: 48px;
height: 48px;
}
h1 {
font-size: 1.5rem;
font-weight: 600;
text-align: center;
margin-bottom: 1.5rem;
}
.form-group {
margin-bottom: 1rem;
}
label {
display: block;
margin-bottom: 0.5rem;
font-size: 0.875rem;
color: #a0a0a0;
}
input {
width: 100%;
padding: 0.75rem;
border: 1px solid #333;
border-radius: 4px;
background: #0f0f0f;
color: #fff;
font-size: 1rem;
}
input:focus {
outline: none;
border-color: #3b82f6;
}
button {
width: 100%;
padding: 0.75rem;
border: none;
border-radius: 4px;
background: #3b82f6;
color: #fff;
font-size: 1rem;
font-weight: 500;
cursor: pointer;
margin-top: 1rem;
}
button:hover {
background: #2563eb;
}
.error {
background: #dc2626;
color: #fff;
padding: 0.75rem;
border-radius: 4px;
margin-bottom: 1rem;
font-size: 0.875rem;
}
`}</style>
</head>
<body>
<div className="login-container">
<div className="logo">
<svg viewBox="0 0 25 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M11.5 3L3 7.5V17.5L11.5 22L20 17.5V7.5L11.5 3Z" stroke="white" strokeWidth="2"/>
<path d="M11.5 12L3 7.5" stroke="white" strokeWidth="2"/>
<path d="M11.5 12V22" stroke="white" strokeWidth="2"/>
<path d="M11.5 12L20 7.5" stroke="white" strokeWidth="2"/>
</svg>
</div>
<h1>Anmelden</h1>
{error && (
<div className="error">
{error === 'invalid' ? 'E-Mail oder Passwort ist falsch.' : error}
</div>
)}
<form action="/api/users/login" method="POST">
<input type="hidden" name="redirect" value={redirectTarget} />
<div className="form-group">
<label htmlFor="email">E-Mail</label>
<input
type="email"
id="email"
name="email"
required
autoComplete="email"
autoFocus
/>
</div>
<div className="form-group">
<label htmlFor="password">Passwort</label>
<input
type="password"
id="password"
name="password"
required
autoComplete="current-password"
/>
</div>
<button type="submit">Anmelden</button>
</form>
</div>
</body>
</html>
)
}

View file

@ -1,5 +0,0 @@
export const GET = async () => {
return Response.json({
message: 'This is an example of a custom route.',
})
}

View file

@ -1,4 +1,4 @@
import type { CollectionConfig } from 'payload' import type { CollectionConfig, Access } from 'payload'
import { auditUserAfterChange, auditUserAfterDelete } from '../hooks/auditUserChanges' import { auditUserAfterChange, auditUserAfterDelete } from '../hooks/auditUserChanges'
import { import {
auditAfterLogin, auditAfterLogin,
@ -6,11 +6,29 @@ import {
auditAfterForgotPassword, auditAfterForgotPassword,
} from '../hooks/auditAuthEvents' } from '../hooks/auditAuthEvents'
// Users können ihren eigenen Account bearbeiten
const canUpdateOwnAccount: Access = ({ req: { user }, id }) => {
// Super Admins können alle User bearbeiten
if (user?.isSuperAdmin) {
return true
}
// User können ihren eigenen Account bearbeiten
if (user?.id && id && String(user.id) === String(id)) {
return true
}
// Ansonsten Multi-Tenant Access Control
return true
}
export const Users: CollectionConfig = { export const Users: CollectionConfig = {
slug: 'users', slug: 'users',
admin: { admin: {
useAsTitle: 'email', useAsTitle: 'email',
}, },
access: {
// Erlaubt Benutzern, ihren eigenen Account zu aktualisieren
update: canUpdateOwnAccount,
},
auth: { auth: {
// Cookie-Konfiguration für Production hinter Reverse-Proxy (Cloudflare/Caddy) // Cookie-Konfiguration für Production hinter Reverse-Proxy (Cloudflare/Caddy)
cookies: { cookies: {

View file

@ -16,6 +16,12 @@ export const SEOSettings: GlobalConfig = {
group: 'Einstellungen', group: 'Einstellungen',
description: 'Globale SEO-Konfiguration und Schema.org Daten', description: 'Globale SEO-Konfiguration und Schema.org Daten',
}, },
access: {
// Alle angemeldeten Benutzer können lesen
read: ({ req: { user } }) => Boolean(user),
// Nur Super Admins können bearbeiten
update: ({ req: { user } }) => Boolean(user?.isSuperAdmin),
},
fields: [ fields: [
// === META DEFAULTS === // === META DEFAULTS ===
{ {

View file

@ -1,33 +0,0 @@
// Zentrale Cache-Key Definitionen
export const CacheKeys = {
// Pages
page: (slug: string, locale: string) => `page:${locale}:${slug}`,
pages: (tenant: string, locale: string) => `pages:${tenant}:${locale}`,
// Posts
post: (slug: string, locale: string) => `post:${locale}:${slug}`,
posts: (tenant: string, locale: string) => `posts:${tenant}:${locale}`,
postsList: (tenant: string, locale: string, page: number) =>
`posts:${tenant}:${locale}:list:${page}`,
// Navigation
navigation: (tenant: string, locale: string) => `nav:${tenant}:${locale}`,
// Categories
categories: (tenant: string, locale: string) => `categories:${tenant}:${locale}`,
// Global Settings
globals: (tenant: string, slug: string) => `global:${tenant}:${slug}`,
// Tenant-spezifisch
tenant: (slug: string) => `tenant:${slug}`,
}
// TTL Werte (in Sekunden)
export const CacheTTL = {
SHORT: 60, // 1 Minute
DEFAULT: 300, // 5 Minuten
MEDIUM: 900, // 15 Minuten
LONG: 3600, // 1 Stunde
VERY_LONG: 86400, // 24 Stunden
}

View file

@ -1,963 +0,0 @@
{
"version": "7",
"dialect": "postgresql",
"tables": {
"public.users_sessions": {
"name": "users_sessions",
"schema": "",
"columns": {
"_order": {
"name": "_order",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"_parent_id": {
"name": "_parent_id",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"id": {
"name": "id",
"type": "varchar",
"primaryKey": true,
"notNull": true
},
"created_at": {
"name": "created_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": false
},
"expires_at": {
"name": "expires_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true
}
},
"indexes": {
"users_sessions_order_idx": {
"name": "users_sessions_order_idx",
"columns": [
{
"expression": "_order",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"users_sessions_parent_id_idx": {
"name": "users_sessions_parent_id_idx",
"columns": [
{
"expression": "_parent_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"users_sessions_parent_id_fk": {
"name": "users_sessions_parent_id_fk",
"tableFrom": "users_sessions",
"tableTo": "users",
"columnsFrom": [
"_parent_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.users": {
"name": "users",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"updated_at": {
"name": "updated_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"created_at": {
"name": "created_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"email": {
"name": "email",
"type": "varchar",
"primaryKey": false,
"notNull": true
},
"reset_password_token": {
"name": "reset_password_token",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"reset_password_expiration": {
"name": "reset_password_expiration",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": false
},
"salt": {
"name": "salt",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"hash": {
"name": "hash",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"login_attempts": {
"name": "login_attempts",
"type": "numeric",
"primaryKey": false,
"notNull": false,
"default": 0
},
"lock_until": {
"name": "lock_until",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": false
}
},
"indexes": {
"users_updated_at_idx": {
"name": "users_updated_at_idx",
"columns": [
{
"expression": "updated_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"users_created_at_idx": {
"name": "users_created_at_idx",
"columns": [
{
"expression": "created_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"users_email_idx": {
"name": "users_email_idx",
"columns": [
{
"expression": "email",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.media": {
"name": "media",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"alt": {
"name": "alt",
"type": "varchar",
"primaryKey": false,
"notNull": true
},
"updated_at": {
"name": "updated_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"created_at": {
"name": "created_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"url": {
"name": "url",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"thumbnail_u_r_l": {
"name": "thumbnail_u_r_l",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"filename": {
"name": "filename",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"mime_type": {
"name": "mime_type",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"filesize": {
"name": "filesize",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"width": {
"name": "width",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"height": {
"name": "height",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"focal_x": {
"name": "focal_x",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"focal_y": {
"name": "focal_y",
"type": "numeric",
"primaryKey": false,
"notNull": false
}
},
"indexes": {
"media_updated_at_idx": {
"name": "media_updated_at_idx",
"columns": [
{
"expression": "updated_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"media_created_at_idx": {
"name": "media_created_at_idx",
"columns": [
{
"expression": "created_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"media_filename_idx": {
"name": "media_filename_idx",
"columns": [
{
"expression": "filename",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.payload_kv": {
"name": "payload_kv",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"key": {
"name": "key",
"type": "varchar",
"primaryKey": false,
"notNull": true
},
"data": {
"name": "data",
"type": "jsonb",
"primaryKey": false,
"notNull": true
}
},
"indexes": {
"payload_kv_key_idx": {
"name": "payload_kv_key_idx",
"columns": [
{
"expression": "key",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": true,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.payload_locked_documents": {
"name": "payload_locked_documents",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"global_slug": {
"name": "global_slug",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"updated_at": {
"name": "updated_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"created_at": {
"name": "created_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {
"payload_locked_documents_global_slug_idx": {
"name": "payload_locked_documents_global_slug_idx",
"columns": [
{
"expression": "global_slug",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_locked_documents_updated_at_idx": {
"name": "payload_locked_documents_updated_at_idx",
"columns": [
{
"expression": "updated_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_locked_documents_created_at_idx": {
"name": "payload_locked_documents_created_at_idx",
"columns": [
{
"expression": "created_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.payload_locked_documents_rels": {
"name": "payload_locked_documents_rels",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"order": {
"name": "order",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"parent_id": {
"name": "parent_id",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"path": {
"name": "path",
"type": "varchar",
"primaryKey": false,
"notNull": true
},
"users_id": {
"name": "users_id",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"media_id": {
"name": "media_id",
"type": "integer",
"primaryKey": false,
"notNull": false
}
},
"indexes": {
"payload_locked_documents_rels_order_idx": {
"name": "payload_locked_documents_rels_order_idx",
"columns": [
{
"expression": "order",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_locked_documents_rels_parent_idx": {
"name": "payload_locked_documents_rels_parent_idx",
"columns": [
{
"expression": "parent_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_locked_documents_rels_path_idx": {
"name": "payload_locked_documents_rels_path_idx",
"columns": [
{
"expression": "path",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_locked_documents_rels_users_id_idx": {
"name": "payload_locked_documents_rels_users_id_idx",
"columns": [
{
"expression": "users_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_locked_documents_rels_media_id_idx": {
"name": "payload_locked_documents_rels_media_id_idx",
"columns": [
{
"expression": "media_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"payload_locked_documents_rels_parent_fk": {
"name": "payload_locked_documents_rels_parent_fk",
"tableFrom": "payload_locked_documents_rels",
"tableTo": "payload_locked_documents",
"columnsFrom": [
"parent_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"payload_locked_documents_rels_users_fk": {
"name": "payload_locked_documents_rels_users_fk",
"tableFrom": "payload_locked_documents_rels",
"tableTo": "users",
"columnsFrom": [
"users_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"payload_locked_documents_rels_media_fk": {
"name": "payload_locked_documents_rels_media_fk",
"tableFrom": "payload_locked_documents_rels",
"tableTo": "media",
"columnsFrom": [
"media_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.payload_preferences": {
"name": "payload_preferences",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"key": {
"name": "key",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"value": {
"name": "value",
"type": "jsonb",
"primaryKey": false,
"notNull": false
},
"updated_at": {
"name": "updated_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"created_at": {
"name": "created_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {
"payload_preferences_key_idx": {
"name": "payload_preferences_key_idx",
"columns": [
{
"expression": "key",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_preferences_updated_at_idx": {
"name": "payload_preferences_updated_at_idx",
"columns": [
{
"expression": "updated_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_preferences_created_at_idx": {
"name": "payload_preferences_created_at_idx",
"columns": [
{
"expression": "created_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.payload_preferences_rels": {
"name": "payload_preferences_rels",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"order": {
"name": "order",
"type": "integer",
"primaryKey": false,
"notNull": false
},
"parent_id": {
"name": "parent_id",
"type": "integer",
"primaryKey": false,
"notNull": true
},
"path": {
"name": "path",
"type": "varchar",
"primaryKey": false,
"notNull": true
},
"users_id": {
"name": "users_id",
"type": "integer",
"primaryKey": false,
"notNull": false
}
},
"indexes": {
"payload_preferences_rels_order_idx": {
"name": "payload_preferences_rels_order_idx",
"columns": [
{
"expression": "order",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_preferences_rels_parent_idx": {
"name": "payload_preferences_rels_parent_idx",
"columns": [
{
"expression": "parent_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_preferences_rels_path_idx": {
"name": "payload_preferences_rels_path_idx",
"columns": [
{
"expression": "path",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_preferences_rels_users_id_idx": {
"name": "payload_preferences_rels_users_id_idx",
"columns": [
{
"expression": "users_id",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {
"payload_preferences_rels_parent_fk": {
"name": "payload_preferences_rels_parent_fk",
"tableFrom": "payload_preferences_rels",
"tableTo": "payload_preferences",
"columnsFrom": [
"parent_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
},
"payload_preferences_rels_users_fk": {
"name": "payload_preferences_rels_users_fk",
"tableFrom": "payload_preferences_rels",
"tableTo": "users",
"columnsFrom": [
"users_id"
],
"columnsTo": [
"id"
],
"onDelete": "cascade",
"onUpdate": "no action"
}
},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
},
"public.payload_migrations": {
"name": "payload_migrations",
"schema": "",
"columns": {
"id": {
"name": "id",
"type": "serial",
"primaryKey": true,
"notNull": true
},
"name": {
"name": "name",
"type": "varchar",
"primaryKey": false,
"notNull": false
},
"batch": {
"name": "batch",
"type": "numeric",
"primaryKey": false,
"notNull": false
},
"updated_at": {
"name": "updated_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
},
"created_at": {
"name": "created_at",
"type": "timestamp(3) with time zone",
"primaryKey": false,
"notNull": true,
"default": "now()"
}
},
"indexes": {
"payload_migrations_updated_at_idx": {
"name": "payload_migrations_updated_at_idx",
"columns": [
{
"expression": "updated_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
},
"payload_migrations_created_at_idx": {
"name": "payload_migrations_created_at_idx",
"columns": [
{
"expression": "created_at",
"isExpression": false,
"asc": true,
"nulls": "last"
}
],
"isUnique": false,
"concurrently": false,
"method": "btree",
"with": {}
}
},
"foreignKeys": {},
"compositePrimaryKeys": {},
"uniqueConstraints": {},
"policies": {},
"checkConstraints": {},
"isRLSEnabled": false
}
},
"enums": {},
"schemas": {},
"sequences": {},
"roles": {},
"policies": {},
"views": {},
"_meta": {
"schemas": {},
"tables": {},
"columns": {}
},
"id": "8f5aa12b-08f6-4857-a473-f525e7f7ee01",
"prevId": "00000000-0000-0000-0000-000000000000"
}

View file

@ -1,133 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TABLE "users_sessions" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"created_at" timestamp(3) with time zone,
"expires_at" timestamp(3) with time zone NOT NULL
);
CREATE TABLE "users" (
"id" serial PRIMARY KEY NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"email" varchar NOT NULL,
"reset_password_token" varchar,
"reset_password_expiration" timestamp(3) with time zone,
"salt" varchar,
"hash" varchar,
"login_attempts" numeric DEFAULT 0,
"lock_until" timestamp(3) with time zone
);
CREATE TABLE "media" (
"id" serial PRIMARY KEY NOT NULL,
"alt" varchar NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"url" varchar,
"thumbnail_u_r_l" varchar,
"filename" varchar,
"mime_type" varchar,
"filesize" numeric,
"width" numeric,
"height" numeric,
"focal_x" numeric,
"focal_y" numeric
);
CREATE TABLE "payload_kv" (
"id" serial PRIMARY KEY NOT NULL,
"key" varchar NOT NULL,
"data" jsonb NOT NULL
);
CREATE TABLE "payload_locked_documents" (
"id" serial PRIMARY KEY NOT NULL,
"global_slug" varchar,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "payload_locked_documents_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" integer NOT NULL,
"path" varchar NOT NULL,
"users_id" integer,
"media_id" integer
);
CREATE TABLE "payload_preferences" (
"id" serial PRIMARY KEY NOT NULL,
"key" varchar,
"value" jsonb,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "payload_preferences_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" integer NOT NULL,
"path" varchar NOT NULL,
"users_id" integer
);
CREATE TABLE "payload_migrations" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar,
"batch" numeric,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
ALTER TABLE "users_sessions" ADD CONSTRAINT "users_sessions_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_locked_documents"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_media_fk" FOREIGN KEY ("media_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."payload_preferences"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_preferences_rels" ADD CONSTRAINT "payload_preferences_rels_users_fk" FOREIGN KEY ("users_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "users_sessions_order_idx" ON "users_sessions" USING btree ("_order");
CREATE INDEX "users_sessions_parent_id_idx" ON "users_sessions" USING btree ("_parent_id");
CREATE INDEX "users_updated_at_idx" ON "users" USING btree ("updated_at");
CREATE INDEX "users_created_at_idx" ON "users" USING btree ("created_at");
CREATE UNIQUE INDEX "users_email_idx" ON "users" USING btree ("email");
CREATE INDEX "media_updated_at_idx" ON "media" USING btree ("updated_at");
CREATE INDEX "media_created_at_idx" ON "media" USING btree ("created_at");
CREATE UNIQUE INDEX "media_filename_idx" ON "media" USING btree ("filename");
CREATE UNIQUE INDEX "payload_kv_key_idx" ON "payload_kv" USING btree ("key");
CREATE INDEX "payload_locked_documents_global_slug_idx" ON "payload_locked_documents" USING btree ("global_slug");
CREATE INDEX "payload_locked_documents_updated_at_idx" ON "payload_locked_documents" USING btree ("updated_at");
CREATE INDEX "payload_locked_documents_created_at_idx" ON "payload_locked_documents" USING btree ("created_at");
CREATE INDEX "payload_locked_documents_rels_order_idx" ON "payload_locked_documents_rels" USING btree ("order");
CREATE INDEX "payload_locked_documents_rels_parent_idx" ON "payload_locked_documents_rels" USING btree ("parent_id");
CREATE INDEX "payload_locked_documents_rels_path_idx" ON "payload_locked_documents_rels" USING btree ("path");
CREATE INDEX "payload_locked_documents_rels_users_id_idx" ON "payload_locked_documents_rels" USING btree ("users_id");
CREATE INDEX "payload_locked_documents_rels_media_id_idx" ON "payload_locked_documents_rels" USING btree ("media_id");
CREATE INDEX "payload_preferences_key_idx" ON "payload_preferences" USING btree ("key");
CREATE INDEX "payload_preferences_updated_at_idx" ON "payload_preferences" USING btree ("updated_at");
CREATE INDEX "payload_preferences_created_at_idx" ON "payload_preferences" USING btree ("created_at");
CREATE INDEX "payload_preferences_rels_order_idx" ON "payload_preferences_rels" USING btree ("order");
CREATE INDEX "payload_preferences_rels_parent_idx" ON "payload_preferences_rels" USING btree ("parent_id");
CREATE INDEX "payload_preferences_rels_path_idx" ON "payload_preferences_rels" USING btree ("path");
CREATE INDEX "payload_preferences_rels_users_id_idx" ON "payload_preferences_rels" USING btree ("users_id");
CREATE INDEX "payload_migrations_updated_at_idx" ON "payload_migrations" USING btree ("updated_at");
CREATE INDEX "payload_migrations_created_at_idx" ON "payload_migrations" USING btree ("created_at");`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
DROP TABLE "users_sessions" CASCADE;
DROP TABLE "users" CASCADE;
DROP TABLE "media" CASCADE;
DROP TABLE "payload_kv" CASCADE;
DROP TABLE "payload_locked_documents" CASCADE;
DROP TABLE "payload_locked_documents_rels" CASCADE;
DROP TABLE "payload_preferences" CASCADE;
DROP TABLE "payload_preferences_rels" CASCADE;
DROP TABLE "payload_migrations" CASCADE;`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,62 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TABLE "users_tenants" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"tenant_id" integer NOT NULL
);
CREATE TABLE "tenants_domains" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"domain" varchar NOT NULL
);
CREATE TABLE "tenants" (
"id" serial PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
"slug" varchar NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
ALTER TABLE "media" ADD COLUMN "tenant_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "tenants_id" integer;
ALTER TABLE "users_tenants" ADD CONSTRAINT "users_tenants_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "users_tenants" ADD CONSTRAINT "users_tenants_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "tenants_domains" ADD CONSTRAINT "tenants_domains_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."tenants"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "users_tenants_order_idx" ON "users_tenants" USING btree ("_order");
CREATE INDEX "users_tenants_parent_id_idx" ON "users_tenants" USING btree ("_parent_id");
CREATE INDEX "users_tenants_tenant_idx" ON "users_tenants" USING btree ("tenant_id");
CREATE INDEX "tenants_domains_order_idx" ON "tenants_domains" USING btree ("_order");
CREATE INDEX "tenants_domains_parent_id_idx" ON "tenants_domains" USING btree ("_parent_id");
CREATE UNIQUE INDEX "tenants_slug_idx" ON "tenants" USING btree ("slug");
CREATE INDEX "tenants_updated_at_idx" ON "tenants" USING btree ("updated_at");
CREATE INDEX "tenants_created_at_idx" ON "tenants" USING btree ("created_at");
ALTER TABLE "media" ADD CONSTRAINT "media_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_tenants_fk" FOREIGN KEY ("tenants_id") REFERENCES "public"."tenants"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "media_tenant_idx" ON "media" USING btree ("tenant_id");
CREATE INDEX "payload_locked_documents_rels_tenants_id_idx" ON "payload_locked_documents_rels" USING btree ("tenants_id");`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "users_tenants" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "tenants_domains" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "tenants" DISABLE ROW LEVEL SECURITY;
DROP TABLE "users_tenants" CASCADE;
DROP TABLE "tenants_domains" CASCADE;
DROP TABLE "tenants" CASCADE;
ALTER TABLE "media" DROP CONSTRAINT "media_tenant_id_tenants_id_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_tenants_fk";
DROP INDEX "media_tenant_idx";
DROP INDEX "payload_locked_documents_rels_tenants_id_idx";
ALTER TABLE "media" DROP COLUMN "tenant_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "tenants_id";`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,466 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_pages_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum_posts_status" AS ENUM('draft', 'published');
CREATE TYPE "public"."enum_social_links_platform" AS ENUM('facebook', 'x', 'instagram', 'youtube', 'linkedin', 'xing');
CREATE TYPE "public"."enum_forms_confirmation_type" AS ENUM('message', 'redirect');
CREATE TYPE "public"."enum_redirects_to_type" AS ENUM('reference', 'custom');
CREATE TYPE "public"."enum_navigation_main_menu_submenu_link_type" AS ENUM('page', 'custom');
CREATE TYPE "public"."enum_navigation_main_menu_type" AS ENUM('page', 'custom', 'submenu');
CREATE TYPE "public"."enum_navigation_footer_menu_link_type" AS ENUM('page', 'custom');
CREATE TABLE "pages" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer,
"title" varchar NOT NULL,
"slug" varchar NOT NULL,
"hero_image_id" integer,
"hero_headline" varchar,
"hero_subline" varchar,
"content" jsonb,
"seo_meta_title" varchar,
"seo_meta_description" varchar,
"seo_og_image_id" integer,
"status" "enum_pages_status" DEFAULT 'draft',
"published_at" timestamp(3) with time zone,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "posts" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer,
"title" varchar NOT NULL,
"slug" varchar NOT NULL,
"excerpt" varchar,
"content" jsonb,
"featured_image_id" integer,
"category_id" integer,
"author_id" integer,
"published_at" timestamp(3) with time zone,
"status" "enum_posts_status" DEFAULT 'draft',
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "categories" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer,
"name" varchar NOT NULL,
"slug" varchar NOT NULL,
"description" varchar,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "social_links" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer,
"platform" "enum_social_links_platform" NOT NULL,
"url" varchar NOT NULL,
"is_active" boolean DEFAULT true,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "forms_blocks_checkbox" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
"label" varchar,
"width" numeric,
"required" boolean,
"default_value" boolean,
"block_name" varchar
);
CREATE TABLE "forms_blocks_email" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
"label" varchar,
"width" numeric,
"required" boolean,
"block_name" varchar
);
CREATE TABLE "forms_blocks_message" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"message" jsonb,
"block_name" varchar
);
CREATE TABLE "forms_blocks_number" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
"label" varchar,
"width" numeric,
"default_value" numeric,
"required" boolean,
"block_name" varchar
);
CREATE TABLE "forms_blocks_select_options" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"label" varchar NOT NULL,
"value" varchar NOT NULL
);
CREATE TABLE "forms_blocks_select" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
"label" varchar,
"width" numeric,
"default_value" varchar,
"placeholder" varchar,
"required" boolean,
"block_name" varchar
);
CREATE TABLE "forms_blocks_text" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
"label" varchar,
"width" numeric,
"default_value" varchar,
"required" boolean,
"block_name" varchar
);
CREATE TABLE "forms_blocks_textarea" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"name" varchar NOT NULL,
"label" varchar,
"width" numeric,
"default_value" varchar,
"required" boolean,
"block_name" varchar
);
CREATE TABLE "forms_emails" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"email_to" varchar,
"cc" varchar,
"bcc" varchar,
"reply_to" varchar,
"email_from" varchar,
"subject" varchar DEFAULT 'You''ve received a new message.' NOT NULL,
"message" jsonb
);
CREATE TABLE "forms" (
"id" serial PRIMARY KEY NOT NULL,
"title" varchar NOT NULL,
"submit_button_label" varchar,
"confirmation_type" "enum_forms_confirmation_type" DEFAULT 'message',
"confirmation_message" jsonb,
"redirect_url" varchar,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "form_submissions_submission_data" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"field" varchar NOT NULL,
"value" varchar NOT NULL
);
CREATE TABLE "form_submissions" (
"id" serial PRIMARY KEY NOT NULL,
"form_id" integer NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "redirects" (
"id" serial PRIMARY KEY NOT NULL,
"from" varchar NOT NULL,
"to_type" "enum_redirects_to_type" DEFAULT 'reference',
"to_url" varchar,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "site_settings" (
"id" serial PRIMARY KEY NOT NULL,
"site_name" varchar DEFAULT 'porwoll.de',
"site_tagline" varchar,
"logo_id" integer,
"favicon_id" integer,
"contact_email" varchar,
"contact_phone" varchar,
"contact_address" varchar,
"footer_copyright_text" varchar,
"footer_show_social_links" boolean DEFAULT true,
"seo_default_meta_title" varchar,
"seo_default_meta_description" varchar,
"seo_default_og_image_id" integer,
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
CREATE TABLE "navigation_main_menu_submenu" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"label" varchar,
"link_type" "enum_navigation_main_menu_submenu_link_type" DEFAULT 'page',
"page_id" integer,
"url" varchar
);
CREATE TABLE "navigation_main_menu" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"label" varchar NOT NULL,
"type" "enum_navigation_main_menu_type" DEFAULT 'page',
"page_id" integer,
"url" varchar,
"open_in_new_tab" boolean DEFAULT false
);
CREATE TABLE "navigation_footer_menu" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"label" varchar NOT NULL,
"link_type" "enum_navigation_footer_menu_link_type" DEFAULT 'page',
"page_id" integer,
"url" varchar
);
CREATE TABLE "navigation" (
"id" serial PRIMARY KEY NOT NULL,
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "pages_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "posts_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "categories_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "social_links_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "forms_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "form_submissions_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "redirects_id" integer;
ALTER TABLE "pages" ADD CONSTRAINT "pages_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages" ADD CONSTRAINT "pages_hero_image_id_media_id_fk" FOREIGN KEY ("hero_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages" ADD CONSTRAINT "pages_seo_og_image_id_media_id_fk" FOREIGN KEY ("seo_og_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "posts" ADD CONSTRAINT "posts_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "posts" ADD CONSTRAINT "posts_featured_image_id_media_id_fk" FOREIGN KEY ("featured_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "posts" ADD CONSTRAINT "posts_category_id_categories_id_fk" FOREIGN KEY ("category_id") REFERENCES "public"."categories"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "posts" ADD CONSTRAINT "posts_author_id_users_id_fk" FOREIGN KEY ("author_id") REFERENCES "public"."users"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "categories" ADD CONSTRAINT "categories_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "social_links" ADD CONSTRAINT "social_links_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "forms_blocks_checkbox" ADD CONSTRAINT "forms_blocks_checkbox_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_blocks_email" ADD CONSTRAINT "forms_blocks_email_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_blocks_message" ADD CONSTRAINT "forms_blocks_message_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_blocks_number" ADD CONSTRAINT "forms_blocks_number_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_blocks_select_options" ADD CONSTRAINT "forms_blocks_select_options_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms_blocks_select"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_blocks_select" ADD CONSTRAINT "forms_blocks_select_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_blocks_text" ADD CONSTRAINT "forms_blocks_text_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_blocks_textarea" ADD CONSTRAINT "forms_blocks_textarea_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "forms_emails" ADD CONSTRAINT "forms_emails_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "form_submissions_submission_data" ADD CONSTRAINT "form_submissions_submission_data_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."form_submissions"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "form_submissions" ADD CONSTRAINT "form_submissions_form_id_forms_id_fk" FOREIGN KEY ("form_id") REFERENCES "public"."forms"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "site_settings" ADD CONSTRAINT "site_settings_logo_id_media_id_fk" FOREIGN KEY ("logo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "site_settings" ADD CONSTRAINT "site_settings_favicon_id_media_id_fk" FOREIGN KEY ("favicon_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "site_settings" ADD CONSTRAINT "site_settings_seo_default_og_image_id_media_id_fk" FOREIGN KEY ("seo_default_og_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "navigation_main_menu_submenu" ADD CONSTRAINT "navigation_main_menu_submenu_page_id_pages_id_fk" FOREIGN KEY ("page_id") REFERENCES "public"."pages"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "navigation_main_menu_submenu" ADD CONSTRAINT "navigation_main_menu_submenu_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."navigation_main_menu"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "navigation_main_menu" ADD CONSTRAINT "navigation_main_menu_page_id_pages_id_fk" FOREIGN KEY ("page_id") REFERENCES "public"."pages"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "navigation_main_menu" ADD CONSTRAINT "navigation_main_menu_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."navigation"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "navigation_footer_menu" ADD CONSTRAINT "navigation_footer_menu_page_id_pages_id_fk" FOREIGN KEY ("page_id") REFERENCES "public"."pages"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "navigation_footer_menu" ADD CONSTRAINT "navigation_footer_menu_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."navigation"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "pages_tenant_idx" ON "pages" USING btree ("tenant_id");
CREATE UNIQUE INDEX "pages_slug_idx" ON "pages" USING btree ("slug");
CREATE INDEX "pages_hero_hero_image_idx" ON "pages" USING btree ("hero_image_id");
CREATE INDEX "pages_seo_seo_og_image_idx" ON "pages" USING btree ("seo_og_image_id");
CREATE INDEX "pages_updated_at_idx" ON "pages" USING btree ("updated_at");
CREATE INDEX "pages_created_at_idx" ON "pages" USING btree ("created_at");
CREATE INDEX "posts_tenant_idx" ON "posts" USING btree ("tenant_id");
CREATE UNIQUE INDEX "posts_slug_idx" ON "posts" USING btree ("slug");
CREATE INDEX "posts_featured_image_idx" ON "posts" USING btree ("featured_image_id");
CREATE INDEX "posts_category_idx" ON "posts" USING btree ("category_id");
CREATE INDEX "posts_author_idx" ON "posts" USING btree ("author_id");
CREATE INDEX "posts_updated_at_idx" ON "posts" USING btree ("updated_at");
CREATE INDEX "posts_created_at_idx" ON "posts" USING btree ("created_at");
CREATE INDEX "categories_tenant_idx" ON "categories" USING btree ("tenant_id");
CREATE UNIQUE INDEX "categories_slug_idx" ON "categories" USING btree ("slug");
CREATE INDEX "categories_updated_at_idx" ON "categories" USING btree ("updated_at");
CREATE INDEX "categories_created_at_idx" ON "categories" USING btree ("created_at");
CREATE INDEX "social_links_tenant_idx" ON "social_links" USING btree ("tenant_id");
CREATE INDEX "social_links_updated_at_idx" ON "social_links" USING btree ("updated_at");
CREATE INDEX "social_links_created_at_idx" ON "social_links" USING btree ("created_at");
CREATE INDEX "forms_blocks_checkbox_order_idx" ON "forms_blocks_checkbox" USING btree ("_order");
CREATE INDEX "forms_blocks_checkbox_parent_id_idx" ON "forms_blocks_checkbox" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_checkbox_path_idx" ON "forms_blocks_checkbox" USING btree ("_path");
CREATE INDEX "forms_blocks_email_order_idx" ON "forms_blocks_email" USING btree ("_order");
CREATE INDEX "forms_blocks_email_parent_id_idx" ON "forms_blocks_email" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_email_path_idx" ON "forms_blocks_email" USING btree ("_path");
CREATE INDEX "forms_blocks_message_order_idx" ON "forms_blocks_message" USING btree ("_order");
CREATE INDEX "forms_blocks_message_parent_id_idx" ON "forms_blocks_message" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_message_path_idx" ON "forms_blocks_message" USING btree ("_path");
CREATE INDEX "forms_blocks_number_order_idx" ON "forms_blocks_number" USING btree ("_order");
CREATE INDEX "forms_blocks_number_parent_id_idx" ON "forms_blocks_number" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_number_path_idx" ON "forms_blocks_number" USING btree ("_path");
CREATE INDEX "forms_blocks_select_options_order_idx" ON "forms_blocks_select_options" USING btree ("_order");
CREATE INDEX "forms_blocks_select_options_parent_id_idx" ON "forms_blocks_select_options" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_select_order_idx" ON "forms_blocks_select" USING btree ("_order");
CREATE INDEX "forms_blocks_select_parent_id_idx" ON "forms_blocks_select" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_select_path_idx" ON "forms_blocks_select" USING btree ("_path");
CREATE INDEX "forms_blocks_text_order_idx" ON "forms_blocks_text" USING btree ("_order");
CREATE INDEX "forms_blocks_text_parent_id_idx" ON "forms_blocks_text" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_text_path_idx" ON "forms_blocks_text" USING btree ("_path");
CREATE INDEX "forms_blocks_textarea_order_idx" ON "forms_blocks_textarea" USING btree ("_order");
CREATE INDEX "forms_blocks_textarea_parent_id_idx" ON "forms_blocks_textarea" USING btree ("_parent_id");
CREATE INDEX "forms_blocks_textarea_path_idx" ON "forms_blocks_textarea" USING btree ("_path");
CREATE INDEX "forms_emails_order_idx" ON "forms_emails" USING btree ("_order");
CREATE INDEX "forms_emails_parent_id_idx" ON "forms_emails" USING btree ("_parent_id");
CREATE INDEX "forms_updated_at_idx" ON "forms" USING btree ("updated_at");
CREATE INDEX "forms_created_at_idx" ON "forms" USING btree ("created_at");
CREATE INDEX "form_submissions_submission_data_order_idx" ON "form_submissions_submission_data" USING btree ("_order");
CREATE INDEX "form_submissions_submission_data_parent_id_idx" ON "form_submissions_submission_data" USING btree ("_parent_id");
CREATE INDEX "form_submissions_form_idx" ON "form_submissions" USING btree ("form_id");
CREATE INDEX "form_submissions_updated_at_idx" ON "form_submissions" USING btree ("updated_at");
CREATE INDEX "form_submissions_created_at_idx" ON "form_submissions" USING btree ("created_at");
CREATE UNIQUE INDEX "redirects_from_idx" ON "redirects" USING btree ("from");
CREATE INDEX "redirects_updated_at_idx" ON "redirects" USING btree ("updated_at");
CREATE INDEX "redirects_created_at_idx" ON "redirects" USING btree ("created_at");
CREATE INDEX "site_settings_logo_idx" ON "site_settings" USING btree ("logo_id");
CREATE INDEX "site_settings_favicon_idx" ON "site_settings" USING btree ("favicon_id");
CREATE INDEX "site_settings_seo_seo_default_og_image_idx" ON "site_settings" USING btree ("seo_default_og_image_id");
CREATE INDEX "navigation_main_menu_submenu_order_idx" ON "navigation_main_menu_submenu" USING btree ("_order");
CREATE INDEX "navigation_main_menu_submenu_parent_id_idx" ON "navigation_main_menu_submenu" USING btree ("_parent_id");
CREATE INDEX "navigation_main_menu_submenu_page_idx" ON "navigation_main_menu_submenu" USING btree ("page_id");
CREATE INDEX "navigation_main_menu_order_idx" ON "navigation_main_menu" USING btree ("_order");
CREATE INDEX "navigation_main_menu_parent_id_idx" ON "navigation_main_menu" USING btree ("_parent_id");
CREATE INDEX "navigation_main_menu_page_idx" ON "navigation_main_menu" USING btree ("page_id");
CREATE INDEX "navigation_footer_menu_order_idx" ON "navigation_footer_menu" USING btree ("_order");
CREATE INDEX "navigation_footer_menu_parent_id_idx" ON "navigation_footer_menu" USING btree ("_parent_id");
CREATE INDEX "navigation_footer_menu_page_idx" ON "navigation_footer_menu" USING btree ("page_id");
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_pages_fk" FOREIGN KEY ("pages_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_posts_fk" FOREIGN KEY ("posts_id") REFERENCES "public"."posts"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_categories_fk" FOREIGN KEY ("categories_id") REFERENCES "public"."categories"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_social_links_fk" FOREIGN KEY ("social_links_id") REFERENCES "public"."social_links"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_forms_fk" FOREIGN KEY ("forms_id") REFERENCES "public"."forms"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_form_submissions_fk" FOREIGN KEY ("form_submissions_id") REFERENCES "public"."form_submissions"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_redirects_fk" FOREIGN KEY ("redirects_id") REFERENCES "public"."redirects"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "payload_locked_documents_rels_pages_id_idx" ON "payload_locked_documents_rels" USING btree ("pages_id");
CREATE INDEX "payload_locked_documents_rels_posts_id_idx" ON "payload_locked_documents_rels" USING btree ("posts_id");
CREATE INDEX "payload_locked_documents_rels_categories_id_idx" ON "payload_locked_documents_rels" USING btree ("categories_id");
CREATE INDEX "payload_locked_documents_rels_social_links_id_idx" ON "payload_locked_documents_rels" USING btree ("social_links_id");
CREATE INDEX "payload_locked_documents_rels_forms_id_idx" ON "payload_locked_documents_rels" USING btree ("forms_id");
CREATE INDEX "payload_locked_documents_rels_form_submissions_id_idx" ON "payload_locked_documents_rels" USING btree ("form_submissions_id");
CREATE INDEX "payload_locked_documents_rels_redirects_id_idx" ON "payload_locked_documents_rels" USING btree ("redirects_id");`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "pages" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "posts" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "categories" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "social_links" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_checkbox" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_email" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_message" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_number" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_select_options" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_select" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_text" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_blocks_textarea" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms_emails" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "forms" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "form_submissions_submission_data" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "form_submissions" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "redirects" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "site_settings" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "navigation_main_menu_submenu" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "navigation_main_menu" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "navigation_footer_menu" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "navigation" DISABLE ROW LEVEL SECURITY;
DROP TABLE "pages" CASCADE;
DROP TABLE "posts" CASCADE;
DROP TABLE "categories" CASCADE;
DROP TABLE "social_links" CASCADE;
DROP TABLE "forms_blocks_checkbox" CASCADE;
DROP TABLE "forms_blocks_email" CASCADE;
DROP TABLE "forms_blocks_message" CASCADE;
DROP TABLE "forms_blocks_number" CASCADE;
DROP TABLE "forms_blocks_select_options" CASCADE;
DROP TABLE "forms_blocks_select" CASCADE;
DROP TABLE "forms_blocks_text" CASCADE;
DROP TABLE "forms_blocks_textarea" CASCADE;
DROP TABLE "forms_emails" CASCADE;
DROP TABLE "forms" CASCADE;
DROP TABLE "form_submissions_submission_data" CASCADE;
DROP TABLE "form_submissions" CASCADE;
DROP TABLE "redirects" CASCADE;
DROP TABLE "site_settings" CASCADE;
DROP TABLE "navigation_main_menu_submenu" CASCADE;
DROP TABLE "navigation_main_menu" CASCADE;
DROP TABLE "navigation_footer_menu" CASCADE;
DROP TABLE "navigation" CASCADE;
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_pages_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_posts_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_categories_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_social_links_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_forms_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_form_submissions_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_redirects_fk";
DROP INDEX "payload_locked_documents_rels_pages_id_idx";
DROP INDEX "payload_locked_documents_rels_posts_id_idx";
DROP INDEX "payload_locked_documents_rels_categories_id_idx";
DROP INDEX "payload_locked_documents_rels_social_links_id_idx";
DROP INDEX "payload_locked_documents_rels_forms_id_idx";
DROP INDEX "payload_locked_documents_rels_form_submissions_id_idx";
DROP INDEX "payload_locked_documents_rels_redirects_id_idx";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "pages_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "posts_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "categories_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "social_links_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "forms_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "form_submissions_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "redirects_id";
DROP TYPE "public"."enum_pages_status";
DROP TYPE "public"."enum_posts_status";
DROP TYPE "public"."enum_social_links_platform";
DROP TYPE "public"."enum_forms_confirmation_type";
DROP TYPE "public"."enum_redirects_to_type";
DROP TYPE "public"."enum_navigation_main_menu_submenu_link_type";
DROP TYPE "public"."enum_navigation_main_menu_type";
DROP TYPE "public"."enum_navigation_footer_menu_link_type";`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,253 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_pages_blocks_hero_block_alignment" AS ENUM('left', 'center', 'right');
CREATE TYPE "public"."enum_pages_blocks_hero_block_cta_style" AS ENUM('primary', 'secondary', 'outline');
CREATE TYPE "public"."enum_pages_blocks_text_block_width" AS ENUM('narrow', 'medium', 'full');
CREATE TYPE "public"."enum_pages_blocks_image_text_block_image_position" AS ENUM('left', 'right');
CREATE TYPE "public"."enum_pages_blocks_card_grid_block_columns" AS ENUM('2', '3', '4');
CREATE TYPE "public"."enum_pages_blocks_quote_block_style" AS ENUM('simple', 'highlighted', 'with-image');
CREATE TYPE "public"."enum_pages_blocks_cta_block_buttons_style" AS ENUM('primary', 'secondary', 'outline');
CREATE TYPE "public"."enum_pages_blocks_cta_block_background_color" AS ENUM('dark', 'light', 'accent');
CREATE TYPE "public"."enum_pages_blocks_divider_block_style" AS ENUM('line', 'space', 'dots');
CREATE TYPE "public"."enum_pages_blocks_divider_block_spacing" AS ENUM('small', 'medium', 'large');
CREATE TYPE "public"."enum_pages_blocks_video_block_aspect_ratio" AS ENUM('16:9', '4:3', '1:1');
CREATE TABLE "pages_blocks_hero_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"background_image_id" integer,
"headline" varchar NOT NULL,
"subline" varchar,
"alignment" "enum_pages_blocks_hero_block_alignment" DEFAULT 'center',
"overlay" boolean DEFAULT true,
"cta_text" varchar,
"cta_link" varchar,
"cta_style" "enum_pages_blocks_hero_block_cta_style" DEFAULT 'primary',
"block_name" varchar
);
CREATE TABLE "pages_blocks_text_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"content" jsonb NOT NULL,
"width" "enum_pages_blocks_text_block_width" DEFAULT 'medium',
"block_name" varchar
);
CREATE TABLE "pages_blocks_image_text_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"image_id" integer NOT NULL,
"image_position" "enum_pages_blocks_image_text_block_image_position" DEFAULT 'left',
"headline" varchar,
"content" jsonb,
"cta_text" varchar,
"cta_link" varchar,
"block_name" varchar
);
CREATE TABLE "pages_blocks_card_grid_block_cards" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"image_id" integer,
"title" varchar NOT NULL,
"description" varchar,
"link" varchar,
"link_text" varchar DEFAULT 'mehr'
);
CREATE TABLE "pages_blocks_card_grid_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"headline" varchar,
"columns" "enum_pages_blocks_card_grid_block_columns" DEFAULT '3',
"block_name" varchar
);
CREATE TABLE "pages_blocks_quote_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"quote" varchar NOT NULL,
"author" varchar,
"role" varchar,
"image_id" integer,
"style" "enum_pages_blocks_quote_block_style" DEFAULT 'simple',
"block_name" varchar
);
CREATE TABLE "pages_blocks_cta_block_buttons" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"text" varchar NOT NULL,
"link" varchar NOT NULL,
"style" "enum_pages_blocks_cta_block_buttons_style" DEFAULT 'primary'
);
CREATE TABLE "pages_blocks_cta_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"headline" varchar NOT NULL,
"description" varchar,
"background_color" "enum_pages_blocks_cta_block_background_color" DEFAULT 'dark',
"block_name" varchar
);
CREATE TABLE "pages_blocks_contact_form_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"headline" varchar DEFAULT 'Kontakt',
"description" varchar,
"recipient_email" varchar DEFAULT 'info@porwoll.de',
"show_phone" boolean DEFAULT true,
"show_address" boolean DEFAULT true,
"show_socials" boolean DEFAULT true,
"block_name" varchar
);
CREATE TABLE "pages_blocks_timeline_block_events" (
"_order" integer NOT NULL,
"_parent_id" varchar NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"year" varchar NOT NULL,
"title" varchar NOT NULL,
"description" varchar,
"image_id" integer
);
CREATE TABLE "pages_blocks_timeline_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"headline" varchar,
"block_name" varchar
);
CREATE TABLE "pages_blocks_divider_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"style" "enum_pages_blocks_divider_block_style" DEFAULT 'space',
"spacing" "enum_pages_blocks_divider_block_spacing" DEFAULT 'medium',
"block_name" varchar
);
CREATE TABLE "pages_blocks_video_block" (
"_order" integer NOT NULL,
"_parent_id" integer NOT NULL,
"_path" text NOT NULL,
"id" varchar PRIMARY KEY NOT NULL,
"video_url" varchar NOT NULL,
"caption" varchar,
"aspect_ratio" "enum_pages_blocks_video_block_aspect_ratio" DEFAULT '16:9',
"block_name" varchar
);
ALTER TABLE "pages_blocks_hero_block" ADD CONSTRAINT "pages_blocks_hero_block_background_image_id_media_id_fk" FOREIGN KEY ("background_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_hero_block" ADD CONSTRAINT "pages_blocks_hero_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_text_block" ADD CONSTRAINT "pages_blocks_text_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_image_text_block" ADD CONSTRAINT "pages_blocks_image_text_block_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_image_text_block" ADD CONSTRAINT "pages_blocks_image_text_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_card_grid_block_cards" ADD CONSTRAINT "pages_blocks_card_grid_block_cards_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_card_grid_block_cards" ADD CONSTRAINT "pages_blocks_card_grid_block_cards_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_card_grid_block"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_card_grid_block" ADD CONSTRAINT "pages_blocks_card_grid_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_quote_block" ADD CONSTRAINT "pages_blocks_quote_block_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_quote_block" ADD CONSTRAINT "pages_blocks_quote_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_cta_block_buttons" ADD CONSTRAINT "pages_blocks_cta_block_buttons_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_cta_block"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_cta_block" ADD CONSTRAINT "pages_blocks_cta_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_contact_form_block" ADD CONSTRAINT "pages_blocks_contact_form_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_timeline_block_events" ADD CONSTRAINT "pages_blocks_timeline_block_events_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "pages_blocks_timeline_block_events" ADD CONSTRAINT "pages_blocks_timeline_block_events_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_timeline_block"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_timeline_block" ADD CONSTRAINT "pages_blocks_timeline_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_divider_block" ADD CONSTRAINT "pages_blocks_divider_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_video_block" ADD CONSTRAINT "pages_blocks_video_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "pages_blocks_hero_block_order_idx" ON "pages_blocks_hero_block" USING btree ("_order");
CREATE INDEX "pages_blocks_hero_block_parent_id_idx" ON "pages_blocks_hero_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_hero_block_path_idx" ON "pages_blocks_hero_block" USING btree ("_path");
CREATE INDEX "pages_blocks_hero_block_background_image_idx" ON "pages_blocks_hero_block" USING btree ("background_image_id");
CREATE INDEX "pages_blocks_text_block_order_idx" ON "pages_blocks_text_block" USING btree ("_order");
CREATE INDEX "pages_blocks_text_block_parent_id_idx" ON "pages_blocks_text_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_text_block_path_idx" ON "pages_blocks_text_block" USING btree ("_path");
CREATE INDEX "pages_blocks_image_text_block_order_idx" ON "pages_blocks_image_text_block" USING btree ("_order");
CREATE INDEX "pages_blocks_image_text_block_parent_id_idx" ON "pages_blocks_image_text_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_image_text_block_path_idx" ON "pages_blocks_image_text_block" USING btree ("_path");
CREATE INDEX "pages_blocks_image_text_block_image_idx" ON "pages_blocks_image_text_block" USING btree ("image_id");
CREATE INDEX "pages_blocks_card_grid_block_cards_order_idx" ON "pages_blocks_card_grid_block_cards" USING btree ("_order");
CREATE INDEX "pages_blocks_card_grid_block_cards_parent_id_idx" ON "pages_blocks_card_grid_block_cards" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_card_grid_block_cards_image_idx" ON "pages_blocks_card_grid_block_cards" USING btree ("image_id");
CREATE INDEX "pages_blocks_card_grid_block_order_idx" ON "pages_blocks_card_grid_block" USING btree ("_order");
CREATE INDEX "pages_blocks_card_grid_block_parent_id_idx" ON "pages_blocks_card_grid_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_card_grid_block_path_idx" ON "pages_blocks_card_grid_block" USING btree ("_path");
CREATE INDEX "pages_blocks_quote_block_order_idx" ON "pages_blocks_quote_block" USING btree ("_order");
CREATE INDEX "pages_blocks_quote_block_parent_id_idx" ON "pages_blocks_quote_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_quote_block_path_idx" ON "pages_blocks_quote_block" USING btree ("_path");
CREATE INDEX "pages_blocks_quote_block_image_idx" ON "pages_blocks_quote_block" USING btree ("image_id");
CREATE INDEX "pages_blocks_cta_block_buttons_order_idx" ON "pages_blocks_cta_block_buttons" USING btree ("_order");
CREATE INDEX "pages_blocks_cta_block_buttons_parent_id_idx" ON "pages_blocks_cta_block_buttons" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_cta_block_order_idx" ON "pages_blocks_cta_block" USING btree ("_order");
CREATE INDEX "pages_blocks_cta_block_parent_id_idx" ON "pages_blocks_cta_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_cta_block_path_idx" ON "pages_blocks_cta_block" USING btree ("_path");
CREATE INDEX "pages_blocks_contact_form_block_order_idx" ON "pages_blocks_contact_form_block" USING btree ("_order");
CREATE INDEX "pages_blocks_contact_form_block_parent_id_idx" ON "pages_blocks_contact_form_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_contact_form_block_path_idx" ON "pages_blocks_contact_form_block" USING btree ("_path");
CREATE INDEX "pages_blocks_timeline_block_events_order_idx" ON "pages_blocks_timeline_block_events" USING btree ("_order");
CREATE INDEX "pages_blocks_timeline_block_events_parent_id_idx" ON "pages_blocks_timeline_block_events" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_timeline_block_events_image_idx" ON "pages_blocks_timeline_block_events" USING btree ("image_id");
CREATE INDEX "pages_blocks_timeline_block_order_idx" ON "pages_blocks_timeline_block" USING btree ("_order");
CREATE INDEX "pages_blocks_timeline_block_parent_id_idx" ON "pages_blocks_timeline_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_timeline_block_path_idx" ON "pages_blocks_timeline_block" USING btree ("_path");
CREATE INDEX "pages_blocks_divider_block_order_idx" ON "pages_blocks_divider_block" USING btree ("_order");
CREATE INDEX "pages_blocks_divider_block_parent_id_idx" ON "pages_blocks_divider_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_divider_block_path_idx" ON "pages_blocks_divider_block" USING btree ("_path");
CREATE INDEX "pages_blocks_video_block_order_idx" ON "pages_blocks_video_block" USING btree ("_order");
CREATE INDEX "pages_blocks_video_block_parent_id_idx" ON "pages_blocks_video_block" USING btree ("_parent_id");
CREATE INDEX "pages_blocks_video_block_path_idx" ON "pages_blocks_video_block" USING btree ("_path");
ALTER TABLE "pages" DROP COLUMN "content";`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
DROP TABLE "pages_blocks_hero_block" CASCADE;
DROP TABLE "pages_blocks_text_block" CASCADE;
DROP TABLE "pages_blocks_image_text_block" CASCADE;
DROP TABLE "pages_blocks_card_grid_block_cards" CASCADE;
DROP TABLE "pages_blocks_card_grid_block" CASCADE;
DROP TABLE "pages_blocks_quote_block" CASCADE;
DROP TABLE "pages_blocks_cta_block_buttons" CASCADE;
DROP TABLE "pages_blocks_cta_block" CASCADE;
DROP TABLE "pages_blocks_contact_form_block" CASCADE;
DROP TABLE "pages_blocks_timeline_block_events" CASCADE;
DROP TABLE "pages_blocks_timeline_block" CASCADE;
DROP TABLE "pages_blocks_divider_block" CASCADE;
DROP TABLE "pages_blocks_video_block" CASCADE;
ALTER TABLE "pages" ADD COLUMN "content" jsonb;
DROP TYPE "public"."enum_pages_blocks_hero_block_alignment";
DROP TYPE "public"."enum_pages_blocks_hero_block_cta_style";
DROP TYPE "public"."enum_pages_blocks_text_block_width";
DROP TYPE "public"."enum_pages_blocks_image_text_block_image_position";
DROP TYPE "public"."enum_pages_blocks_card_grid_block_columns";
DROP TYPE "public"."enum_pages_blocks_quote_block_style";
DROP TYPE "public"."enum_pages_blocks_cta_block_buttons_style";
DROP TYPE "public"."enum_pages_blocks_cta_block_background_color";
DROP TYPE "public"."enum_pages_blocks_divider_block_style";
DROP TYPE "public"."enum_pages_blocks_divider_block_spacing";
DROP TYPE "public"."enum_pages_blocks_video_block_aspect_ratio";`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,122 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_cookie_configurations_enabled_categories" AS ENUM('necessary', 'functional', 'analytics', 'marketing');
CREATE TYPE "public"."enum_cookie_configurations_styling_position" AS ENUM('bottom', 'top', 'middle');
CREATE TYPE "public"."enum_cookie_configurations_styling_theme" AS ENUM('dark', 'light', 'auto');
CREATE TYPE "public"."enum_cookie_inventory_category" AS ENUM('necessary', 'functional', 'analytics', 'marketing');
CREATE TABLE "cookie_configurations_enabled_categories" (
"order" integer NOT NULL,
"parent_id" integer NOT NULL,
"value" "enum_cookie_configurations_enabled_categories",
"id" serial PRIMARY KEY NOT NULL
);
CREATE TABLE "cookie_configurations" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer NOT NULL,
"title" varchar DEFAULT 'Cookie-Einstellungen' NOT NULL,
"revision" numeric DEFAULT 1 NOT NULL,
"translations_de_banner_title" varchar DEFAULT 'Wir respektieren Ihre Privatsphäre',
"translations_de_banner_description" varchar DEFAULT 'Diese Website verwendet Cookies, um Ihnen die bestmögliche Erfahrung zu bieten. Sie können Ihre Einstellungen jederzeit anpassen.',
"translations_de_accept_all_button" varchar DEFAULT 'Alle akzeptieren',
"translations_de_accept_necessary_button" varchar DEFAULT 'Nur notwendige',
"translations_de_settings_button" varchar DEFAULT 'Einstellungen',
"translations_de_save_button" varchar DEFAULT 'Auswahl speichern',
"translations_de_privacy_policy_url" varchar DEFAULT '/datenschutz',
"translations_de_category_labels_necessary_title" varchar DEFAULT 'Notwendig',
"translations_de_category_labels_necessary_description" varchar DEFAULT 'Diese Cookies sind für die Grundfunktionen der Website erforderlich.',
"translations_de_category_labels_functional_title" varchar DEFAULT 'Funktional',
"translations_de_category_labels_functional_description" varchar DEFAULT 'Diese Cookies ermöglichen erweiterte Funktionen und Personalisierung.',
"translations_de_category_labels_analytics_title" varchar DEFAULT 'Statistik',
"translations_de_category_labels_analytics_description" varchar DEFAULT 'Diese Cookies helfen uns zu verstehen, wie Besucher mit der Website interagieren.',
"translations_de_category_labels_marketing_title" varchar DEFAULT 'Marketing',
"translations_de_category_labels_marketing_description" varchar DEFAULT 'Diese Cookies werden verwendet, um Werbung relevanter für Sie zu gestalten.',
"styling_position" "enum_cookie_configurations_styling_position" DEFAULT 'bottom',
"styling_theme" "enum_cookie_configurations_styling_theme" DEFAULT 'dark',
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "cookie_inventory" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer NOT NULL,
"name" varchar NOT NULL,
"provider" varchar NOT NULL,
"category" "enum_cookie_inventory_category" NOT NULL,
"duration" varchar NOT NULL,
"description" varchar NOT NULL,
"is_active" boolean DEFAULT true,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE TABLE "consent_logs" (
"id" serial PRIMARY KEY NOT NULL,
"consent_id" varchar NOT NULL,
"client_ref" varchar,
"tenant_id" integer NOT NULL,
"categories" jsonb NOT NULL,
"revision" numeric NOT NULL,
"user_agent" varchar,
"anonymized_ip" varchar,
"expires_at" timestamp(3) with time zone NOT NULL,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "cookie_configurations_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "cookie_inventory_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "consent_logs_id" integer;
ALTER TABLE "cookie_configurations_enabled_categories" ADD CONSTRAINT "cookie_configurations_enabled_categories_parent_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."cookie_configurations"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "cookie_configurations" ADD CONSTRAINT "cookie_configurations_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "cookie_inventory" ADD CONSTRAINT "cookie_inventory_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "consent_logs" ADD CONSTRAINT "consent_logs_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
CREATE INDEX "cookie_configurations_enabled_categories_order_idx" ON "cookie_configurations_enabled_categories" USING btree ("order");
CREATE INDEX "cookie_configurations_enabled_categories_parent_idx" ON "cookie_configurations_enabled_categories" USING btree ("parent_id");
CREATE UNIQUE INDEX "cookie_configurations_tenant_idx" ON "cookie_configurations" USING btree ("tenant_id");
CREATE INDEX "cookie_configurations_updated_at_idx" ON "cookie_configurations" USING btree ("updated_at");
CREATE INDEX "cookie_configurations_created_at_idx" ON "cookie_configurations" USING btree ("created_at");
CREATE INDEX "cookie_inventory_tenant_idx" ON "cookie_inventory" USING btree ("tenant_id");
CREATE INDEX "cookie_inventory_updated_at_idx" ON "cookie_inventory" USING btree ("updated_at");
CREATE INDEX "cookie_inventory_created_at_idx" ON "cookie_inventory" USING btree ("created_at");
CREATE UNIQUE INDEX "consent_logs_consent_id_idx" ON "consent_logs" USING btree ("consent_id");
CREATE INDEX "consent_logs_tenant_idx" ON "consent_logs" USING btree ("tenant_id");
CREATE INDEX "consent_logs_updated_at_idx" ON "consent_logs" USING btree ("updated_at");
CREATE INDEX "consent_logs_created_at_idx" ON "consent_logs" USING btree ("created_at");
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_cookie_configurations_fk" FOREIGN KEY ("cookie_configurations_id") REFERENCES "public"."cookie_configurations"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_cookie_inventory_fk" FOREIGN KEY ("cookie_inventory_id") REFERENCES "public"."cookie_inventory"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_consent_logs_fk" FOREIGN KEY ("consent_logs_id") REFERENCES "public"."consent_logs"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "payload_locked_documents_rels_cookie_configurations_id_idx" ON "payload_locked_documents_rels" USING btree ("cookie_configurations_id");
CREATE INDEX "payload_locked_documents_rels_cookie_inventory_id_idx" ON "payload_locked_documents_rels" USING btree ("cookie_inventory_id");
CREATE INDEX "payload_locked_documents_rels_consent_logs_id_idx" ON "payload_locked_documents_rels" USING btree ("consent_logs_id");`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "cookie_configurations_enabled_categories" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "cookie_configurations" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "cookie_inventory" DISABLE ROW LEVEL SECURITY;
ALTER TABLE "consent_logs" DISABLE ROW LEVEL SECURITY;
DROP TABLE "cookie_configurations_enabled_categories" CASCADE;
DROP TABLE "cookie_configurations" CASCADE;
DROP TABLE "cookie_inventory" CASCADE;
DROP TABLE "consent_logs" CASCADE;
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_cookie_configurations_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_cookie_inventory_fk";
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_consent_logs_fk";
DROP INDEX "payload_locked_documents_rels_cookie_configurations_id_idx";
DROP INDEX "payload_locked_documents_rels_cookie_inventory_id_idx";
DROP INDEX "payload_locked_documents_rels_consent_logs_id_idx";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "cookie_configurations_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "cookie_inventory_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "consent_logs_id";
DROP TYPE "public"."enum_cookie_configurations_enabled_categories";
DROP TYPE "public"."enum_cookie_configurations_styling_position";
DROP TYPE "public"."enum_cookie_configurations_styling_theme";
DROP TYPE "public"."enum_cookie_inventory_category";`)
}

File diff suppressed because it is too large Load diff

View file

@ -1,61 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
CREATE TYPE "public"."enum_privacy_policy_settings_provider" AS ENUM('alfright', 'internal');
CREATE TYPE "public"."enum_privacy_policy_settings_alfright_language" AS ENUM('de-de', 'de-at', 'de-ch', 'en-gb', 'en-us');
CREATE TABLE "privacy_policy_settings" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer NOT NULL,
"title" varchar DEFAULT 'Datenschutzerklärung' NOT NULL,
"provider" "enum_privacy_policy_settings_provider" DEFAULT 'alfright' NOT NULL,
"alfright_tenant_id" varchar DEFAULT 'alfright_schutzteam',
"alfright_api_key" varchar,
"alfright_language" "enum_privacy_policy_settings_alfright_language" DEFAULT 'de-de',
"alfright_iframe_height" numeric DEFAULT 4000,
"styling_header_color" varchar DEFAULT '#ca8a04',
"styling_header_font" varchar DEFAULT 'Inter, sans-serif',
"styling_header_size" varchar DEFAULT '24px',
"styling_subheader_size" varchar DEFAULT '18px',
"styling_font_color" varchar DEFAULT '#f3f4f6',
"styling_text_font" varchar DEFAULT 'Inter, sans-serif',
"styling_text_size" varchar DEFAULT '16px',
"styling_link_color" varchar DEFAULT '#ca8a04',
"styling_background_color" varchar DEFAULT '#111827',
"show_cookie_table" boolean DEFAULT true,
"cookie_table_title" varchar DEFAULT 'Übersicht der verwendeten Cookies',
"cookie_table_description" varchar DEFAULT 'Ergänzend zur Datenschutzerklärung finden Sie hier eine detaillierte Übersicht aller auf dieser Website eingesetzten Cookies. Sie können Ihre Cookie-Einstellungen jederzeit über den Link "Cookie-Einstellungen" im Footer anpassen.',
"seo_meta_title" varchar DEFAULT 'Datenschutzerklärung',
"seo_meta_description" varchar DEFAULT 'Informationen zum Datenschutz und zur Verarbeitung Ihrer personenbezogenen Daten.',
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_banner_description" SET DEFAULT 'Diese Website verwendet Cookies, um Ihnen die bestmögliche Erfahrung zu bieten.';
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_category_labels_functional_description" SET DEFAULT 'Diese Cookies ermöglichen erweiterte Funktionen.';
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_category_labels_analytics_description" SET DEFAULT 'Diese Cookies helfen uns zu verstehen, wie Besucher die Website nutzen.';
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_category_labels_marketing_description" SET DEFAULT 'Diese Cookies werden für Werbezwecke verwendet.';
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "privacy_policy_settings_id" integer;
ALTER TABLE "privacy_policy_settings" ADD CONSTRAINT "privacy_policy_settings_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
CREATE UNIQUE INDEX "privacy_policy_settings_tenant_idx" ON "privacy_policy_settings" USING btree ("tenant_id");
CREATE INDEX "privacy_policy_settings_updated_at_idx" ON "privacy_policy_settings" USING btree ("updated_at");
CREATE INDEX "privacy_policy_settings_created_at_idx" ON "privacy_policy_settings" USING btree ("created_at");
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_privacy_policy_settings_fk" FOREIGN KEY ("privacy_policy_settings_id") REFERENCES "public"."privacy_policy_settings"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "payload_locked_documents_rels_privacy_policy_settings_id_idx" ON "payload_locked_documents_rels" USING btree ("privacy_policy_settings_id");`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "privacy_policy_settings" DISABLE ROW LEVEL SECURITY;
DROP TABLE "privacy_policy_settings" CASCADE;
ALTER TABLE "payload_locked_documents_rels" DROP CONSTRAINT "payload_locked_documents_rels_privacy_policy_settings_fk";
DROP INDEX "payload_locked_documents_rels_privacy_policy_settings_id_idx";
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_banner_description" SET DEFAULT 'Diese Website verwendet Cookies, um Ihnen die bestmögliche Erfahrung zu bieten. Sie können Ihre Einstellungen jederzeit anpassen.';
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_category_labels_functional_description" SET DEFAULT 'Diese Cookies ermöglichen erweiterte Funktionen und Personalisierung.';
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_category_labels_analytics_description" SET DEFAULT 'Diese Cookies helfen uns zu verstehen, wie Besucher mit der Website interagieren.';
ALTER TABLE "cookie_configurations" ALTER COLUMN "translations_de_category_labels_marketing_description" SET DEFAULT 'Diese Cookies werden verwendet, um Werbung relevanter für Sie zu gestalten.';
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN "privacy_policy_settings_id";
DROP TYPE "public"."enum_privacy_policy_settings_provider";
DROP TYPE "public"."enum_privacy_policy_settings_alfright_language";`)
}

View file

@ -1,170 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
-- ENUMs für neue Collections
CREATE TYPE "public"."enum_posts_type" AS ENUM('blog', 'news', 'press', 'announcement');
CREATE TYPE "public"."enum_newsletter_subscribers_status" AS ENUM('pending', 'confirmed', 'unsubscribed', 'bounced');
-- Testimonials Collection
CREATE TABLE IF NOT EXISTS "testimonials" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer,
"quote" varchar NOT NULL,
"author" varchar NOT NULL,
"role" varchar,
"company" varchar,
"image_id" integer,
"rating" numeric,
"source" varchar,
"source_url" varchar,
"date" timestamp(3) with time zone,
"is_active" boolean DEFAULT true,
"order" integer DEFAULT 0,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE INDEX IF NOT EXISTS "testimonials_tenant_idx" ON "testimonials" USING btree ("tenant_id");
CREATE INDEX IF NOT EXISTS "testimonials_created_at_idx" ON "testimonials" USING btree ("created_at");
CREATE INDEX IF NOT EXISTS "testimonials_updated_at_idx" ON "testimonials" USING btree ("updated_at");
ALTER TABLE "testimonials" ADD CONSTRAINT "testimonials_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "testimonials" ADD CONSTRAINT "testimonials_image_id_media_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
-- Newsletter Subscribers Collection
CREATE TABLE IF NOT EXISTS "newsletter_subscribers" (
"id" serial PRIMARY KEY NOT NULL,
"tenant_id" integer,
"email" varchar NOT NULL,
"first_name" varchar,
"last_name" varchar,
"status" "enum_newsletter_subscribers_status" DEFAULT 'pending',
"source" varchar,
"subscribed_at" timestamp(3) with time zone,
"confirmed_at" timestamp(3) with time zone,
"unsubscribed_at" timestamp(3) with time zone,
"confirmation_token" varchar,
"ip_address" varchar,
"user_agent" varchar,
"updated_at" timestamp(3) with time zone DEFAULT now() NOT NULL,
"created_at" timestamp(3) with time zone DEFAULT now() NOT NULL
);
CREATE INDEX IF NOT EXISTS "newsletter_subscribers_tenant_idx" ON "newsletter_subscribers" USING btree ("tenant_id");
CREATE INDEX IF NOT EXISTS "newsletter_subscribers_email_idx" ON "newsletter_subscribers" USING btree ("email");
CREATE INDEX IF NOT EXISTS "newsletter_subscribers_created_at_idx" ON "newsletter_subscribers" USING btree ("created_at");
ALTER TABLE "newsletter_subscribers" ADD CONSTRAINT "newsletter_subscribers_tenant_id_tenants_id_fk" FOREIGN KEY ("tenant_id") REFERENCES "public"."tenants"("id") ON DELETE set null ON UPDATE no action;
-- Newsletter Subscribers Interests (hasMany select)
CREATE TABLE IF NOT EXISTS "newsletter_subscribers_interests" (
"order" integer NOT NULL,
"parent_id" integer NOT NULL,
"value" varchar,
"id" serial PRIMARY KEY NOT NULL
);
CREATE INDEX IF NOT EXISTS "newsletter_subscribers_interests_order_idx" ON "newsletter_subscribers_interests" USING btree ("order");
CREATE INDEX IF NOT EXISTS "newsletter_subscribers_interests_parent_idx" ON "newsletter_subscribers_interests" USING btree ("parent_id");
ALTER TABLE "newsletter_subscribers_interests" ADD CONSTRAINT "newsletter_subscribers_interests_parent_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."newsletter_subscribers"("id") ON DELETE cascade ON UPDATE no action;
-- Pages Rels (für Block-Relationships)
CREATE TABLE IF NOT EXISTS "pages_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" integer NOT NULL,
"path" varchar NOT NULL,
"categories_id" integer,
"testimonials_id" integer
);
CREATE INDEX IF NOT EXISTS "pages_rels_order_idx" ON "pages_rels" USING btree ("order");
CREATE INDEX IF NOT EXISTS "pages_rels_parent_idx" ON "pages_rels" USING btree ("parent_id");
CREATE INDEX IF NOT EXISTS "pages_rels_path_idx" ON "pages_rels" USING btree ("path");
ALTER TABLE "pages_rels" ADD CONSTRAINT "pages_rels_parent_id_pages_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_rels" ADD CONSTRAINT "pages_rels_categories_id_categories_id_fk" FOREIGN KEY ("categories_id") REFERENCES "public"."categories"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_rels" ADD CONSTRAINT "pages_rels_testimonials_id_testimonials_id_fk" FOREIGN KEY ("testimonials_id") REFERENCES "public"."testimonials"("id") ON DELETE cascade ON UPDATE no action;
-- Posts Rels (für Category Relationships)
CREATE TABLE IF NOT EXISTS "posts_rels" (
"id" serial PRIMARY KEY NOT NULL,
"order" integer,
"parent_id" integer NOT NULL,
"path" varchar NOT NULL,
"categories_id" integer
);
CREATE INDEX IF NOT EXISTS "posts_rels_order_idx" ON "posts_rels" USING btree ("order");
CREATE INDEX IF NOT EXISTS "posts_rels_parent_idx" ON "posts_rels" USING btree ("parent_id");
CREATE INDEX IF NOT EXISTS "posts_rels_path_idx" ON "posts_rels" USING btree ("path");
ALTER TABLE "posts_rels" ADD CONSTRAINT "posts_rels_parent_id_posts_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."posts"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "posts_rels" ADD CONSTRAINT "posts_rels_categories_id_categories_id_fk" FOREIGN KEY ("categories_id") REFERENCES "public"."categories"("id") ON DELETE cascade ON UPDATE no action;
-- Füge type-Feld zu posts hinzu (falls nicht vorhanden)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'posts' AND column_name = 'type') THEN
ALTER TABLE "posts" ADD COLUMN "type" "enum_posts_type" DEFAULT 'blog';
END IF;
END $$;
-- Füge isFeatured-Feld zu posts hinzu (falls nicht vorhanden)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'posts' AND column_name = 'is_featured') THEN
ALTER TABLE "posts" ADD COLUMN "is_featured" boolean DEFAULT false;
END IF;
END $$;
-- Füge excerpt-Feld zu posts hinzu (falls nicht vorhanden)
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'posts' AND column_name = 'excerpt') THEN
ALTER TABLE "posts" ADD COLUMN "excerpt" varchar;
END IF;
END $$;
-- Payload Locked Documents Rels erweitern
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'payload_locked_documents_rels' AND column_name = 'testimonials_id') THEN
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "testimonials_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_testimonials_fk" FOREIGN KEY ("testimonials_id") REFERENCES "public"."testimonials"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "payload_locked_documents_rels_testimonials_id_idx" ON "payload_locked_documents_rels" USING btree ("testimonials_id");
END IF;
END $$;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_name = 'payload_locked_documents_rels' AND column_name = 'newsletter_subscribers_id') THEN
ALTER TABLE "payload_locked_documents_rels" ADD COLUMN "newsletter_subscribers_id" integer;
ALTER TABLE "payload_locked_documents_rels" ADD CONSTRAINT "payload_locked_documents_rels_newsletter_subscribers_fk" FOREIGN KEY ("newsletter_subscribers_id") REFERENCES "public"."newsletter_subscribers"("id") ON DELETE cascade ON UPDATE no action;
CREATE INDEX "payload_locked_documents_rels_newsletter_subscribers_id_idx" ON "payload_locked_documents_rels" USING btree ("newsletter_subscribers_id");
END IF;
END $$;
`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
DROP TABLE IF EXISTS "pages_rels" CASCADE;
DROP TABLE IF EXISTS "posts_rels" CASCADE;
DROP TABLE IF EXISTS "newsletter_subscribers_interests" CASCADE;
DROP TABLE IF EXISTS "newsletter_subscribers" CASCADE;
DROP TABLE IF EXISTS "testimonials" CASCADE;
ALTER TABLE "posts" DROP COLUMN IF EXISTS "type";
ALTER TABLE "posts" DROP COLUMN IF EXISTS "is_featured";
ALTER TABLE "posts" DROP COLUMN IF EXISTS "excerpt";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN IF EXISTS "testimonials_id";
ALTER TABLE "payload_locked_documents_rels" DROP COLUMN IF EXISTS "newsletter_subscribers_id";
DROP TYPE IF EXISTS "enum_posts_type";
DROP TYPE IF EXISTS "enum_newsletter_subscribers_status";
`)
}

View file

@ -1,177 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
-- Neue Felder für Media Collection
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "caption" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "credit" varchar;
-- Image Size Spalten für optimierte Bildvarianten
-- WebP Varianten
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_thumbnail_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_thumbnail_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_thumbnail_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_thumbnail_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_thumbnail_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_thumbnail_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_small_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_small_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_small_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_small_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_small_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_small_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_2k_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_2k_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_2k_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_2k_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_2k_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_2k_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_og_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_og_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_og_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_og_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_og_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_og_filename" varchar;
-- AVIF Varianten
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_avif_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_avif_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_avif_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_avif_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_avif_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_medium_avif_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_avif_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_avif_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_avif_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_avif_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_avif_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_large_avif_filename" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_avif_url" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_avif_width" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_avif_height" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_avif_mime_type" varchar;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_avif_filesize" numeric;
ALTER TABLE "media" ADD COLUMN IF NOT EXISTS "sizes_xlarge_avif_filename" varchar;
-- Tags Tabelle (hasMany text)
CREATE TABLE IF NOT EXISTS "media_tags" (
"order" integer NOT NULL,
"parent_id" integer NOT NULL,
"value" varchar,
"id" serial PRIMARY KEY NOT NULL
);
CREATE INDEX IF NOT EXISTS "media_tags_order_idx" ON "media_tags" USING btree ("order");
CREATE INDEX IF NOT EXISTS "media_tags_parent_idx" ON "media_tags" USING btree ("parent_id");
ALTER TABLE "media_tags" DROP CONSTRAINT IF EXISTS "media_tags_parent_id_fk";
ALTER TABLE "media_tags" ADD CONSTRAINT "media_tags_parent_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action;
`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
ALTER TABLE "media" DROP COLUMN IF EXISTS "caption";
ALTER TABLE "media" DROP COLUMN IF EXISTS "credit";
-- WebP Sizes
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_thumbnail_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_thumbnail_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_thumbnail_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_thumbnail_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_thumbnail_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_thumbnail_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_small_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_small_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_small_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_small_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_small_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_small_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_2k_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_2k_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_2k_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_2k_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_2k_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_2k_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_og_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_og_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_og_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_og_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_og_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_og_filename";
-- AVIF Sizes
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_avif_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_avif_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_avif_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_avif_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_avif_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_medium_avif_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_avif_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_avif_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_avif_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_avif_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_avif_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_large_avif_filename";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_avif_url";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_avif_width";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_avif_height";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_avif_mime_type";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_avif_filesize";
ALTER TABLE "media" DROP COLUMN IF EXISTS "sizes_xlarge_avif_filename";
DROP TABLE IF EXISTS "media_tags" CASCADE;
`)
}

View file

@ -1,269 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
-- Posts List Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_posts_list_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar,
"subtitle" varchar,
"post_type" varchar DEFAULT 'blog',
"layout" varchar DEFAULT 'grid',
"columns" varchar DEFAULT '3',
"limit" integer DEFAULT 6,
"show_featured_only" boolean DEFAULT false,
"show_excerpt" boolean DEFAULT true,
"show_date" boolean DEFAULT true,
"show_author" boolean DEFAULT false,
"show_category" boolean DEFAULT true,
"show_pagination" boolean DEFAULT false,
"show_read_more" boolean DEFAULT true,
"read_more_label" varchar DEFAULT 'Alle Beiträge anzeigen',
"read_more_link" varchar DEFAULT '/blog',
"background_color" varchar DEFAULT 'white',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_posts_list_block_parent_idx" ON "pages_blocks_posts_list_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_posts_list_block_order_idx" ON "pages_blocks_posts_list_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_posts_list_block_path_idx" ON "pages_blocks_posts_list_block" USING btree ("_path");
ALTER TABLE "pages_blocks_posts_list_block" DROP CONSTRAINT IF EXISTS "pages_blocks_posts_list_block_parent_id_fk";
ALTER TABLE "pages_blocks_posts_list_block" ADD CONSTRAINT "pages_blocks_posts_list_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
-- Testimonials Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_testimonials_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar DEFAULT 'Das sagen unsere Kunden',
"subtitle" varchar,
"layout" varchar DEFAULT 'slider',
"columns" varchar DEFAULT '3',
"display_mode" varchar DEFAULT 'all',
"limit" integer DEFAULT 6,
"show_rating" boolean DEFAULT true,
"show_image" boolean DEFAULT true,
"show_company" boolean DEFAULT true,
"show_source" boolean DEFAULT false,
"autoplay" boolean DEFAULT true,
"autoplay_speed" integer DEFAULT 5000,
"background_color" varchar DEFAULT 'light',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_testimonials_block_parent_idx" ON "pages_blocks_testimonials_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_testimonials_block_order_idx" ON "pages_blocks_testimonials_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_testimonials_block_path_idx" ON "pages_blocks_testimonials_block" USING btree ("_path");
ALTER TABLE "pages_blocks_testimonials_block" DROP CONSTRAINT IF EXISTS "pages_blocks_testimonials_block_parent_id_fk";
ALTER TABLE "pages_blocks_testimonials_block" ADD CONSTRAINT "pages_blocks_testimonials_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
-- Newsletter Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_newsletter_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar DEFAULT 'Newsletter abonnieren',
"subtitle" varchar,
"layout" varchar DEFAULT 'inline',
"image_id" integer,
"image_position" varchar DEFAULT 'left',
"collect_name" boolean DEFAULT false,
"show_interests" boolean DEFAULT false,
"button_text" varchar DEFAULT 'Anmelden',
"placeholder_email" varchar DEFAULT 'Ihre E-Mail-Adresse',
"success_message" varchar,
"error_message" varchar,
"privacy_text" varchar,
"privacy_link" varchar DEFAULT '/datenschutz',
"source" varchar DEFAULT 'website',
"background_color" varchar DEFAULT 'accent',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_parent_idx" ON "pages_blocks_newsletter_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_order_idx" ON "pages_blocks_newsletter_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_path_idx" ON "pages_blocks_newsletter_block" USING btree ("_path");
ALTER TABLE "pages_blocks_newsletter_block" DROP CONSTRAINT IF EXISTS "pages_blocks_newsletter_block_parent_id_fk";
ALTER TABLE "pages_blocks_newsletter_block" ADD CONSTRAINT "pages_blocks_newsletter_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_newsletter_block" DROP CONSTRAINT IF EXISTS "pages_blocks_newsletter_block_image_id_fk";
ALTER TABLE "pages_blocks_newsletter_block" ADD CONSTRAINT "pages_blocks_newsletter_block_image_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
-- Newsletter Block Available Interests (hasMany select)
CREATE TABLE IF NOT EXISTS "pages_blocks_newsletter_block_available_interests" (
"id" serial PRIMARY KEY NOT NULL,
"parent_id" integer NOT NULL,
"order" integer NOT NULL,
"value" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_available_interests_parent_idx" ON "pages_blocks_newsletter_block_available_interests" USING btree ("parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_newsletter_block_available_interests_order_idx" ON "pages_blocks_newsletter_block_available_interests" USING btree ("order");
ALTER TABLE "pages_blocks_newsletter_block_available_interests" DROP CONSTRAINT IF EXISTS "pages_blocks_newsletter_block_available_interests_parent_id_fk";
ALTER TABLE "pages_blocks_newsletter_block_available_interests" ADD CONSTRAINT "pages_blocks_newsletter_block_available_interests_parent_id_fk" FOREIGN KEY ("parent_id") REFERENCES "public"."pages_blocks_newsletter_block"("id") ON DELETE cascade ON UPDATE no action;
-- Process Steps Block Table
CREATE TABLE IF NOT EXISTS "pages_blocks_process_steps_block" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"_path" varchar NOT NULL,
"title" varchar DEFAULT 'So funktioniert es',
"subtitle" varchar,
"layout" varchar DEFAULT 'horizontal',
"show_numbers" boolean DEFAULT true,
"show_icons" boolean DEFAULT true,
"cta_show" boolean DEFAULT false,
"cta_label" varchar DEFAULT 'Jetzt starten',
"cta_href" varchar,
"cta_variant" varchar DEFAULT 'default',
"background_color" varchar DEFAULT 'white',
"block_name" varchar
);
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_parent_idx" ON "pages_blocks_process_steps_block" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_order_idx" ON "pages_blocks_process_steps_block" USING btree ("_order");
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_path_idx" ON "pages_blocks_process_steps_block" USING btree ("_path");
ALTER TABLE "pages_blocks_process_steps_block" DROP CONSTRAINT IF EXISTS "pages_blocks_process_steps_block_parent_id_fk";
ALTER TABLE "pages_blocks_process_steps_block" ADD CONSTRAINT "pages_blocks_process_steps_block_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages"("id") ON DELETE cascade ON UPDATE no action;
-- Process Steps Block Steps (array)
CREATE TABLE IF NOT EXISTS "pages_blocks_process_steps_block_steps" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"title" varchar NOT NULL,
"description" varchar,
"icon" varchar,
"image_id" integer
);
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_steps_parent_idx" ON "pages_blocks_process_steps_block_steps" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "pages_blocks_process_steps_block_steps_order_idx" ON "pages_blocks_process_steps_block_steps" USING btree ("_order");
ALTER TABLE "pages_blocks_process_steps_block_steps" DROP CONSTRAINT IF EXISTS "pages_blocks_process_steps_block_steps_parent_id_fk";
ALTER TABLE "pages_blocks_process_steps_block_steps" ADD CONSTRAINT "pages_blocks_process_steps_block_steps_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."pages_blocks_process_steps_block"("id") ON DELETE cascade ON UPDATE no action;
ALTER TABLE "pages_blocks_process_steps_block_steps" DROP CONSTRAINT IF EXISTS "pages_blocks_process_steps_block_steps_image_id_fk";
ALTER TABLE "pages_blocks_process_steps_block_steps" ADD CONSTRAINT "pages_blocks_process_steps_block_steps_image_id_fk" FOREIGN KEY ("image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
-- SEO Settings Global
CREATE TABLE IF NOT EXISTS "seo_settings" (
"id" serial PRIMARY KEY NOT NULL,
"meta_defaults_title_suffix" varchar DEFAULT '| Website',
"meta_defaults_default_description" varchar,
"meta_defaults_default_og_image_id" integer,
"organization_name" varchar,
"organization_legal_name" varchar,
"organization_description" varchar,
"organization_logo_id" integer,
"organization_founding_date" timestamp(3) with time zone,
"contact_email" varchar,
"contact_phone" varchar,
"contact_fax" varchar,
"address_street" varchar,
"address_postal_code" varchar,
"address_city" varchar,
"address_region" varchar,
"address_country" varchar DEFAULT 'Deutschland',
"address_country_code" varchar DEFAULT 'DE',
"geo_latitude" numeric,
"geo_longitude" numeric,
"local_business_enabled" boolean DEFAULT false,
"local_business_type" varchar,
"local_business_price_range" varchar,
"robots_allow_indexing" boolean DEFAULT true,
"verification_google" varchar,
"verification_bing" varchar,
"verification_yandex" varchar,
"updated_at" timestamp(3) with time zone,
"created_at" timestamp(3) with time zone
);
ALTER TABLE "seo_settings" DROP CONSTRAINT IF EXISTS "seo_settings_meta_defaults_default_og_image_id_fk";
ALTER TABLE "seo_settings" ADD CONSTRAINT "seo_settings_meta_defaults_default_og_image_id_fk" FOREIGN KEY ("meta_defaults_default_og_image_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
ALTER TABLE "seo_settings" DROP CONSTRAINT IF EXISTS "seo_settings_organization_logo_id_fk";
ALTER TABLE "seo_settings" ADD CONSTRAINT "seo_settings_organization_logo_id_fk" FOREIGN KEY ("organization_logo_id") REFERENCES "public"."media"("id") ON DELETE set null ON UPDATE no action;
-- SEO Settings Keywords (hasMany text)
CREATE TABLE IF NOT EXISTS "seo_settings_meta_defaults_keywords" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"order" integer NOT NULL,
"value" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_meta_defaults_keywords_parent_idx" ON "seo_settings_meta_defaults_keywords" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_meta_defaults_keywords_order_idx" ON "seo_settings_meta_defaults_keywords" USING btree ("order");
ALTER TABLE "seo_settings_meta_defaults_keywords" DROP CONSTRAINT IF EXISTS "seo_settings_meta_defaults_keywords_parent_id_fk";
ALTER TABLE "seo_settings_meta_defaults_keywords" ADD CONSTRAINT "seo_settings_meta_defaults_keywords_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
-- SEO Settings Social Profiles (array)
CREATE TABLE IF NOT EXISTS "seo_settings_social_profiles" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"platform" varchar,
"url" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_social_profiles_parent_idx" ON "seo_settings_social_profiles" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_social_profiles_order_idx" ON "seo_settings_social_profiles" USING btree ("_order");
ALTER TABLE "seo_settings_social_profiles" DROP CONSTRAINT IF EXISTS "seo_settings_social_profiles_parent_id_fk";
ALTER TABLE "seo_settings_social_profiles" ADD CONSTRAINT "seo_settings_social_profiles_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
-- SEO Settings Opening Hours (array)
CREATE TABLE IF NOT EXISTS "seo_settings_local_business_opening_hours" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"_order" integer NOT NULL,
"specification" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_local_business_opening_hours_parent_idx" ON "seo_settings_local_business_opening_hours" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_local_business_opening_hours_order_idx" ON "seo_settings_local_business_opening_hours" USING btree ("_order");
ALTER TABLE "seo_settings_local_business_opening_hours" DROP CONSTRAINT IF EXISTS "seo_settings_local_business_opening_hours_parent_id_fk";
ALTER TABLE "seo_settings_local_business_opening_hours" ADD CONSTRAINT "seo_settings_local_business_opening_hours_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
-- SEO Settings Additional Disallow Paths (hasMany text)
CREATE TABLE IF NOT EXISTS "seo_settings_robots_additional_disallow" (
"id" serial PRIMARY KEY NOT NULL,
"_parent_id" integer NOT NULL,
"order" integer NOT NULL,
"value" varchar
);
CREATE INDEX IF NOT EXISTS "seo_settings_robots_additional_disallow_parent_idx" ON "seo_settings_robots_additional_disallow" USING btree ("_parent_id");
CREATE INDEX IF NOT EXISTS "seo_settings_robots_additional_disallow_order_idx" ON "seo_settings_robots_additional_disallow" USING btree ("order");
ALTER TABLE "seo_settings_robots_additional_disallow" DROP CONSTRAINT IF EXISTS "seo_settings_robots_additional_disallow_parent_id_fk";
ALTER TABLE "seo_settings_robots_additional_disallow" ADD CONSTRAINT "seo_settings_robots_additional_disallow_parent_id_fk" FOREIGN KEY ("_parent_id") REFERENCES "public"."seo_settings"("id") ON DELETE cascade ON UPDATE no action;
`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
DROP TABLE IF EXISTS "pages_blocks_posts_list_block" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_testimonials_block" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_newsletter_block_available_interests" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_newsletter_block" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_process_steps_block_steps" CASCADE;
DROP TABLE IF EXISTS "pages_blocks_process_steps_block" CASCADE;
DROP TABLE IF EXISTS "seo_settings_meta_defaults_keywords" CASCADE;
DROP TABLE IF EXISTS "seo_settings_social_profiles" CASCADE;
DROP TABLE IF EXISTS "seo_settings_local_business_opening_hours" CASCADE;
DROP TABLE IF EXISTS "seo_settings_robots_additional_disallow" CASCADE;
DROP TABLE IF EXISTS "seo_settings" CASCADE;
`)
}

View file

@ -1,50 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
/**
* Migration zur Behebung der Schema-Divergenz zwischen Code und Datenbank
*
* Hauptänderungen:
* - media_tags media_texts umbenennen (Payload 3.x Konvention)
* - Spaltenstruktur anpassen (path-Feld hinzufügen)
*/
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
await db.execute(sql`
-- Umbenennen von media_tags zu media_texts
ALTER TABLE IF EXISTS "media_tags" RENAME TO "media_texts";
-- Spalte 'path' hinzufügen falls nicht vorhanden (Payload 3.x benötigt diese)
ALTER TABLE "media_texts" ADD COLUMN IF NOT EXISTS "path" varchar NOT NULL DEFAULT 'tags';
-- Indices umbenennen
ALTER INDEX IF EXISTS "media_tags_order_idx" RENAME TO "media_texts_order_idx";
ALTER INDEX IF EXISTS "media_tags_parent_idx" RENAME TO "media_texts_parent_idx";
-- Constraint umbenennen
ALTER TABLE "media_texts" DROP CONSTRAINT IF EXISTS "media_tags_parent_id_fk";
ALTER TABLE "media_texts" ADD CONSTRAINT "media_texts_parent_id_fk"
FOREIGN KEY ("parent_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action;
-- Path Index hinzufügen
CREATE INDEX IF NOT EXISTS "media_texts_path_idx" ON "media_texts" USING btree ("path");
`)
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
await db.execute(sql`
-- Zurück umbenennen
ALTER TABLE IF EXISTS "media_texts" RENAME TO "media_tags";
-- Spalte entfernen
ALTER TABLE "media_tags" DROP COLUMN IF EXISTS "path";
-- Indices zurück umbenennen
ALTER INDEX IF EXISTS "media_texts_order_idx" RENAME TO "media_tags_order_idx";
ALTER INDEX IF EXISTS "media_texts_parent_idx" RENAME TO "media_tags_parent_idx";
DROP INDEX IF EXISTS "media_texts_path_idx";
-- Constraint zurück
ALTER TABLE "media_tags" DROP CONSTRAINT IF EXISTS "media_texts_parent_id_fk";
ALTER TABLE "media_tags" ADD CONSTRAINT "media_tags_parent_id_fk"
FOREIGN KEY ("parent_id") REFERENCES "public"."media"("id") ON DELETE cascade ON UPDATE no action;
`)
}

View file

@ -1,105 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
/**
* Migration: Add Full-Text Search Index for Posts
*
* This migration adds:
* 1. A function to extract text from Lexical JSONB content
* 2. A generated column (search_text) that concatenates searchable fields
* 3. GIN indexes for both German and English full-text search
*
* The FTS can be activated by setting USE_FTS=true environment variable.
* Without this flag, the search API uses ILIKE which works without these indexes.
*/
export async function up({ db }: MigrateUpArgs): Promise<void> {
// 1. Create function to extract text from Lexical JSONB content
await db.execute(sql`
CREATE OR REPLACE FUNCTION extract_lexical_text(content jsonb)
RETURNS text
LANGUAGE sql
IMMUTABLE
PARALLEL SAFE
AS $$
SELECT COALESCE(
string_agg(node_text, ' '),
''
)
FROM (
SELECT jsonb_path_query(
content,
'strict $.root.**.text'
)::text AS node_text
) extracted
WHERE node_text IS NOT NULL
AND node_text != 'null'
$$;
`)
// 2. Add generated column for full searchable text
// This combines title, excerpt, and extracted content text
await db.execute(sql`
ALTER TABLE posts
ADD COLUMN IF NOT EXISTS search_text text
GENERATED ALWAYS AS (
COALESCE(title, '') || ' ' ||
COALESCE(excerpt, '') || ' ' ||
COALESCE(extract_lexical_text(content), '')
) STORED;
`)
// 3. Create GIN index for German full-text search
await db.execute(sql`
CREATE INDEX IF NOT EXISTS posts_search_german_idx
ON posts
USING GIN (to_tsvector('pg_catalog.german', search_text));
`)
// 4. Create GIN index for English full-text search
await db.execute(sql`
CREATE INDEX IF NOT EXISTS posts_search_english_idx
ON posts
USING GIN (to_tsvector('pg_catalog.english', search_text));
`)
// 5. Create btree index on title for faster ILIKE prefix searches
// This is a fallback for when FTS is not used
await db.execute(sql`
CREATE INDEX IF NOT EXISTS posts_title_lower_idx
ON posts (LOWER(title) varchar_pattern_ops);
`)
// Note: For even better ILIKE performance, pg_trgm extension can be enabled manually:
// CREATE EXTENSION IF NOT EXISTS pg_trgm;
// CREATE INDEX posts_title_trgm_idx ON posts USING GIN (title gin_trgm_ops);
}
export async function down({ db }: MigrateDownArgs): Promise<void> {
// Remove indexes
await db.execute(sql`
DROP INDEX IF EXISTS posts_title_lower_idx;
`)
await db.execute(sql`
DROP INDEX IF EXISTS posts_title_trgm_idx;
`)
await db.execute(sql`
DROP INDEX IF EXISTS posts_search_english_idx;
`)
await db.execute(sql`
DROP INDEX IF EXISTS posts_search_german_idx;
`)
// Remove generated column
await db.execute(sql`
ALTER TABLE posts
DROP COLUMN IF EXISTS search_text;
`)
// Remove function
await db.execute(sql`
DROP FUNCTION IF EXISTS extract_lexical_text(jsonb);
`)
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,9 +0,0 @@
import { MigrateUpArgs, MigrateDownArgs, sql } from '@payloadcms/db-postgres'
export async function up({ db, payload, req }: MigrateUpArgs): Promise<void> {
// Migration code
}
export async function down({ db, payload, req }: MigrateDownArgs): Promise<void> {
// Migration code
}

View file

@ -1,75 +0,0 @@
import * as migration_20251126_163428 from './20251126_163428';
import * as migration_20251126_200521 from './20251126_200521';
import * as migration_20251127_081206 from './20251127_081206';
import * as migration_20251127_085124 from './20251127_085124';
import * as migration_20251127_224713 from './20251127_224713';
import * as migration_20251128_142608 from './20251128_142608';
import * as migration_20251130_135459 from './20251130_135459';
import * as migration_20251130_143000_media_optimization from './20251130_143000_media_optimization';
import * as migration_20251130_150000_blocks_tables from './20251130_150000_blocks_tables';
import * as migration_20251130_160000_fix_schema_divergence from './20251130_160000_fix_schema_divergence';
import * as migration_20251130_170000_add_search_index from './20251130_170000_add_search_index';
import * as migration_20251130_213429_add_localization from './20251130_213429_add_localization';
export const migrations = [
{
up: migration_20251126_163428.up,
down: migration_20251126_163428.down,
name: '20251126_163428',
},
{
up: migration_20251126_200521.up,
down: migration_20251126_200521.down,
name: '20251126_200521',
},
{
up: migration_20251127_081206.up,
down: migration_20251127_081206.down,
name: '20251127_081206',
},
{
up: migration_20251127_085124.up,
down: migration_20251127_085124.down,
name: '20251127_085124',
},
{
up: migration_20251127_224713.up,
down: migration_20251127_224713.down,
name: '20251127_224713',
},
{
up: migration_20251128_142608.up,
down: migration_20251128_142608.down,
name: '20251128_142608',
},
{
up: migration_20251130_135459.up,
down: migration_20251130_135459.down,
name: '20251130_135459',
},
{
up: migration_20251130_143000_media_optimization.up,
down: migration_20251130_143000_media_optimization.down,
name: '20251130_143000_media_optimization',
},
{
up: migration_20251130_150000_blocks_tables.up,
down: migration_20251130_150000_blocks_tables.down,
name: '20251130_150000_blocks_tables',
},
{
up: migration_20251130_160000_fix_schema_divergence.up,
down: migration_20251130_160000_fix_schema_divergence.down,
name: '20251130_160000_fix_schema_divergence',
},
{
up: migration_20251130_170000_add_search_index.up,
down: migration_20251130_170000_add_search_index.down,
name: '20251130_170000_add_search_index',
},
{
up: migration_20251130_213429_add_localization.up,
down: migration_20251130_213429_add_localization.down,
name: '20251130_213429_add_localization'
},
];