add more filtering options

This commit is contained in:
ducklet 2021-06-21 23:48:36 +02:00
parent 7dd10f8bc3
commit d09880438d
5 changed files with 113 additions and 41 deletions

View file

@ -1,5 +1,6 @@
import base64
import binascii
import logging
from starlette.applications import Starlette
from starlette.authentication import (
@ -19,6 +20,8 @@ from . import config, db
from .db import close_connection_pool, find_ratings, open_connection_pool
from .models import Movie, asplain
log = logging.getLogger(__name__)
class BasicAuthBackend(AuthenticationBackend):
async def authenticate(self, request):
@ -48,11 +51,13 @@ def truthy(s: str):
async def ratings(request):
title = request.query_params.get("title")
media_type = request.query_params.get("media_type")
ignore_tv_episodes = truthy(request.query_params.get("ignore_tv_episodes"))
params = request.query_params
rows = await find_ratings(
title=title, media_type=media_type, ignore_tv_episodes=ignore_tv_episodes
title=params.get("title"),
media_type=params.get("media_type"),
ignore_tv_episodes=truthy(params.get("ignore_tv_episodes")),
include_unrated=truthy(params.get("include_unrated")),
year=int(params["year"]) if "year" in params else None,
)
aggr = {}
@ -69,7 +74,8 @@ async def ratings(request):
"media_type": r["media_type"],
},
)
mov["user_scores"].append(r["user_score"])
if r["user_score"] is not None:
mov["user_scores"].append(r["user_score"])
resp = tuple(aggr.values())
@ -121,24 +127,37 @@ async def get_ratings_for_group(request):
request.path_params["group_id"]
app = Starlette(
on_startup=[open_connection_pool],
on_shutdown=[close_connection_pool],
routes=[
Mount(
"/api/v1",
routes=[
Route("/ratings", ratings), # XXX legacy, remove.
Route("/movies", get_movies),
Route("/movies", add_movie, methods=["POST"]),
Route("/users", add_user, methods=["POST"]),
Route("/users/{user_id}/ratings", ratings_for_user),
Route("/users/{user_id}/ratings", set_rating_for_user, methods=["PUT"]),
Route("/groups", add_group, methods=["POST"]),
Route("/groups/{group_id}/users", add_user_to_group, methods=["POST"]),
Route("/groups/{group_id}/ratings", get_ratings_for_group),
],
),
],
middleware=[Middleware(AuthenticationMiddleware, backend=BasicAuthBackend())],
)
def create_app():
if config.loglevel == "DEBUG":
logging.basicConfig(
format="%(asctime)s.%(msecs)03d [%(name)s:%(process)d] %(levelname)s: %(message)s",
datefmt="%H:%M:%S",
level=config.loglevel,
)
log.debug(f"Log level: {config.loglevel}")
return Starlette(
on_startup=[open_connection_pool],
on_shutdown=[close_connection_pool],
routes=[
Mount(
"/api/v1",
routes=[
Route("/ratings", ratings), # XXX legacy, remove.
Route("/movies", get_movies),
Route("/movies", add_movie, methods=["POST"]),
Route("/users", add_user, methods=["POST"]),
Route("/users/{user_id}/ratings", ratings_for_user),
Route(
"/users/{user_id}/ratings", set_rating_for_user, methods=["PUT"]
),
Route("/groups", add_group, methods=["POST"]),
Route(
"/groups/{group_id}/users", add_user_to_group, methods=["POST"]
),
Route("/groups/{group_id}/ratings", get_ratings_for_group),
],
),
],
middleware=[Middleware(AuthenticationMiddleware, backend=BasicAuthBackend())],
)