diff --git a/server/src/at_record_server/shelf_index.gleam b/server/src/at_record_server/shelf_index.gleam index fd76e55..452f709 100644 --- a/server/src/at_record_server/shelf_index.gleam +++ b/server/src/at_record_server/shelf_index.gleam @@ -487,7 +487,11 @@ fn handle(state: State, msg: Msg) -> actor.Next(State, Msg) { ListForDid(did, reply) -> { process.send( reply, - dict.values(state.entries) |> list.filter(fn(e) { e.did == did }), + dict.values(state.entries) + |> list.filter(fn(e) { e.did == did }) + // Deterministic store-level order, matching the Postgres backend + // (the handler re-sorts for the wire). + |> list.sort(fn(a, b) { string.compare(b.entry_uri, a.entry_uri) }), ) actor.continue(state) } diff --git a/server/src/at_record_server/shelf_index_postgres.gleam b/server/src/at_record_server/shelf_index_postgres.gleam index 5e0a6c0..57d2c9d 100644 --- a/server/src/at_record_server/shelf_index_postgres.gleam +++ b/server/src/at_record_server/shelf_index_postgres.gleam @@ -452,7 +452,10 @@ fn get_entry(conn: pog.Connection, entry_uri: String) -> Option(FoldedEntry) { fn list_for_did(conn: pog.Connection, did: String) -> List(FoldedEntry) { case pog.query( - "select " <> entry_columns <> " from shelf_entries where did = $1", + // Deterministic store-level order (the handler re-sorts for the wire). + "select " + <> entry_columns + <> " from shelf_entries where did = $1 order by entry_uri desc", ) |> pog.parameter(pog.text(did)) |> pog.returning(entry_row_decoder()) diff --git a/server/test/shelf_index_test.gleam b/server/test/shelf_index_test.gleam index 8c10123..16d09dc 100644 --- a/server/test/shelf_index_test.gleam +++ b/server/test/shelf_index_test.gleam @@ -295,6 +295,35 @@ pub fn list_for_did_returns_only_that_dids_entries_test() { assert only.entry_uri == entry_a } +pub fn list_for_did_is_newest_first_by_genesis_tid_test() { + let assert Ok(store) = shelf_index.start() + let older = "at://did:plc:a/dev.mokkenstorm.crate.shelf.entry/3aaa" + let newer = "at://did:plc:a/dev.mokkenstorm.crate.shelf.entry/3bbb" + shelf_index.record_and_fold( + store, + genesis( + entry_uri: older, + did: "did:plc:a", + rkey: "3aaa", + action: "acquired", + created_at: "2024-01-01T00:00:00Z", + ), + ) + shelf_index.record_and_fold( + store, + genesis( + entry_uri: newer, + did: "did:plc:a", + rkey: "3bbb", + action: "acquired", + created_at: "2024-01-02T00:00:00Z", + ), + ) + let assert [first, second] = store.entries.list_for_did("did:plc:a") + assert first.entry_uri == newer + assert second.entry_uri == older +} + pub fn delete_for_did_drops_entries_events_and_seen_test() { let assert Ok(store) = shelf_index.start() let entry_a = "at://did:plc:a/dev.mokkenstorm.crate.shelf.entry/e1"