diff --git a/.env.example b/.env.example index 96c6443..9c834ca 100644 --- a/.env.example +++ b/.env.example @@ -9,3 +9,6 @@ READER_PASSWORD=your-reader-password-here # A long random string used to sign JWT tokens. # Generate one with: node -e "console.log(require('crypto').randomBytes(32).toString('hex'))" JWT_SECRET=change-this-to-a-random-secret + +# Discord webhook URL for first-read notifications (optional) +DISCORD_WEBHOOK_URL= diff --git a/backend/src/routes/letters.ts b/backend/src/routes/letters.ts index 6a7fb8d..572b8c8 100644 --- a/backend/src/routes/letters.ts +++ b/backend/src/routes/letters.ts @@ -128,6 +128,18 @@ export async function letterRoutes(app: FastifyInstance) { if (role === "reader" && !rows[0].readAt) { const readAt = new Date().toISOString(); await db.update(letters).set({ readAt }).where(eq(letters.id, id)); + + const webhookUrl = process.env.DISCORD_WEBHOOK_URL; + if (webhookUrl) { + const date = new Date(rows[0].letterDate ?? rows[0].createdAt.slice(0, 10)) + .toLocaleDateString("en-US", { weekday: "long", year: "numeric", month: "long", day: "numeric" }); + fetch(webhookUrl, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ content: `💌 Your letter from **${date}** was just opened!` }), + }).catch(() => {}); + } + return { ...rows[0], readAt }; }