Renn F
b1d5dbb240
[F106] compound (timestamp, id) keyset cursor for message pagination
...
get_messages used strict timestamp inequalities with a non-deterministic
order_by(timestamp.desc()), so equal-timestamp messages were cut by limit
on one page and excluded (strict < T / > T) from the next — they vanished
across pages. Bundled the (timestamp, id) pair into a MessageCursor dataclass
so the next page resumes exactly past the cursor's id at the shared
timestamp (or_: strictly-older OR same-timestamp-smaller-id for before; the
mirror for after), with a deterministic order_by(timestamp.desc(), id.desc())
so the last-item cursor is unambiguous. id is None for a legacy timestamp-
only cursor (strict inequality, prior behavior). The route builds cursors
from the flat before/before_id + after/after_id HTTP params; the schema now
carries the tie-breaker ids. Also clears PLR0913 (cursors replace the
before_id/after_id params).
2026-06-28 21:56:10 +02:00
..
2026-06-28 17:00:20 +02:00
2026-06-21 20:31:42 +02:00
2026-05-02 03:11:49 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-05-12 06:39:18 +02:00
2026-05-06 00:32:52 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-24 01:15:57 +02:00
2026-05-12 04:37:01 +02:00
2026-06-14 13:43:46 +02:00
2026-06-03 19:48:10 +02:00
2026-06-11 04:36:17 +02:00
2026-06-27 06:52:59 +02:00
2026-06-14 13:43:46 +02:00
2026-06-28 18:15:56 +02:00
2026-06-15 20:47:41 +02:00
2026-06-22 12:37:46 +02:00
2026-06-22 12:37:46 +02:00
2026-06-22 12:37:46 +02:00
2026-06-22 12:37:46 +02:00
2026-06-22 15:19:50 +02:00
2026-06-23 07:26:41 +02:00
2026-05-06 21:02:31 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-22 15:50:46 +02:00
2026-06-10 12:04:24 +02:00
2026-05-12 06:27:33 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-21 20:31:42 +02:00
2026-06-22 12:37:46 +02:00
2026-06-17 06:36:28 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-26 01:43:08 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-24 03:35:02 +02:00
2026-06-25 01:07:05 +02:00
2026-06-19 09:15:01 +02:00
2026-06-14 13:43:46 +02:00
2026-06-28 21:56:10 +02:00
2026-06-23 07:26:41 +02:00
2026-05-06 21:02:31 +02:00
2026-06-28 17:00:20 +02:00
2026-06-28 17:00:20 +02:00
2026-06-03 06:35:03 +02:00
2026-06-13 08:38:31 +02:00
2026-06-24 01:15:57 +02:00
2026-06-25 21:11:36 +02:00
2026-06-25 21:11:36 +02:00
2026-06-28 17:00:20 +02:00
2026-06-14 13:43:46 +02:00
2026-06-03 18:54:07 +02:00
2026-06-15 04:55:16 +02:00
2026-06-19 09:15:01 +02:00
2026-06-11 04:36:17 +02:00
2026-06-14 13:43:46 +02:00
2026-06-15 20:47:41 +02:00
2026-06-26 01:43:08 +02:00
2026-06-26 01:43:08 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-20 09:27:29 +02:00
2026-06-03 06:35:03 +02:00
2026-06-22 15:19:50 +02:00
2026-06-14 13:43:46 +02:00
2026-06-22 12:37:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-24 01:15:57 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-14 13:43:46 +02:00
2026-06-26 01:43:08 +02:00
2026-05-06 21:02:31 +02:00
2026-06-15 20:47:41 +02:00
2026-06-15 20:47:41 +02:00
2026-06-14 13:43:46 +02:00
2026-05-12 03:48:47 +02:00
2026-06-14 13:43:46 +02:00
2026-06-22 15:19:50 +02:00
2026-06-14 13:43:46 +02:00
2026-06-21 02:48:07 +02:00
2026-06-14 13:43:46 +02:00
2026-06-21 02:48:07 +02:00
2026-06-27 06:52:59 +02:00
2026-06-14 13:43:46 +02:00
2026-06-21 02:48:07 +02:00
2026-06-28 09:57:08 +02:00
2026-06-21 02:48:07 +02:00
2026-06-22 01:59:41 +02:00
2026-06-22 01:31:45 +02:00
2026-06-24 05:58:42 +02:00