🔧 fix(store.py): rename list_components function to get_components to improve semantics and clarity

🔧 fix(service.py): add search, status, tags, and sort parameters to query_components function to enable filtering and sorting of components
 feat(service.py): add build_search_filter_conditions method to build filter conditions for search query in query_components function
This commit is contained in:
Gabriel Luiz Freitas Almeida 2023-11-07 15:42:54 -03:00
commit f9b57f90a7
2 changed files with 41 additions and 2 deletions

View file

@ -71,11 +71,15 @@ def create_component(
@router.get("/components/", response_model=ListComponentResponseModel)
def list_components(
def get_components(
search: Optional[List[str]] = Query(None),
status: Optional[str] = Query(None),
is_component: Optional[bool] = Query(None),
tags: Optional[List[str]] = Query(None),
sort: Optional[List[str]] = Query(None),
filter_by_user: bool = Query(False),
page: int = 1,
limit: int = 10,
is_component: Optional[bool] = Query(None),
store_service: StoreService = Depends(get_store_service),
store_api_Key: Optional[str] = Depends(get_optional_user_store_api_key),
):
@ -88,6 +92,10 @@ def list_components(
limit=limit,
filter_by_user=filter_by_user,
is_component=is_component,
search=search,
status=status,
tags=tags,
sort=sort,
)
comp_count = store_service.count_components(

View file

@ -201,9 +201,23 @@ class StoreService(Service):
results = self._get(self.components_url, api_key, params)
return results[0].get("count", 0)
@staticmethod
def build_search_filter_conditions(query: str):
# instead of build the param ?search=query, we will build the filter
# that will use _icontains (case insensitive)
conditions = {"_or": []}
conditions["_or"].append({"name": {"_icontains": query}})
conditions["_or"].append({"description": {"_icontains": query}})
conditions["_or"].append({"tags": {"tags_id": {"name": {"_icontains": query}}}})
return conditions
def query_components(
self,
api_key: str,
search: Optional[str] = None,
status: Optional[str] = None,
tags: Optional[List[str]] = None,
sort: Optional[List[str]] = None,
page: int = 1,
limit: int = 15,
fields: Optional[List[str]] = None,
@ -213,8 +227,25 @@ class StoreService(Service):
params = {"page": page, "limit": limit}
# ?aggregate[count]=likes
params["fields"] = ",".join(fields) if fields else ",".join(self.default_fields)
if sort:
params["sort"] = ",".join(sort)
filter_conditions = []
if search is not None:
search_conditions = self.build_search_filter_conditions(search)
filter_conditions.append(search_conditions)
if status:
filter_conditions.append({"status": {"_eq": status}})
if tags:
filter_conditions.append({"tags": {"tags_id": {"name": {"_in": tags}}}})
if is_component is not None:
filter_conditions.append({"is_component": {"_eq": is_component}})
if is_component is not None:
filter_conditions.append({"is_component": {"_eq": is_component}})