mirror of
https://github.com/juherr/kill-the-news.git
synced 2026-06-20 22:03:48 +00:00
feat: reader-compat batch — JSON Feed, OPML export, conditional GET, dedup
Batch of four reader-facing improvements (TODO "Compat lecteurs + dedup"): - JSON Feed at /json/:feedId (feed lib .json1()); all formats cross-link - OPML export at /admin/opml (admin-protected; the registry lists every feed URL, so it must not be public) - Conditional GET on /rss + /atom: strong ETag + Last-Modified, 304 on If-None-Match/If-Modified-Since, validators shared via http-cache.ts - Duplicate-send dedup in ingestion: match by Message-ID, fall back to a SHA-256 of normalized subject+content; a duplicate is a no-op and bumps the new emails_deduplicated counter (status page + /api/v1/stats) 429 tests green, tsc clean, build dry-run OK. Docs (README/CLAUDE/TODO + landing cards) updated. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -203,6 +203,30 @@ export class Feed {
|
||||
).decide(senders);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check whether the email index already contains a duplicate of the incoming
|
||||
* email. Dedup uses `messageId` as the primary key (when both sides have one)
|
||||
* and falls back to `dedupHash` (SHA-256 of normalised subject+content).
|
||||
* Old entries that predate the feature and carry neither field are never
|
||||
* matched — they cannot cause false positives.
|
||||
*/
|
||||
hasDuplicate(messageId?: string, dedupHash?: string): boolean {
|
||||
for (const entry of this._metadata.emails) {
|
||||
if (messageId && entry.messageId && entry.messageId === messageId) {
|
||||
return true;
|
||||
}
|
||||
if (
|
||||
!messageId &&
|
||||
dedupHash &&
|
||||
entry.dedupHash &&
|
||||
entry.dedupHash === dedupHash
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an email to the front of the index, refresh the icon domain and the
|
||||
* per-sender unsubscribe link, then trim the oldest entries back under the
|
||||
|
||||
Reference in New Issue
Block a user