- Shipped
- August 19, 2026 at 8:09 AM UTC
- Author
- Kamo
- Commit
- 2d0a998
Four endpoints the rebuilt knowledge base needs, and three facts the API was unable to state. GET /api/kb/pins returned a Page of pin ROWS, and KbArticlePin.article is @JsonIgnore — so the response carried a pin id, a member id and a date, and nothing about which article had been pinned. The home page has asked for that list since it shipped and rendered nothing, because a Page envelope has no .length and the guard in front of the section was a length check. Pinning has never worked end to end. It now returns the articles themselves, resolved inside a transaction rather than leaning on open-in-view. GET /api/kb/articles/overview is new: status counts, every article's real dates, authorship, word count and excerpt, plus the caller's pinned guids, in one read. The home page used to fake "recent" by taking the first ten nodes of the tree and stamping them PUBLISHED with a blank date. GET /api/kb/reviews/queue is new: what is waiting and what was recently settled, both halves in one request. A reviewer looking at an empty queue asks the same question either way — is nothing waiting, or did I just clear it. Its decided read is a LIST with a limit, not a Page: inside the read-only transaction a Page's discarded COUNT is never statement #1, so Yugabyte cannot restart it and a concurrent write turns the queue into a 40001. GET /api/kb/media now sends each row's articleCount and, for the types a grid draws, its presigned URL. The count was only ever populated by the single-resource endpoint, so the library's "used in N articles" warning before a delete could never fire — a diagram embedded in nine articles deleted as quietly as an orphan. The URLs were one request per thumbnail after the list had already landed. POST /api/kb/media/urls signs a batch for callers that hold rows already. Every int64 member id leaves as a STRING. They are 19-digit unique_rowid() values and a JSON number is an IEEE double in the browser — the submitter id on the review queue arrived pre-rounded, which is why it could never be matched against the member directory and a raw id sat where a name belongs. No shared-library change, so no KamoInitializer run and no fleet redeploy.