2 Commits
1.2.1 ... 1.2.3

Author SHA1 Message Date
4257686f35 ics invite 2025-03-19 00:37:53 +01:00
2f25937a94 feat: add ical 2025-03-18 23:57:01 +01:00
8 changed files with 20 additions and 73 deletions

View File

@@ -1,6 +1,6 @@
{ {
"name": "@odit/lfk-mailer", "name": "@odit/lfk-mailer",
"version": "1.2.1", "version": "1.2.3",
"private": true, "private": true,
"type": "module", "type": "module",
"scripts": { "scripts": {

View File

@@ -2,11 +2,13 @@ import { createTransport } from "nodemailer";
import { Queue, Worker, QueueEvents } from "bullmq"; import { Queue, Worker, QueueEvents } from "bullmq";
import { config } from "../config/env"; import { config } from "../config/env";
import Redis from "ioredis"; import Redis from "ioredis";
import { Attachment } from "nodemailer/lib/mailer";
interface EmailJob { interface EmailJob {
to: string; to: string;
subject: string; subject: string;
html: string; html: string;
attachments: Attachment[];
text: string; text: string;
} }
@@ -40,12 +42,13 @@ const worker = new Worker<EmailJob>(
QUEUE_NAME, QUEUE_NAME,
async (job) => { async (job) => {
await transporter.sendMail({ await transporter.sendMail({
from: config.email.from, from: { address: config.email.from, name: "Lauf für Kaya!" },
replyTo: config.email.replyTo, replyTo: config.email.replyTo,
to: job.data.to, to: job.data.to,
subject: job.data.subject, subject: job.data.subject,
text: job.data.text, text: job.data.text,
html: job.data.html, html: job.data.html,
attachments: job.data.attachments,
}); });
}, },
{ {

View File

@@ -5,6 +5,7 @@ import { z } from 'zod'
import { EmailService } from '../services/email' import { EmailService } from '../services/email'
import { getEmailTemplate } from '../templates' import { getEmailTemplate } from '../templates'
import { Language } from '../types' import { Language } from '../types'
import { Attachment } from 'nodemailer/lib/mailer'
const emailRouter = new Hono() const emailRouter = new Hono()
const emailService = new EmailService() const emailService = new EmailService()
@@ -22,7 +23,7 @@ async function generateBarcodeDataURL(data) {
emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('json', sendEmailSchema), async (c) => { emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('json', sendEmailSchema), async (c) => {
let { to, templateName, language, data } = c.req.valid('json') let { to, templateName, language, data } = c.req.valid('json')
const attachments: Attachment[] = []
try { try {
const template = getEmailTemplate(templateName, language as Language) const template = getEmailTemplate(templateName, language as Language)
if (templateName === "welcome") { if (templateName === "welcome") {
@@ -32,6 +33,12 @@ emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('js
} else { } else {
return c.json({ success: false, error: "required params 'data.name', 'data.link', 'data.barcode_content' not provided" }, 406) return c.json({ success: false, error: "required params 'data.name', 'data.link', 'data.barcode_content' not provided" }, 406)
} }
const attachment: Attachment = {
filename: 'invite.ics',
content: `BEGIN:VCALENDAR\nVERSION:2.0\nBEGIN:VEVENT\nSUMMARY:Lauf für Kaya! 2025\nDTSTART:20250523T110000Z\nDTEND:20250523T160000Z\nDTSTAMP:20250318T230306Z\nUID:1742338986492-lfk2025\nDESCRIPTION:Der Lauf für Kaya! 2025 findet am 23.05.2025 auf dem Sportplatz des Gymnasium Herzogenaurach statt - Bürgerlauf von 13 bis 18 Uhr.\nLOCATION:Sportplatz Gymnasium Herzogenaurach\nORGANIZER:info@lauf-fuer-kaya.de\nSTATUS:CONFIRMED\nPRIORITY:5\nEND:VEVENT\nEND:VCALENDAR`,
contentType: 'text/calendar; method=REQUEST',
}
attachments.push(attachment)
} }
if (templateName === "password-reset") { if (templateName === "password-reset") {
if (data.token) { if (data.token) {
@@ -45,6 +52,7 @@ emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('js
data.event_name = process.env.EVENT_NAME data.event_name = process.env.EVENT_NAME
await emailService.sendEmail({ await emailService.sendEmail({
to, to,
attachments,
subject: template.subject(data), subject: template.subject(data),
html: template.html(data), html: template.html(data),
text: template.text(data) text: template.text(data)

View File

@@ -1,10 +1,12 @@
import { emailQueue } from '../queues/email.queue' import { emailQueue } from '../queues/email.queue'
import { config } from '../config/env' import { config } from '../config/env'
import { Attachment } from 'nodemailer/lib/mailer'
interface EmailOptions { interface EmailOptions {
to: string to: string
subject: string subject: string
html: string html: string
attachments: Attachment[]
text: string text: string
} }

View File

@@ -287,41 +287,6 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p
style="
font-size: 15px;
line-height: 26.25px;
margin: 0 0 20px 0;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #374151;
"
>
Wenn der Button nicht funktioniert, kannst du diesen Link in
deinen Browser kopieren:
<code
style="
background-color: #efefef;
color: #111827;
padding: 2px 4px;
border-radius: 6px;
font-family: SFMono-Regular, Menlo, Monaco, Consolas,
'Liberation Mono', 'Courier New', monospace;
font-weight: 400;
letter-spacing: 0;
"
>{{link}}</code
>
</p>
<hr
style="
width: 100%;
border: none;
border-top: 1px solid #eaeaea;
margin-top: 32px;
margin-bottom: 32px;
"
/>
<p <p
style=" style="
font-size: 15px; font-size: 15px;

View File

@@ -3,6 +3,8 @@ Hallo {{name}} 👋
vielen Dank für deine Registrierung beim {{event_name}} vielen Dank für deine Registrierung beim {{event_name}}
Am Lauftag ({{event_date}}) musst du nur noch deinen Barcode vorzeigen, damit erhältst du deine Läuferkarte. Am Lauftag ({{event_date}}) musst du nur noch deinen Barcode vorzeigen, damit erhältst du deine Läuferkarte.
Der Bürger- & Firmenlauf findet von 13:00 bis 18:00 Uhr statt.
Deinen Registrierungs-Code, Rundenzeiten und weitere Infos kannst du jederzeit im Lauf für Kaya! Selfservice unter {{link}} einsehen. Deinen Registrierungs-Code, Rundenzeiten und weitere Infos kannst du jederzeit im Lauf für Kaya! Selfservice unter {{link}} einsehen.
Wir freuen uns schon auf dich und einen erfolgreichen Lauf für Kaya! Wir freuen uns schon auf dich und einen erfolgreichen Lauf für Kaya!

View File

@@ -287,41 +287,6 @@
</tr> </tr>
</tbody> </tbody>
</table> </table>
<p
style="
font-size: 15px;
line-height: 26.25px;
margin: 0 0 20px 0;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
color: #374151;
"
>
If the button doesn't work, you can copy this link into your
browser:
<code
style="
background-color: #efefef;
color: #111827;
padding: 2px 4px;
border-radius: 6px;
font-family: SFMono-Regular, Menlo, Monaco, Consolas,
'Liberation Mono', 'Courier New', monospace;
font-weight: 400;
letter-spacing: 0;
"
>{{link}}</code
>
</p>
<hr
style="
width: 100%;
border: none;
border-top: 1px solid #eaeaea;
margin-top: 32px;
margin-bottom: 32px;
"
/>
<p <p
style=" style="
font-size: 15px; font-size: 15px;

View File

@@ -3,6 +3,8 @@ Hello {{name}} 👋
Thank you for registering for the {{event_name}} Thank you for registering for the {{event_name}}
On the day of the run ({{event_date}}) you only have to show your barcode to receive your runner's card. On the day of the run ({{event_date}}) you only have to show your barcode to receive your runner's card.
The Citizens' & Company Run will take place from 1:00 p.m. to 6:00 p.m.
You can view your registration code, lap times and further information at any time from the Lauf für Kaya! Selfservice at {{link}}. You can view your registration code, lap times and further information at any time from the Lauf für Kaya! Selfservice at {{link}}.
We look forward to seeing you and to a successful Lauf für Kaya! We look forward to seeing you and to a successful Lauf für Kaya!