🐛 fix(store.py): change function name from query_components to count_components to improve semantics and accurately count components

✨ feat(service.py): add count_components method to StoreService class to count components based on filter criteria
This commit is contained in:
Gabriel Luiz Freitas Almeida 2023-10-25 21:50:06 -03:00
commit 31fb76c992
2 changed files with 27 additions and 18 deletions

View file

@ -85,12 +85,10 @@ def count_components(
store_api_Key: str = Depends(get_optional_user_store_api_key), store_api_Key: str = Depends(get_optional_user_store_api_key),
): ):
try: try:
result = store_service.query_components( result = store_service.count_components(
store_api_Key, api_key=store_api_Key, filter_by_user=filter_by_user
count=True,
filter_by_user=filter_by_user,
) )
return {"count": result[0].get("count", 0)} return {"count": result}
except Exception as exc: except Exception as exc:
raise HTTPException(status_code=400, detail=str(exc)) raise HTTPException(status_code=400, detail=str(exc))

View file

@ -119,6 +119,25 @@ class StoreService(Service):
results = self._get(self.components_url, api_key, params) results = self._get(self.components_url, api_key, params)
return [ComponentResponse(**component) for component in results] return [ComponentResponse(**component) for component in results]
def count_components(
self,
api_key: str,
filter_by_user: bool = False,
) -> int:
params = {"aggregate": json.dumps({"count": "*"})}
if filter_by_user:
params["deep"] = json.dumps(
{
"components": {
"_filter": {"user_created": {"token": {"_eq": api_key}}}
}
}
)
else:
params["filter"] = json.dumps({"status": {"_in": ["public", "Public"]}})
results = self._get(self.components_url, api_key, params)
return results[0].get("count", 0)
def query_components( def query_components(
self, self,
api_key: str, api_key: str,
@ -126,20 +145,14 @@ class StoreService(Service):
limit: int = 15, limit: int = 15,
fields: Optional[List[str]] = None, fields: Optional[List[str]] = None,
filter_by_user: bool = False, filter_by_user: bool = False,
count: bool = False,
) -> Union[List[ListComponentResponse], List[Dict[str, int]]]: ) -> Union[List[ListComponentResponse], List[Dict[str, int]]]:
params = {"page": page, "limit": limit} params = {"page": page, "limit": limit}
# ?aggregate[count]=likes # ?aggregate[count]=likes
if count: params["fields"] = (
params["aggregate"] = json.dumps({"count": "*"}) ",".join(fields)
else: if fields
params["fields"] = ( else ",".join(["id", "name", "description", "count(likes)", "is_component"])
",".join(fields) )
if fields
else ",".join(
["id", "name", "description", "count(likes)", "is_component"]
)
)
# Only public components or the ones created by the user # Only public components or the ones created by the user
# check for "public" or "Public" # check for "public" or "Public"
@ -157,8 +170,6 @@ class StoreService(Service):
) )
results = self._get(self.components_url, api_key, params) results = self._get(self.components_url, api_key, params)
if "count" in results[0]:
return results
return [ListComponentResponse(**component) for component in results] return [ListComponentResponse(**component) for component in results]
def download(self, api_key: str, component_id: str) -> DownloadComponentResponse: def download(self, api_key: str, component_id: str) -> DownloadComponentResponse: