docs(libraries): Beam WO5 batch 5 — 11 endpoints backfilled + pilot recovery

Beam backfilled 11 library docs (CRUD, folders, visibility, browse, stats,
media-items) and re-attached frontmatter to create_collection.md — which had
silently lost its pilot version in cc893f75: the negative-test
'git checkout --' restored the OLD file because the pilot was never staged,
and a frontmatter-less doc is invisible to the gate. Claude restored the full
corrected pilot content (priority higher-wins, time.String() note, 409).

Claude registry: 11 entries + one inverted catch — DELETE /:id/folders DOES
bind {folder_path} (handler reuses AddLibraryFolderRequest); registry first
draft said bodyless. GET /:id/visibility returns joined
GetUserVisibleLibrariesRow (type_name etc.), not bare Libraries.

Gate-driven merges fixed create/get library response shapes (sqlc row keys:
created_by_admin_id, library_type_id, updated_at; dropped invented type/
folders/is_visible). Fixed invented request fields (user_id in
set-visibility; library_type_id in update). make test 9/9.
This commit is contained in:
John O'Keefe committed 2026-10-24 16:18:48 -04:00
1 parent 6f13dc2b63
commit b77eab7ffd
13 files changed
+223 -121

No files matched your search

@@ -1,3 +1,11 @@
---
method: POST
path: /api/libraries/:id/folders
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:167 LibraryHandler.AddLibraryFolder -->
# Add Library Folder
Add a folder to an existing library (Admin only).
@@ -20,7 +28,7 @@ Add a folder to an existing library (Admin only).
### Example Request
```json
```json example-request
{
"folder_path": "/path/to/comics"
}
@@ -28,7 +36,7 @@ Add a folder to an existing library (Admin only).
## Response (201 Created)
```json
```json example-response
{
"id": "uuid",
"library_id": "uuid",
@@ -1,3 +1,11 @@
---
method: GET
path: /api/libraries/browse
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:254 LibraryHandler.BrowseDirectories -->
# Browse Library Folders
Browse server directories for folder selection in library management.
@@ -26,7 +34,7 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
## Response (200 OK)
```json
```json example-response
{
"current_path": "/home/user",
"parent_path": "/home",
+14 -4
View File
@@ -1,3 +1,11 @@
---
method: POST
path: /api/libraries
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:60 LibraryHandler.CreateLibrary -->
# Create Library
Create a new library (Admin only).
@@ -16,7 +24,7 @@ Create a new library (Admin only).
### Example Request
```json
```json example-request
{
"name": "Comics Collection",
"description": "Digital comics",
@@ -26,13 +34,15 @@ Create a new library (Admin only).
## Response (201 Created)
```json
```json example-response
{
"id": "uuid",
"name": "Comics Collection",
"description": "Digital comics",
"type": "comics",
"created_at": "2026-01-31T10:00:00Z"
"created_at": "2026-01-31T10:00:00Z",
"created_by_admin_id": null,
"library_type_id": null,
"updated_at": null
}
```
@@ -1,3 +1,11 @@
---
method: DELETE
path: /api/libraries/:id
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:152 LibraryHandler.DeleteLibrary -->
# Delete Library
Delete a library and all associated data.
@@ -1,3 +1,11 @@
---
method: DELETE
path: /api/libraries/:id/folders
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:231 LibraryHandler.DeleteLibraryFolder -->
# Delete Library Folder
Delete a folder from a library.
@@ -20,7 +28,7 @@ Delete a folder from a library.
### Example Request
```json
```json example-request
{
"folder_path": "/path/to/library/folder"
}
+15 -10
View File
@@ -1,4 +1,13 @@
# Get Library Details
---
method: GET
path: /api/libraries/:id
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:87 LibraryHandler.GetLibrary -->
# Get Library Details:<|end|><|start|> assistant to=edit<|channel|>analysis <|constrain|>xml<|message|><rfl:parameter name="path">
/home/nymusicman/Code/bookhoard/docs/developer/api/libraries/get_library_media_items.md
Retrieve details of a specific library.
@@ -26,19 +35,15 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
## Response (200 OK)
```json
```json example-response
{
"id": "uuid",
"name": "My Ebooks",
"description": "Ebook collection",
"type": "ebooks",
"folders": [
{
"id": "uuid",
"folder_path": "/path/to/ebooks"
}
],
"is_visible": true
"created_at": null,
"created_by_admin_id": null,
"library_type_id": null,
"updated_at": null
}
```
@@ -1,3 +1,11 @@
---
method: GET
path: /api/libraries/:id/media-items
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/media.go:757 MediaHandler.ListMediaItems -->
# Get Library Media Items
Get all media items in a specific library.
@@ -35,20 +43,9 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
## Response (200 OK)
```json
```json example-response
{
"items": [
{
"id": "uuid",
"title": "Sample Book",
"authors": ["Author Name"],
"tags": ["fiction", "science-fiction"],
"created_at": "2026-02-08T10:00:00Z"
}
],
"total": 1523,
"limit": 20,
"offset": 0
"data": null
}
```
@@ -1,3 +1,11 @@
---
method: GET
path: /api/libraries/:id/stats
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:303 LibraryHandler.GetLibraryStats -->
# Get Library Statistics
Get statistics for a specific library.
@@ -26,18 +34,14 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
## Response (200 OK)
```json
```json example-response
{
"library_id": "uuid",
"total_media_items": 1523,
"total_size_bytes": 5368709120,
"last_scan": "2026-02-08T10:00:00Z",
"formats": {
"epub": 1234,
"kepub": 189,
"mobi": 50,
"pdf": 50
}
"books": null,
"minutes": null,
"name": null,
"pages": null,
"sessions": null
}
```
@@ -1,3 +1,11 @@
---
method: GET
path: /api/libraries/visibility
auth: jwt
area: libraries
---
<!-- source: internal/handlers/library.go:112 LibraryHandler.GetUserVisibleLibraries -->
# Get Visible Libraries
Retrieve all libraries visible to the current user.
@@ -22,7 +30,7 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
A top-level JSON **array** of library rows:
```json
```json example-response
[
{
"id": "uuid",
@@ -1,3 +1,11 @@
---
method: POST
path: /api/libraries/visibility
auth: jwt
area: libraries
---
<!-- source: internal/handlers/library.go:273 LibraryHandler.SetLibraryVisibility -->
# Set Library Visibility
Set library visibility for a specific user (Admin only).
@@ -16,9 +24,8 @@ Set library visibility for a specific user (Admin only).
### Example Request
```json
```json example-request
{
"user_id": "user-uuid",
"library_id": "library-uuid",
"is_visible": true
}
@@ -26,11 +33,14 @@ Set library visibility for a specific user (Admin only).
## Response (200 OK)
```json
```json example-response
{
"user_id": "user-uuid",
"library_id": "library-uuid",
"is_visible": true
"is_visible": true,
"created_at": null,
"id": null,
"updated_at": null
}
```
+14 -4
View File
@@ -1,3 +1,11 @@
---
method: PUT
path: /api/libraries/:id
auth: jwt+admin
area: libraries
---
<!-- source: internal/handlers/library.go:124 LibraryHandler.UpdateLibrary -->
# Update Library
Update a library's information.
@@ -21,22 +29,24 @@ Update a library's information.
### Example Request
```json
```json example-request
{
"name": "My Updated Library",
"library_type_id": 1
"description": "Updated description"
}
```
## Response (200 OK)
```json
```json example-response
{
"id": "uuid",
"name": "My Updated Library",
"library_type_id": 1,
"created_at": "2026-02-08T10:00:00Z",
"updated_at": "2026-02-08T11:00:00Z"
"updated_at": "2026-02-08T11:00:00Z",
"created_by_admin_id": null,
"description": null
}
```