persee-tech commited on
Commit
602cc0a
·
verified ·
1 Parent(s): 7ce3d45

Delete backend/server.py

Browse files
Files changed (1) hide show
  1. backend/server.py +0 -162
backend/server.py DELETED
@@ -1,162 +0,0 @@
1
- import os
2
- import socketio
3
- import uvicorn
4
- from fastapi import FastAPI, HTTPException
5
- from fastapi.middleware.cors import CORSMiddleware
6
- import asyncio
7
- import base64
8
- import cv2
9
- import numpy as np
10
- import random
11
- from deepface import DeepFace
12
- from supabase import create_client, Client
13
-
14
- # --- 1. CONFIGURATION SUPABASE ---
15
- SUPABASE_URL = os.getenv("SUPABASE_URL", "https://gwjrwejdjpctizolfkcz.supabase.co")
16
- SUPABASE_KEY = os.getenv("SUPABASE_KEY")
17
-
18
- try:
19
- if SUPABASE_KEY:
20
- supabase: Client = create_client(SUPABASE_URL, SUPABASE_KEY)
21
- print("☁️ Connecté à Supabase")
22
- else:
23
- print("⚠️ ATTENTION: SUPABASE_KEY manquante !")
24
- except Exception as e:
25
- print(f"❌ Erreur connexion Supabase : {e}")
26
-
27
- # --- 2. CONFIGURATION SOCKET.IO (BYPASS TOTAL) ---
28
- # Cette fonction force l'acceptation de tout le monde et affiche qui se connecte
29
- def force_allow_origins(origin, environ, **kwargs):
30
- print(f"🔍 TENTATIVE CONNEXION DEPUIS : {origin}")
31
- return True # Retourne toujours VRAI (Autorisé)
32
-
33
- sio = socketio.AsyncServer(
34
- async_mode='asgi',
35
- cors_allowed_origins=force_allow_origins, # On utilise la fonction au lieu de '*'
36
- logger=True,
37
- engineio_logger=True,
38
- always_connect=True
39
- )
40
-
41
- app = FastAPI()
42
-
43
- # --- 3. MIDDLEWARE CORS API (REST) ---
44
- app.add_middleware(
45
- CORSMiddleware,
46
- allow_origins=["*"],
47
- allow_credentials=True,
48
- allow_methods=["*"],
49
- allow_headers=["*"],
50
- )
51
-
52
- socket_app = socketio.ASGIApp(sio, app)
53
-
54
- # --- 4. API REST (ADMIN) ---
55
- @app.get("/")
56
- def home():
57
- return {"status": "online", "message": "Startech API is running"}
58
-
59
- @app.get("/api/sessions")
60
- def get_sessions():
61
- response = supabase.table('sessions').select("*").order('id', desc=True).execute()
62
- return response.data
63
-
64
- @app.get("/api/sessions/{session_id}")
65
- def get_session_details(session_id: int):
66
- sess = supabase.table('sessions').select("*").eq('id', session_id).execute()
67
- if not sess.data: raise HTTPException(status_code=404, detail="Session introuvable")
68
- meas = supabase.table('measurements').select("*").eq('session_id', session_id).order('session_time', desc=False).execute()
69
- return {"info": sess.data[0], "data": meas.data}
70
-
71
- @app.delete("/api/sessions/{session_id}")
72
- def delete_session(session_id: int):
73
- supabase.table('sessions').delete().eq('id', session_id).execute()
74
- return {"message": "Supprimé"}
75
-
76
- # --- 5. LOGIQUE MÉTIER ---
77
- camera_state = { "emotion": "neutral", "emotion_score": 0, "face_coords": None }
78
- active_sessions = {}
79
-
80
- def calculate_kpis(emotion):
81
- valence = 0.0; arousal = 0.0; noise = random.uniform(-0.05, 0.05)
82
- if emotion == "happy": valence = 0.8 + noise; arousal = 0.6 + noise
83
- elif emotion == "surprise": valence = 0.2 + noise; arousal = 0.9 + noise
84
- elif emotion in ["fear", "angry"]: valence = -0.7 + noise; arousal = 0.8 + noise
85
- elif emotion == "disgust": valence = -0.8 + noise; arousal = 0.5 + noise
86
- elif emotion == "sad": valence = -0.6 + noise; arousal = 0.2 + noise
87
- else: valence = 0.0 + noise; arousal = 0.3 + noise
88
-
89
- def clamp(n): return max(0, min(100, int(n)))
90
- val_eng = clamp((arousal * 100) + random.uniform(0, 5))
91
- val_sat = clamp(((valence + 1) / 2) * 100)
92
- val_tru = clamp(50 + (valence * 40) + random.uniform(0, 5)) if valence > 0 else clamp(50 - (abs(valence) * 40) + random.uniform(0, 5))
93
- val_loy = clamp((val_sat * 0.7) + (val_tru * 0.3))
94
- val_opi = val_sat
95
-
96
- lbl_eng = "Engagement Fort 🔥" if val_eng >= 75 else ("Engagement Moyen" if val_eng >= 40 else "Désengagement 💤")
97
- lbl_sat = "Très Satisfait 😃" if val_sat >= 70 else ("Neutre 😐" if val_sat >= 45 else "Insatisfait 😡")
98
-
99
- return { "engagement": val_eng, "satisfaction": val_sat, "trust": val_tru, "loyalty": val_loy, "opinion": val_opi, "lbl_eng": lbl_eng, "lbl_sat": lbl_sat }
100
-
101
- # --- 6. SOCKET EVENTS ---
102
- @sio.event
103
- async def connect(sid, environ):
104
- print(f"✅ Client CONNECTÉ: {sid}")
105
- active_sessions[sid] = { "is_recording": False, "session_time": 0, "db_id": None }
106
-
107
- @sio.event
108
- async def disconnect(sid):
109
- if sid in active_sessions: del active_sessions[sid]
110
-
111
- @sio.event
112
- async def process_frame(sid, data_uri):
113
- try:
114
- encoded_data = data_uri.split(',')[1]
115
- nparr = np.frombuffer(base64.b64decode(encoded_data), np.uint8)
116
- frame = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
117
- result = DeepFace.analyze(frame, actions=['emotion'], enforce_detection=False, silent=True)
118
- data = result[0] if isinstance(result, list) else result
119
- camera_state["emotion"] = data['dominant_emotion']
120
- region = data['region']
121
- camera_state["face_coords"] = {'x': region['x'], 'y': region['y'], 'w': region['w'], 'h': region['h']} if region['w'] > 0 else None
122
- except:
123
- pass
124
-
125
- @sio.event
126
- async def start_session(sid, data):
127
- user = active_sessions.get(sid)
128
- if user:
129
- user["is_recording"] = True
130
- user["session_time"] = 0
131
- try:
132
- res = supabase.table('sessions').insert({ "first_name": data.get('firstName'), "last_name": data.get('lastName'), "client_id": data.get('clientId') }).execute()
133
- user["db_id"] = res.data[0]['id']
134
- except Exception as e: print(f"Erreur DB: {e}")
135
-
136
- @sio.event
137
- async def stop_session(sid):
138
- if sid in active_sessions: active_sessions[sid]["is_recording"] = False
139
-
140
- async def loop():
141
- while True:
142
- for sid, user in list(active_sessions.items()):
143
- kpis = calculate_kpis(camera_state["emotion"])
144
- if user["is_recording"]:
145
- user["session_time"] += 1
146
- if user["db_id"]:
147
- try:
148
- supabase.table('measurements').insert({
149
- "session_id": user["db_id"], "session_time": user["session_time"],
150
- "emotion": camera_state["emotion"],
151
- "engagement_val": kpis["engagement"], "engagement_lbl": kpis["lbl_eng"],
152
- "satisfaction_val": kpis["satisfaction"], "satisfaction_lbl": kpis["lbl_sat"],
153
- "trust_val": kpis["trust"], "loyalty_val": kpis["loyalty"], "opinion_val": kpis["opinion"]
154
- }).execute()
155
- except: pass
156
- await sio.emit('metrics_update', { "emotion": camera_state["emotion"], "metrics": kpis, "face_coords": camera_state["face_coords"], "session_time": user["session_time"], "is_recording": user["is_recording"] }, room=sid)
157
- await asyncio.sleep(1)
158
-
159
- if __name__ == "__main__":
160
- @app.on_event("startup")
161
- async def startup(): asyncio.create_task(loop())
162
- uvicorn.run(socket_app, host="0.0.0.0", port=7860)