refactor: invert application↔routes boundary (Track B — points 3, 6a)

- Point 3: move the feed/email storage-cleanup helpers (purgeFeedKeysStep,
  collectUnsubscribeUrls, purgeExpiredFeeds, deleteKeysWithConcurrency,
  deleteAttachmentsForEmails) out of routes/admin/helpers.ts into
  src/application/feed-cleanup.ts, so the application layer no longer imports
  from routes/. deleteFeedRecord no longer takes a Hono Context: it accepts a
  BackgroundScheduler ((task) => void) and the HTTP edge passes
  (p) => waitUntilSafe(c, p). Application/domain are now Hono-Context-free.
- Point 6a: rename the misleadingly-named Feed.rename → Feed.editDetails (it
  edits title + description), and feed-service.renameFeed → editFeedDetails.

CLAUDE.md source layout updated. 351 tests pass; tsc --noEmit clean.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Julien Herr
2026-05-24 10:05:21 +02:00
parent f823a5f222
commit 46af982c40
9 changed files with 41 additions and 33 deletions
+3 -3
View File
@@ -164,10 +164,10 @@ export class Feed {
}
/**
* In-place edit of the presentational fields only. Never touches expiry or the
* sender policy — used by the dashboard's minimal title/description edit.
* In-place edit of the presentational fields only (title + description). Never
* touches expiry or the sender policy — used by the dashboard's minimal edit.
*/
rename(patch: { title?: string; description?: string }): void {
editDetails(patch: { title?: string; description?: string }): void {
if (patch.title !== undefined) this._config.title = patch.title;
if (patch.description !== undefined) {
this._config.description = patch.description;