add route to list all users

This commit is contained in:
ducklet 2021-07-08 09:49:52 +02:00
parent 75391b1ca2
commit 60f0152f9d
2 changed files with 20 additions and 3 deletions

View file

@ -157,7 +157,7 @@ async def get(model: Type[ModelType], **kwds) -> Optional[ModelType]:
return fromplain(model, row) if row else None return fromplain(model, row) if row else None
async def get_many(model: Type[ModelType], **kwds) -> list[ModelType]: async def get_many(model: Type[ModelType], **kwds) -> Iterable[ModelType]:
keys = { keys = {
k: [f"{k}_{i}" for i, _ in enumerate(vs, start=1)] for k, vs in kwds.items() k: [f"{k}_{i}" for i, _ in enumerate(vs, start=1)] for k, vs in kwds.items()
} }
@ -173,7 +173,17 @@ async def get_many(model: Type[ModelType], **kwds) -> list[ModelType]:
) )
query = f"SELECT {fields_} FROM {model._table} WHERE {cond}" query = f"SELECT {fields_} FROM {model._table} WHERE {cond}"
rows = await shared_connection().fetch_all(query=query, values=values) rows = await shared_connection().fetch_all(query=query, values=values)
return [fromplain(model, row) for row in rows] return (fromplain(model, row) for row in rows)
async def get_all(model: Type[ModelType], **kwds) -> Iterable[ModelType]:
values = {k: v for k, v in kwds.items() if v is not None}
fields_ = ", ".join(f.name for f in fields(model))
cond = " AND ".join(f"{k}=:{k}" for k in values) or "1=1"
query = f"SELECT {fields_} FROM {model._table} WHERE {cond}"
rows = await shared_connection().fetch_all(query=query, values=values)
return (fromplain(model, row) for row in rows)
async def update(item): async def update(item):

View file

@ -21,7 +21,7 @@ from starlette.routing import Mount, Route
from . import config, db from . import config, db
from .db import close_connection_pool, find_ratings, open_connection_pool from .db import close_connection_pool, find_ratings, open_connection_pool
from .middleware.responsetime import ResponseTimeMiddleware from .middleware.responsetime import ResponseTimeMiddleware
from .models import Group, Movie, asplain from .models import Group, Movie, User, asplain
from .types import ULID from .types import ULID
from .utils import b64encode, phc_compare, phc_scrypt from .utils import b64encode, phc_compare, phc_scrypt
@ -160,6 +160,12 @@ async def add_movie(request):
pass pass
@requires(["authenticated", "admin"])
async def list_users(request):
users = await db.get_all(User)
return JSONResponse([asplain(u) for u in users])
@requires(["authenticated", "admin"]) @requires(["authenticated", "admin"])
async def add_user(request): async def add_user(request):
pass pass
@ -263,6 +269,7 @@ def create_app():
routes=[ routes=[
Route("/movies", get_movies), Route("/movies", get_movies),
Route("/movies", add_movie, methods=["POST"]), Route("/movies", add_movie, methods=["POST"]),
Route("/users", list_users),
Route("/users", add_user, methods=["POST"]), Route("/users", add_user, methods=["POST"]),
Route("/users/{user_id}/ratings", ratings_for_user), Route("/users/{user_id}/ratings", ratings_for_user),
Route( Route(