From 7b2b98d693524c39f63b8dfdda4a3c4809e29a65 Mon Sep 17 00:00:00 2001 From: Julien Herr Date: Fri, 22 May 2026 22:38:29 +0200 Subject: [PATCH] refactor: extract url helpers, add EMAIL_DOMAIN support - Add src/utils/urls.ts with baseUrl, feedRssUrl, feedAtomUrl, feedUrl, feedEmailAddress, feedTopicPattern - Add optional EMAIL_DOMAIN env var so web domain and email domain can differ (e.g. demo.kill-the.news serves feeds, @kill-the.news receives mail) - Replace all inline domain template literals with the new helpers - Remove unused site_url/feed_url fields from FeedConfig - Remove unused feedPath param from fetchFeedData - Extract verifyCallback() to deduplicate verifyAndStoreSubscription / verifyAndDeleteSubscription Co-Authored-By: Claude Sonnet 4.6 --- src/lib/email-processor.test.ts | 2 - src/routes/admin.tsx | 13 ++--- src/routes/admin/emails.tsx | 9 ++-- src/routes/admin/feeds.tsx | 7 ++- src/routes/atom.test.ts | 2 - src/routes/atom.ts | 11 +++-- src/routes/hub.ts | 5 +- src/routes/rss.ts | 11 +++-- src/types/index.ts | 3 +- src/utils/feed-fetcher.ts | 3 -- src/utils/feed-generator.test.ts | 2 - src/utils/urls.ts | 30 ++++++++++++ src/utils/websub.test.ts | 10 ---- src/utils/websub.ts | 81 +++++++++++++++----------------- wrangler-example.toml | 7 ++- 15 files changed, 104 insertions(+), 92 deletions(-) create mode 100644 src/utils/urls.ts diff --git a/src/lib/email-processor.test.ts b/src/lib/email-processor.test.ts index 01fd5be..3ada63b 100644 --- a/src/lib/email-processor.test.ts +++ b/src/lib/email-processor.test.ts @@ -220,8 +220,6 @@ describe("processEmail", () => { JSON.stringify({ title: "Test", language: "en", - site_url: "https://example.com", - feed_url: `https://example.com/rss/${VALID_FEED_ID}`, created_at: Date.now(), }), ); diff --git a/src/routes/admin.tsx b/src/routes/admin.tsx index f865d84..c751011 100644 --- a/src/routes/admin.tsx +++ b/src/routes/admin.tsx @@ -8,6 +8,7 @@ import { ADMIN_COOKIE_MAX_AGE } from "../config/constants"; import { logger } from "../lib/logger"; import { Layout, clampText } from "./admin/ui"; import { listAllFeeds, updateFeedInList } from "./admin/helpers"; +import { feedRssUrl, feedAtomUrl, feedEmailAddress } from "../utils/urls"; import { feedsRouter } from "./admin/feeds"; import { emailsRouter } from "./admin/emails"; import { dashboardScript } from "../scripts/generated/dashboard"; @@ -601,9 +602,9 @@ app.get("/", async (c) => { {feedsWithConfig.map((feed) => { - const emailAddress = `${feed.id}@${env.DOMAIN}`; - const rssUrl = `https://${env.DOMAIN}/rss/${feed.id}`; - const atomUrl = `https://${env.DOMAIN}/atom/${feed.id}`; + const emailAddress = feedEmailAddress(feed.id, env); + const rssUrl = feedRssUrl(feed.id, env); + const atomUrl = feedAtomUrl(feed.id, env); const titleDisplay = clampText(feed.title, 160); const titleHover = clampText(feed.title, 1000); const sortTitle = titleHover.toLowerCase(); @@ -712,9 +713,9 @@ app.get("/", async (c) => {