From 278cb98e480017ecf5f01351d7d8c9ff14fd2b6f Mon Sep 17 00:00:00 2001 From: kirtanchandak Date: Thu, 6 Mar 2025 22:35:54 +0530 Subject: [PATCH 1/3] adds logic to fetch specific keys for a product --- folksonomy/api.py | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/folksonomy/api.py b/folksonomy/api.py index 843fe7f..8d1e6d3 100644 --- a/folksonomy/api.py +++ b/folksonomy/api.py @@ -1,5 +1,6 @@ #! /usr/bin/python3 +from fastapi import Query import contextlib import os import logging @@ -324,22 +325,36 @@ async def product_list(response: Response, @app.get("/product/{product}", response_model=List[ProductTag]) -async def product_tags_list(response: Response, - product: str, owner='', - user: User = Depends(get_current_user)): +async def product_tags_list( + response: Response, + product: str, + owner: str = '', + keys: str = Query(None, description="Comma-separated list of keys to filter by"), + user: User = Depends(get_current_user) +): """ - Get a list of existing tags for a product + Get a list of existing tags for a product, optionally filtering by specific keys. """ check_owner_user(user, owner, allow_anonymous=True) - cur, timing = await db.db_exec(""" - SELECT json_agg(j)::json FROM( - SELECT * FROM folksonomy WHERE product = %s AND owner = %s ORDER BY k - ) as j; - """, - (product, owner), - ) + keys_list = [key.strip() for key in keys.split(",")] if keys else None + + query = """ + SELECT json_agg(j)::json FROM ( + SELECT * FROM folksonomy WHERE product = %s AND owner = %s + """ + params = [product, owner] + + if keys_list: + placeholders = ', '.join(['%s'] * len(keys_list)) + query += f" AND k IN ({placeholders})" + params.extend(keys_list) + + query += " ORDER BY k) as j;" + + cur, timing = await db.db_exec(query, tuple(params)) out = await cur.fetchone() + return JSONResponse(status_code=200, content=out[0], headers={"x-pg-timing": timing}) From d1c59dea777c1670c40df7a6eb136f187309889c Mon Sep 17 00:00:00 2001 From: kirtanchandak Date: Wed, 12 Mar 2025 16:36:07 +0530 Subject: [PATCH 2/3] rewritten SQL query in f-string for better readability --- folksonomy/api.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/folksonomy/api.py b/folksonomy/api.py index 8d1e6d3..2172ac2 100644 --- a/folksonomy/api.py +++ b/folksonomy/api.py @@ -339,18 +339,18 @@ async def product_tags_list( check_owner_user(user, owner, allow_anonymous=True) keys_list = [key.strip() for key in keys.split(",")] if keys else None - query = """ + placeholders = ', '.join(['%s'] * len(keys_list)) if keys_list else '' + + query = f""" SELECT json_agg(j)::json FROM ( - SELECT * FROM folksonomy WHERE product = %s AND owner = %s + SELECT * FROM folksonomy + WHERE product = %s AND owner = %s + {f"AND k IN ({placeholders})" if keys_list else ""} + ORDER BY k + ) as j; """ - params = [product, owner] - - if keys_list: - placeholders = ', '.join(['%s'] * len(keys_list)) - query += f" AND k IN ({placeholders})" - params.extend(keys_list) - query += " ORDER BY k) as j;" + params = [product, owner] + (keys_list if keys_list else []) cur, timing = await db.db_exec(query, tuple(params)) out = await cur.fetchone() From 5f82ef30fbcf931fb2bbf0197f49c117c196f930 Mon Sep 17 00:00:00 2001 From: kirtanchandak Date: Mon, 17 Mar 2025 23:03:20 +0530 Subject: [PATCH 3/3] adds more clear desc for API --- folksonomy/api.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/folksonomy/api.py b/folksonomy/api.py index 2172ac2..65dd076 100644 --- a/folksonomy/api.py +++ b/folksonomy/api.py @@ -329,7 +329,7 @@ async def product_tags_list( response: Response, product: str, owner: str = '', - keys: str = Query(None, description="Comma-separated list of keys to filter by"), + keys: str = Query(None, description="Comma-separated list of keys to filter by. If not provided, all keys are returned."), user: User = Depends(get_current_user) ): """