use decorator to add routes
This commit is contained in:
parent
edb2fa5069
commit
b081371d27
1 changed files with 27 additions and 18 deletions
|
|
@ -108,6 +108,22 @@ def as_ulid(s: str) -> ULID:
|
||||||
raise HTTPException(422, "Not a valid ULID.")
|
raise HTTPException(422, "Not a valid ULID.")
|
||||||
|
|
||||||
|
|
||||||
|
_routes = []
|
||||||
|
|
||||||
|
|
||||||
|
def route(path: str, *, methods: list[str] = None, **kwds):
|
||||||
|
def decorator(func):
|
||||||
|
r = Route(path, func, methods=methods, **kwds)
|
||||||
|
_routes.append(r)
|
||||||
|
return func
|
||||||
|
|
||||||
|
return decorator
|
||||||
|
|
||||||
|
|
||||||
|
route.registered = _routes
|
||||||
|
|
||||||
|
|
||||||
|
@route("/groups/{group_id}/ratings")
|
||||||
async def get_ratings_for_group(request):
|
async def get_ratings_for_group(request):
|
||||||
group_id = as_ulid(request.path_params["group_id"])
|
group_id = as_ulid(request.path_params["group_id"])
|
||||||
group = await db.get(Group, id=str(group_id))
|
group = await db.get(Group, id=str(group_id))
|
||||||
|
|
@ -163,6 +179,8 @@ def not_found(reason: str = "Not Found"):
|
||||||
return JSONResponse({"error": reason}, status_code=404)
|
return JSONResponse({"error": reason}, status_code=404)
|
||||||
|
|
||||||
|
|
||||||
|
@route("/movies")
|
||||||
|
@requires(["private"])
|
||||||
async def get_movies(request):
|
async def get_movies(request):
|
||||||
imdb_id = request.query_params.get("imdb_id")
|
imdb_id = request.query_params.get("imdb_id")
|
||||||
|
|
||||||
|
|
@ -172,31 +190,38 @@ async def get_movies(request):
|
||||||
return JSONResponse(resp)
|
return JSONResponse(resp)
|
||||||
|
|
||||||
|
|
||||||
|
@route("/movies", methods=["POST"])
|
||||||
@requires(["authenticated", "admin"])
|
@requires(["authenticated", "admin"])
|
||||||
async def add_movie(request):
|
async def add_movie(request):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@route("/users")
|
||||||
@requires(["authenticated", "admin"])
|
@requires(["authenticated", "admin"])
|
||||||
async def list_users(request):
|
async def list_users(request):
|
||||||
users = await db.get_all(User)
|
users = await db.get_all(User)
|
||||||
return JSONResponse([asplain(u) for u in users])
|
return JSONResponse([asplain(u) for u in users])
|
||||||
|
|
||||||
|
|
||||||
|
@route("/users", methods=["POST"])
|
||||||
@requires(["authenticated", "admin"])
|
@requires(["authenticated", "admin"])
|
||||||
async def add_user(request):
|
async def add_user(request):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@route("/users/{user_id}/ratings")
|
||||||
|
@requires(["private"])
|
||||||
async def ratings_for_user(request):
|
async def ratings_for_user(request):
|
||||||
request.path_params["user_id"]
|
request.path_params["user_id"]
|
||||||
|
|
||||||
|
|
||||||
|
@route("/users/{user_id}/ratings", methods=["PUT"])
|
||||||
@requires("authenticated")
|
@requires("authenticated")
|
||||||
async def set_rating_for_user(request):
|
async def set_rating_for_user(request):
|
||||||
request.path_params["user_id"]
|
request.path_params["user_id"]
|
||||||
|
|
||||||
|
|
||||||
|
@route("/groups", methods=["POST"])
|
||||||
@requires(["authenticated", "admin"])
|
@requires(["authenticated", "admin"])
|
||||||
async def add_group(request):
|
async def add_group(request):
|
||||||
if not await request.body():
|
if not await request.body():
|
||||||
|
|
@ -227,6 +252,7 @@ async def add_group(request):
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@route("/groups/{group_id}/users", methods=["POST"])
|
||||||
@requires(["authenticated"])
|
@requires(["authenticated"])
|
||||||
async def add_user_to_group(request):
|
async def add_user_to_group(request):
|
||||||
group_id = as_ulid(request.path_params["group_id"])
|
group_id = as_ulid(request.path_params["group_id"])
|
||||||
|
|
@ -289,24 +315,7 @@ def create_app():
|
||||||
on_startup=[open_connection_pool],
|
on_startup=[open_connection_pool],
|
||||||
on_shutdown=[close_connection_pool],
|
on_shutdown=[close_connection_pool],
|
||||||
routes=[
|
routes=[
|
||||||
Mount(
|
Mount("/api/v1", routes=route.registered),
|
||||||
"/api/v1",
|
|
||||||
routes=[
|
|
||||||
Route("/movies", get_movies),
|
|
||||||
Route("/movies", add_movie, methods=["POST"]),
|
|
||||||
Route("/users", list_users),
|
|
||||||
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=[
|
||||||
Middleware(ResponseTimeMiddleware, header_name="Unwind-Elapsed"),
|
Middleware(ResponseTimeMiddleware, header_name="Unwind-Elapsed"),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue