|
| 1 | +/** |
| 2 | + * Branding-Patch für die E-Mail-Primärfarbe (Link- und Button-Farbe). |
| 3 | + * |
| 4 | + * WOZU: |
| 5 | + * In Ocelot v3.15.1 ist der Dockerfile-COPY für Email-Branding defekt: |
| 6 | + * `ONBUILD COPY ./branding/email/ src/middleware/helpers/email/` zeigt auf |
| 7 | + * einen toten Pfad, der nach der Pug-Umstellung (PR #8435) nicht mehr |
| 8 | + * gelesen wird. Die neuen Pug-Templates liegen in `src/emails/templates/` |
| 9 | + * und haben die Farbe `#17b53e` in `includes/webflow.css` hardcoded. |
| 10 | + * Dieses Branding-Middleware-File wird dagegen vom Dockerfile korrekt |
| 11 | + * nach `src/middleware/branding/` kopiert und beim Server-Start aufgerufen |
| 12 | + * (siehe `src/middleware/index.ts`). Es patched die CSS-Datei zur Laufzeit. |
| 13 | + * |
| 14 | + * WO KOPIEREN: |
| 15 | + * Diese Datei gehört in dein Branding-Repo unter: |
| 16 | + * branding/middlewares/brandingMiddlewares.ts |
| 17 | + * |
| 18 | + * NACH DEM UPDATE ENTFERNEN: |
| 19 | + * Sobald dein Backend auf einer Version läuft, die PR #9515 enthält |
| 20 | + * ("fix(backend): allow to brand emails in backend"), ist dieser Hack |
| 21 | + * überflüssig. Dann: |
| 22 | + * 1. Diese Datei aus deinem Branding löschen (bzw. wieder durch die |
| 23 | + * Default-Variante mit nur `addMiddleware`-Kommentaren ersetzen). |
| 24 | + * 2. Stattdessen die Pug-Templates komplett überschreiben via |
| 25 | + * `branding/emails/templates/includes/webflow.css` (ggf. nur die |
| 26 | + * geänderten Zeilen). Ab PR #9515 kopiert das Dockerfile diesen |
| 27 | + * Pfad korrekt nach `src/emails/templates/`. |
| 28 | + * |
| 29 | + * HOW IT WORKS: |
| 30 | + * - Läuft einmalig beim Server-Start (aufgerufen aus `middleware/index.ts`). |
| 31 | + * - Liest `build/src/emails/templates/includes/webflow.css`, ersetzt die |
| 32 | + * Default-Farbe `#17b53e` durch `BRAND_PRIMARY` und schreibt zurück. |
| 33 | + * - Idempotent: wenn die Default-Farbe nicht mehr drin steht, passiert nichts. |
| 34 | + * - `email-templates` liest Templates bei jedem `send()` frisch vom FS, |
| 35 | + * daher greift der Patch ohne Neustart der Rendering-Pipeline. |
| 36 | + * - Synchrones I/O ist Absicht: der Patch muss fertig sein, bevor der |
| 37 | + * Server den ersten Request handled (middleware/index.ts ruft uns |
| 38 | + * synchron während createServer auf). |
| 39 | + */ |
| 40 | + |
| 41 | +/* eslint-disable no-console */ |
| 42 | +import fs from 'node:fs' |
| 43 | +import path from 'node:path' |
| 44 | + |
| 45 | +// Deine Brand-Primärfarbe hier eintragen (hex oder rgb/rgba). |
| 46 | +// Sollte mit `THEME_COLOR` aus branding/constants/metadata.js übereinstimmen. |
| 47 | +const BRAND_PRIMARY = '#004E80' |
| 48 | + |
| 49 | +const DEFAULT_COLOR = '#17b53e' |
| 50 | + |
| 51 | +function patchEmailCss(): void { |
| 52 | + // __dirname zur Laufzeit: /app/build/src/middleware/branding/ |
| 53 | + // Zielpfad: /app/build/src/emails/templates/includes/webflow.css |
| 54 | + const cssPath = path.resolve(__dirname, '../../emails/templates/includes/webflow.css') |
| 55 | + |
| 56 | + let css: string |
| 57 | + try { |
| 58 | + // eslint-disable-next-line n/no-sync -- siehe Datei-Kommentar |
| 59 | + css = fs.readFileSync(cssPath, 'utf8') |
| 60 | + // eslint-disable-next-line no-catch-all/no-catch-all -- Patch darf Server-Start nicht kippen |
| 61 | + } catch (err) { |
| 62 | + console.warn('[branding] cannot read email css, skipping patch:', err) |
| 63 | + return |
| 64 | + } |
| 65 | + |
| 66 | + if (!css.includes(DEFAULT_COLOR)) { |
| 67 | + // schon gepatched oder Template hat sich geändert – nichts tun |
| 68 | + return |
| 69 | + } |
| 70 | + |
| 71 | + const patched = css.replace(new RegExp(DEFAULT_COLOR, 'g'), BRAND_PRIMARY) |
| 72 | + |
| 73 | + try { |
| 74 | + // eslint-disable-next-line n/no-sync -- siehe Datei-Kommentar |
| 75 | + fs.writeFileSync(cssPath, patched) |
| 76 | + console.log(`[branding] email primary color patched: ${DEFAULT_COLOR} -> ${BRAND_PRIMARY}`) |
| 77 | + // eslint-disable-next-line no-catch-all/no-catch-all -- Patch darf Server-Start nicht kippen |
| 78 | + } catch (err) { |
| 79 | + console.warn('[branding] cannot write email css, skipping patch:', err) |
| 80 | + } |
| 81 | +} |
| 82 | + |
| 83 | +export default () => { |
| 84 | + patchEmailCss() |
| 85 | + // Platz für weitere Branding-GraphQL-Middlewares, z. B.: |
| 86 | + // addMiddleware({ name: 'myMW', middleware: myMW, position: { } }) |
| 87 | +} |
0 commit comments