22 Commits

Author SHA1 Message Date
philipp f9a202db55 chore(deps): bump
Build Latest image / build-container (push) Successful in 44s
Build release images / build-container (push) Failing after 3h14m11s
2025-03-27 10:20:15 +01:00
philipp 92fc5762e4 chore(deps): bun:1.2.6
Build Latest image / build-container (push) Successful in 38s
2025-03-27 10:03:18 +01:00
philipp 326b241dab feat: update email for new times
Build Latest image / build-container (push) Successful in 33s
Build release images / build-container (push) Successful in 31s
2025-03-27 10:00:56 +01:00
niggl a7a50ff59d refactor(ci): Switch to actions
Build Latest image / build-container (push) Successful in 36s
2025-03-22 22:55:22 +01:00
philipp 4257686f35 ics invite 2025-03-19 00:37:53 +01:00
philipp 2f25937a94 feat: add ical 2025-03-18 23:57:01 +01:00
philipp 658b8d4dd8 chore: 1.2.1 2025-03-18 23:38:08 +01:00
philipp df6381fd5e feat: new email templates 2025-03-18 23:37:28 +01:00
philipp a11e5f2f3e ci: drop main branch
ci/woodpecker/push/build Pipeline was successful
2024-12-18 18:01:12 +01:00
philipp 7a8e484632 chore: 1.2.0
ci/woodpecker/push/build Pipeline failed
ci/woodpecker/tag/release Pipeline was successful
2024-12-18 18:00:06 +01:00
philipp 1f771fb73f feat: NODE_ENV=production 2024-12-18 17:59:40 +01:00
philipp 34c8f03571 refactor: dockerfile 2024-12-18 17:59:30 +01:00
philipp dfac4c0fe9 chore(deps): bun:1.1.40 2024-12-18 17:59:24 +01:00
philipp 9860014420 chore(deps): bump all
ci/woodpecker/push/build Pipeline failed
2024-12-18 17:59:10 +01:00
philipp bfce0c22c0 chore: 1.1.1
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/release Pipeline was successful
2024-12-12 18:55:05 +01:00
philipp 828290d9ba fix(env): no trailing slash for DOCUMENT_SERVER_URL 2024-12-12 18:54:53 +01:00
philipp 96e3be543b chore: 1.1.0
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/release Pipeline was successful
2024-12-12 18:37:43 +01:00
philipp c8781e3a3d refactor: move barcode generation to document server 2024-12-12 18:37:25 +01:00
philipp 22ab25045c chore: 1.0.2
ci/woodpecker/tag/release Pipeline was successful
ci/woodpecker/push/build Pipeline was successful
2024-12-11 22:59:17 +01:00
philipp 2230259e4a Merge branch 'dev' of https://git.odit.services/lfk/mailer into dev
ci/woodpecker/push/build Pipeline was successful
ci/woodpecker/tag/release Pipeline was successful
2024-12-11 22:55:42 +01:00
philipp 57f3a910f6 tmp-fix(templates): use barcode generation api 2024-12-11 22:55:30 +01:00
philipp 9076a9488e fix(templates): use logo from frontend 2024-12-11 22:55:15 +01:00
17 changed files with 250 additions and 146 deletions
+3 -1
View File
@@ -6,6 +6,8 @@ EMAIL_FROM="noreply@lauf-fuer-kaya.de"
EMAIL_REPLYTO="info@lauf-fuer-kaya.de"
REDIS_URL=redis://localhost:6379
FRONTEND_URL="https://run.lauf-fuer-kaya.de"
DOCUMENT_SERVER_URL="https://documents.run.lauf-fuer-kaya.de"
AUTHKEY=""
EVENT_DATE="23.05.2025"
EVENT_NAME="Lauf für Kaya! 2025"
EVENT_NAME="Lauf für Kaya! 2025"
NODE_ENV=production
+28
View File
@@ -0,0 +1,28 @@
name: Build Latest image
on:
push:
branches:
- dev
jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Login to registry
uses: docker/login-action@v3
with:
registry: registry.odit.services
username: ${{ vars.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
tags: |
${{ vars.REGISTRY }}/lfk/mailer:dev
${{ vars.REGISTRY }}/lfk/mailer:latest
platforms: linux/amd64,linux/arm64
+27
View File
@@ -0,0 +1,27 @@
name: Build release images
on:
push:
tags:
- "*.*.*"
jobs:
build-container:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Login to registry
uses: docker/login-action@v3
with:
registry: registry.odit.services
username: ${{ vars.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build and push
uses: docker/build-push-action@v6
with:
push: true
tags: |
${{ vars.REGISTRY }}/lfk/mailer:${{ github.ref_name }}
platforms: linux/amd64,linux/arm64
-33
View File
@@ -1,33 +0,0 @@
steps:
- name: build latest
image: woodpeckerci/plugin-docker-buildx
settings:
repo: registry.odit.services/lfk/mailer
tags:
- latest
registry: registry.odit.services
platforms: linux/amd64,linux/arm64
cache_from: registry.odit.services/lfk/mailer:dev
username:
from_secret: odit-registry-builder-username
password:
from_secret: odit-registry-builder-password
when:
branch: main
- name: build dev
image: woodpeckerci/plugin-docker-buildx
settings:
repo: registry.odit.services/lfk/mailer
tags:
- dev
registry: registry.odit.services
platforms: linux/amd64,linux/arm64
cache_from: registry.odit.services/lfk/mailer:dev
username:
from_secret: odit-registry-builder-username
password:
from_secret: odit-registry-builder-password
when:
branch: dev
when:
event: push
-17
View File
@@ -1,17 +0,0 @@
steps:
- name: build tag
image: woodpeckerci/plugin-docker-buildx
settings:
repo: registry.odit.services/lfk/mailer
tags:
- "${CI_COMMIT_TAG}"
registry: registry.odit.services
platforms: linux/amd64,linux/arm64
cache_from: registry.odit.services/lfk/mailer:dev
username:
from_secret: odit-registry-builder-username
password:
from_secret: odit-registry-builder-password
when:
event:
- tag
+1 -15
View File
@@ -1,21 +1,7 @@
FROM oven/bun:1.1.36-slim
# FROM oven/bun:1.0.25
FROM oven/bun:1.2.6-slim
WORKDIR /app
# Copy package files
# Install dependencies
COPY package.json .
RUN bun i
# COPY package.json bun.lockb ./
# RUN bun install --frozen-lockfile
# Copy source code
COPY . .
# Expose the application port
EXPOSE 3000
# Start the application
CMD ["bun", "run", "start"]
Regular → Executable
BIN
View File
Binary file not shown.
+12 -13
View File
@@ -1,6 +1,6 @@
{
"name": "@odit/lfk-mailer",
"version": "1.0.0",
"version": "1.2.3",
"private": true,
"type": "module",
"scripts": {
@@ -8,21 +8,20 @@
"start": "bun src/index.ts"
},
"dependencies": {
"@hono/node-server": "1.13.7",
"@hono/swagger-ui": "0.5.0",
"@hono/zod-openapi": "0.18.3",
"@hono/zod-validator": "0.4.1",
"bullmq": "5.34.0",
"bwip-js": "4.5.1",
"@hono/node-server": "1.14.0",
"@hono/swagger-ui": "0.5.1",
"@hono/zod-openapi": "0.19.2",
"@hono/zod-validator": "0.4.3",
"bullmq": "5.44.4",
"handlebars": "4.7.8",
"hono": "4.6.13",
"ioredis": "5.4.1",
"nodemailer": "6.9.16",
"zod": "3.24.1"
"hono": "4.7.5",
"ioredis": "5.6.0",
"nodemailer": "6.10.0",
"zod": "3.24.2"
},
"devDependencies": {
"@types/node": "22.10.2",
"@types/node": "22.13.14",
"@types/nodemailer": "6.4.17",
"bun-types": "1.1.38"
"bun-types": "1.2.6"
}
}
+4 -1
View File
@@ -2,11 +2,13 @@ import { createTransport } from "nodemailer";
import { Queue, Worker, QueueEvents } from "bullmq";
import { config } from "../config/env";
import Redis from "ioredis";
import { Attachment } from "nodemailer/lib/mailer";
interface EmailJob {
to: string;
subject: string;
html: string;
attachments: Attachment[];
text: string;
}
@@ -40,12 +42,13 @@ const worker = new Worker<EmailJob>(
QUEUE_NAME,
async (job) => {
await transporter.sendMail({
from: config.email.from,
from: { address: config.email.from, name: "Lauf für Kaya!" },
replyTo: config.email.replyTo,
to: job.data.to,
subject: job.data.subject,
text: job.data.text,
html: job.data.html,
attachments: job.data.attachments,
});
},
{
+11 -16
View File
@@ -5,7 +5,7 @@ import { z } from 'zod'
import { EmailService } from '../services/email'
import { getEmailTemplate } from '../templates'
import { Language } from '../types'
import { toBuffer } from 'bwip-js/node'
import { Attachment } from 'nodemailer/lib/mailer'
const emailRouter = new Hono()
const emailService = new EmailService()
@@ -18,24 +18,12 @@ const sendEmailSchema = z.object({
})
async function generateBarcodeDataURL(data) {
const buffer = await toBuffer({
bcid: 'code128',
text: data,
scale: 3,
height: 10,
includetext: true,
textxalign: 'center',
});
const base64Data = buffer.toString('base64');
const dataURL = `data:image/png;base64,${base64Data}`;
return dataURL;
return `${process.env.DOCUMENT_SERVER_URL}/v1/barcodes/code128/${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')
const attachments: Attachment[] = []
try {
const template = getEmailTemplate(templateName, language as Language)
if (templateName === "welcome") {
@@ -45,6 +33,12 @@ emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('js
} else {
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:lfk2025-xhJP3h\nDESCRIPTION:Der Lauf für Kaya! 2025 findet am 23.05.2025 auf dem Sportplatz des Gymnasium Herzogenaurach statt - Bürgerlauf von 14 bis 18 Uhr - Firmenlauf von 13:30 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 (data.token) {
@@ -58,6 +52,7 @@ emailRouter.post('/', bearerAuth({ token: process.env.AUTHKEY }), zValidator('js
data.event_name = process.env.EVENT_NAME
await emailService.sendEmail({
to,
attachments,
subject: template.subject(data),
html: template.html(data),
text: template.text(data)
+2
View File
@@ -1,10 +1,12 @@
import { emailQueue } from '../queues/email.queue'
import { config } from '../config/env'
import { Attachment } from 'nodemailer/lib/mailer'
interface EmailOptions {
to: string
subject: string
html: string
attachments: Attachment[]
text: string
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+3
View File
@@ -3,6 +3,9 @@ Hallo {{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.
Der Bürgerlauf findet von 14:00 bis 18:00 Uhr statt.
Der Firmenlauf beginnt um 13:30 Uhr.
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!
File diff suppressed because one or more lines are too long
+3
View File
@@ -3,6 +3,9 @@ Hello {{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.
The Citizens' Run takes place from 2:00 PM to 6:00 PM.
The Corporate Run begins at 1:30 PM.
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!