Files
bookhoard/bruno/media-items/Search All Libraries.yml
T
john-okeefe dc0d037e06 test: update Bruno requests for tags filter
- Update Combined Search and Filters to use tags_filter
- Update Field Values Search to cover tags autocomplete
- Add fuzzy matching examples for tags
- Update search scenarios to use tags instead of genre

Updates the Bruno API test collection to use the new tags filter
instead of the genre filter, including fuzzy matching examples.

Relates to IMPLEMENTATION_TAGS_FILTER.md Phase 6
2026-03-25 20:38:29 -04:00

219 lines
5.7 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: tags_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"
- `tags_filter` (string, optional): Fuzzy match tags field
- Example: `tags_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, tags, 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",
"tags": "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&tags_filter=scifi&library_id={uuid}
```
Returns "foundation" books by "asimov" in "scifi" tags
**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