merge: develop into main (resolve dependabot workflow conflict)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Martin Porwoll 2026-02-25 12:35:11 +00:00
commit 174314ad29
30 changed files with 4420 additions and 2603 deletions

View file

@ -40,12 +40,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -73,12 +73,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -117,12 +117,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -178,7 +178,7 @@ jobs:
- name: Upload coverage report - name: Upload coverage report
if: always() if: always()
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: test-coverage name: test-coverage
path: coverage/ path: coverage/
@ -196,12 +196,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -230,7 +230,7 @@ jobs:
echo "Build successful - BUILD_ID: $(cat .next/BUILD_ID)" echo "Build successful - BUILD_ID: $(cat .next/BUILD_ID)"
- name: Upload build artifacts - name: Upload build artifacts
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: build-output name: build-output
path: | path: |
@ -267,12 +267,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -281,7 +281,7 @@ jobs:
run: pnpm install --frozen-lockfile run: pnpm install --frozen-lockfile
- name: Download build artifacts - name: Download build artifacts
uses: actions/download-artifact@v4 uses: actions/download-artifact@v7
with: with:
name: build-output name: build-output
path: .next/ path: .next/
@ -325,7 +325,7 @@ jobs:
- name: Upload Playwright report - name: Upload Playwright report
if: always() if: always()
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: playwright-report name: playwright-report
path: playwright-report/ path: playwright-report/

View file

@ -20,7 +20,7 @@ jobs:
github-token: "${{ secrets.GITHUB_TOKEN }}" github-token: "${{ secrets.GITHUB_TOKEN }}"
- name: Wait for CI to pass - name: Wait for CI to pass
uses: lewagon/wait-on-check-action@v1.3.4 uses: lewagon/wait-on-check-action@v1.5.0
with: with:
ref: ${{ github.event.pull_request.head.sha }} ref: ${{ github.event.pull_request.head.sha }}
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}

View file

@ -114,12 +114,12 @@ jobs:
ref: ${{ needs.preflight.outputs.deploy_sha }} ref: ${{ needs.preflight.outputs.deploy_sha }}
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'

View file

@ -35,12 +35,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'

View file

@ -40,12 +40,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -81,12 +81,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -118,12 +118,12 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
- name: Setup pnpm - name: Setup pnpm
uses: pnpm/action-setup@v3 uses: pnpm/action-setup@v4
with: with:
version: ${{ env.PNPM_VERSION }} version: ${{ env.PNPM_VERSION }}
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v6
with: with:
node-version: ${{ env.NODE_VERSION }} node-version: ${{ env.NODE_VERSION }}
cache: 'pnpm' cache: 'pnpm'
@ -141,7 +141,7 @@ jobs:
- name: Upload test results - name: Upload test results
if: always() if: always()
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v6
with: with:
name: security-test-results name: security-test-results
path: | path: |

View file

@ -10,9 +10,9 @@ Multi-Tenant CMS für 3 aktive Websites unter einer Payload CMS 3.x Instanz:
## Tech Stack ## Tech Stack
- **CMS:** Payload CMS 3.76.1 - **CMS:** Payload CMS 3.77.0
- **Framework:** Next.js 16.2.0-canary.41 - **Framework:** Next.js 16.2.0-canary.58
- **React:** 19.2.3 - **React:** 19.2.4
- **Sprache:** TypeScript - **Sprache:** TypeScript
- **Runtime:** Node.js 22.x - **Runtime:** Node.js 22.x
- **Datenbank:** PostgreSQL 17.6 (separater Server) - **Datenbank:** PostgreSQL 17.6 (separater Server)
@ -410,4 +410,36 @@ Credentials in `~/.pgpass` (chmod 600), nie Klartext in `.env`.
### Scripts & Backup ### Scripts & Backup
- `scripts/backup/README.md` - Backup-System Dokumentation - `scripts/backup/README.md` - Backup-System Dokumentation
*Letzte Aktualisierung: 14.02.2026* ## Codex CLI — Remote-Orchestrierung (sv-frontend)
OpenAI Codex CLI (`v0.101.0`, Model `gpt-5.3-codex`) ist auf sv-frontend installiert und kann von sv-payload aus non-interaktiv gesteuert werden. **Nutze Codex für Frontend-Aufgaben um Arbeit zu parallelisieren.**
**Wichtig:** Mehrere Codex-Sessions können parallel laufen — nutze dies für unabhängige Aufgaben in verschiedenen Projekten.
```bash
# Einzelne Aufgabe (JSON-Output für Parsing):
ssh sv-frontend "codex exec -s danger-full-access -C ~/frontend.blogwoman.de 'prompt' --json 2>&1"
# Aufgabe mit Ergebnis-Datei:
ssh sv-frontend "codex exec -s danger-full-access -C ~/projekt -o /tmp/result.txt 'prompt' 2>&1"
# Parallele Aufgaben (in separaten SSH-Sessions):
ssh sv-frontend "codex exec -s danger-full-access -C ~/frontend.blogwoman.de 'task1' --json" &
ssh sv-frontend "codex exec -s danger-full-access -C ~/frontend.porwoll.de 'task2' --json" &
wait
```
**Wann Codex delegieren:**
- Frontend-Komponenten erstellen/ändern
- Lint/Format-Fehler in Frontend-Repos beheben
- Code-Reviews in Frontend-Projekten
- Tests schreiben für Frontend-Code
- Refactoring in Frontend-Repos
**Einschränkungen:**
- **MUSS** `-s danger-full-access` verwenden (`workspace-write` hat Landlock-Fehler)
- `rg` (ripgrep) nicht installiert — Codex nutzt `find` als Fallback
- Keine `~/.codex/config.toml` — Konfiguration nur via CLI-Flags
- Kein Git-Commit durch Codex — nur Code-Änderungen, Commit/Push über SSH
*Letzte Aktualisierung: 22.02.2026*

View file

@ -0,0 +1,43 @@
Hier ist eine kurze Anleitung im Markdown-Format, die du direkt als System-Prompt oder Instruktion für eine Frontend-KI verwenden kannst, um hochwertige ("Premium") Webseiten zu generieren:
```markdown
# Anleitung für die Frontend-KI: Umsetzung von Premium-Webseiten
**Ziel:** Deine Aufgabe ist es, Webseiten zu generieren, die sofortiges Vertrauen aufbauen und professionell wirken. Die Website darf niemals "billig" oder hastig zusammengebaut wirken. Eine Premium-Website ist nicht lauter, sondern **klarer, ruhiger und bewusster**.
Halte dich bei der Generierung von Code, Layouts und Styles strikt an die folgenden Gestaltungsprinzipien:
## 1. Fundament & Erster Eindruck
- **Klare Botschaft "Above the Fold":** Der Besucher muss sofort und ohne zu scrollen verstehen, was angeboten wird, für wen es ist und warum es wichtig ist.
- **Absichtsvolles Layout (Kein "DIY-Look"):** Vermeide Layouts, die nach billigen Templates aussehen. Selbst die einfachsten Strukturen müssen bewusst und durchdacht wirken.
- **Vertrauenssignale:** Sorge durch visuelle Klarheit und ein professionelles Auftreten dafür, dass die Seite sofort seriös und sicher wirkt.
## 2. Visuelle Struktur & Grafiken
- **Maßgeschneiderte Optik statt Stock-Material:** Verzichte auf generische Stock-Icons. Nutze visuelle Elemente, die exakt zur Tonalität und Farbpalette der Marke passen.
- **Funktion vor reiner Dekoration:** Nutze Grafiken gezielt, um die Aufmerksamkeit zu lenken, Inhalte aufzulockern und Informationen leichter verdaulich zu machen. Vermeide absolutes visuelles Rauschen jedes Element muss sich seinen Platz verdienen.
## 3. Markenstrategie (Farben & Typografie)
- **Farb-Minimalismus:** Implementiere ein kohärentes Farbsystem. Setze auf **Zurückhaltung statt Vielfalt** wenige Farben, die souverän eingesetzt werden, sorgen für einen hochwertigen Look.
- **Exzellente Typografie:** Wähle anspruchsvolle, professionelle Schriftarten. **Lesbarkeit steht an erster Stelle** verwende niemals schwer lesbare, veraltete oder unprofessionelle Fonts.
## 4. Subtile Animationen & Interaktionen
- **Lebendig, aber nicht chaotisch:** Nutze dezente, scrollbasierte Bewegungen, bei denen Elemente natürlich einblenden.
- **Feedback ohne Reibung:** Buttons und Links müssen auf Hover und Klicks flüssig reagieren.
- **Keine Spielereien:** Verzichte auf alles, was sich grundlos dreht, hüpft oder die Aufmerksamkeit vom eigentlichen Inhalt ablenkt. Animationen sollen den Nutzer führen, nicht verwirren.
## 5. User Experience (UX) & Call-to-Actions
- **Klare Nutzerführung (User Journey):** Jede Sektion und jede Seite muss natürlich zum nächsten logischen Schritt führen.
- **Keine Entscheidungsparalyse:** Der Besucher darf nie überlegen müssen, was er als Nächstes tun soll.
- **Sichtbare CTAs:** Call-to-Actions müssen offensichtlich platziert und leicht auffindbar sein.
- **Semantischer Aufbau:** Strukturiere den HTML-Code und die Seitenhierarchie logisch optimiert für menschliche Besucher und SEO-Algorithmen.
## 6. Code-Wartbarkeit & Langlebigkeit
- **Keine "Black-Box":** Entwickle den Code sauber und modular, sodass spätere Aktualisierungen durch den Betreiber leicht möglich sind, ohne dass die Struktur zerbricht.
- Das Setup muss darauf ausgelegt sein, dass Seiten, Services und Inhalte in Zukunft unkompliziert erweitert werden können.
```

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 506 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 721 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 977 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 986 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 672 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 849 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 993 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 261 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 243 KiB

View file

@ -27,61 +27,61 @@
"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": {
"@anthropic-ai/sdk": "^0.71.2", "@anthropic-ai/sdk": "^0.78.0",
"@fullcalendar/core": "^6.1.20", "@fullcalendar/core": "^6.1.20",
"@fullcalendar/daygrid": "^6.1.20", "@fullcalendar/daygrid": "^6.1.20",
"@fullcalendar/interaction": "^6.1.20", "@fullcalendar/interaction": "^6.1.20",
"@fullcalendar/list": "^6.1.20", "@fullcalendar/list": "^6.1.20",
"@fullcalendar/react": "^6.1.20", "@fullcalendar/react": "^6.1.20",
"@fullcalendar/timegrid": "^6.1.20", "@fullcalendar/timegrid": "^6.1.20",
"@payloadcms/db-postgres": "3.76.1", "@payloadcms/db-postgres": "3.77.0",
"@payloadcms/next": "3.76.1", "@payloadcms/next": "3.77.0",
"@payloadcms/plugin-form-builder": "3.76.1", "@payloadcms/plugin-form-builder": "3.77.0",
"@payloadcms/plugin-multi-tenant": "3.76.1", "@payloadcms/plugin-multi-tenant": "3.77.0",
"@payloadcms/plugin-nested-docs": "3.76.1", "@payloadcms/plugin-nested-docs": "3.77.0",
"@payloadcms/plugin-redirects": "3.76.1", "@payloadcms/plugin-redirects": "3.77.0",
"@payloadcms/plugin-seo": "3.76.1", "@payloadcms/plugin-seo": "3.77.0",
"@payloadcms/richtext-lexical": "3.76.1", "@payloadcms/richtext-lexical": "3.77.0",
"@payloadcms/translations": "3.76.1", "@payloadcms/translations": "3.77.0",
"@payloadcms/ui": "3.76.1", "@payloadcms/ui": "3.77.0",
"@types/pdfkit": "^0.17.4", "@types/pdfkit": "^0.17.5",
"bullmq": "^5.65.1", "bullmq": "^5.70.1",
"cross-env": "^7.0.3", "cross-env": "^10.1.0",
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"dotenv": "16.4.7", "dotenv": "17.3.1",
"exceljs": "^4.4.0", "exceljs": "^4.4.0",
"googleapis": "^170.0.0", "googleapis": "^171.4.0",
"ioredis": "^5.8.2", "ioredis": "^5.9.3",
"next": "16.2.0-canary.41", "next": "16.2.0-canary.58",
"node-cron": "^4.2.1", "node-cron": "^4.2.1",
"nodemailer": "^7.0.11", "nodemailer": "^8.0.1",
"payload": "3.76.1", "payload": "3.77.0",
"payload-oapi": "^0.2.5", "payload-oapi": "^0.2.5",
"pdfkit": "^0.17.2", "pdfkit": "^0.17.2",
"react": "19.2.3", "react": "19.2.4",
"react-dom": "19.2.3", "react-dom": "19.2.4",
"recharts": "^3.6.0", "recharts": "^3.7.0",
"sharp": "0.34.5" "sharp": "0.34.5"
}, },
"devDependencies": { "devDependencies": {
"@playwright/test": "1.57.0", "@playwright/test": "1.58.2",
"@types/node": "^22.10.2", "@types/node": "^25.3.0",
"@types/node-cron": "^3.0.11", "@types/node-cron": "^3.0.11",
"@types/nodemailer": "^7.0.4", "@types/nodemailer": "^7.0.11",
"@types/react": "19.2.7", "@types/react": "19.2.14",
"@types/react-dom": "19.2.3", "@types/react-dom": "19.2.3",
"@vitejs/plugin-react": "4.5.2", "@vitejs/plugin-react": "5.1.4",
"@vitest/coverage-v8": "4.0.15", "@vitest/coverage-v8": "4.0.18",
"drizzle-kit": "^0.31.8", "drizzle-kit": "^0.31.9",
"eslint": "^9.39.2", "eslint": "^9.39.3",
"eslint-config-next": "16.2.0-canary.41", "eslint-config-next": "16.2.0-canary.58",
"jsdom": "26.1.0", "jsdom": "28.1.0",
"playwright": "1.57.0", "playwright": "1.58.2",
"prettier": "^3.7.4", "prettier": "^3.8.1",
"tsx": "^4.21.0", "tsx": "^4.21.0",
"typescript": "5.9.3", "typescript": "5.9.3",
"vite-tsconfig-paths": "6.0.0", "vite-tsconfig-paths": "6.1.1",
"vitest": "4.0.15" "vitest": "4.0.18"
}, },
"engines": { "engines": {
"node": ">=20.9.0", "node": ">=20.9.0",
@ -92,6 +92,12 @@
"sharp", "sharp",
"esbuild", "esbuild",
"unrs-resolver" "unrs-resolver"
] ],
"overrides": {
"minimatch": ">=10.2.1",
"esbuild": ">=0.25.0",
"ajv": ">=8.18.0",
"ioredis": "5.9.3"
}
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -208,8 +208,21 @@ async function seed() {
categorySlug: 'emergency', categorySlug: 'emergency',
order: 1, order: 1,
isFeatured: true, isFeatured: true,
icon: 'activity',
shortDescription: shortDescription:
'Unabhängige ärztliche Zweitmeinung bei laufender oder geplanter Intensivbehandlung. Wir prüfen medizinische Indikation, Patientenwille und Behandlungsalternativen empathisch, neutral und fachlich fundiert.', 'Unabhängige ärztliche Zweitmeinung bei laufender oder geplanter Intensivbehandlung. Wir prüfen medizinische Indikation, Patientenwille und Behandlungsalternativen empathisch, neutral und fachlich fundiert.',
features: [
{ title: 'Unabhängige Beurteilung durch erfahrene Intensivmediziner', description: 'Neutrale Einschätzung ohne wirtschaftliche Eigeninteressen ausschließlich in Ihrem Interesse.', icon: 'shield' },
{ title: 'Vermeidung unnötiger Eingriffe bei fehlender Indikation', description: 'Schutz vor überflüssigen invasiven Behandlungen durch fundierte medizinische Bewertung.', icon: 'file-check' },
{ title: 'Besseres Verständnis der Risiken und Therapieziele', description: 'Umfassende Aufklärung über alle Behandlungsoptionen und deren Auswirkungen.', icon: 'users' },
{ title: 'Stärkung Ihrer Entscheidungssicherheit und Eigenverantwortung', description: 'Fundierte Basis für selbstbestimmte Entscheidungen über Ihre Versorgung.', icon: 'heart-handshake' },
],
detailSections: [
{ title: 'Strukturierte Beratung durch erfahrene Case Manager:innen', content: createRichText('Individuelle Betreuung für Ihre weitere Behandlungsplanung.') },
{ title: 'Unabhängige ärztliche Zweitmeinung inkl. schriftlichem Gutachten', content: createRichText('Fundierte Einschätzung durch Fachärzt:innen für Intensivmedizin.') },
{ title: 'Bewertung von Therapiezielen, Indikationen und Prognose', content: createRichText('Umfassende Analyse aller relevanten medizinischen Aspekte.') },
{ title: 'Unterstützung bei palliativer Umsteuerung bis Pflegeüberleitung', content: createRichText('Begleitung bei der Umsetzung der empfohlenen Maßnahmen.') },
],
description: createRichTextComplex([ description: createRichTextComplex([
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Intensiv fundierte Beratung in kritischen Situationen' }, { type: 'heading', tag: 'h2', text: 'Zweitmeinung Intensiv fundierte Beratung in kritischen Situationen' },
{ {
@ -256,8 +269,21 @@ async function seed() {
categorySlug: 'consultation', categorySlug: 'consultation',
order: 2, order: 2,
isFeatured: true, isFeatured: true,
icon: 'heart',
shortDescription: shortDescription:
'Unabhängige ärztliche Zweitmeinung vor Herzkatheter, Stent oder OP. Fundierte Empfehlung durch erfahrene Kardiolog:innen verständlich, sicher, neutral.', 'Unabhängige ärztliche Zweitmeinung vor Herzkatheter, Stent oder OP. Fundierte Empfehlung durch erfahrene Kardiolog:innen verständlich, sicher, neutral.',
features: [
{ title: 'Unabhängige Beurteilung durch erfahrene Kardiolog:innen', description: 'Neutrale Einschätzung Ihrer kardiologischen Befunde ohne wirtschaftliche Interessen.', icon: 'shield' },
{ title: 'Vermeidung unnötiger Eingriffe bei fehlender Indikation', description: 'Schutz vor überflüssigen invasiven Behandlungen durch fundierte Bewertung.', icon: 'file-check' },
{ title: 'Besseres Verständnis der Risiken und Therapieziele', description: 'Umfassende Aufklärung über alle Behandlungsoptionen.', icon: 'users' },
{ title: 'Stärkung Ihrer Entscheidungssicherheit', description: 'Fundierte Basis für selbstbestimmte Entscheidungen über Ihre Herzgesundheit.', icon: 'heart-handshake' },
],
detailSections: [
{ title: 'Bewertung Ihrer Diagnosen und EKG-/Katheterbefunde', content: createRichText('Sach- und leitliniengerechte Beurteilung durch Fachärzt:innen.') },
{ title: 'Zweitmeinung bei geplanter PCI, Bypass-OP oder Umstellung', content: createRichText('Unabhängige Einschätzung aller kardiologischen Behandlungsoptionen.') },
{ title: 'Schriftliches ärztliches Gutachten mit klarer Empfehlung', content: createRichText('Nachvollziehbare, fundierte Empfehlung für Ihre Entscheidung.') },
{ title: 'Persönliche Erläuterung telefonisch oder per Video', content: createRichText('Direkter Austausch mit unseren Kardiologie-Expert:innen.') },
],
description: createRichTextComplex([ description: createRichTextComplex([
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Kardiologie klare Empfehlungen bei Herzentscheidungen' }, { type: 'heading', tag: 'h2', text: 'Zweitmeinung Kardiologie klare Empfehlungen bei Herzentscheidungen' },
{ {
@ -289,8 +315,21 @@ async function seed() {
categorySlug: 'consultation', categorySlug: 'consultation',
order: 3, order: 3,
isFeatured: true, isFeatured: true,
icon: 'flask-conical',
shortDescription: shortDescription:
'Unabhängige ärztliche Zweitmeinung bei Krebs. Fundierte Einschätzung von Therapieoptionen durch erfahrene Onkolog:innen empathisch, verständlich, individuell.', 'Unabhängige ärztliche Zweitmeinung bei Krebs. Fundierte Einschätzung von Therapieoptionen durch erfahrene Onkolog:innen empathisch, verständlich, individuell.',
features: [
{ title: 'Unabhängige Beurteilung durch erfahrene Onkolog:innen', description: 'Neutrale Einschätzung Ihrer Krebsdiagnose und Therapieoptionen.', icon: 'shield' },
{ title: 'Bewertung von Wirksamkeit und Nebenwirkungen', description: 'Transparente Analyse aller Behandlungswege und deren Auswirkungen auf Ihre Lebensqualität.', icon: 'file-check' },
{ title: 'Einbindung von Case Management und Palliativberatung', description: 'Ganzheitliche Betreuung über die reine Diagnose hinaus.', icon: 'users' },
{ title: 'Stärkung Ihrer Entscheidungssicherheit', description: 'Fundierte Grundlage für informierte Therapieentscheidungen.', icon: 'heart-handshake' },
],
detailSections: [
{ title: 'Auswertung Ihrer Diagnose und Befunde', content: createRichText('Umfassende Prüfung durch erfahrene Fachärzt:innen.') },
{ title: 'Bewertung der geplanten Therapie', content: createRichText('Analyse von Wirksamkeit, Nebenwirkungen und Lebensqualität.') },
{ title: 'Schriftliches Zweitmeinungsgutachten', content: createRichText('Nachvollziehbare, medizinisch fundierte Empfehlung.') },
{ title: 'Optionales Gespräch per Telefon oder Video', content: createRichText('Persönliche Erläuterung und Beantwortung Ihrer Fragen.') },
],
description: createRichTextComplex([ description: createRichTextComplex([
{ {
type: 'heading', type: 'heading',
@ -327,8 +366,21 @@ async function seed() {
categorySlug: 'consultation', categorySlug: 'consultation',
order: 4, order: 4,
isFeatured: false, isFeatured: false,
icon: 'stethoscope',
shortDescription: shortDescription:
'Unabhängige ärztliche Einschätzung bei Nierenerkrankungen, Dialyseempfehlung oder Transplantationsvorbereitung. Klar, neutral und verständlich erklärt.', 'Unabhängige ärztliche Einschätzung bei Nierenerkrankungen, Dialyseempfehlung oder Transplantationsvorbereitung. Klar, neutral und verständlich erklärt.',
features: [
{ title: 'Unabhängige Beurteilung durch erfahrene Nephrolog:innen', description: 'Neutrale Einschätzung Ihrer nephrologischen Diagnostik.', icon: 'shield' },
{ title: 'Prüfung der Dialyse-Notwendigkeit', description: 'Bewertung ob und wann eine Dialyse tatsächlich erforderlich ist.', icon: 'file-check' },
{ title: 'Bewertung konservativer Behandlungsoptionen', description: 'Prüfung alternativer Therapiewege vor invasiven Maßnahmen.', icon: 'users' },
{ title: 'Stärkung Ihrer Entscheidungssicherheit', description: 'Fundierte Basis für selbstbestimmte Entscheidungen.', icon: 'heart-handshake' },
],
detailSections: [
{ title: 'Prüfung der nephrologischen Diagnostik und Laborwerte', content: createRichText('Umfassende Analyse Ihrer Nierenfunktionswerte.') },
{ title: 'Zweitmeinung durch Fachärzt:innen für Nephrologie', content: createRichText('Unabhängige Einschätzung erfahrener Spezialist:innen.') },
{ title: 'Gutachten zur Notwendigkeit einer Dialyse', content: createRichText('Klare Empfehlung zum Zeitpunkt und zur Art der Behandlung.') },
{ title: 'Bewertung konservativer Behandlungsoptionen', content: createRichText('Prüfung aller verfügbaren Therapiealternativen.') },
],
description: createRichTextComplex([ description: createRichTextComplex([
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Nephrologie Klarheit bei Nierenentscheidungen' }, { type: 'heading', tag: 'h2', text: 'Zweitmeinung Nephrologie Klarheit bei Nierenentscheidungen' },
{ {
@ -356,8 +408,21 @@ async function seed() {
categorySlug: 'consultation', categorySlug: 'consultation',
order: 5, order: 5,
isFeatured: false, isFeatured: false,
icon: 'pill',
shortDescription: shortDescription:
'Unabhängige ärztliche Zweitmeinung vor einer geplanten Gallenblasen-OP. Wir prüfen, ob der Eingriff medizinisch notwendig ist verständlich, neutral und leitlinienbasiert.', 'Unabhängige ärztliche Zweitmeinung vor einer geplanten Gallenblasen-OP. Wir prüfen, ob der Eingriff medizinisch notwendig ist verständlich, neutral und leitlinienbasiert.',
features: [
{ title: 'Unabhängige Beurteilung durch erfahrene Chirurg:innen', description: 'Neutrale Einschätzung der OP-Indikation.', icon: 'shield' },
{ title: 'Vermeidung unnötiger Operationen', description: 'Schutz vor überflüssigen Eingriffen durch fundierte Bewertung.', icon: 'file-check' },
{ title: 'Aufklärung über konservative Alternativen', description: 'Information über nicht-operative Behandlungsmöglichkeiten.', icon: 'users' },
{ title: 'Verständliche Erklärung der Befunde', description: 'Klare Darstellung von Risiken und Nutzen.', icon: 'heart-handshake' },
],
detailSections: [
{ title: 'Bewertung Ihrer Beschwerden und Untersuchungsergebnisse', content: createRichText('Sorgfältige Analyse aller vorliegenden Befunde.') },
{ title: 'Prüfung der OP-Indikation nach medizinischen Leitlinien', content: createRichText('Leitlinienbasierte Bewertung der Operationsnotwendigkeit.') },
{ title: 'Zweitmeinung durch Viszeralchirurg:innen oder Gastroenterolog:innen', content: createRichText('Unabhängige Einschätzung spezialisierter Fachärzt:innen.') },
{ title: 'Verständliches Gutachten mit klarer Empfehlung', content: createRichText('Nachvollziehbare Entscheidungsgrundlage.') },
],
description: createRichTextComplex([ description: createRichTextComplex([
{ type: 'heading', tag: 'h2', text: 'Zweitmeinung Gallenblase unnötige Operationen vermeiden' }, { type: 'heading', tag: 'h2', text: 'Zweitmeinung Gallenblase unnötige Operationen vermeiden' },
{ {
@ -394,8 +459,21 @@ async function seed() {
categorySlug: 'consultation', categorySlug: 'consultation',
order: 6, order: 6,
isFeatured: false, isFeatured: false,
icon: 'brain',
shortDescription: shortDescription:
'Unabhängige ärztliche Einschätzung vor einer geplanten Schilddrüsen-OP. Fundierte Zweitmeinung durch erfahrene Endokrinolog:innen individuell, neutral, verständlich.', 'Unabhängige ärztliche Einschätzung vor einer geplanten Schilddrüsen-OP. Fundierte Zweitmeinung durch erfahrene Endokrinolog:innen individuell, neutral, verständlich.',
features: [
{ title: 'Unabhängige Beurteilung durch erfahrene Endokrinolog:innen', description: 'Neutrale Einschätzung Ihrer Schilddrüsenbefunde.', icon: 'shield' },
{ title: 'Prüfung der OP-Notwendigkeit', description: 'Bewertung ob eine Operation tatsächlich indiziert ist.', icon: 'file-check' },
{ title: 'Bewertung konservativer Alternativen', description: 'Prüfung medikamentöser oder abwartender Therapieoptionen.', icon: 'users' },
{ title: 'Verständliche Erklärung der Befunde', description: 'Nachvollziehbare Darstellung aller Optionen.', icon: 'heart-handshake' },
],
detailSections: [
{ title: 'Prüfung von Ultraschallbefunden, Szintigrammen, Laborwerten', content: createRichText('Umfassende Analyse aller diagnostischen Ergebnisse.') },
{ title: 'Zweitmeinung durch Endokrinolog:innen oder Schilddrüsenchirurg:innen', content: createRichText('Spezialisierte Fachärzt:innen bewerten Ihren Fall.') },
{ title: 'Schriftliches Gutachten mit nachvollziehbarer Empfehlung', content: createRichText('Fundierte Entscheidungsgrundlage für Sie und Ihre Ärzt:innen.') },
{ title: 'Bei Bedarf: telefonische Erläuterung', content: createRichText('Persönliches Gespräch zu allen offenen Fragen.') },
],
description: createRichTextComplex([ description: createRichTextComplex([
{ {
type: 'heading', type: 'heading',

View file

@ -0,0 +1,75 @@
#!/usr/bin/env bash
# Setup GitHub branch protection and auto-merge for Dependabot
# Repository: complexcaresolutions/cms.c2sgmbh
#
# Voraussetzungen:
# - gh CLI installiert und authentifiziert (gh auth login)
# - Admin-Rechte auf das Repository
set -euo pipefail
REPO="complexcaresolutions/cms.c2sgmbh"
BRANCH="main"
echo "=== GitHub Repository Setup für Dependabot ==="
echo "Repository: $REPO"
echo "Branch: $BRANCH"
echo ""
# 1. Prüfe gh CLI Auth
echo "[1/4] Prüfe GitHub CLI Authentifizierung..."
if ! gh auth status &>/dev/null; then
echo "FEHLER: gh CLI nicht authentifiziert. Bitte 'gh auth login' ausführen."
exit 1
fi
echo " OK"
# 2. Auto-Merge aktivieren
echo "[2/4] Aktiviere Auto-Merge in Repository-Settings..."
gh api "repos/$REPO" \
--method PATCH \
--field allow_auto_merge=true \
--silent
echo " OK"
# 3. Branch Protection setzen
echo "[3/4] Setze Branch Protection auf '$BRANCH'..."
gh api "repos/$REPO/branches/$BRANCH/protection" \
--method PUT \
--input - <<'EOF'
{
"required_status_checks": {
"strict": true,
"contexts": ["CI Success"]
},
"enforce_admins": false,
"required_pull_request_reviews": {
"required_approving_review_count": 0,
"dismiss_stale_reviews": false,
"require_code_owner_reviews": false
},
"restrictions": null,
"allow_force_pushes": false,
"allow_deletions": false
}
EOF
echo " OK"
# 4. Verifizierung
echo "[4/4] Verifiziere Konfiguration..."
echo ""
echo "--- Auto-Merge ---"
gh api "repos/$REPO" --jq '" allow_auto_merge: \(.allow_auto_merge)"'
echo ""
echo "--- Branch Protection ($BRANCH) ---"
gh api "repos/$REPO/branches/$BRANCH/protection/required_status_checks" \
--jq '" strict: \(.strict)\n checks: \(.contexts | join(", "))"'
echo ""
echo "=== Setup abgeschlossen ==="
echo ""
echo "Nächste Schritte:"
echo " - Dependabot erstellt ab morgen 04:00 automatisch PRs"
echo " - Patch-Updates werden nach CI-Success auto-gemergt"
echo " - Major/Minor-Updates erfordern manuelles Review"

View file

@ -58,6 +58,7 @@ export const Users: CollectionConfig = {
type: 'checkbox', type: 'checkbox',
label: 'Super Admin', label: 'Super Admin',
defaultValue: false, defaultValue: false,
saveToJWT: true,
access: { access: {
read: superAdminFieldAccess, read: superAdminFieldAccess,
create: superAdminFieldAccess, create: superAdminFieldAccess,

View file

@ -193,6 +193,8 @@ export default buildConfig({
'https://porwoll.de', 'https://porwoll.de',
'https://www.porwoll.de', 'https://www.porwoll.de',
'https://pl.porwoll.tech', 'https://pl.porwoll.tech',
'https://pl.c2sgmbh.de',
'https://cms.c2sgmbh.de',
], ],
// CSRF Protection // CSRF Protection
csrf: [ csrf: [
@ -205,6 +207,8 @@ export default buildConfig({
'https://porwoll.de', 'https://porwoll.de',
'https://www.porwoll.de', 'https://www.porwoll.de',
'https://pl.porwoll.tech', 'https://pl.porwoll.tech',
'https://pl.c2sgmbh.de',
'https://cms.c2sgmbh.de',
], ],
collections: [ collections: [
Users, Users,