public share UI fix
This commit is contained in:
@@ -98,5 +98,5 @@ async def delete_map_share_link(
|
||||
current_user: User = Depends(get_current_user)
|
||||
):
|
||||
"""Delete a share link."""
|
||||
map_share_service.delete_share_link(db, map_id, link_id, current_user)
|
||||
await map_share_service.delete_share_link(db, map_id, link_id, current_user)
|
||||
return None
|
||||
|
||||
@@ -223,7 +223,7 @@ def get_share_links(db: Session, map_id: UUID, current_user: User) -> List[MapSh
|
||||
return links
|
||||
|
||||
|
||||
def delete_share_link(
|
||||
async def delete_share_link(
|
||||
db: Session,
|
||||
map_id: UUID,
|
||||
link_id: UUID,
|
||||
@@ -252,6 +252,10 @@ def delete_share_link(
|
||||
db.delete(link)
|
||||
db.commit()
|
||||
|
||||
# Disconnect all guest users from this map
|
||||
from app.websocket.connection_manager import manager
|
||||
await manager.disconnect_guests(map_id)
|
||||
|
||||
|
||||
def get_map_by_share_token(db: Session, token: str) -> tuple[Map, SharePermission]:
|
||||
"""Get map by share token (for guest access)."""
|
||||
|
||||
@@ -82,6 +82,38 @@ class ConnectionManager:
|
||||
if not self.active_connections[map_key]:
|
||||
del self.active_connections[map_key]
|
||||
|
||||
async def disconnect_guests(self, map_id: UUID):
|
||||
"""Disconnect all guest connections (no user_id) on a specific map."""
|
||||
map_key = str(map_id)
|
||||
|
||||
if map_key not in self.active_connections:
|
||||
return
|
||||
|
||||
# Find all guest websockets (uid is None)
|
||||
connections_to_close = [
|
||||
websocket for websocket, uid in self.active_connections[map_key]
|
||||
if uid is None
|
||||
]
|
||||
|
||||
# Close each connection
|
||||
for websocket in connections_to_close:
|
||||
try:
|
||||
await websocket.close(code=1008, reason="Share link revoked")
|
||||
logger.info(f"Closed WebSocket for guest on map {map_id}")
|
||||
except Exception as e:
|
||||
logger.error(f"Error closing WebSocket for guest: {e}")
|
||||
|
||||
# Remove from active connections
|
||||
self.active_connections[map_key] = {
|
||||
conn for conn in self.active_connections[map_key]
|
||||
if conn[0] != websocket
|
||||
}
|
||||
self.websocket_to_map.pop(websocket, None)
|
||||
|
||||
# Clean up empty map entry
|
||||
if not self.active_connections[map_key]:
|
||||
del self.active_connections[map_key]
|
||||
|
||||
async def broadcast_to_map(self, map_id: UUID, message: dict):
|
||||
"""Broadcast a message to all clients connected to a specific map."""
|
||||
map_key = str(map_id)
|
||||
|
||||
Reference in New Issue
Block a user