Bunpheng's picture
Update app.py
a361233 verified
# from fastapi import FastAPI
# app = FastAPI()
# @app.get("/")
# def greet_json():
# return {"Hello": "World!"}
from fastapi import FastAPI, WebSocket, WebSocketDisconnect
from fastapi.middleware.cors import CORSMiddleware
import json
import asyncio
from google.analytics.data_v1beta import BetaAnalyticsDataClient, RunReportRequest, Metric, DateRange, FilterExpression, Filter
from google.oauth2 import service_account
import os, base64
from dotenv import load_dotenv
from datetime import datetime
# # Build Docker image
# docker build -t portfolio-api .
# # Run the container
# docker run -p 8000:8000 portfolio-api
# uvicorn app:app --host 0.0.0.0 --port 8000 --reload
app = FastAPI()
load_dotenv()
# CORS for frontend access
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_methods=["*"],
allow_headers=["*"],
)
# Google Analytics setup
key_b64 = os.getenv("GOOGLE_KEY_B64")
property_id = os.getenv("PROPERTY_ID")
creds_dict = json.loads(base64.b64decode(key_b64).decode("utf-8"))
credentials = service_account.Credentials.from_service_account_info(creds_dict)
client = BetaAnalyticsDataClient(credentials=credentials)
clients = []
def get_metrics():
chatbot_filter = FilterExpression(
filter=Filter(
field_name="eventName",
string_filter=Filter.StringFilter(match_type=Filter.StringFilter.MatchType.EXACT, value="chatbot_toggle")
)
)
return {
"timestamp": datetime.utcnow().isoformat(),
"total_users": client.run_report(
RunReportRequest(
property=f"properties/{property_id}",
metrics=[Metric(name="totalUsers")],
date_ranges=[DateRange(start_date="2015-08-14", end_date="today")]
)
).rows[0].metric_values[0].value,
"today_active_users": client.run_report(
RunReportRequest(
property=f"properties/{property_id}",
metrics=[Metric(name="activeUsers")],
date_ranges=[DateRange(start_date="today", end_date="today")]
)
).rows[0].metric_values[0].value,
"total_chatbot_users": client.run_report(
RunReportRequest(
property=f"properties/{property_id}",
metrics=[Metric(name="totalUsers")],
dimension_filter=chatbot_filter,
date_ranges=[DateRange(start_date="2015-08-14", end_date="today")]
)
).rows[0].metric_values[0].value,
"today_chatbot_users": client.run_report(
RunReportRequest(
property=f"properties/{property_id}",
metrics=[Metric(name="activeUsers")],
dimension_filter=chatbot_filter,
date_ranges=[DateRange(start_date="today", end_date="today")]
)
).rows[0].metric_values[0].value,
"total_chatbot_events": client.run_report(
RunReportRequest(
property=f"properties/{property_id}",
metrics=[Metric(name="eventCount")],
dimension_filter=chatbot_filter,
date_ranges=[DateRange(start_date="2015-08-14", end_date="today")]
)
).rows[0].metric_values[0].value,
"today_chatbot_events": client.run_report(
RunReportRequest(
property=f"properties/{property_id}",
metrics=[Metric(name="eventCount")],
dimension_filter=chatbot_filter,
date_ranges=[DateRange(start_date="today", end_date="today")]
)
).rows[0].metric_values[0].value,
}
# WebSocket endpoint
# @app.websocket("/ws")
# async def websocket_endpoint(websocket: WebSocket):
# await websocket.accept()
# clients.append(websocket)
# try:
# while True:
# await asyncio.sleep(10)
# data = get_metrics()
# await websocket.send_text(json.dumps(data))
#except WebSocketDisconnect:
# clients.remove(websocket)
# Optional: test HTTP route
@app.get("/")
def read_root():
return {"message": "Hello from FastAPI"}