Skip to content

Commit c70a34a

Browse files
Merge pull request #10 from goldlabelapps/staging
This pull request refactors and modularizes the FastAPI application, improving maintainability and clarity.
2 parents 0a09b43 + f6efa78 commit c70a34a

11 files changed

Lines changed: 1421 additions & 129 deletions

File tree

app/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
"""NX AI - FastAPI"""
22

33
# Version tracking
4-
__version__ = "1.0.2"
4+
__version__ = "1.0.3"
Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,19 @@
11
import os
2-
32
import psycopg2
43
from dotenv import load_dotenv
54

5+
load_dotenv()
66

7-
def main() -> None:
8-
load_dotenv()
9-
7+
def get_db_connection(): # type: ignore[return]
8+
"""Create and yield a PostgreSQL connection for use as a FastAPI dependency."""
109
conn = psycopg2.connect(
1110
host=os.getenv('DB_HOST'),
1211
port=os.getenv('DB_PORT', '5432'),
1312
dbname=os.getenv('DB_NAME'),
1413
user=os.getenv('DB_USER'),
1514
password=os.getenv('DB_PASSWORD'),
1615
)
17-
cur = conn.cursor()
1816
try:
19-
cur.execute('SELECT * FROM product;')
20-
rows = cur.fetchall()
21-
for row in rows:
22-
print(row)
17+
yield conn
2318
finally:
24-
cur.close()
2519
conn.close()
26-
27-
28-
if __name__ == "__main__":
29-
main()

app/api/echo.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from fastapi import APIRouter
2+
from app.api.schemas import EchoRequest, EchoResponse
3+
4+
router = APIRouter()
5+
6+
@router.post("/echo", response_model=EchoResponse)
7+
def echo(body: EchoRequest) -> EchoResponse:
8+
return EchoResponse(echo=body.message)

app/api/health.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from fastapi import APIRouter
2+
3+
router = APIRouter()
4+
5+
@router.get("/health")
6+
def health() -> dict[str, str]:
7+
"""Return the health status of the application."""
8+
return {"status": "ok"}

app/api/root.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("/")
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"NX AI says hello. Returned {len(products)} products."
43+
}
44+
return {"meta": meta, "data": products}

app/api/routes.py

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,29 @@
1+
from app import __version__
12
"""API route definitions for NX AI."""
23

34
import os
45
import time
56

67
import psycopg2
78
from dotenv import load_dotenv
8-
from fastapi import APIRouter, Depends
9-
from pydantic import BaseModel
109

11-
from app import __version__
10+
from fastapi import APIRouter, Depends
1211

13-
load_dotenv()
12+
from app.api.db import get_db_connection
13+
from app.api.schemas import EchoRequest, EchoResponse
1414

1515
router = APIRouter()
1616

17+
from app.api.root import router as root_router
18+
from app.api.health import router as health_router
19+
from app.api.echo import router as echo_router
1720

18-
def get_db_connection(): # type: ignore[return]
19-
"""Create and yield a PostgreSQL connection for use as a FastAPI dependency."""
20-
conn = psycopg2.connect(
21-
host=os.getenv('DB_HOST'),
22-
port=os.getenv('DB_PORT', '5432'),
23-
dbname=os.getenv('DB_NAME'),
24-
user=os.getenv('DB_USER'),
25-
password=os.getenv('DB_PASSWORD'),
26-
)
27-
try:
28-
yield conn
29-
finally:
30-
conn.close()
31-
32-
33-
class EchoRequest(BaseModel):
34-
"""Request body for the echo endpoint."""
35-
36-
message: str
21+
router.include_router(root_router)
22+
router.include_router(health_router)
23+
router.include_router(echo_router)
3724

3825

39-
class EchoResponse(BaseModel):
40-
"""Response body for the echo endpoint."""
4126

42-
echo: str
4327

4428

4529
@router.get("/")

app/api/schemas.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from pydantic import BaseModel
2+
3+
class EchoRequest(BaseModel):
4+
message: str
5+
6+
class EchoResponse(BaseModel):
7+
echo: str

app/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
from app import __version__
12
"""NX AI - FastAPI entry point."""
23

34
from fastapi import FastAPI

app/seed_product_table.py

Lines changed: 0 additions & 48 deletions
This file was deleted.

app/test_db_connection.py

Lines changed: 0 additions & 40 deletions
This file was deleted.

0 commit comments

Comments
 (0)