From d51cc49f993d114774216fffb9fc61b03588e354 Mon Sep 17 00:00:00 2001 From: Wei Zang Date: Mon, 20 Apr 2026 09:36:06 +0100 Subject: [PATCH 1/3] Update python-logo.sketch --- app/static/python-logo.sketch | Bin 9045 -> 9194 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/app/static/python-logo.sketch b/app/static/python-logo.sketch index 56ecd6581a5f5334b9c9cefa7f8cdbcb34be413a..ec9b0d2d822a93c04b649463133071ee631d1845 100644 GIT binary patch delta 8141 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 S8~mT83Spq8M@pjl=lnko(0@w+ delta 7993 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 Date: Mon, 20 Apr 2026 13:22:24 +0100 Subject: [PATCH 2/3] Delete python-logo.sketch --- app/static/python-logo.sketch | Bin 9194 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 app/static/python-logo.sketch diff --git a/app/static/python-logo.sketch b/app/static/python-logo.sketch deleted file mode 100644 index ec9b0d2d822a93c04b649463133071ee631d1845..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9194 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 Tp#MySdOxJz0bLx)pV9vSNPo;+ From a992d87aba7a27e9d0d25e0ae510f2e6187da3c4 Mon Sep 17 00:00:00 2001 From: Wei Zang Date: Mon, 20 Apr 2026 13:51:14 +0100 Subject: [PATCH 3/3] Add filtering and next item to /queue endpoint Bump version to 2.2.9 and enhance the GET /queue route: accept optional collection and group query params, compute total and filtered counts, return distinct collections/groups, and return the next queue item (most recently updated) for the applied filters instead of a random example. Also simplified schema handling and changed error handling to return a meta error response rather than raising an HTTPException. --- app/__init__.py | 2 +- app/api/queue/routes/get.py | 64 ++++++++++++++++++++++--------------- 2 files changed, 40 insertions(+), 26 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index 06f6a53..d85556c 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,4 +1,4 @@ """Python - FastAPI, Postgres, tsvector""" # Current Version -__version__ = "2.2.8" +__version__ = "2.2.9" diff --git a/app/api/queue/routes/get.py b/app/api/queue/routes/get.py index 0399d71..9ad55c5 100644 --- a/app/api/queue/routes/get.py +++ b/app/api/queue/routes/get.py @@ -1,55 +1,69 @@ import os -from fastapi import APIRouter, HTTPException +from fastapi import APIRouter, HTTPException, Query from app.utils.make_meta import make_meta from app.utils.db import get_db_connection_direct router = APIRouter() @router.get("/queue") -def read_queue() -> dict: +def read_queue( + collection: str = Query(None, description="Filter by collection name"), + group: str = Query(None, description="Filter by group name") +) -> dict: """GET /queue: Return queue table info, schema, and most recent record.""" try: conn = get_db_connection_direct() cursor = conn.cursor() - # 1. Count records + # 1. Total record count (unfiltered) cursor.execute("SELECT COUNT(*) FROM queue;") count_row = cursor.fetchone() - record_count = count_row[0] if count_row else 0 - - # 2. Get table schema - cursor.execute("SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'queue';") - schema = [ - { - "name": row[0], - "type": row[1] - } - for row in cursor.fetchall() - ] - - # 3. Get a random record - cursor.execute("SELECT * FROM queue ORDER BY RANDOM() LIMIT 1;") - columns = [desc[0] for desc in cursor.description] if cursor.description else [] - rows = cursor.fetchall() - random_record = [dict(zip(columns, row)) for row in rows] if rows and columns else [] + total_count = count_row[0] if count_row else 0 - # 4. Get unique values from collection and group columns + # 2. Get unique values from collection and group columns cursor.execute("SELECT DISTINCT collection FROM queue WHERE collection IS NOT NULL;") collections = [row[0] for row in cursor.fetchall()] cursor.execute('SELECT DISTINCT "group" FROM queue WHERE "group" IS NOT NULL;') groups = [row[0] for row in cursor.fetchall()] + # 3. Build filter conditions + filters = [] + params = [] + if collection: + filters.append("collection = %s") + params.append(collection) + if group: + filters.append('"group" = %s') + params.append(group) + where_clause = f"WHERE {' AND '.join(filters)}" if filters else "" + + # 4. Filtered count + count_query = f"SELECT COUNT(*) FROM queue {where_clause};" + cursor.execute(count_query, params) + filtered_count_row = cursor.fetchone() + filtered_count = filtered_count_row[0] if filtered_count_row else 0 + + # 5. Get the next in queue (most recently updated in filtered list) + next_query = f"SELECT * FROM queue {where_clause} ORDER BY updated DESC LIMIT 1;" + cursor.execute(next_query, params) + columns = [desc[0] for desc in cursor.description] if cursor.description else [] + row = cursor.fetchone() + next_record = dict(zip(columns, row)) if row and columns else None + conn.close() return { "meta": make_meta("success", "Queue table info"), "data": { - "in_queue": record_count, + "total": total_count, + "filtered": filtered_count, "collections": collections, "groups": groups, - "example": random_record, - # "queue_schema": schema + "next": next_record } } except Exception as e: - raise HTTPException(status_code=500, detail=str(e)) + return { + "meta": make_meta("error", str(e)), + "data": None + }