Consolidate search endpoints for better API organization
- Removed duplicate /api/search endpoint - Kept /search as the main JSON API endpoint with proper documentation - Added /search/form for web form submissions - Updated HTML form to use /search/form endpoint - Clear separation between API and web interface - Media type enums still visible in /docs for API usage - Maintains all functionality while reducing endpoint confusion
This commit is contained in:
16
main.py
16
main.py
@@ -1,10 +1,10 @@
|
|||||||
from fastapi import FastAPI, Request, Form
|
from fastapi import FastAPI, Request, Form, Body
|
||||||
from fastapi.responses import HTMLResponse
|
from fastapi.responses import HTMLResponse, JSONResponse
|
||||||
from fastapi.staticfiles import StaticFiles
|
from fastapi.staticfiles import StaticFiles
|
||||||
from fastapi.templating import Jinja2Templates
|
from fastapi.templating import Jinja2Templates
|
||||||
import httpx
|
import httpx
|
||||||
import asyncio
|
import asyncio
|
||||||
from typing import Optional, List
|
from typing import Optional, List, Union
|
||||||
import json
|
import json
|
||||||
import os
|
import os
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
@@ -59,10 +59,10 @@ async def home(request: Request):
|
|||||||
"""Serve the main search form"""
|
"""Serve the main search form"""
|
||||||
return templates.TemplateResponse("index.html", {"request": request})
|
return templates.TemplateResponse("index.html", {"request": request})
|
||||||
|
|
||||||
@app.post("/api/search", response_model=List[MediaItem])
|
@app.post("/search", response_model=List[MediaItem])
|
||||||
async def api_search_media(search_request: SearchRequest):
|
async def api_search_media(search_request: SearchRequest):
|
||||||
"""
|
"""
|
||||||
Search for media items via API
|
Search for media items via JSON API
|
||||||
|
|
||||||
**Media Types:**
|
**Media Types:**
|
||||||
- `book`: Search books using OpenLibrary API
|
- `book`: Search books using OpenLibrary API
|
||||||
@@ -88,14 +88,14 @@ async def api_search_media(search_request: SearchRequest):
|
|||||||
|
|
||||||
return results
|
return results
|
||||||
|
|
||||||
@app.post("/search")
|
@app.post("/search/form")
|
||||||
async def search_media(
|
async def form_search_media(
|
||||||
request: Request,
|
request: Request,
|
||||||
media_type: str = Form(...),
|
media_type: str = Form(...),
|
||||||
query: str = Form(...),
|
query: str = Form(...),
|
||||||
artist: Optional[str] = Form(None)
|
artist: Optional[str] = Form(None)
|
||||||
):
|
):
|
||||||
"""Search for media based on type and query"""
|
"""Search for media via web form submission - returns HTML page"""
|
||||||
|
|
||||||
if not query.strip():
|
if not query.strip():
|
||||||
return templates.TemplateResponse("index.html", {
|
return templates.TemplateResponse("index.html", {
|
||||||
|
@@ -16,7 +16,7 @@
|
|||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<form method="post" action="/search">
|
<form method="post" action="/search/form">
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label for="media_type" class="form-label">Media Type</label>
|
<label for="media_type" class="form-label">Media Type</label>
|
||||||
<select class="form-select" id="media_type" name="media_type" required>
|
<select class="form-select" id="media_type" name="media_type" required>
|
||||||
|
Reference in New Issue
Block a user