Skip to content

Commit e240f17

Browse files
committed
common requestcontext
1 parent cd53a4a commit e240f17

File tree

9 files changed

+46
-114
lines changed

9 files changed

+46
-114
lines changed

services/web/server/src/simcore_service_webserver/api_keys/_handlers.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,15 @@
33
from aiohttp import web
44
from aiohttp.web import RouteTableDef
55
from models_library.api_schemas_webserver.auth import ApiKeyCreate
6-
from models_library.rest_base import RequestParameters
7-
from models_library.users import UserID
8-
from pydantic import Field
96
from servicelib.aiohttp import status
107
from servicelib.aiohttp.requests_validation import parse_request_body_as
118
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
129
from simcore_postgres_database.errors import DatabaseError
1310
from simcore_service_webserver.security.decorators import permission_required
1411

15-
from .._constants import RQ_PRODUCT_KEY, RQT_USERID_KEY
1612
from .._meta import API_VTAG
1713
from ..login.decorators import login_required
14+
from ..models import RequestContext
1815
from ..utils_aiohttp import envelope_json_response
1916
from . import _api
2017

@@ -24,16 +21,11 @@
2421
routes = RouteTableDef()
2522

2623

27-
class _RequestContext(RequestParameters):
28-
user_id: UserID = Field(..., alias=RQT_USERID_KEY) # type: ignore[literal-required]
29-
product_name: str = Field(..., alias=RQ_PRODUCT_KEY) # type: ignore[literal-required]
30-
31-
3224
@routes.get(f"/{API_VTAG}/auth/api-keys", name="list_api_keys")
3325
@login_required
3426
@permission_required("user.apikey.*")
3527
async def list_api_keys(request: web.Request):
36-
req_ctx = _RequestContext.parse_obj(request)
28+
req_ctx = RequestContext.parse_obj(request)
3729
api_keys_names = await _api.list_api_keys(
3830
request.app,
3931
user_id=req_ctx.user_id,
@@ -46,7 +38,7 @@ async def list_api_keys(request: web.Request):
4638
@login_required
4739
@permission_required("user.apikey.*")
4840
async def create_api_key(request: web.Request):
49-
req_ctx = _RequestContext.parse_obj(request)
41+
req_ctx = RequestContext.parse_obj(request)
5042
new = await parse_request_body_as(ApiKeyCreate, request)
5143
try:
5244
data = await _api.create_api_key(
@@ -68,7 +60,7 @@ async def create_api_key(request: web.Request):
6860
@login_required
6961
@permission_required("user.apikey.*")
7062
async def delete_api_key(request: web.Request):
71-
req_ctx = _RequestContext.parse_obj(request)
63+
req_ctx = RequestContext.parse_obj(request)
7264

7365
# NOTE: SEE https://github.com/ITISFoundation/osparc-simcore/issues/4920
7466
body = await request.json()

services/web/server/src/simcore_service_webserver/clusters/_handlers.py

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,13 @@
1010
ClusterPathParams,
1111
ClusterPing,
1212
)
13-
from models_library.users import UserID
14-
from pydantic import BaseModel, Field, parse_obj_as
13+
from pydantic import parse_obj_as
1514
from servicelib.aiohttp import status
1615
from servicelib.aiohttp.requests_validation import (
1716
parse_request_body_as,
1817
parse_request_path_parameters_as,
1918
)
2019
from servicelib.aiohttp.typing_extension import Handler
21-
from servicelib.request_keys import RQT_USERID_KEY
2220

2321
from .._meta import api_version_prefix
2422
from ..director_v2 import api as director_v2_api
@@ -29,6 +27,7 @@
2927
DirectorServiceError,
3028
)
3129
from ..login.decorators import login_required
30+
from ..models import RequestContext
3231
from ..security.decorators import permission_required
3332
from ..utils_aiohttp import envelope_json_response
3433

@@ -57,15 +56,6 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
5756
return wrapper
5857

5958

60-
#
61-
# API components/schemas
62-
#
63-
64-
65-
class _RequestContext(BaseModel):
66-
user_id: UserID = Field(..., alias=RQT_USERID_KEY) # type: ignore[literal-required]
67-
68-
6959
#
7060
# API handlers
7161
#
@@ -78,7 +68,7 @@ class _RequestContext(BaseModel):
7868
@permission_required("clusters.create")
7969
@_handle_cluster_exceptions
8070
async def create_cluster(request: web.Request) -> web.Response:
81-
req_ctx = _RequestContext.parse_obj(request)
71+
req_ctx = RequestContext.parse_obj(request)
8272
new_cluster = await parse_request_body_as(ClusterCreate, request)
8373

8474
created_cluster = await director_v2_api.create_cluster(
@@ -94,7 +84,7 @@ async def create_cluster(request: web.Request) -> web.Response:
9484
@permission_required("clusters.read")
9585
@_handle_cluster_exceptions
9686
async def list_clusters(request: web.Request) -> web.Response:
97-
req_ctx = _RequestContext.parse_obj(request)
87+
req_ctx = RequestContext.parse_obj(request)
9888

9989
clusters = await director_v2_api.list_clusters(
10090
app=request.app,
@@ -109,7 +99,7 @@ async def list_clusters(request: web.Request) -> web.Response:
10999
@permission_required("clusters.read")
110100
@_handle_cluster_exceptions
111101
async def get_cluster(request: web.Request) -> web.Response:
112-
req_ctx = _RequestContext.parse_obj(request)
102+
req_ctx = RequestContext.parse_obj(request)
113103
path_params = parse_request_path_parameters_as(ClusterPathParams, request)
114104

115105
cluster = await director_v2_api.get_cluster(
@@ -126,7 +116,7 @@ async def get_cluster(request: web.Request) -> web.Response:
126116
@permission_required("clusters.write")
127117
@_handle_cluster_exceptions
128118
async def update_cluster(request: web.Request) -> web.Response:
129-
req_ctx = _RequestContext.parse_obj(request)
119+
req_ctx = RequestContext.parse_obj(request)
130120
path_params = parse_request_path_parameters_as(ClusterPathParams, request)
131121
cluster_patch = await parse_request_body_as(ClusterPatch, request)
132122

@@ -146,7 +136,7 @@ async def update_cluster(request: web.Request) -> web.Response:
146136
@permission_required("clusters.delete")
147137
@_handle_cluster_exceptions
148138
async def delete_cluster(request: web.Request) -> web.Response:
149-
req_ctx = _RequestContext.parse_obj(request)
139+
req_ctx = RequestContext.parse_obj(request)
150140
path_params = parse_request_path_parameters_as(ClusterPathParams, request)
151141

152142
await director_v2_api.delete_cluster(
@@ -165,7 +155,7 @@ async def delete_cluster(request: web.Request) -> web.Response:
165155
@permission_required("clusters.read")
166156
@_handle_cluster_exceptions
167157
async def get_cluster_details(request: web.Request) -> web.Response:
168-
req_ctx = _RequestContext.parse_obj(request)
158+
req_ctx = RequestContext.parse_obj(request)
169159
path_params = parse_request_path_parameters_as(ClusterPathParams, request)
170160

171161
cluster_details = await director_v2_api.get_cluster_details(
@@ -199,7 +189,7 @@ async def ping_cluster(request: web.Request) -> web.Response:
199189
@permission_required("clusters.read")
200190
@_handle_cluster_exceptions
201191
async def ping_cluster_cluster_id(request: web.Request) -> web.Response:
202-
req_ctx = _RequestContext.parse_obj(request)
192+
req_ctx = RequestContext.parse_obj(request)
203193
path_params = parse_request_path_parameters_as(ClusterPathParams, request)
204194

205195
await director_v2_api.ping_specific_cluster(

services/web/server/src/simcore_service_webserver/director_v2/_handlers.py

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
GroupExtraPropertiesRepo,
2323
)
2424

25-
from .._constants import RQ_PRODUCT_KEY
2625
from .._meta import API_VTAG as VTAG
2726
from ..db.plugin import get_database_engine
2827
from ..login.decorators import login_required
@@ -44,11 +43,6 @@
4443
routes = web.RouteTableDef()
4544

4645

47-
class RequestContext(BaseModel):
48-
user_id: UserID = Field(..., alias=RQT_USERID_KEY) # type: ignore[literal-required]
49-
product_name: str = Field(..., alias=RQ_PRODUCT_KEY) # type: ignore[literal-required]
50-
51-
5246
class _ComputationStarted(BaseModel):
5347
pipeline_id: ProjectID = Field(
5448
..., description="ID for created pipeline (=project identifier)"

services/web/server/src/simcore_service_webserver/resource_usage/_pricing_plans_admin_handlers.py

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,17 @@
2020
PricingUnitWithCostUpdate,
2121
)
2222
from models_library.rest_base import StrictRequestParameters
23-
from models_library.users import UserID
24-
from pydantic import BaseModel, Extra, Field
23+
from pydantic import BaseModel, Extra
2524
from servicelib.aiohttp.requests_validation import (
2625
parse_request_body_as,
2726
parse_request_path_parameters_as,
2827
)
2928
from servicelib.aiohttp.typing_extension import Handler
3029
from servicelib.rabbitmq._errors import RPCServerError
31-
from servicelib.request_keys import RQT_USERID_KEY
3230

33-
from .._constants import RQ_PRODUCT_KEY
3431
from .._meta import API_VTAG as VTAG
3532
from ..login.decorators import login_required
33+
from ..models import RequestContext
3634
from ..security.decorators import permission_required
3735
from ..utils_aiohttp import envelope_json_response
3836
from . import _pricing_plans_admin_api as admin_api
@@ -56,11 +54,6 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
5654
return wrapper
5755

5856

59-
class _RequestContext(BaseModel):
60-
user_id: UserID = Field(..., alias=RQT_USERID_KEY) # type: ignore[literal-required]
61-
product_name: str = Field(..., alias=RQ_PRODUCT_KEY) # type: ignore[literal-required]
62-
63-
6457
#
6558
# API handlers
6659
#
@@ -86,7 +79,7 @@ class Config:
8679
@permission_required("resource-usage.write")
8780
@_handle_pricing_plan_admin_exceptions
8881
async def list_pricing_plans(request: web.Request):
89-
req_ctx = _RequestContext.parse_obj(request)
82+
req_ctx = RequestContext.parse_obj(request)
9083

9184
pricing_plans_list = await admin_api.list_pricing_plans(
9285
app=request.app,
@@ -117,7 +110,7 @@ async def list_pricing_plans(request: web.Request):
117110
@permission_required("resource-usage.write")
118111
@_handle_pricing_plan_admin_exceptions
119112
async def get_pricing_plan(request: web.Request):
120-
req_ctx = _RequestContext.parse_obj(request)
113+
req_ctx = RequestContext.parse_obj(request)
121114
path_params = parse_request_path_parameters_as(PricingPlanGetPathParams, request)
122115

123116
pricing_plan_get = await admin_api.get_pricing_plan(
@@ -161,7 +154,7 @@ async def get_pricing_plan(request: web.Request):
161154
@permission_required("resource-usage.write")
162155
@_handle_pricing_plan_admin_exceptions
163156
async def create_pricing_plan(request: web.Request):
164-
req_ctx = _RequestContext.parse_obj(request)
157+
req_ctx = RequestContext.parse_obj(request)
165158
body_params = await parse_request_body_as(CreatePricingPlanBodyParams, request)
166159

167160
_data = PricingPlanCreate(
@@ -210,7 +203,7 @@ async def create_pricing_plan(request: web.Request):
210203
@permission_required("resource-usage.write")
211204
@_handle_pricing_plan_admin_exceptions
212205
async def update_pricing_plan(request: web.Request):
213-
req_ctx = _RequestContext.parse_obj(request)
206+
req_ctx = RequestContext.parse_obj(request)
214207
path_params = parse_request_path_parameters_as(PricingPlanGetPathParams, request)
215208
body_params = await parse_request_body_as(UpdatePricingPlanBodyParams, request)
216209

@@ -271,7 +264,7 @@ class Config:
271264
@permission_required("resource-usage.write")
272265
@_handle_pricing_plan_admin_exceptions
273266
async def get_pricing_unit(request: web.Request):
274-
req_ctx = _RequestContext.parse_obj(request)
267+
req_ctx = RequestContext.parse_obj(request)
275268
path_params = parse_request_path_parameters_as(PricingUnitGetPathParams, request)
276269

277270
pricing_unit_get = await admin_api.get_pricing_unit(
@@ -301,7 +294,7 @@ async def get_pricing_unit(request: web.Request):
301294
@permission_required("resource-usage.write")
302295
@_handle_pricing_plan_admin_exceptions
303296
async def create_pricing_unit(request: web.Request):
304-
req_ctx = _RequestContext.parse_obj(request)
297+
req_ctx = RequestContext.parse_obj(request)
305298
path_params = parse_request_path_parameters_as(PricingPlanGetPathParams, request)
306299
body_params = await parse_request_body_as(CreatePricingUnitBodyParams, request)
307300

@@ -340,7 +333,7 @@ async def create_pricing_unit(request: web.Request):
340333
@permission_required("resource-usage.write")
341334
@_handle_pricing_plan_admin_exceptions
342335
async def update_pricing_unit(request: web.Request):
343-
req_ctx = _RequestContext.parse_obj(request)
336+
req_ctx = RequestContext.parse_obj(request)
344337
path_params = parse_request_path_parameters_as(PricingUnitGetPathParams, request)
345338
body_params = await parse_request_body_as(UpdatePricingUnitBodyParams, request)
346339

@@ -382,7 +375,7 @@ async def update_pricing_unit(request: web.Request):
382375
@permission_required("resource-usage.write")
383376
@_handle_pricing_plan_admin_exceptions
384377
async def list_connected_services_to_pricing_plan(request: web.Request):
385-
req_ctx = _RequestContext.parse_obj(request)
378+
req_ctx = RequestContext.parse_obj(request)
386379
path_params = parse_request_path_parameters_as(PricingPlanGetPathParams, request)
387380

388381
connected_services_list = await admin_api.list_connected_services_to_pricing_plan(
@@ -411,7 +404,7 @@ async def list_connected_services_to_pricing_plan(request: web.Request):
411404
@permission_required("resource-usage.write")
412405
@_handle_pricing_plan_admin_exceptions
413406
async def connect_service_to_pricing_plan(request: web.Request):
414-
req_ctx = _RequestContext.parse_obj(request)
407+
req_ctx = RequestContext.parse_obj(request)
415408
path_params = parse_request_path_parameters_as(PricingPlanGetPathParams, request)
416409
body_params = await parse_request_body_as(
417410
ConnectServiceToPricingPlanBodyParams, request

services/web/server/src/simcore_service_webserver/resource_usage/_pricing_plans_handlers.py

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,12 @@
44
from models_library.api_schemas_webserver.resource_usage import PricingUnitGet
55
from models_library.resource_tracker import PricingPlanId, PricingUnitId
66
from models_library.rest_base import StrictRequestParameters
7-
from models_library.users import UserID
8-
from pydantic import BaseModel, Field
97
from servicelib.aiohttp.requests_validation import parse_request_path_parameters_as
108
from servicelib.aiohttp.typing_extension import Handler
11-
from servicelib.request_keys import RQT_USERID_KEY
129

13-
from .._constants import RQ_PRODUCT_KEY
1410
from .._meta import API_VTAG as VTAG
1511
from ..login.decorators import login_required
12+
from ..models import RequestContext
1613
from ..security.decorators import permission_required
1714
from ..utils_aiohttp import envelope_json_response
1815
from ..wallets.errors import WalletAccessForbiddenError
@@ -35,11 +32,6 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
3532
return wrapper
3633

3734

38-
class _RequestContext(BaseModel):
39-
user_id: UserID = Field(..., alias=RQT_USERID_KEY) # type: ignore[literal-required]
40-
product_name: str = Field(..., alias=RQ_PRODUCT_KEY) # type: ignore[literal-required]
41-
42-
4335
routes = web.RouteTableDef()
4436

4537

@@ -56,7 +48,7 @@ class PricingPlanUnitGetPathParams(StrictRequestParameters):
5648
@permission_required("resource-usage.read")
5749
@_handle_resource_usage_exceptions
5850
async def get_pricing_plan_unit(request: web.Request):
59-
req_ctx = _RequestContext.parse_obj(request)
51+
req_ctx = RequestContext.parse_obj(request)
6052
path_params = parse_request_path_parameters_as(
6153
PricingPlanUnitGetPathParams, request
6254
)

services/web/server/src/simcore_service_webserver/resource_usage/_service_runs_handlers.py

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,23 @@
1212
ServicesAggregatedUsagesTimePeriod,
1313
ServicesAggregatedUsagesType,
1414
)
15-
from models_library.rest_base import RequestParameters
1615
from models_library.rest_ordering import (
1716
OrderBy,
1817
OrderDirection,
1918
create_ordering_query_model_classes,
2019
)
2120
from models_library.rest_pagination import Page, PageQueryParameters
2221
from models_library.rest_pagination_utils import paginate_data
23-
from models_library.users import UserID
2422
from models_library.wallets import WalletID
2523
from pydantic import Extra, Field, Json, parse_obj_as, validator
2624
from servicelib.aiohttp.requests_validation import parse_request_query_parameters_as
2725
from servicelib.aiohttp.typing_extension import Handler
2826
from servicelib.mimetype_constants import MIMETYPE_APPLICATION_JSON
29-
from servicelib.request_keys import RQT_USERID_KEY
3027
from servicelib.rest_constants import RESPONSE_MODEL_POLICY
3128

32-
from .._constants import RQ_PRODUCT_KEY
3329
from .._meta import API_VTAG as VTAG
3430
from ..login.decorators import login_required
31+
from ..models import RequestContext
3532
from ..security.decorators import permission_required
3633
from ..wallets.errors import WalletAccessForbiddenError
3734
from . import _service_runs_api as api
@@ -53,11 +50,6 @@ async def wrapper(request: web.Request) -> web.StreamResponse:
5350
return wrapper
5451

5552

56-
class _RequestContext(RequestParameters):
57-
user_id: UserID = Field(..., alias=RQT_USERID_KEY) # type: ignore[literal-required]
58-
product_name: str = Field(..., alias=RQ_PRODUCT_KEY) # type: ignore[literal-required]
59-
60-
6153
_ResorceUsagesListOrderQueryParams = create_ordering_query_model_classes(
6254
ordering_fields={
6355
"wallet_id",
@@ -133,7 +125,7 @@ class Config:
133125
@permission_required("resource-usage.read")
134126
@_handle_resource_usage_exceptions
135127
async def list_resource_usage_services(request: web.Request):
136-
req_ctx = _RequestContext.parse_obj(request)
128+
req_ctx = RequestContext.parse_obj(request)
137129
query_params: ServicesResourceUsagesListQueryParams = (
138130
parse_request_query_parameters_as(
139131
ServicesResourceUsagesListQueryParams, request
@@ -174,7 +166,7 @@ async def list_resource_usage_services(request: web.Request):
174166
@permission_required("resource-usage.read")
175167
@_handle_resource_usage_exceptions
176168
async def list_osparc_credits_aggregated_usages(request: web.Request):
177-
req_ctx = _RequestContext.parse_obj(request)
169+
req_ctx = RequestContext.parse_obj(request)
178170
query_params: ServicesAggregatedUsagesListQueryParams = (
179171
parse_request_query_parameters_as(
180172
ServicesAggregatedUsagesListQueryParams, request
@@ -214,7 +206,7 @@ async def list_osparc_credits_aggregated_usages(request: web.Request):
214206
@permission_required("resource-usage.read")
215207
@_handle_resource_usage_exceptions
216208
async def export_resource_usage_services(request: web.Request):
217-
req_ctx = _RequestContext.parse_obj(request)
209+
req_ctx = RequestContext.parse_obj(request)
218210
query_params: ServicesResourceUsagesReportQueryParams = (
219211
parse_request_query_parameters_as(
220212
ServicesResourceUsagesReportQueryParams, request

0 commit comments

Comments
 (0)