Skip to content

Commit c7a197b

Browse files
committed
email-branding-patch
1 parent 208fa43 commit c7a197b

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
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

Comments
 (0)