# 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"}