66"""
77
88import logging
9- from typing import Optional
9+ from typing import Optional , Annotated
1010
11- from fastapi import Depends , FastAPI
11+ from fastapi import FastAPI , Security , Request , Depends
12+ from cql2 import Expr
1213
1314from .auth import OpenIdConnectAuth
1415from .config import Settings
1516from .handlers import OpenApiSpecHandler , ReverseProxyHandler
1617from .middleware import AddProcessTimeHeaderMiddleware
18+ from .utils import apply_filter
1719
1820logger = logging .getLogger (__name__ )
1921
@@ -28,8 +30,8 @@ def create_app(settings: Optional[Settings] = None) -> FastAPI:
2830 app .add_middleware (AddProcessTimeHeaderMiddleware )
2931
3032 auth_scheme = OpenIdConnectAuth (
31- openid_configuration_url = str ( settings .oidc_discovery_url )
32- ). valid_token_dependency
33+ openid_configuration_url = settings .oidc_discovery_url
34+ )
3335
3436 if settings .debug :
3537 app .add_api_route (
@@ -38,12 +40,40 @@ def create_app(settings: Optional[Settings] = None) -> FastAPI:
3840 methods = ["GET" ],
3941 )
4042
41- proxy_handler = ReverseProxyHandler (upstream = str (settings .upstream_url ))
43+ collections_filter = (
44+ settings .collections_filter (auth_scheme .maybe_validated_user )
45+ if settings .collections_filter
46+ else None
47+ )
48+ items_filter = (
49+ settings .items_filter (auth_scheme .maybe_validated_user )
50+ if settings .items_filter
51+ else None
52+ )
53+ proxy_handler = ReverseProxyHandler (
54+ upstream = str (settings .upstream_url ),
55+ collections_filter = collections_filter ,
56+ items_filter = items_filter ,
57+ )
4258 openapi_handler = OpenApiSpecHandler (
4359 proxy = proxy_handler ,
4460 oidc_config_url = str (settings .oidc_discovery_url ),
4561 )
4662
63+ # @app.get("/collections")
64+ # async def collections(
65+ # request: Request,
66+ # filter: Annotated[Optional[Expr], Depends(collections_filter.dependency)],
67+ # ):
68+ # # if filter:
69+ # # print(f"{request.receive=}")
70+ # # request = await apply_filter(
71+ # # request,
72+ # # filter,
73+ # # )
74+ # # print(f"{request.receive=}")
75+ # return await proxy_handler.stream(request=request)
76+
4777 # Endpoints that are explicitely marked private
4878 for path , methods in settings .private_endpoints .items ():
4979 app .add_api_route (
@@ -54,7 +84,7 @@ def create_app(settings: Optional[Settings] = None) -> FastAPI:
5484 else openapi_handler .dispatch
5585 ),
5686 methods = methods ,
57- dependencies = [Depends (auth_scheme )],
87+ dependencies = [Security (auth_scheme . validated_user )],
5888 )
5989
6090 # Endpoints that are explicitely marked as public
@@ -67,14 +97,23 @@ def create_app(settings: Optional[Settings] = None) -> FastAPI:
6797 else openapi_handler .dispatch
6898 ),
6999 methods = methods ,
100+ dependencies = [Security (auth_scheme .maybe_validated_user )],
70101 )
71102
72103 # Catchall for remainder of the endpoints
73104 app .add_api_route (
74105 "/{path:path}" ,
75106 proxy_handler .stream ,
76107 methods = ["GET" , "POST" , "PUT" , "PATCH" , "DELETE" ],
77- dependencies = ([] if settings .default_public else [Depends (auth_scheme )]),
108+ dependencies = (
109+ [
110+ Security (
111+ auth_scheme .maybe_validated_user
112+ if settings .default_public
113+ else auth_scheme .validated_user
114+ )
115+ ]
116+ ),
78117 )
79118
80119 return app
0 commit comments