Skip to content

Commit d9fb9d2

Browse files
🐛 folder full search adding text query parameter (#6716)
1 parent 819df89 commit d9fb9d2

File tree

7 files changed

+37
-1
lines changed

7 files changed

+37
-1
lines changed

api/specs/web-server/_folders.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ async def list_folders(
6969
)
7070
async def list_folders_full_search(
7171
params: Annotated[PageQueryParameters, Depends()],
72+
text: str | None = None,
7273
order_by: Annotated[
7374
Json,
7475
Query(

services/web/server/src/simcore_service_webserver/api/v0/openapi.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2697,6 +2697,12 @@ paths:
26972697
summary: List Folders Full Search
26982698
operationId: list_folders_full_search
26992699
parameters:
2700+
- required: false
2701+
schema:
2702+
title: Text
2703+
type: string
2704+
name: text
2705+
in: query
27002706
- description: Order by field (modified_at|name|description) and direction (asc|desc).
27012707
The default sorting order is ascending.
27022708
required: false

services/web/server/src/simcore_service_webserver/folders/_folders_api.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,7 @@ async def list_folders(
172172
else WorkspaceQuery(workspace_scope=WorkspaceScope.PRIVATE)
173173
),
174174
filter_trashed=trashed,
175+
filter_by_text=None,
175176
offset=offset,
176177
limit=limit,
177178
order_by=order_by,
@@ -199,6 +200,7 @@ async def list_folders_full_search(
199200
app: web.Application,
200201
user_id: UserID,
201202
product_name: ProductName,
203+
text: str | None,
202204
trashed: bool | None,
203205
offset: NonNegativeInt,
204206
limit: int,
@@ -213,6 +215,7 @@ async def list_folders_full_search(
213215
folder_query=FolderQuery(folder_scope=FolderScope.ALL),
214216
workspace_query=WorkspaceQuery(workspace_scope=WorkspaceScope.ALL),
215217
filter_trashed=trashed,
218+
filter_by_text=text,
216219
offset=offset,
217220
limit=limit,
218221
order_by=order_by,

services/web/server/src/simcore_service_webserver/folders/_folders_db.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ async def list_( # pylint: disable=too-many-arguments,too-many-branches
113113
workspace_query: WorkspaceQuery,
114114
# attribute filters
115115
filter_trashed: bool | None,
116+
filter_by_text: str | None,
116117
# pagination
117118
offset: NonNegativeInt,
118119
limit: int,
@@ -199,6 +200,8 @@ async def list_( # pylint: disable=too-many-arguments,too-many-branches
199200
else:
200201
assert folder_query.folder_scope == FolderScope.ROOT # nosec
201202
attributes_filters.append(folders_v2.c.parent_folder_id.is_(None))
203+
if filter_by_text:
204+
attributes_filters.append(folders_v2.c.name.ilike(f"%{filter_by_text}%"))
202205

203206
###
204207
# Combined

services/web/server/src/simcore_service_webserver/folders/_folders_handlers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,7 @@ async def list_folders_full_search(request: web.Request):
119119
app=request.app,
120120
user_id=req_ctx.user_id,
121121
product_name=req_ctx.product_name,
122+
text=query_params.text,
122123
trashed=query_params.filters.trashed,
123124
offset=query_params.offset,
124125
limit=query_params.limit,

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
from models_library.rest_ordering import OrderBy, OrderDirection
77
from models_library.rest_pagination import PageQueryParameters
88
from models_library.users import UserID
9-
from models_library.utils.common_validators import null_or_none_str_to_none_validator
9+
from models_library.utils.common_validators import (
10+
empty_str_to_none_pre_validator,
11+
null_or_none_str_to_none_validator,
12+
)
1013
from models_library.workspaces import WorkspaceID
1114
from pydantic import BaseModel, Extra, Field, Json, validator
1215
from servicelib.aiohttp.requests_validation import RequestParams, StrictRequestParams
@@ -88,6 +91,17 @@ class Config:
8891
class FolderListFullSearchWithJsonStrQueryParams(
8992
PageQueryParameters, FolderListSortParams, FiltersQueryParameters[FolderFilters]
9093
):
94+
text: str | None = Field(
95+
default=None,
96+
description="Multi column full text search, across all folders and workspaces",
97+
max_length=100,
98+
example="My Project",
99+
)
100+
101+
_empty_is_none = validator("text", allow_reuse=True, pre=True)(
102+
empty_str_to_none_pre_validator
103+
)
104+
91105
class Config:
92106
extra = Extra.forbid
93107

services/web/server/tests/unit/with_dbs/04/folders/test_folders__full_search.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,14 @@ async def test_folders_full_search(
103103
data, _ = await assert_status(resp, status.HTTP_200_OK)
104104
assert len(data) == 3
105105

106+
# list full folder search with specific text
107+
url = client.app.router["list_folders_full_search"].url_for()
108+
query_parameters = {"text": "My subfolder"}
109+
url_with_query = url.with_query(**query_parameters)
110+
resp = await client.get(f"{url_with_query}")
111+
data, _ = await assert_status(resp, status.HTTP_200_OK)
112+
assert len(data) == 1
113+
106114
# Create new user
107115
async with LoggedUser(client) as new_logged_user:
108116
# list full folder search

0 commit comments

Comments
 (0)