Files
bookhoard/bruno/media-items/Search All Libraries.yml
T
john-okeefe 74009f66b5 refactor: restructure Bruno API collection for consistency
Standardize all Bruno API request files with consistent formatting and
structure to improve maintainability and readability.

Changes include:
- Consolidate URL parameters into main URL instead of separate definitions
- Standardize quote style (double quotes throughout)
- Add proper settings section with defaults (timeout, redirects, etc.)
- Improve YAML formatting with literal style for multi-line content
- Remove redundant fields (disabled: false)
- Clean up header and body structure
- Update sequence numbers for better organization
- Add scenarios folder structure for organized test groupings

Removes obsolete Search Invalid Library ID test case.

Environment configuration updated with new library_id for testing.

These changes improve the Bruno collection's maintainability and make
it easier to create new API requests following established patterns.
2026-03-25 18:03:00 -04:00

219 lines
5.8 KiB
YAML

info:
name: Search All Libraries
type: http
seq: 13
http:
method: GET
url: "{{base_url}}/api/media-items/search?q=foundation&library_id={{library_id}}"
params:
- name: q
value: foundation
type: query
- name: library_id
value: "{{library_id}}"
type: query
- name: author_filter
value: ""
type: query
disabled: true
- name: series_filter
value: ""
type: query
disabled: true
- name: genre_filter
value: ""
type: query
disabled: true
- name: language_filter
value: ""
type: query
disabled: true
- name: year_min
value: ""
type: query
disabled: true
- name: year_max
value: ""
type: query
disabled: true
- name: has_cover
value: ""
type: query
disabled: true
- name: sort
value: title ASC
type: query
disabled: true
- name: limit
value: "50"
type: query
disabled: true
- name: offset
value: "0"
type: query
disabled: true
auth: inherit
settings:
encodeUrl: true
timeout: 0
followRedirects: true
maxRedirects: 5
docs: |-
## Search All Libraries
Searches for media items using the unified search endpoint. Supports fuzzy search, exact match, and filtering.
**Method:** GET
**Endpoint:** /api/media-items/search
**Authentication:** Required (Bearer token)
## Query Parameters
### Search Parameters:
- `q` (string, optional): Global search query
- Fuzzy matching by default (tolerates typos)
- Exact match with quotes: `"\"exact phrase\""`
- Searches: title, author, series, tags, contributors
- Example: `q=foundation` (fuzzy), `q="\"Foundation and Empire\""` (exact)
### Filter Parameters (All Fuzzy Except Years/Booleans):
- `author_filter` (string, optional): Fuzzy match author field
- Example: `author_filter=asimov` matches "Asimov, Isaac"
- `series_filter` (string, optional): Fuzzy match series field
- Example: `series_filter=harry` matches "Harry Potter"
- `genre_filter` (string, optional): Fuzzy match genre field
- Example: `genre_filter=scifi` matches "Sci-Fi", "Science Fiction"
- `language_filter` (string, optional): Fuzzy match language field
- Example: `language_filter=eng` matches "English", "eng"
- `year_min` (integer, optional): Minimum copyright year (exact range)
- Example: `year_min=2000`
- `year_max` (integer, optional): Maximum copyright year (exact range)
- Example: `year_max=2020`
- `has_cover` (boolean, optional): Filter by cover image presence
- Values: `true`, `false`, or empty (all)
- Example: `has_cover=true`
### Pagination Parameters:
- `limit` (integer, optional): Number of results (default: 50, max: 200)
- Example: `limit=100`
- `offset` (integer, optional): Number of results to skip (for pagination)
- Example: `offset=50`
- `sort` (string, optional): Sort order (default: relevance DESC, title ASC)
- Options:
- `title ASC` - Title A-Z
- `title DESC` - Title Z-A
- `author ASC` - Author A-Z
- `author DESC` - Author Z-A
- `created_at ASC` - Date added oldest first
- `created_at DESC` - Date added newest first
- `page_count ASC` - Page count low to high
- `page_count DESC` - Page count high to low
- Example: `sort=author ASC`
## How Fuzzy Matching Works
**Text Filters (author, series, genre, language):**
- Uses PostgreSQL pg_trgm word_similarity()
- Threshold: 0.3 (30% similarity)
- Handles typos: "azimov" → "Asimov"
- Handles partial matches: "scifi" → "Sci-Fi"
- Case-insensitive
**Search Query (q parameter):**
- **Fuzzy (default):** Matches similar words across title, author, series, tags
- `q=foundation` → "Foundation", "Foundations", "The Foundation"
- **Exact (with quotes):** Must match the exact phrase
- `q="\"Foundation and Empire\""` → Only "Foundation and Empire"
## Response
**HTTP 200 (OK):**
```json
[
{
"id": "uuid",
"title": "Foundation",
"author": "Asimov, Isaac",
"series": "Foundation",
"genre": "Sci-Fi",
"language": "English",
"copyright_year": 1951,
"page_count": 255,
"cover_image_path": "/path/to/cover.jpg",
"library_id": "uuid",
"library_name": "E-Books",
"library_type_name": "ebooks"
}
]
```
**HTTP 404 (Not Found):**
```json
{
"error": "no results found",
"query": "foundation",
"results": []
}
```
## Examples
**1. Simple search:**
```
GET /api/media-items/search?q=harry&library_id={uuid}
```
Returns books matching "harry" in title/author/series
**2. Fuzzy author filter:**
```
GET /api/media-items/search?author_filter=asimov&library_id={uuid}
```
Returns books by authors similar to "asimov"
**3. Combined search + filters:**
```
GET /api/media-items/search?q=foundation&author_filter=asimov&genre_filter=scifi&library_id={uuid}
```
Returns "foundation" books by "asimov" in "scifi" genre
**4. Exact match with quotes:**
```
GET /api/media-items/search?q="\"Foundation and Empire\""&library_id={uuid}
```
Returns only exact title match
**5. Year range + sorting:**
```
GET /api/media-items/search?year_min=2000&year_max=2020&sort=created_at DESC&library_id={uuid}
```
Returns books from 2000-2020 sorted by newest first
**6. Boolean filter:**
```
GET /api/media-items/search?has_cover=true&library_id={uuid}
```
Returns only books that have cover images
## Success Criteria
- Status: 200
- Returns array of media items matching all filters
- Results sorted by:
1. Relevance score (when searching with `q`)
2. User-specified sort parameter
3. Title (final fallback)
- Pagination works correctly with limit/offset