public share UI fix

This commit is contained in:
2025-12-13 14:29:08 +05:00
parent 378a8727e2
commit 62a13a9f45
5 changed files with 149 additions and 61 deletions

View File

@@ -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

View File

@@ -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)."""

View File

@@ -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)