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:
2025-08-11 16:50:57 +07:00
parent 93284a9088
commit 664f58cefe
2 changed files with 9 additions and 9 deletions

16
main.py
View File

@@ -1,10 +1,10 @@
from fastapi import FastAPI, Request, Form
from fastapi.responses import HTMLResponse
from fastapi import FastAPI, Request, Form, Body
from fastapi.responses import HTMLResponse, JSONResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
import httpx
import asyncio
from typing import Optional, List
from typing import Optional, List, Union
import json
import os
from dotenv import load_dotenv
@@ -59,10 +59,10 @@ async def home(request: Request):
"""Serve the main search form"""
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):
"""
Search for media items via API
Search for media items via JSON API
**Media Types:**
- `book`: Search books using OpenLibrary API
@@ -88,14 +88,14 @@ async def api_search_media(search_request: SearchRequest):
return results
@app.post("/search")
async def search_media(
@app.post("/search/form")
async def form_search_media(
request: Request,
media_type: str = Form(...),
query: str = Form(...),
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():
return templates.TemplateResponse("index.html", {

View File

@@ -16,7 +16,7 @@
</div>
{% endif %}
<form method="post" action="/search">
<form method="post" action="/search/form">
<div class="mb-3">
<label for="media_type" class="form-label">Media Type</label>
<select class="form-select" id="media_type" name="media_type" required>