root
67a6cbcd9e
feat(media-supply): persist favorites with multi-group membership
...
Move media favorites from client state to PostgreSQL with server-side
search and pagination.
- Store favorites keyed by (tenant, user, group, resource) so a resource
can belong to multiple groups; the 500-resource cap counts distinct
resources, not memberships.
- Add favorite-group CRUD and group/global removal routes, with silent
cleanup of delisted or invisible resources on read.
- Serve favorite resource details server-side, 10 per page, with name/ID
search; favorites-page removal is group-scoped, resources-page removal
is global.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 20:21:59 +08:00
..
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-29 00:01:36 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-05-12 01:55:29 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-09 14:43:20 +08:00
2026-04-09 14:43:20 +08:00
2026-04-09 14:43:20 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-01 00:58:42 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-05-01 12:25:29 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-05-01 12:25:29 +08:00
2026-05-01 12:25:29 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-30 01:32:19 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 00:31:28 +08:00
2026-04-02 10:58:39 +08:00
2026-04-02 10:58:39 +08:00
2026-04-02 11:38:08 +08:00
2026-04-02 11:38:08 +08:00
2026-04-02 11:38:08 +08:00
2026-04-02 11:38:08 +08:00
2026-04-02 21:16:12 +08:00
2026-04-02 21:16:12 +08:00
2026-04-20 13:52:35 +08:00
2026-05-06 18:25:35 +08:00
2026-04-20 13:52:35 +08:00
2026-04-20 13:52:35 +08:00
2026-04-05 17:14:13 +08:00
2026-04-05 17:14:13 +08:00
2026-04-05 20:41:42 +08:00
2026-04-05 20:41:42 +08:00
2026-04-07 22:21:16 +08:00
2026-04-07 22:21:16 +08:00
2026-04-09 14:43:20 +08:00
2026-05-01 12:37:15 +08:00
2026-04-12 09:56:18 +08:00
2026-04-23 09:09:20 +08:00
2026-04-30 01:32:19 +08:00
2026-04-30 01:32:19 +08:00
2026-04-16 20:40:41 +08:00
2026-04-16 20:40:41 +08:00
2026-04-16 20:40:41 +08:00
2026-04-16 20:40:41 +08:00
2026-04-17 07:53:56 +08:00
2026-04-17 07:53:56 +08:00
2026-04-17 08:04:56 +08:00
2026-04-17 08:04:56 +08:00
2026-04-17 08:34:12 +08:00
2026-04-17 08:34:12 +08:00
2026-04-17 08:06:36 +08:00
2026-04-17 08:06:36 +08:00
2026-04-18 00:47:57 +08:00
2026-04-18 00:47:57 +08:00
2026-04-19 14:18:20 +08:00
2026-04-19 14:18:20 +08:00
2026-04-19 14:18:20 +08:00
2026-04-19 14:18:20 +08:00
2026-04-19 14:18:20 +08:00
2026-04-19 14:18:20 +08:00
2026-04-19 14:18:20 +08:00
2026-05-06 18:25:35 +08:00
2026-04-19 14:18:20 +08:00
2026-05-06 12:56:39 +08:00
2026-04-20 13:52:35 +08:00
2026-04-20 13:52:35 +08:00
2026-04-20 15:40:18 +08:00
2026-04-20 15:40:18 +08:00
2026-04-22 00:24:21 +08:00
2026-06-22 15:38:06 +08:00
2026-04-24 22:19:57 +08:00
2026-05-13 19:36:24 +08:00
2026-04-28 11:33:47 +08:00
2026-04-28 11:33:47 +08:00
2026-04-29 00:01:36 +08:00
2026-04-29 00:01:36 +08:00
2026-04-30 01:32:19 +08:00
2026-04-30 01:32:19 +08:00
2026-05-01 11:02:21 +08:00
2026-05-01 11:02:21 +08:00
2026-05-05 20:48:14 +08:00
2026-05-05 20:48:14 +08:00
2026-05-03 02:02:39 +08:00
2026-05-05 20:48:14 +08:00
2026-05-06 12:56:39 +08:00
2026-05-06 12:56:39 +08:00
2026-05-05 19:47:04 +08:00
2026-05-05 19:47:04 +08:00
2026-05-05 23:43:10 +08:00
2026-05-05 23:43:10 +08:00
2026-05-06 18:25:35 +08:00
2026-05-06 18:25:35 +08:00
2026-05-11 11:11:31 +08:00
2026-05-11 11:11:31 +08:00
2026-05-12 01:55:29 +08:00
2026-05-12 01:55:29 +08:00
2026-05-12 21:53:36 +08:00
2026-05-12 21:53:36 +08:00
2026-05-20 11:22:37 +08:00
2026-05-20 11:22:37 +08:00
2026-05-20 12:19:27 +08:00
2026-05-20 12:19:27 +08:00
2026-05-20 15:37:25 +08:00
2026-05-20 15:37:25 +08:00
2026-05-20 15:37:25 +08:00
2026-05-20 15:37:25 +08:00
2026-05-20 15:37:25 +08:00
2026-05-20 15:37:25 +08:00
2026-05-20 18:09:53 +08:00
2026-05-20 18:09:53 +08:00
2026-05-22 23:51:45 +08:00
2026-05-22 23:51:45 +08:00
2026-05-24 01:47:51 +08:00
2026-05-24 01:47:51 +08:00
2026-05-26 18:43:15 +08:00
2026-05-26 18:43:15 +08:00
2026-05-26 18:43:15 +08:00
2026-05-26 18:43:15 +08:00
2026-05-26 18:43:15 +08:00
2026-05-26 18:43:15 +08:00
2026-05-29 23:17:01 +08:00
2026-05-29 23:17:01 +08:00
2026-05-29 23:17:01 +08:00
2026-05-29 23:17:01 +08:00
2026-05-29 23:17:01 +08:00
2026-05-29 23:17:01 +08:00
2026-05-29 23:17:01 +08:00
2026-05-29 23:17:01 +08:00
2026-05-30 19:52:17 +08:00
2026-05-30 19:52:17 +08:00
2026-05-30 19:52:17 +08:00
2026-05-30 19:52:17 +08:00
2026-06-06 13:06:14 +08:00
2026-06-06 13:06:14 +08:00
2026-06-09 19:44:24 +08:00
2026-06-09 19:44:24 +08:00
2026-06-09 19:44:24 +08:00
2026-06-09 19:44:24 +08:00
2026-06-14 21:02:39 +08:00
2026-06-14 21:02:39 +08:00
2026-06-19 17:20:35 +08:00
2026-06-19 17:20:35 +08:00
2026-06-19 17:20:35 +08:00
2026-06-19 17:20:35 +08:00
2026-06-19 17:20:35 +08:00
2026-06-19 17:20:35 +08:00
2026-06-19 17:20:35 +08:00
2026-06-19 17:20:35 +08:00
2026-06-21 08:26:56 +08:00
2026-06-21 08:26:56 +08:00
2026-06-22 15:38:06 +08:00
2026-06-22 15:38:06 +08:00
2026-06-22 22:37:16 +08:00
2026-06-22 22:37:16 +08:00
2026-06-23 01:03:35 +08:00
2026-06-23 01:03:35 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-29 23:13:33 +08:00
2026-06-30 12:30:10 +08:00
2026-06-30 12:30:10 +08:00
2026-07-08 21:48:20 +08:00
2026-07-08 21:48:20 +08:00
2026-07-10 20:21:59 +08:00
2026-07-10 20:21:59 +08:00