@@ -547,6 +547,16 @@ def share_room(roomId):
547547 })
548548 except Exception :
549549 pass
550+ # Send dedicated invite event for real-time dashboard updates
551+ try :
552+ push_to_user (uid , 'invite_received' , {
553+ 'roomId' : str (room ['_id' ]),
554+ 'roomName' : room .get ('name' ),
555+ 'inviterName' : claims ['username' ],
556+ 'role' : user_role
557+ })
558+ except Exception :
559+ pass
550560 results ["invited" ].append ({"username" : uname , "role" : role })
551561 else :
552562 shares_coll .update_one (
@@ -577,6 +587,25 @@ def share_room(roomId):
577587 })
578588 except Exception :
579589 pass
590+ # Send real-time event for room access granted
591+ try :
592+ push_to_user (uid , 'room_access_granted' , {
593+ 'roomId' : str (room ["_id" ]),
594+ 'roomName' : room .get ('name' ),
595+ 'role' : user_role
596+ })
597+ except Exception :
598+ pass
599+ # Notify all room members that someone was added
600+ try :
601+ push_to_room (str (room ["_id" ]), 'member_added' , {
602+ 'roomId' : str (room ["_id" ]),
603+ 'userId' : uid ,
604+ 'username' : user ["username" ],
605+ 'role' : user_role
606+ })
607+ except Exception :
608+ pass
580609 results ["updated" ].append ({"username" : uname , "role" : user_role , "note" : "added to public room" })
581610 return jsonify ({"status" :"ok" ,"results" : results })
582611
@@ -2069,6 +2098,23 @@ def update_permissions(roomId):
20692098 })
20702099 except Exception :
20712100 pass
2101+ # Send real-time event to user so they get kicked immediately
2102+ try :
2103+ push_to_user (target_user_id , 'user_removed_from_room' , {
2104+ 'roomId' : roomId ,
2105+ 'roomName' : room .get ('name' ),
2106+ 'message' : f"You were removed from room '{ room .get ('name' )} '"
2107+ })
2108+ except Exception :
2109+ pass
2110+ # Notify all room members that someone was removed
2111+ try :
2112+ push_to_room (roomId , 'member_removed' , {
2113+ 'roomId' : roomId ,
2114+ 'userId' : target_user_id
2115+ })
2116+ except Exception :
2117+ pass
20722118 return jsonify ({"status" :"ok" ,"removed" : target_user_id })
20732119 role = (data .get ("role" ) or "" ).lower ()
20742120 if role not in ("admin" ,"editor" ,"viewer" ):
@@ -2101,6 +2147,25 @@ def update_permissions(roomId):
21012147 })
21022148 except Exception :
21032149 pass
2150+ # Send real-time event to user whose role changed so UI updates immediately
2151+ try :
2152+ push_to_user (target_user_id , 'role_changed' , {
2153+ 'roomId' : roomId ,
2154+ 'roomName' : room .get ('name' ),
2155+ 'newRole' : role ,
2156+ 'message' : f"Your role in room '{ room .get ('name' )} ' was changed to '{ role } '"
2157+ })
2158+ except Exception :
2159+ pass
2160+ # Notify all room members that someone's role changed
2161+ try :
2162+ push_to_room (roomId , 'member_role_changed' , {
2163+ 'roomId' : roomId ,
2164+ 'userId' : target_user_id ,
2165+ 'newRole' : role
2166+ })
2167+ except Exception :
2168+ pass
21042169 return jsonify ({"status" :"ok" ,"userId" : target_user_id , "role" : role })
21052170
21062171@rooms_bp .route ("/rooms/<roomId>" , methods = ["PATCH" ])
@@ -2225,6 +2290,15 @@ def update_room(roomId):
22252290 "createdAt" : room_refreshed .get ("createdAt" ),
22262291 "updatedAt" : room_refreshed .get ("updatedAt" )
22272292 }
2293+ # Notify all room members that room settings were updated
2294+ try :
2295+ push_to_room (roomId , 'room_updated' , {
2296+ 'roomId' : roomId ,
2297+ 'updates' : updates ,
2298+ 'room' : resp_room
2299+ })
2300+ except Exception :
2301+ pass
22282302 return jsonify ({"status" : "ok" , "room" : resp_room })
22292303 except Exception :
22302304 return jsonify ({"status" :"ok" ,"updated" : updates })
@@ -2286,6 +2360,33 @@ def transfer_ownership(roomId):
22862360 "read" : False ,
22872361 "createdAt" : datetime .utcnow ()
22882362 })
2363+ # Send real-time events for ownership transfer
2364+ try :
2365+ push_to_user (str (target_user ["_id" ]), 'role_changed' , {
2366+ 'roomId' : roomId ,
2367+ 'roomName' : room .get ('name' ),
2368+ 'newRole' : 'owner' ,
2369+ 'message' : f"You are now the owner of room '{ room .get ('name' )} '"
2370+ })
2371+ except Exception :
2372+ pass
2373+ try :
2374+ push_to_user (claims ["sub" ], 'role_changed' , {
2375+ 'roomId' : roomId ,
2376+ 'roomName' : room .get ('name' ),
2377+ 'newRole' : 'editor' ,
2378+ 'message' : f"You transferred ownership of room '{ room .get ('name' )} ' to { target_user ['username' ]} "
2379+ })
2380+ except Exception :
2381+ pass
2382+ try :
2383+ # Notify all room members about ownership change
2384+ push_to_room (roomId , 'room_updated' , {
2385+ 'roomId' : roomId ,
2386+ 'updates' : {'ownerId' : str (target_user ["_id" ]), 'ownerName' : target_user ["username" ]}
2387+ })
2388+ except Exception :
2389+ pass
22892390 return jsonify ({"status" :"ok" })
22902391
22912392@rooms_bp .route ("/rooms/<roomId>/leave" , methods = ["POST" ])
@@ -2330,6 +2431,15 @@ def leave_room(roomId):
23302431 "read" : False ,
23312432 "createdAt" : datetime .utcnow ()
23322433 })
2434+ # Send real-time event to notify room members that someone left
2435+ try :
2436+ push_to_room (roomId , 'member_removed' , {
2437+ 'roomId' : roomId ,
2438+ 'userId' : user_id ,
2439+ 'username' : claims .get ('username' )
2440+ })
2441+ except Exception :
2442+ pass
23332443 return jsonify ({"status" :"ok" , "removed" : True })
23342444
23352445@rooms_bp .route ("/rooms/<roomId>" , methods = ["DELETE" ])
@@ -2543,6 +2653,35 @@ def accept_invite(inviteId):
25432653 })
25442654 except Exception :
25452655 pass
2656+ # Send real-time events when invite is accepted
2657+ try :
2658+ # Notify the user who accepted (for dashboard room list update)
2659+ push_to_user (inv ["invitedUserId" ], 'room_access_granted' , {
2660+ 'roomId' : inv ["roomId" ],
2661+ 'roomName' : inv .get ('roomName' ),
2662+ 'role' : inv ["role" ]
2663+ })
2664+ except Exception :
2665+ pass
2666+ try :
2667+ # Also send invite_accepted event so their pending invites list updates
2668+ push_to_user (inv ["invitedUserId" ], 'invite_accepted' , {
2669+ 'inviteId' : inviteId ,
2670+ 'roomId' : inv ["roomId" ],
2671+ 'roomName' : inv .get ('roomName' )
2672+ })
2673+ except Exception :
2674+ pass
2675+ try :
2676+ # Notify all room members that someone was added
2677+ push_to_room (inv ["roomId" ], 'member_added' , {
2678+ 'roomId' : inv ["roomId" ],
2679+ 'userId' : inv ["invitedUserId" ],
2680+ 'username' : inv ["invitedUsername" ],
2681+ 'role' : inv ["role" ]
2682+ })
2683+ except Exception :
2684+ pass
25462685 return jsonify ({"status" :"ok" })
25472686
25482687@rooms_bp .route ("/invites/<inviteId>/decline" , methods = ["POST" ])
@@ -2584,6 +2723,15 @@ def decline_invite(inviteId):
25842723 })
25852724 except Exception :
25862725 pass
2726+ # Send real-time event to user who declined so their invites list updates
2727+ try :
2728+ push_to_user (inv ["invitedUserId" ], 'invite_declined' , {
2729+ 'inviteId' : inviteId ,
2730+ 'roomId' : inv ["roomId" ],
2731+ 'roomName' : inv .get ('roomName' )
2732+ })
2733+ except Exception :
2734+ pass
25872735 return jsonify ({"status" :"ok" })
25882736
25892737@rooms_bp .route ("/notifications" , methods = ["GET" ])
0 commit comments