Naiyuan Qing
6b2097ccbb
feat(inbox): archived notifications sub-view (MUL-3736) ( #5518 )
...
Adds an "Archived" sub-view to the Inbox, reachable from an entry at the
bottom of the main list, with per-row unarchive. Mirrors chat's archived
sub-view so the two surfaces share one mental model.
Backend:
- GET /api/inbox/archived and POST /api/inbox/{id}/unarchive. Kept off the
existing GET /api/inbox so installed clients keep their contract and the
unbounded archive never rides along with the main list.
- The archived query excludes any issue that still has an active row. Archiving
is issue-level, so a new notification on an archived issue leaves old archived
rows beside a fresh active one — without the guard the issue renders in BOTH
lists. The exclusion lives in SQL so neither list depends on the other's cache.
- Unarchive is issue-level (mirroring archive) and leaves `read` untouched, so a
restored unread item raises the unread badge again.
- v1 ships no pagination: LIMIT 200, newest-first, so truncation drops the
oldest rows and never hides a group's newest one.
- inbox:unarchived event, fanned out to the recipient like the other personal
inbox events.
- Two CONCURRENTLY-built indexes; inbox_item previously had none covering
workspace/archived/created_at.
Frontend:
- Separate TanStack cache per list; every inbox event invalidates the workspace
prefix, since any of them can move an item across the boundary.
- View persisted as ?view=archived, so refresh, back/forward, and the mobile
detail-back all return to the list the user was in.
- Batch actions stay main-view only — they archive from the MAIN inbox, so
offering them over the archived list would do the opposite of what it reads.
- Mobile subscribes to inbox:unarchived (its list gains the restored row); its
own archived view remains follow-up.
Known debt: no pagination, so an archive past ~200 rows is truncated silently
in the UI; the entry's count is the deduplicated count of the rows returned.
Verified: pnpm typecheck/test/lint (0 errors), go build/vet, Go inbox suite
against a real Postgres, migrations up+down, and EXPLAIN confirming both new
indexes serve the query.
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com >
Co-authored-by: multica-agent <github@multica.ai >
2026-07-16 14:58:42 +08:00
..
2026-05-09 05:49:33 +02:00
2026-05-09 05:49:33 +02:00
2026-05-07 15:45:29 +08:00
2026-05-07 15:45:29 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-08 15:35:21 +08:00
2026-05-09 15:07:57 +08:00
2026-05-09 15:07:57 +08:00
2026-05-09 14:39:10 +08:00
2026-05-09 14:39:10 +08:00
2026-05-12 13:49:03 +08:00
2026-05-12 13:49:03 +08:00
2026-05-09 15:07:57 +08:00
2026-05-09 15:07:57 +08:00
2026-05-11 14:39:35 +08:00
2026-05-11 14:39:35 +08:00
2026-05-11 14:39:35 +08:00
2026-05-11 14:39:35 +08:00
2026-05-12 10:57:54 +08:00
2026-05-12 10:57:54 +08:00
2026-05-11 22:53:07 +08:00
2026-05-11 22:53:07 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 12:51:16 +08:00
2026-05-13 12:51:16 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-13 18:46:20 +08:00
2026-05-14 14:07:26 +08:00
2026-05-14 14:07:26 +08:00
2026-05-14 15:23:36 +02:00
2026-05-14 15:23:36 +02:00
2026-05-18 12:17:39 +08:00
2026-05-18 12:17:39 +08:00
2026-05-17 15:01:38 +08:00
2026-05-17 15:01:38 +08:00
2026-05-16 21:26:30 +02:00
2026-05-16 21:26:30 +02:00
2026-05-16 21:26:30 +02:00
2026-05-16 21:26:30 +02:00
2026-05-18 14:59:40 +08:00
2026-05-18 14:59:40 +08:00
2026-05-19 05:35:18 +02:00
2026-05-19 05:35:18 +02:00
2026-05-20 12:30:10 +08:00
2026-05-20 12:30:10 +08:00
2026-05-19 18:37:48 +02:00
2026-05-19 18:37:48 +02:00
2026-05-20 05:30:13 +02:00
2026-05-20 05:30:13 +02:00
2026-06-17 09:24:15 +02:00
2026-06-17 17:53:43 +08:00
2026-05-19 19:51:28 +02:00
2026-05-19 19:51:28 +02:00
2026-05-20 15:37:23 +08:00
2026-05-20 15:37:23 +08:00
2026-05-22 13:22:36 +08:00
2026-05-22 13:22:36 +08:00
2026-05-21 19:00:26 +08:00
2026-05-21 19:00:26 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 16:26:42 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 15:33:47 +08:00
2026-05-21 16:35:45 +08:00
2026-05-21 16:35:45 +08:00
2026-05-22 12:26:56 +08:00
2026-05-22 12:26:56 +08:00
2026-05-22 14:51:43 +08:00
2026-05-22 14:51:43 +08:00
2026-05-25 18:42:48 +08:00
2026-05-25 18:42:48 +08:00
2026-05-27 13:44:31 +08:00
2026-05-27 13:44:31 +08:00
2026-05-26 17:00:01 +08:00
2026-05-26 17:00:01 +08:00
2026-05-26 16:45:46 +08:00
2026-05-26 16:45:46 +08:00
2026-06-03 19:12:14 +08:00
2026-06-03 19:12:14 +08:00
2026-05-27 15:47:36 +08:00
2026-05-27 15:47:36 +08:00
2026-06-03 19:12:14 +08:00
2026-06-03 19:12:14 +08:00
2026-06-01 16:48:05 +02:00
2026-06-01 16:48:05 +02:00
2026-06-03 14:34:01 +08:00
2026-06-03 14:34:01 +08:00
2026-06-03 19:12:14 +08:00
2026-06-03 19:12:14 +08:00
2026-06-03 19:12:14 +08:00
2026-06-03 19:12:14 +08:00
2026-06-05 13:46:26 +08:00
2026-06-05 13:46:26 +08:00
2026-06-04 11:21:51 +08:00
2026-06-04 11:21:51 +08:00
2026-06-04 11:21:51 +08:00
2026-06-04 11:21:51 +08:00
2026-06-05 16:03:13 +08:00
2026-06-05 16:03:13 +08:00
2026-06-08 19:29:57 +08:00
2026-06-09 19:59:20 +08:00
2026-06-09 19:59:20 +08:00
2026-06-09 19:59:20 +08:00
2026-06-12 15:53:55 +08:00
2026-06-12 15:53:55 +08:00
2026-06-18 13:33:14 +08:00
2026-06-18 13:33:14 +08:00
2026-06-17 15:18:44 +02:00
2026-06-18 13:33:14 +08:00
2026-06-17 12:26:25 +08:00
2026-06-17 12:26:25 +08:00
2026-06-17 11:32:55 +08:00
2026-06-17 11:32:55 +08:00
2026-06-17 18:23:46 +08:00
2026-06-17 18:23:46 +08:00
2026-06-22 13:34:40 +08:00
2026-06-22 13:34:40 +08:00
2026-06-23 13:17:13 +08:00
2026-06-23 13:17:13 +08:00
2026-06-23 00:14:42 +08:00
2026-06-23 00:14:42 +08:00
2026-06-24 12:01:10 +08:00
2026-06-24 12:01:10 +08:00
2026-06-24 12:46:20 +08:00
2026-06-24 18:18:06 +08:00
2026-06-23 16:19:16 +08:00
2026-06-23 16:19:16 +08:00
2026-06-23 16:19:16 +08:00
2026-06-23 16:19:16 +08:00
2026-06-24 15:15:42 +08:00
2026-06-24 15:15:42 +08:00
2026-07-05 13:30:18 +08:00
2026-07-05 13:30:18 +08:00
2026-06-26 16:01:33 +08:00
2026-06-26 16:01:33 +08:00
2026-07-03 14:18:43 +08:00
2026-07-03 14:18:43 +08:00
2026-07-03 14:18:43 +08:00
2026-07-03 14:18:43 +08:00
2026-06-30 12:29:11 +08:00
2026-06-30 12:29:11 +08:00
2026-06-30 12:24:57 +08:00
2026-06-30 12:24:57 +08:00
2026-07-03 14:18:43 +08:00
2026-07-03 14:18:43 +08:00
2026-07-03 14:18:43 +08:00
2026-07-03 14:18:43 +08:00
2026-07-01 15:20:22 +08:00
2026-07-01 15:20:22 +08:00
2026-07-03 14:18:43 +08:00
2026-07-03 14:18:43 +08:00
2026-07-02 17:21:50 +08:00
2026-07-02 17:21:50 +08:00
2026-07-04 23:16:01 +08:00
2026-07-04 23:16:01 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 15:03:17 +08:00
2026-07-06 15:03:17 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-06 19:06:53 +08:00
2026-07-07 13:20:30 +08:00
2026-07-07 13:20:30 +08:00
2026-07-07 13:20:30 +08:00
2026-07-07 13:20:30 +08:00
2026-07-08 16:00:17 +08:00
2026-07-08 16:00:17 +08:00
2026-07-09 15:10:09 +08:00
2026-07-09 15:10:09 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-09 17:59:19 +08:00
2026-07-10 14:10:10 +08:00
2026-07-10 14:10:10 +08:00
2026-07-10 16:22:42 +08:00
2026-07-10 16:22:42 +08:00
2026-07-10 16:22:42 +08:00
2026-07-10 16:22:42 +08:00
2026-07-10 16:22:42 +08:00
2026-07-10 16:22:42 +08:00
2026-07-12 02:53:17 +08:00
2026-07-12 02:53:17 +08:00
2026-07-13 19:31:27 +08:00
2026-07-13 18:13:44 +08:00
2026-07-12 15:40:10 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 11:09:50 +08:00
2026-07-13 15:33:52 +08:00
2026-07-13 11:09:50 +08:00
2026-07-13 11:09:50 +08:00
2026-07-13 13:22:02 +08:00
2026-07-13 13:22:02 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 19:31:27 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 18:13:44 +08:00
2026-07-13 19:31:27 +08:00
2026-07-13 19:31:27 +08:00
2026-07-14 15:21:45 +08:00
2026-07-14 15:21:45 +08:00
2026-07-14 17:19:44 +08:00
2026-07-14 17:19:44 +08:00
2026-07-14 17:19:44 +08:00
2026-07-14 17:19:44 +08:00
2026-07-14 17:19:44 +08:00
2026-07-14 17:19:44 +08:00
2026-07-15 12:30:36 +08:00
2026-07-15 12:30:36 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 00:52:27 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 03:09:56 +08:00
2026-07-15 12:00:28 +08:00
2026-07-15 17:40:24 +08:00
2026-07-15 12:00:28 +08:00
2026-07-15 12:00:28 +08:00
2026-07-15 17:40:24 +08:00
2026-07-15 17:40:24 +08:00
2026-07-15 17:40:24 +08:00
2026-07-15 17:40:24 +08:00
2026-07-15 17:40:24 +08:00
2026-07-15 17:40:24 +08:00
2026-07-15 22:37:57 +08:00
2026-07-15 22:37:57 +08:00
2026-07-16 11:21:20 +08:00
2026-07-16 11:21:20 +08:00
2026-07-16 11:21:20 +08:00
2026-07-16 11:21:20 +08:00
2026-07-16 11:21:20 +08:00
2026-07-16 11:21:20 +08:00
2026-07-16 14:58:42 +08:00
2026-07-16 14:58:42 +08:00
2026-07-16 14:58:42 +08:00
2026-07-16 14:58:42 +08:00