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 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", {

View File

@@ -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>