Skip to content

Commit 5fd4b06

Browse files
committed
workspaces query
1 parent 412d7d6 commit 5fd4b06

File tree

3 files changed

+35
-44
lines changed

3 files changed

+35
-44
lines changed

api/specs/web-server/_workspaces.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,18 @@
2323
WorkspacesFilters,
2424
WorkspacesGroupsBodyParams,
2525
WorkspacesGroupsPathParams,
26-
WorkspacesListWithJsonStrQueryParams,
26+
WorkspacesOrderByJsonQueryParams,
2727
WorkspacesPathParams,
2828
)
2929

30+
31+
class _ListQueryParams(WorkspacesOrderByJsonQueryParams):
32+
filters: Annotated[
33+
Json | None,
34+
Query(description=WorkspacesFilters.schema_json(indent=1)),
35+
] = None
36+
37+
3038
router = APIRouter(
3139
prefix=f"/{API_VTAG}",
3240
tags=[
@@ -51,21 +59,7 @@ async def create_workspace(
5159
response_model=Envelope[list[WorkspaceGet]],
5260
)
5361
async def list_workspaces(
54-
order_by: Annotated[
55-
Json,
56-
Query(
57-
description=WorkspacesListWithJsonStrQueryParams.__fields__[
58-
"order_by"
59-
].field_info.description,
60-
example=WorkspacesListWithJsonStrQueryParams.__fields__[
61-
"order_by"
62-
].field_info.extra.get("example"),
63-
),
64-
] = WorkspacesListWithJsonStrQueryParams.__fields__["order_by"].field_info.default,
65-
filters: Annotated[
66-
Json | None,
67-
Query(description=WorkspacesFilters.schema_json(indent=1)),
68-
] = None,
62+
_q: Annotated[_ListQueryParams, Depends()],
6963
):
7064
...
7165

services/web/server/src/simcore_service_webserver/workspaces/_models.py

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,16 @@
22

33
from models_library.basic_types import IDStr
44
from models_library.rest_filters import Filters, FiltersQueryParameters
5-
from models_library.rest_ordering import OrderBy, OrderDirection
5+
from models_library.rest_ordering import (
6+
OrderBy,
7+
OrderDirection,
8+
create_order_by_query_model_classes,
9+
)
610
from models_library.rest_pagination import PageQueryParameters
711
from models_library.trash import RemoveQueryParams
812
from models_library.users import GroupID, UserID
913
from models_library.workspaces import WorkspaceID
10-
from pydantic import BaseModel, Extra, Field, Json, validator
14+
from pydantic import BaseModel, Extra, Field
1115
from servicelib.aiohttp.requests_validation import RequestParams, StrictRequestParams
1216
from servicelib.request_keys import RQT_USERID_KEY
1317

@@ -32,31 +36,23 @@ class WorkspacesFilters(Filters):
3236
)
3337

3438

35-
class WorkspacesListWithJsonStrQueryParams(
36-
PageQueryParameters, FiltersQueryParameters[WorkspacesFilters]
37-
):
38-
# pylint: disable=unsubscriptable-object
39-
order_by: Json[OrderBy] = Field(
40-
default=OrderBy(field=IDStr("modified"), direction=OrderDirection.DESC),
41-
description="Order by field (modified_at|name|description) and direction (asc|desc). The default sorting order is ascending.",
42-
example='{"field": "name", "direction": "desc"}',
43-
alias="order_by",
44-
)
39+
(
40+
WorkspacesOrderByQueryParams,
41+
WorkspacesOrderByJsonQueryParams,
42+
) = create_order_by_query_model_classes(
43+
sortable_fields={"modified", "name"},
44+
default_order_by=OrderBy(
45+
field=IDStr("modified"),
46+
direction=OrderDirection.DESC,
47+
),
48+
)
4549

46-
@validator("order_by", check_fields=False)
47-
@classmethod
48-
def _validate_order_by_field(cls, v):
49-
if v.field not in {
50-
"modified_at",
51-
"name",
52-
"description",
53-
}:
54-
msg = f"We do not support ordering by provided field {v.field}"
55-
raise ValueError(msg)
56-
if v.field == "modified_at":
57-
v.field = "modified"
58-
return v
5950

51+
class WorkspacesListQueryParams(
52+
PageQueryParameters,
53+
FiltersQueryParameters[WorkspacesFilters],
54+
WorkspacesOrderByQueryParams,
55+
):
6056
class Config:
6157
extra = Extra.forbid
6258

services/web/server/src/simcore_service_webserver/workspaces/_workspaces_handlers.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
from ._exceptions_handlers import handle_plugin_requests_exceptions
2929
from ._models import (
3030
WorkspacesFilters,
31-
WorkspacesListWithJsonStrQueryParams,
31+
WorkspacesListQueryParams,
3232
WorkspacesPathParams,
3333
WorkspacesRequestContext,
3434
)
@@ -65,13 +65,14 @@ async def create_workspace(request: web.Request):
6565
@handle_plugin_requests_exceptions
6666
async def list_workspaces(request: web.Request):
6767
req_ctx = WorkspacesRequestContext.parse_obj(request)
68-
query_params: WorkspacesListWithJsonStrQueryParams = (
69-
parse_request_query_parameters_as(WorkspacesListWithJsonStrQueryParams, request)
68+
query_params: WorkspacesListQueryParams = parse_request_query_parameters_as(
69+
WorkspacesListQueryParams, request
7070
)
7171

7272
if not query_params.filters:
7373
query_params.filters = WorkspacesFilters()
7474

75+
assert query_params.filters
7576
workspaces: WorkspaceGetPage = await _workspaces_api.list_workspaces(
7677
app=request.app,
7778
user_id=req_ctx.user_id,

0 commit comments

Comments
 (0)