File size: 4,139 Bytes
f748244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
08071a4
 
f748244
 
 
 
 
 
 
 
 
 
 
caa0006
f748244
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a361233
 
 
 
 
 
 
 
 
 
 
08071a4
f748244
08071a4
f748244
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 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"}