Skip to content

Commit d834b8e

Browse files
committed
Add /products endpoint; update root and routes
Introduce a new app/api/products.py endpoint that queries Postgres (psycopg2) using env vars and returns product records with meta information. Simplify app/api/root.py by removing direct DB access: root now exposes API metadata and a list of endpoints (uses BASE_URL). Update app/api/routes.py to import and include the new products router and remove now-unused DB-related imports. These changes separate product data handling from the root endpoint and keep routing organized.
1 parent 5abde5c commit d834b8e

3 files changed

Lines changed: 56 additions & 31 deletions

File tree

app/api/products.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from app import __version__
2+
from fastapi import APIRouter
3+
import os, time
4+
import psycopg2
5+
from dotenv import load_dotenv
6+
from app import __version__
7+
8+
router = APIRouter()
9+
10+
@router.get("/products")
11+
def root() -> dict:
12+
"""Return a structured welcome message for the API root, including product data."""
13+
load_dotenv()
14+
conn = psycopg2.connect(
15+
host=os.getenv('DB_HOST'),
16+
port=os.getenv('DB_PORT', '5432'),
17+
dbname=os.getenv('DB_NAME'),
18+
user=os.getenv('DB_USER'),
19+
password=os.getenv('DB_PASSWORD')
20+
)
21+
cur = conn.cursor()
22+
cur.execute('SELECT id, name, description, price, in_stock, created_at FROM product;')
23+
products = [
24+
{
25+
"id": row[0],
26+
"name": row[1],
27+
"description": row[2],
28+
"price": float(row[3]),
29+
"in_stock": row[4],
30+
"created_at": row[5].isoformat() if row[5] else None
31+
}
32+
for row in cur.fetchall()
33+
]
34+
cur.close()
35+
conn.close()
36+
epoch = int(time.time() * 1000)
37+
meta = {
38+
"version": __version__,
39+
"time": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()),
40+
"epoch": epoch,
41+
"severity": "success",
42+
"message": f"{len(products)} products"
43+
}
44+
return {"meta": meta, "data": products}

app/api/root.py

Lines changed: 9 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,20 @@
99

1010
@router.get("/")
1111
def root() -> dict:
12-
"""Return a structured welcome message for the API root, including product data."""
12+
"""Return product data."""
1313
load_dotenv()
14-
conn = psycopg2.connect(
15-
host=os.getenv('DB_HOST'),
16-
port=os.getenv('DB_PORT', '5432'),
17-
dbname=os.getenv('DB_NAME'),
18-
user=os.getenv('DB_USER'),
19-
password=os.getenv('DB_PASSWORD')
20-
)
21-
cur = conn.cursor()
22-
cur.execute('SELECT id, name, description, price, in_stock, created_at FROM product;')
23-
products = [
24-
{
25-
"id": row[0],
26-
"name": row[1],
27-
"description": row[2],
28-
"price": float(row[3]),
29-
"in_stock": row[4],
30-
"created_at": row[5].isoformat() if row[5] else None
31-
}
32-
for row in cur.fetchall()
33-
]
34-
cur.close()
35-
conn.close()
14+
base_url = os.getenv("BASE_URL", "http://localhost:8000")
3615
epoch = int(time.time() * 1000)
3716
meta = {
3817
"version": __version__,
3918
"time": time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()),
4019
"epoch": epoch,
4120
"severity": "success",
42-
"message": f"NX AI says hello & returned {len(products)} products"
21+
"message": f"NX AI says hello",
22+
"base_url": base_url
4323
}
44-
return {"meta": meta, "data": products}
24+
endpoints = [
25+
{"name": "health", "url": f"{base_url}/health"},
26+
{"name": "products", "url": f"{base_url}/products"}
27+
]
28+
return {"meta": meta, "data": endpoints}

app/api/routes.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
from app import __version__
2-
"""API route definitions for NX AI."""
2+
"""API routes"""
33

4-
import os
5-
import time
6-
7-
import psycopg2
84
from dotenv import load_dotenv
95

106
from fastapi import APIRouter, Depends
@@ -18,9 +14,10 @@
1814
from app.api.health import router as health_router
1915
from app.api.echo import router as echo_router
2016
from app.api.import_csv import router as import_csv_router
17+
from app.api.products import router as products_router
2118

2219
router.include_router(root_router)
2320
router.include_router(health_router)
2421
router.include_router(echo_router)
2522
router.include_router(import_csv_router)
26-
23+
router.include_router(products_router)

0 commit comments

Comments
 (0)