feat(room): reaction highlights recap page (LC-529) #502

Merged
longjacksonle merged 1 commit from longjacksonle/feat/LC-529-reaction-highlights into main 2026-07-03 02:59:57 +02:00 AGit

Adds a per-room "Highlights" page that lists the most-reacted messages over the past 7 days, so a member who was heads-down can catch up on what popped. Reached from a new Highlights action in the room header (channels only; DMs 404 as a private 1:1 surface). Each row shows the author, a snippet, a jump-to-message link, and the emoji breakdown with counts.

It is a plain aggregate over message_reactions (db::highlights::top_reacted), ranked by reactions RECEIVED IN THE WINDOW rather than message age, so an older message that gets a fresh burst still surfaces. Being non-LLM, it works with no AI configured - complementary to the LLM "catch me up" summaries. The page mirrors the pins page shape (routes::pinned): access-gated, sidebar chrome, a simple list; no WebSocket wiring (it is a pulled recap, not a live surface).

Custom-emoji reactions render as their raw :shortcode: text for now (the recap is a lightweight overview); unicode reactions render directly.

Tests: db-layer ranking / window-exclusion / limit (db_highlights.rs); i18n parity (en + es); full just test + just test-saas + just check green.

Co-Authored-By: Claude Opus 4.8 (1M context) noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01NTRhc4n7A2uB2Y5PHV2ewL

Adds a per-room "Highlights" page that lists the most-reacted messages over the past 7 days, so a member who was heads-down can catch up on what popped. Reached from a new Highlights action in the room header (channels only; DMs 404 as a private 1:1 surface). Each row shows the author, a snippet, a jump-to-message link, and the emoji breakdown with counts. It is a plain aggregate over `message_reactions` (`db::highlights::top_reacted`), ranked by reactions RECEIVED IN THE WINDOW rather than message age, so an older message that gets a fresh burst still surfaces. Being non-LLM, it works with no AI configured - complementary to the LLM "catch me up" summaries. The page mirrors the pins page shape (`routes::pinned`): access-gated, sidebar chrome, a simple list; no WebSocket wiring (it is a pulled recap, not a live surface). Custom-emoji reactions render as their raw `:shortcode:` text for now (the recap is a lightweight overview); unicode reactions render directly. Tests: db-layer ranking / window-exclusion / limit (db_highlights.rs); i18n parity (en + es); full `just test` + `just test-saas` + `just check` green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NTRhc4n7A2uB2Y5PHV2ewL
feat(room): reaction highlights recap page (LC-529)
All checks were successful
check-secrets / TruffleHog (pull_request) Successful in 3s
check-secrets / Nosey parker (pull_request) Successful in 4s
check-secrets / Kingfisher (pull_request) Successful in 5s
Check / clippy + fmt + tests (pull_request) Successful in 3m2s
Create release / Create release from merged PR (pull_request) Has been skipped
748e74f135
Adds a per-room "Highlights" page that lists the most-reacted messages over the past 7 days, so a member who was heads-down can catch up on what popped. Reached from a new Highlights action in the room header (channels only; DMs 404 as a private 1:1 surface). Each row shows the author, a snippet, a jump-to-message link, and the emoji breakdown with counts.

It is a plain aggregate over `message_reactions` (`db::highlights::top_reacted`), ranked by reactions RECEIVED IN THE WINDOW rather than message age, so an older message that gets a fresh burst still surfaces. Being non-LLM, it works with no AI configured - complementary to the LLM "catch me up" summaries. The page mirrors the pins page shape (`routes::pinned`): access-gated, sidebar chrome, a simple list; no WebSocket wiring (it is a pulled recap, not a live surface).

Custom-emoji reactions render as their raw `:shortcode:` text for now (the recap is a lightweight overview); unicode reactions render directly.

Tests: db-layer ranking / window-exclusion / limit (db_highlights.rs); i18n parity (en + es); full `just test` + `just test-saas` + `just check` green.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NTRhc4n7A2uB2Y5PHV2ewL
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
psa-systems/lets-chat!502
No description provided.