From aff8084692e3f1fb64bde9932443d8b82fa4475e Mon Sep 17 00:00:00 2001 From: Philipp Dormann Date: Thu, 21 Nov 2024 18:46:35 +0100 Subject: [PATCH] templates in files --- bun.lockb | Bin 18212 -> 20345 bytes package.json | 1 + src/templates/index.ts | 43 +++++++++++++++++++++------ src/templates/password-reset/de.html | 7 +++++ src/templates/password-reset/de.txt | 13 ++++++++ src/templates/password-reset/en.html | 7 +++++ src/templates/password-reset/en.txt | 13 ++++++++ src/templates/welcome/de.html | 3 ++ src/templates/welcome/de.txt | 4 +++ src/templates/welcome/en.html | 3 ++ src/templates/welcome/en.txt | 4 +++ 11 files changed, 89 insertions(+), 9 deletions(-) create mode 100644 src/templates/password-reset/de.html create mode 100644 src/templates/password-reset/de.txt create mode 100644 src/templates/password-reset/en.html create mode 100644 src/templates/password-reset/en.txt create mode 100644 src/templates/welcome/de.html create mode 100644 src/templates/welcome/de.txt create mode 100644 src/templates/welcome/en.html create mode 100644 src/templates/welcome/en.txt diff --git a/bun.lockb b/bun.lockb index 7dcebf1a7f4d392505bbe5c64b8828f879c132df..913134be331b13278d84a1db9fa540751fba5c1c 100644 GIT binary patch delta 3756 zcmeHKdsI~C5x@8D0~U9AD6+fk@>m2BbT9jW1q2qgHmLXr6wm5uYUHKtDlD*|s5Rgt z7Lppl0bjDYA?*rvO1^@G(~x%Y)6zLW;!tik?fmQbtYhr z0R>MKG>Be^Ircm|Ic=5musR_{Nl?GmUYNDEFg?E#Wpc^yocdgAo;BC%D5`oISn4UJ zsEKIHb*#)!&s#rJgJ%Z}gt?WTRtY54EIE*|1dWDIS*BOeMj~5D{Ko~7Kg3>D}31L7OEgC>6 z5^{xcbO`i{5@`#Bi4*B9U==5d{w$!VneY&8Qs@;YdL?6!Dl*?LsZL1GU65 zatqTgf^ZizV-SN4AwvxH2>Zp*hj2{{;jU&T)CFt^2V9`u)hzPGRLO&*u5qIBk=c(p zE97)Jm^j1MPMqa)x>xYQ7LgefCn0`-633RW-8plCN)c%-6?9;$cE?c(1*4e9uO`wGh02t zhVZEe)FZs~fIbAXCxpA3nG#R1AvAkJz58?}dPMSv8)H!dAs*4C_~KAwXTB2R_NU{wJ`MA`S#2kquLw8~z(4`=>eg5hOCcj@%$fasppV3KNSW#fQjINMxOf z0)yxHrDTdJ#F;R`I1{EPhnT?JAV}6F42v8RnG6!uv61C<|BtXU!cqTIgd3Z^W{YNg zcIc+hk$C-kUPnWoA77ldX8X-U|Jq*OeCzJE11Hq~NZkAG{hLq9Gs=PvS^BPq?B0Jn zYJBjqefqdvZR0mPu2jFULV{dT`lsSY&!-+2m3(~YfMUU!rzs6XZJRCi>zj5zemHaS zTfa7`J45$p6!x6oDv0h#dhqn+(C>F|yi@x_PX5l<&99z?F!Z0MhCGH4v1E@7;pQif z;H8T$p560p=Yo5a?k8T3lYRAEeD%r2%je#|x4WnBk3BUv3ZFex{xY`K()M}k%Fkb$ zHgD6Xm!GXY2AW02$z9#>5WP!{@jcjEThpkiR2UaE1v_fxDdy?&Id8R|+qUee${`qB zo7mkxnAzKVu|EDuc1zQ{HFbw89xOiP6Psy}7nD32;~lA{{1B#heeK1rSQ1>H)VF<6 z*I&ElDN^T^t-O)E<$UXwn>}@H2bX7@DoFcYDcI33FIsg%UTE1sDcY{3+U76sHy5=m zY=!p~iut#ul_g!;RM~aCMP6Ym4qL*ebu|rsaQgA-_TMJyu2shi{94r1?mP7#J!$>R z&NTDAs;sA%p1Zi!)E~B$wS8uE9pl|Z81S*sJ}_5qq2;h2xdH}}Dnauv`@ z3$2Ew$o-%Jxj#sJE%KnZL6mxS%pz1okRlG6)e+bq^uOLTy0&k&gS?KbyDaKlEXgDtI!@K zWkSSoCulNLO~4ldCn;q4SnpK0?`=e-b8S}R=}9KH#(kQ}wA+-(;m24Kxs#2@mSO1M z!-HsbNElU)#>&J8Qpbo*??m#6jYT5EfJAH`InOSNf;ACA@CR1sh2Jr*q>-hhTB;!- zLXOX9fSmx+h`@!|iE-7FR9I5ZeUL~MC6zk_X);nM(iEgHq;Mos#fdwlbds{Vk8HrP z%S5hKl448>G&zziCELj{6X9sYFG|UUB$-LqLtZ)T^0>>$@9{-aA}Nr_H;Xufv7~~K zG)RF+0Z7lK>LDU_yq& zI{`N9ZY%g);9D|=JO~`{n%<-=#tBK3x4*ozu;k;r5e&V|#Ky9E6CBa2RD9!lLuu5z zNp>WmRnOud-UZ$I1@tV4Fep`g&#UfyaVy$#lB_b~Ds&|i8VufI1DV=kBQE9J<_mcm z_l~PgCvmA^bg8kF?|AvPkh{>p;-levV!mH3ocQ(EqAsHrxSLv-mu2RGX2tJdn&vip@8XHc7Z-t=eP5N+6mZSV5eC2_tZ;Y+HOhK{?mDI_d*ySUFDsV zo|m;cJ0rc&k!R1!&P}(j&Mt(8>8i#H(H{!jGpu97|UW@c-1)ANVRo7Uza=kc|UoTeVJ;9(Mhm#Uz8u*&5Y|FK8Z_YYmu!2HYR0aQ-I_t$cRl;RZH_9NxGsZtuAN E05)V{v;Y7A delta 2563 zcmeHJYfMyE5I*N}FR&Lb;sXVDfn6Sg4_2PLtH9zDgq0GEcBM^Bt)Sq8RnTfR3Z|h! zY8!FH7-CIS+Gx_$Skgvg(nzc?jIGAlHr>|Nw2e(MrcD~H#%RB}?5cgFN&k0}neWV; z$DK20W@qmokbQ5-UCxQiJ2$_$H)>M(#}6jw^iKM~*r@&X?OXW@1Z4XG zAlz&Z0H*?LfOg;z+=~G=;#|hn8#V=+@v+6=(a_i^iO%WoZ{ctP|$_Z&V3?VGA z!)tTj!nolZJ=JNH@_PRTWrma+$fB0XKB|PgNjo4r=py8GvS?*8fhx5!%OXXH`8Y3v zuBvX!L1^XBRI1h7+AU~>bXhHyR;r9Flhw2X@>RMRS*8s{2r-kYwPLAIWmK6`pptI! zDm^My0nVz_1yD5_1b8&kb+6K;Q57I6lDc%SwiN+urZ@FsZRp9UE?S5d({>4?;n``p z?OM}z6r=S#QeM-kD%NYcix_(0twPzPYCT}WIaoWD$|64Kpu#RVB{(%v#BGQ&4mb^NsPQPFNFC(-dD&v zX`@nWF%WLncmVo8NaAln!mkQ~)PH~U9F3~2KI%*|=pCz1j-+3$e)5brXpzk)N7F%@ zpMHX-CHqjwwaI=tmX1P>BbnltiBt!fM8_e=lO@%U0$vJfqmz)yG}7*uDbxg+N&}E~ zN^kgkxCr6r}8tn#kr1@kfU4@qDFsLZqC$ngKx}PpU`w`ki%FFQ6 zrZj_kGJJ9}-Gr8%ZqVFJpUmm+&fFsDO2nAms!IE_qP0#WkwJM`{PY<5J@zc`0wV)5)UQZG0$u&%YPw z4BW4{GjOXiKg=$%YwRMs$}W!sv-|8EJA@`--k2S-KclmA63hkYH z#i2bCD)q%KI^_DA_PGm-R>7>}-QGBVw|6v7Y3Y>X7Q%7%m zlC0rQZgm9jSEnrQG3Rr6ejQ!K`E@kpDNq_!Iy7y*(yG!g)0Vr!Jv;x>f-kqvZF)iF zGjpAIm2g*nuyGg~fBD?jE7zXR)J9QUaiTJ$Q+DxkB`=nC0nq1vFYZ-t z7__G(-xY4}mO#n5pKE(hDRP_3nKuot{lg4=b~y_%Lk~+5^&^~VplCOxl+J47;a{)$ za#OQ&Wh%|}gk`QD?vz8vuXKBN@MN!T|Bf-W(2<<&7v!`RAJES7Vbn`Dc)a#Jdu!8X3YNC(&4K!cHA|aTH?+{r U8P@(T@8Jkam}%_~&OQ+H2aA}(^8f$< diff --git a/package.json b/package.json index 58cf923..5696002 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "@hono/zod-openapi": "0.18.0", "@hono/zod-validator": "0.4.1", "bullmq": "5.28.1", + "handlebars": "^4.7.8", "hono": "4.6.11", "ioredis": "5.4.1", "nodemailer": "^6.9.16", diff --git a/src/templates/index.ts b/src/templates/index.ts index cc259b8..b58d15d 100644 --- a/src/templates/index.ts +++ b/src/templates/index.ts @@ -1,16 +1,41 @@ import { Language } from '../types' -import { welcomeTemplate } from './welcome' -import { passwordResetTemplate } from './password-reset' +import { readFileSync } from 'fs' +import { join } from 'path' +import { compile } from 'handlebars' -const templates = { - welcome: welcomeTemplate, - passwordReset: passwordResetTemplate +interface TemplateCache { + [key: string]: { + html: HandlebarsTemplateDelegate + text: HandlebarsTemplateDelegate + } +} + +const templateCache: TemplateCache = {} + +function loadTemplate(name: string, language: Language) { + const cacheKey = `${name}:${language}` + + if (!templateCache[cacheKey]) { + const htmlPath = join(process.cwd(), 'src', 'templates', name, `${language}.html`) + const textPath = join(process.cwd(), 'src', 'templates', name, `${language}.txt`) + + const htmlTemplate = readFileSync(htmlPath, 'utf-8') + const textTemplate = readFileSync(textPath, 'utf-8') + + templateCache[cacheKey] = { + html: compile(htmlTemplate), + text: compile(textTemplate) + } + } + + return templateCache[cacheKey] } export function getEmailTemplate(name: string, language: Language) { - const template = templates[name as keyof typeof templates] - if (!template) { - throw new Error(`Template ${name} not found`) + const template = loadTemplate(name, language) + + return { + html: (data: any) => template.html(data), + text: (data: any) => template.text(data) } - return template[language] } \ No newline at end of file diff --git a/src/templates/password-reset/de.html b/src/templates/password-reset/de.html new file mode 100644 index 0000000..dac8602 --- /dev/null +++ b/src/templates/password-reset/de.html @@ -0,0 +1,7 @@ +

Anfrage zum Zurücksetzen des Passworts

+

Hallo {{name}},

+

Wir haben eine Anfrage zum Zurücksetzen Ihres Passworts erhalten. Klicken Sie auf den untenstehenden Link, um ein neues Passwort zu erstellen:

+Passwort zurücksetzen +

Dieser Link läuft in {{expiresIn}} ab.

+

Falls Sie diese Anfrage nicht gestellt haben, ignorieren Sie bitte diese E-Mail oder kontaktieren Sie den Support, wenn Sie Bedenken haben.

+

Mit freundlichen Grüßen,
Ihr Support-Team

\ No newline at end of file diff --git a/src/templates/password-reset/de.txt b/src/templates/password-reset/de.txt new file mode 100644 index 0000000..e3e7e3b --- /dev/null +++ b/src/templates/password-reset/de.txt @@ -0,0 +1,13 @@ +Anfrage zum Zurücksetzen des Passworts + +Hallo {{name}}, + +Wir haben eine Anfrage zum Zurücksetzen Ihres Passworts erhalten. Verwenden Sie den folgenden Link, um ein neues Passwort zu erstellen: +{{resetLink}} + +Dieser Link läuft in {{expiresIn}} ab. + +Falls Sie diese Anfrage nicht gestellt haben, ignorieren Sie bitte diese E-Mail oder kontaktieren Sie den Support, wenn Sie Bedenken haben. + +Mit freundlichen Grüßen, +Ihr Support-Team \ No newline at end of file diff --git a/src/templates/password-reset/en.html b/src/templates/password-reset/en.html new file mode 100644 index 0000000..5542c3b --- /dev/null +++ b/src/templates/password-reset/en.html @@ -0,0 +1,7 @@ +

Password Reset Request

+

Hello {{name}},

+

We received a request to reset your password. Click the link below to create a new password:

+Reset Password +

This link will expire in {{expiresIn}}.

+

If you didn't request this password reset, please ignore this email or contact support if you have concerns.

+

Best regards,
Your Support Team

\ No newline at end of file diff --git a/src/templates/password-reset/en.txt b/src/templates/password-reset/en.txt new file mode 100644 index 0000000..d21021b --- /dev/null +++ b/src/templates/password-reset/en.txt @@ -0,0 +1,13 @@ +Password Reset Request + +Hello {{name}}, + +We received a request to reset your password. Use the following link to create a new password: +{{resetLink}} + +This link will expire in {{expiresIn}}. + +If you didn't request this password reset, please ignore this email or contact support if you have concerns. + +Best regards, +Your Support Team \ No newline at end of file diff --git a/src/templates/welcome/de.html b/src/templates/welcome/de.html new file mode 100644 index 0000000..a68fa0a --- /dev/null +++ b/src/templates/welcome/de.html @@ -0,0 +1,3 @@ +

Willkommen {{name}}!

+

Danke, dass Sie sich bei uns registriert haben. Bitte klicken Sie auf den Link unten, um Ihr Konto zu aktivieren:

+Konto aktivieren \ No newline at end of file diff --git a/src/templates/welcome/de.txt b/src/templates/welcome/de.txt new file mode 100644 index 0000000..4a7356c --- /dev/null +++ b/src/templates/welcome/de.txt @@ -0,0 +1,4 @@ +Willkommen {{name}}! + +Danke, dass Sie sich bei uns registriert haben. Bitte verwenden Sie den folgenden Link, um Ihr Konto zu aktivieren: +{{activationLink}} \ No newline at end of file diff --git a/src/templates/welcome/en.html b/src/templates/welcome/en.html new file mode 100644 index 0000000..8292560 --- /dev/null +++ b/src/templates/welcome/en.html @@ -0,0 +1,3 @@ +

Welcome {{name}}!

+

Thank you for joining us. Please click the link below to activate your account:

+Activate Account \ No newline at end of file diff --git a/src/templates/welcome/en.txt b/src/templates/welcome/en.txt new file mode 100644 index 0000000..b1ac5a2 --- /dev/null +++ b/src/templates/welcome/en.txt @@ -0,0 +1,4 @@ +Welcome {{name}}! + +Thank you for joining us. Please use the following link to activate your account: +{{activationLink}} \ No newline at end of file