Spaces:
Sleeping
Sleeping
Update backend/ai/main.py
Browse files- backend/ai/main.py +25 -10
backend/ai/main.py
CHANGED
|
@@ -4,7 +4,7 @@ from fastapi.responses import HTMLResponse
|
|
| 4 |
from fastapi.staticfiles import StaticFiles
|
| 5 |
from fastapi.templating import Jinja2Templates
|
| 6 |
import os
|
| 7 |
-
|
| 8 |
|
| 9 |
app = FastAPI(title="VNPT AI Call Center MVP")
|
| 10 |
|
|
@@ -14,15 +14,32 @@ app.mount("/static", StaticFiles(directory="frontend"), name="static")
|
|
| 14 |
# --- Templates ---
|
| 15 |
templates = Jinja2Templates(directory="frontend")
|
| 16 |
|
| 17 |
-
# ---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
@app.get("/", response_class=HTMLResponse)
|
| 19 |
async def base(request: Request):
|
| 20 |
-
"""
|
| 21 |
-
Trang chính của app Space: base.html với 3 tab
|
| 22 |
-
"""
|
| 23 |
return templates.TemplateResponse("base.html", {"request": request})
|
| 24 |
|
| 25 |
-
# --- Các tab HTML ---
|
| 26 |
@app.get("/call_desktop", response_class=HTMLResponse)
|
| 27 |
async def call_desktop(request: Request):
|
| 28 |
return templates.TemplateResponse("call_desktop.html", {"request": request})
|
|
@@ -35,15 +52,13 @@ async def call_mobile(request: Request):
|
|
| 35 |
async def dashboard(request: Request):
|
| 36 |
return templates.TemplateResponse("dashboard.html", {"request": request})
|
| 37 |
|
| 38 |
-
# --- API
|
| 39 |
@app.get("/api/dashboard-stats")
|
| 40 |
async def dashboard_stats():
|
| 41 |
try:
|
| 42 |
-
calls =
|
| 43 |
-
print(f"[DEBUG API] Lấy {len(calls)} bản ghi")
|
| 44 |
return {"status": "success", "data": calls}
|
| 45 |
except Exception as e:
|
| 46 |
-
print(f"[DEBUG API Error] {e}")
|
| 47 |
return {"status": "error", "message": str(e)}
|
| 48 |
|
| 49 |
# --- Run app ---
|
|
|
|
| 4 |
from fastapi.staticfiles import StaticFiles
|
| 5 |
from fastapi.templating import Jinja2Templates
|
| 6 |
import os
|
| 7 |
+
import sqlite3
|
| 8 |
|
| 9 |
app = FastAPI(title="VNPT AI Call Center MVP")
|
| 10 |
|
|
|
|
| 14 |
# --- Templates ---
|
| 15 |
templates = Jinja2Templates(directory="frontend")
|
| 16 |
|
| 17 |
+
# --- SQLite local database ---
|
| 18 |
+
DB_FILE = os.path.join(os.path.dirname(__file__), "backend/ai/db.sqlite")
|
| 19 |
+
|
| 20 |
+
# Tạo database nếu chưa có
|
| 21 |
+
conn = sqlite3.connect(DB_FILE, check_same_thread=False)
|
| 22 |
+
cursor = conn.cursor()
|
| 23 |
+
cursor.execute("""
|
| 24 |
+
CREATE TABLE IF NOT EXISTS calls (
|
| 25 |
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
| 26 |
+
name TEXT,
|
| 27 |
+
duration INTEGER
|
| 28 |
+
)
|
| 29 |
+
""")
|
| 30 |
+
conn.commit()
|
| 31 |
+
|
| 32 |
+
# --- Database helper ---
|
| 33 |
+
def get_all_calls():
|
| 34 |
+
cursor.execute("SELECT * FROM calls")
|
| 35 |
+
rows = cursor.fetchall()
|
| 36 |
+
return [{"id": r[0], "name": r[1], "duration": r[2]} for r in rows]
|
| 37 |
+
|
| 38 |
+
# --- Routes HTML ---
|
| 39 |
@app.get("/", response_class=HTMLResponse)
|
| 40 |
async def base(request: Request):
|
|
|
|
|
|
|
|
|
|
| 41 |
return templates.TemplateResponse("base.html", {"request": request})
|
| 42 |
|
|
|
|
| 43 |
@app.get("/call_desktop", response_class=HTMLResponse)
|
| 44 |
async def call_desktop(request: Request):
|
| 45 |
return templates.TemplateResponse("call_desktop.html", {"request": request})
|
|
|
|
| 52 |
async def dashboard(request: Request):
|
| 53 |
return templates.TemplateResponse("dashboard.html", {"request": request})
|
| 54 |
|
| 55 |
+
# --- API ---
|
| 56 |
@app.get("/api/dashboard-stats")
|
| 57 |
async def dashboard_stats():
|
| 58 |
try:
|
| 59 |
+
calls = get_all_calls()
|
|
|
|
| 60 |
return {"status": "success", "data": calls}
|
| 61 |
except Exception as e:
|
|
|
|
| 62 |
return {"status": "error", "message": str(e)}
|
| 63 |
|
| 64 |
# --- Run app ---
|