|
|
@@ -1,4 +1,5 @@
|
|
|
import os
|
|
|
+import json
|
|
|
# Fix matplotlib/gunicorn permission issues in server environment
|
|
|
_temp_dir = os.path.join(os.getcwd(), 'temp')
|
|
|
os.makedirs(_temp_dir, exist_ok=True)
|
|
|
@@ -151,19 +152,33 @@ async def ws_chat(websocket: WebSocket, token: str = Query(...), order_id: int =
|
|
|
try:
|
|
|
while True:
|
|
|
data = await websocket.receive_text()
|
|
|
- if data == "read":
|
|
|
- if role == 'admin':
|
|
|
- db.execute_commit("UPDATE order_messages SET is_read = TRUE WHERE order_id = %s AND is_from_admin = FALSE AND is_read = FALSE", (order_id,))
|
|
|
- await global_manager.notify_admins()
|
|
|
- await global_manager.notify_order_read(order_id)
|
|
|
- else:
|
|
|
- db.execute_commit("UPDATE order_messages SET is_read = TRUE WHERE order_id = %s AND is_from_admin = TRUE AND is_read = FALSE", (order_id,))
|
|
|
- await global_manager.notify_user(user_id)
|
|
|
+ try:
|
|
|
+ # Try to parse as JSON for new "true chat" protocol
|
|
|
+ msg_data = json.loads(data)
|
|
|
+ if msg_data.get("type") == "message":
|
|
|
+ text = msg_data.get("text", "")
|
|
|
+ await manager.handle_message(order_id, user_id, role, text)
|
|
|
+ elif msg_data.get("type") == "read":
|
|
|
+ await _handle_read_event(order_id, user_id, role)
|
|
|
+ except json.JSONDecodeError:
|
|
|
+ # Fallback for legacy plain text messages (like "read")
|
|
|
+ if data == "read":
|
|
|
+ await _handle_read_event(order_id, user_id, role)
|
|
|
except WebSocketDisconnect:
|
|
|
manager.disconnect(websocket, order_id)
|
|
|
except Exception as e:
|
|
|
+ print(f"ERROR in ws_chat loop: {e}")
|
|
|
manager.disconnect(websocket, order_id)
|
|
|
|
|
|
+async def _handle_read_event(order_id: int, user_id: int, role: str):
|
|
|
+ if role == 'admin':
|
|
|
+ db.execute_commit("UPDATE order_messages SET is_read = TRUE WHERE order_id = %s AND is_from_admin = FALSE AND is_read = FALSE", (order_id,))
|
|
|
+ await global_manager.notify_admins()
|
|
|
+ await global_manager.notify_order_read(order_id)
|
|
|
+ else:
|
|
|
+ db.execute_commit("UPDATE order_messages SET is_read = TRUE WHERE order_id = %s AND is_from_admin = TRUE AND is_read = FALSE", (order_id,))
|
|
|
+ await global_manager.notify_user(user_id)
|
|
|
+
|
|
|
# Mount Static Files
|
|
|
for sub in ["", "previews", "invoices", "reports"]:
|
|
|
path = os.path.join("uploads", sub)
|