Skip to content

Commit d36aecf

Browse files
committed
Add queue API routes and sample data
Introduce a Queue API surface: add individual route modules (create, drop, empty, get) and register them via app/api/queue/__init__.py (APIRouter includes). Add supporting artifacts: a sample linkedin.csv and SQL schema (create_queue_table.sql). Also update queue implementation and top-level app/api/routes.py to wire the new queue endpoints.
1 parent 94f12ad commit d36aecf

9 files changed

Lines changed: 1791 additions & 13 deletions

File tree

app/api/queue/__init__.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
11
"""Queue Routes"""
22

3-
from .queue import router as queue_router
3+
4+
from fastapi import APIRouter
5+
from .routes.drop import router as drop_router
6+
from .routes.empty import router as empty_router
7+
from .routes.get import router as get_router
8+
from .routes.create import router as create_router
9+
10+
router = APIRouter()
11+
router.include_router(drop_router)
12+
router.include_router(empty_router)
13+
router.include_router(get_router)
14+
router.include_router(create_router)

app/api/queue/linkedin.csv

Lines changed: 1650 additions & 0 deletions
Large diffs are not rendered by default.

app/api/queue/queue.py

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,8 @@
1-
import os
2-
from fastapi import APIRouter, HTTPException, Query, Request, Depends
3-
from app.utils.make_meta import make_meta
4-
from app.utils.db import get_db_connection_direct
5-
from app.utils.api_key_auth import get_api_key
61

7-
router = APIRouter()
82

9-
10-
@router.get("/queue")
11-
def read_queue() -> dict:
12-
"""GET /queue: """
13-
return {"meta": make_meta("success", "Hello from queue"), "data": {"do": "it"}}
3+
from .routes.drop import router as drop_router
4+
from .routes.empty import router as empty_router
5+
from .routes.get import router as get_router
6+
from .routes.create import router as create_router
147

158

app/api/queue/routes/create.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import os
2+
from fastapi import APIRouter, HTTPException
3+
from app.utils.make_meta import make_meta
4+
from app.utils.db import get_db_connection_direct
5+
6+
router = APIRouter()
7+
8+
@router.post("/queue/create")
9+
def create_queue_table() -> dict:
10+
"""POST /queue/create: Create the queue table from SQL script."""
11+
try:
12+
sql_path = os.path.join(os.path.dirname(__file__), "../sql/create_queue_table.sql")
13+
with open(sql_path, "r") as f:
14+
sql = f.read()
15+
conn = get_db_connection_direct()
16+
cursor = conn.cursor()
17+
# Split SQL script into individual statements for PostgreSQL
18+
statements = [s.strip() for s in sql.split(';') if s.strip()]
19+
for statement in statements:
20+
cursor.execute(statement)
21+
conn.commit()
22+
conn.close()
23+
return {"meta": make_meta("success", "Queue table created")}
24+
except Exception as e:
25+
raise HTTPException(status_code=500, detail=str(e))

app/api/queue/routes/drop.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import os
2+
from fastapi import APIRouter, HTTPException
3+
from app.utils.make_meta import make_meta
4+
from app.utils.db import get_db_connection_direct
5+
6+
router = APIRouter()
7+
8+
@router.post("/queue/drop")
9+
def drop_queue_table() -> dict:
10+
"""POST /queue/drop: Drop the queue table."""
11+
try:
12+
conn = get_db_connection_direct()
13+
cursor = conn.cursor()
14+
cursor.execute("DROP TABLE IF EXISTS queue;")
15+
conn.commit()
16+
conn.close()
17+
return {"meta": make_meta("success", "Queue table dropped")}
18+
except Exception as e:
19+
raise HTTPException(status_code=500, detail=str(e))

app/api/queue/routes/empty.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import os
2+
from fastapi import APIRouter, HTTPException
3+
from app.utils.make_meta import make_meta
4+
from app.utils.db import get_db_connection_direct
5+
6+
router = APIRouter()
7+
8+
@router.post("/queue/empty")
9+
def empty_queue_table() -> dict:
10+
"""POST /queue/empty: Remove all records from the queue table."""
11+
try:
12+
conn = get_db_connection_direct()
13+
cursor = conn.cursor()
14+
cursor.execute("DELETE FROM queue;")
15+
conn.commit()
16+
conn.close()
17+
return {"meta": make_meta("success", "Queue table emptied")}
18+
except Exception as e:
19+
raise HTTPException(status_code=500, detail=str(e))

app/api/queue/routes/get.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
import os
2+
from fastapi import APIRouter, HTTPException
3+
from app.utils.make_meta import make_meta
4+
from app.utils.db import get_db_connection_direct
5+
6+
router = APIRouter()
7+
8+
@router.get("/queue")
9+
def read_queue() -> dict:
10+
"""GET /queue: Return queue table info, schema, and most recent record."""
11+
try:
12+
conn = get_db_connection_direct()
13+
cursor = conn.cursor()
14+
15+
# 1. Count records
16+
cursor.execute("SELECT COUNT(*) FROM queue;")
17+
count_row = cursor.fetchone()
18+
record_count = count_row[0] if count_row else 0
19+
20+
# 2. Get table schema
21+
cursor.execute("SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'queue';")
22+
schema = [
23+
{
24+
"name": row[0],
25+
"type": row[1]
26+
}
27+
for row in cursor.fetchall()
28+
]
29+
30+
# 3. Get most recently updated record
31+
cursor.execute("SELECT * FROM queue ORDER BY updated DESC LIMIT 1;")
32+
columns = [desc[0] for desc in cursor.description] if cursor.description else []
33+
row = cursor.fetchone()
34+
most_recent = dict(zip(columns, row)) if row and columns else None
35+
36+
conn.close()
37+
38+
return {
39+
"meta": make_meta("success", "Queue table info"),
40+
"data": {
41+
"record_count": record_count,
42+
"schema": schema,
43+
"most_recent": most_recent
44+
}
45+
}
46+
except Exception as e:
47+
raise HTTPException(status_code=500, detail=str(e))
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
CREATE TABLE IF NOT EXISTS queue (
2+
id SERIAL PRIMARY KEY,
3+
first_name TEXT,
4+
last_name TEXT,
5+
url TEXT,
6+
email_address TEXT,
7+
company TEXT,
8+
position TEXT,
9+
connected_on TEXT,
10+
created INTEGER,
11+
updated INTEGER,
12+
hidden BOOLEAN DEFAULT FALSE,
13+
collection TEXT
14+
);

app/api/routes.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from app.api.prompt.drop import router as drop_router
1414
from app.api.prospects.prospects import router as prospects_router
1515
from app.api.orders.orders import router as orders_router
16-
from app.api.queue.queue import router as queue_router
16+
from app.api.queue import router as queue_router
1717

1818
router.include_router(root_router)
1919
router.include_router(resend_router)

0 commit comments

Comments
 (0)