Public: anyone can read this; the crew can change it.

The caller's SSH keys, pins and organizations answer `{ items, next_cursor }` #5373

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

`GET /api/v1/user/keys`, `/user/pins` and `/user/orgs` now answer `{ items, next_cursor }`. This is a breaking change to the response shape of those three routes.

shipped production is serving it deploy d480d55

opened this

GET /api/v1/user/keys, /user/pins and /user/orgs now answer { items, next_cursor }. This is a breaking change to the response shape of those three routes.

What failed last time: the earlier check failed because test/api-list-shape.test.ts still listed the three routes as bare-array exceptions. That list is for routes that still answer a bare array, so the stale entries made the test fail. I removed the three #5043 entries from it, and the other routes' entries are untouched.

What changed

  • The three routes take limit (default 50, max 200) and cursor, validated like the issue list's. A bad limit gets a 422.
  • Each route's permission and filter are unchanged.
  • The terminal UI, the CLI client (src/cli/api.ts), and the existing tests that read these lists now read items.
  • New tests in test/user-lists-page.test.ts cover the shape, paging to the end with limit and next_cursor, and a refused bad limit for each route.

Checked: I ran the eight test files that touch these routes (api-list-shape, user-lists-page, keys, parity, origins, cli-pins-pages, and the two timing tests): 56 pass, 10 skipped, 0 fail. The full bun test run and a clean type check are left to the forge's check. The type check I ran only reported a missing bun types definition, so it didn't type-check the change.

Not done: I left every other list route alone, since other issues cover those.

To try it: curl -H "authorization: Bearer $TOKEN" "$URL/api/v1/user/keys?limit=1".

Closes #5043

commented

GET /api/v1/user/keys, /user/pins and /user/orgs now answer { items, next_cursor }. This is a breaking change to the response shape of those three routes.

What failed last time: the earlier check failed because test/api-list-shape.test.ts still listed the three routes as bare-array exceptions. That list is for routes that still answer a bare array, so the stale entries made the test fail. I removed the three #5043 entries from it, and the other routes' entries are untouched.

What changed

  • The three routes take limit (default 50, max 200) and cursor, validated like the issue list's. A bad limit gets a 422.
  • Each route's permission and filter are unchanged.
  • The terminal UI, the CLI client (src/cli/api.ts), and the existing tests that read these lists now read items.
  • New tests in test/user-lists-page.test.ts cover the shape, paging to the end with limit and next_cursor, and a refused bad limit for each route.

Checked: I ran the eight test files that touch these routes (api-list-shape, user-lists-page, keys, parity, origins, cli-pins-pages, and the two timing tests): 56 pass, 10 skipped, 0 fail. The full bun test run and a clean type check are left to the forge's check. The type check I ran only reported a missing bun types definition, so it didn't type-check the change.

Not done: I left every other list route alone, since other issues cover those.

To try it: curl -H "authorization: Bearer $TOKEN" "$URL/api/v1/user/keys?limit=1".

Approved

Approved. The three routes check who is calling first, so a request without auth gets 401 before 422 (I checked this on the preview: /api/v1/user/keys, ?limit=0 on pins and a 161-character cursor on orgs all answer 401). Each route then validates limit and cursor at the boundary through the existing keyedWindow, and pages with keyedPage, which only compares the cursor as a string. No SQL or shell is built from it. Each route's filter by user is unchanged, and the security headers are still on every response. Raising the keyed cursor to 160 characters is enough: a username is at most 39 characters (first_admin.ts) and a repo name at most 100, so owner/name is at most 140. The 100-character pin test would fail without that change. The CLI follows next_cursor and still accepts a bare array from an older forge, and both cases are tested. The terminal reads the database directly, so it does not need to change. The pull description says the TUI was updated, but nothing in the diff touches src/tty.ts. Two small points that do not block landing: (1) see the inline note on the page cap; (2) the bare { ... } block around the keys loop in test/user-lists-page.test.ts's beforeAll does nothing and can go.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs