docs(media-items): Work Order 3 batch 3a — reader-adjacent CRUD (11 endpoints)
New frontmatter'd docs with real shapes (sqlc models pinned directly):
- bookmarks: get/create/update/delete (sync-aware rows: dedup_key,
last_modified_*, tombstones; delete is 204)
- review: upsert (empty string DELETES the review) / get (200 with
{review:null} when absent) / delete
- get single note + highlight (full sqlc row shapes)
- annotation history: restore (POST, kind via query or body) and purge
(DELETE, kind via required query; permanent)
Gate hardening forced by this batch:
- required-field walk now guards non-struct Request types (RawMessage pins)
- update_media_bookmark needed a full example block (no cross-reference
shortcuts — the gate checks every doc standalone)
This commit is contained in:
1 parent
85cdaf7196
commit
ed0ce5d077
13 files changed
+545
-4
No files matched your search
@@ -0,0 +1,51 @@
|
||||
---
|
||||
method: GET
|
||||
path: /api/media-items/:id/bookmarks
|
||||
auth: jwt
|
||||
area: media-items
|
||||
---
|
||||
<!-- source: internal/handlers/media.go:2181 MediaHandler.GetMediaBookmarks -->
|
||||
|
||||
# Get Media Bookmarks
|
||||
|
||||
Lists the signed-in user's bookmarks for one media item (sync-aware rows:
|
||||
dedup key and last-writer bookkeeping included).
|
||||
|
||||
## Example response
|
||||
|
||||
```json example-response
|
||||
[
|
||||
{
|
||||
"id": "110e8400-e29b-41d4-a716-446655440000",
|
||||
"media_item_id": "550e8400-e29b-41d4-a716-446655440000",
|
||||
"user_id": "92413c3a-e1b8-4fff-b3f9-95c74478d19a",
|
||||
"page_number": null,
|
||||
"chapter_number": null,
|
||||
"cfi_position": null,
|
||||
"title": "Chapter 3",
|
||||
"position": "kindle:pos:1:2",
|
||||
"notes": null,
|
||||
"created_at": "2026-10-24T13:57:01Z",
|
||||
"dedup_key": "kindle:pos:1:2",
|
||||
"last_modified_at": "2026-10-24T13:57:01Z",
|
||||
"last_modified_source": "web",
|
||||
"device_sync_data": null,
|
||||
"percentage_location": null,
|
||||
"epubcfi_location": null,
|
||||
"chapter_reference": null,
|
||||
"deleted": false,
|
||||
"deleted_at": null,
|
||||
"origin_source": "web"
|
||||
}
|
||||
]
|
||||
```
|
||||
|
||||
`device_sync_data` is `[]byte` → base64 string when set, `null` otherwise.
|
||||
pgtype fields are `null` when unset.
|
||||
|
||||
## Errors
|
||||
|
||||
| Status | Body | When |
|
||||
| ------ | ---- | ---- |
|
||||
| 400 | `{"error": "invalid user"}` / `{"error": "invalid media item id"}` | malformed ids |
|
||||
| 500 | `{"error": "..."}` | unexpected server error |
|
||||
Reference in new issue
Block a user