gallery: sort by earliest post date across all posts (new default) #178

Merged
bvandeusen merged 1 commits from dev into main 2026-07-01 10:54:41 -04:00
Owner

The gallery led with download dates because newest/oldest key off effective_date = the PRIMARY post's date (often the repost/download the file came from). Adds a materialized earliest_post_date = MIN(post_date) across ALL of an image's provenance posts (original publish), mirroring the effective_date pattern so the sort stays an index scan.

  • alembic 0071: earliest_post_date column + index (DESC, id DESC); backfill created_at baseline then MIN over image_provenance ⋈ post.
  • importer recomputes it whenever a dated post is linked.
  • gallery_service: new sorts posted_new/posted_old; cursor + year/month grouping follow the active column.
  • api: accepts posted_new|posted_old; default is now posted_new so the grid leads with original publish date. newest/oldest (effective_date) still available.
  • frontend: dropdown gains "Newest/Oldest post date" (default), old sorts relabelled "Newest/Oldest added".
  • tests: service test asserts the new sort keys off earliest_post_date; frontend default-omission test updated.

CI green on dev (run 1824, incl. integration + migration). No behavioral risk to existing sorts.

🤖 Generated with Claude Code

The gallery led with download dates because newest/oldest key off `effective_date` = the PRIMARY post's date (often the repost/download the file came from). Adds a materialized `earliest_post_date` = MIN(post_date) across ALL of an image's provenance posts (original publish), mirroring the effective_date pattern so the sort stays an index scan. - alembic 0071: `earliest_post_date` column + index (DESC, id DESC); backfill created_at baseline then MIN over image_provenance ⋈ post. - importer recomputes it whenever a dated post is linked. - gallery_service: new sorts `posted_new`/`posted_old`; cursor + year/month grouping follow the active column. - api: accepts `posted_new|posted_old`; **default is now `posted_new`** so the grid leads with original publish date. newest/oldest (effective_date) still available. - frontend: dropdown gains "Newest/Oldest post date" (default), old sorts relabelled "Newest/Oldest added". - tests: service test asserts the new sort keys off earliest_post_date; frontend default-omission test updated. CI green on dev (run 1824, incl. integration + migration). No behavioral risk to existing sorts. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 1 commit 2026-07-01 10:54:35 -04:00
feat(gallery): sort by earliest post date across all posts (new default)
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 16s
CI / backend-lint-and-test (push) Successful in 27s
CI / integration (push) Successful in 3m24s
c22f37d64d
The gallery's newest/oldest sort keys off image_record.effective_date =
COALESCE(primary post's post_date, created_at). The primary post is often the
repost/download the file came from, so the grid led with download dates rather
than when content was first posted (operator-flagged).

Add a second materialized sort key, earliest_post_date = MIN(post_date) across
ALL of an image's provenance posts (every post it appears in), else created_at —
the original publish date. Mirrors the effective_date pattern so the sort stays a
forward index scan.

- alembic 0071: add earliest_post_date + index (DESC, id DESC); backfill
  created_at baseline then MIN over image_provenance ⋈ post.
- importer: recompute earliest_post_date whenever a dated post is linked (MIN over
  the image's provenance, which now includes the just-added row).
- gallery_service: new sorts posted_new / posted_old key off earliest_post_date;
  cursor + year/month grouping follow the active column transparently.
- api: accept posted_new|posted_old; DEFAULT is now posted_new so the grid leads
  with original publish date. newest/oldest (effective_date) still available.
- frontend: sort dropdown gains "Newest/Oldest post date" (default Newest post
  date); existing effective-date sorts relabelled "Newest/Oldest added".
- tests: service test asserts posted_new/posted_old key off earliest_post_date;
  frontend default-sort omission test updated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Ttrj5P7upUTueSfoJcxEqa
bvandeusen merged commit 560a5000a2 into main 2026-07-01 10:54:41 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledCurator#178