4aaf1d4f91
Implements spec #135 (spec 2 of 4, derived from wayfinder map #114; decisions settled in #120/#121/#125/#131). Blocked-by #134 is merged, so this lands on `main`. Four owner actions the dashboard can now perform, one ticket each: - **#149** — Latest Chapter correction: one numeric input, overwritten by the next machine write. - **#151** — Series URL repair: owner-typed, gated by the poller's own fetch gate. - **#150 / #153 / #154** — Cover replacement: addresses derived from bytes (`#150`), a Forced Poll replaces the Cover while an ordinary pass still only fills a blank one (`#153`), and byte reclamation is one guarded helper, file first / covers row last (`#154`). - **#155** — Orphan removal: one Series at a time, with the foreign key as the guard. Plus **#152** — Latest Chapter provenance: one derived line naming the actor class, so an owner can tell a hand-edited number from a machine read. - Migration `0015_latest_correction.sql` adds the correction/provenance columns; `0009` now derives cover addresses from bytes. - ADR `0014-cover-addresses-from-bytes.md` records the address scheme. Backend tests cover the store, poller, admin handlers, and web routes (`go test ./...`, needs Docker). Reviewed-on: #156 Co-authored-by: Sulthan Zaki <sultankiki05@gmail.com> Co-committed-by: Sulthan Zaki <sultankiki05@gmail.com>
16 lines
954 B
SQL
16 lines
954 B
SQL
-- The Cover splits into two facts. `cover` keeps the third-party address the
|
|
-- bytes come from, which is what the refetch path dedupes on; `cover_address`
|
|
-- is the content address of the bytes once they are actually stored, and is
|
|
-- what the wire's absolute URL is built from.
|
|
--
|
|
-- Empty `cover_address` therefore means "no Cover yet" rather than "a Cover
|
|
-- that 404s", which is the distinction the API and the UI both depend on.
|
|
--
|
|
-- The content address was originally the hex SHA-256 of the source URL
|
|
-- (ADR-0007). Since ADR-0014 it is the hex SHA-256 of the bytes themselves,
|
|
-- so a re-art behind the same URL is a new address. Rows written before
|
|
-- ADR-0014 keep their URL-derived addresses; they are never rehashed and heal
|
|
-- into byte addressing on their first forced replacement. Both derivations
|
|
-- share the 64-hex-digit shape, so the serving guard is unchanged.
|
|
ALTER TABLE series ADD COLUMN cover_address text NOT NULL DEFAULT '';
|