Skip to content

Commit ae5be6f

Browse files
review @sanderegg
1 parent f58843c commit ae5be6f

File tree

3 files changed

+44
-22
lines changed

3 files changed

+44
-22
lines changed

packages/models-library/src/models_library/api_schemas_webserver/projects.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,9 @@ class ProjectDocument(OutputSchema):
302302
model_config = ConfigDict(from_attributes=True, arbitrary_types_allowed=True)
303303

304304

305+
ProjectDocumentVersion: TypeAlias = int
306+
307+
305308
__all__: tuple[str, ...] = (
306309
"EmptyModel",
307310
"ProjectCopyOverride",

services/web/server/src/simcore_service_webserver/projects/_project_document_utils.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
from typing import cast
77

88
from aiohttp import web
9-
from models_library.api_schemas_webserver.projects import ProjectDocument
9+
from models_library.api_schemas_webserver.projects import (
10+
ProjectDocument,
11+
ProjectDocumentVersion,
12+
)
1013
from models_library.projects import ProjectID, ProjectTemplateType
1114
from models_library.projects import ProjectType as ProjectTypeAPI
1215
from servicelib.redis import (
@@ -24,7 +27,7 @@
2427

2528
async def build_project_document_and_increment_version(
2629
app: web.Application, project_uuid: ProjectID
27-
) -> tuple[ProjectDocument, int]:
30+
) -> tuple[ProjectDocument, ProjectDocumentVersion]:
2831
"""Build project document and increment version with Redis lock protection.
2932
3033
This function is protected by Redis exclusive lock because:

services/web/server/src/simcore_service_webserver/projects/_projects_service.py

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,6 +1449,35 @@ async def _clean_user_disconnected_clients(
14491449
await user_session.remove(PROJECT_ID_KEY)
14501450

14511451

1452+
async def _leave_project_room(
1453+
*,
1454+
app: web.Application,
1455+
user_id: UserID,
1456+
client_session_id: str,
1457+
project_uuid: ProjectID,
1458+
user_session,
1459+
) -> None:
1460+
"""Helper function to leave a project room via socketio"""
1461+
socket_id = await user_session.get_socket_id()
1462+
if socket_id is not None:
1463+
_logger.debug(
1464+
"User %s/%s is leaving project room %s with socket_id %s",
1465+
user_id,
1466+
client_session_id,
1467+
project_uuid,
1468+
socket_id,
1469+
)
1470+
sio = get_socket_server(app)
1471+
await sio.leave_room(socket_id, SocketIORoomStr.from_project_id(project_uuid))
1472+
else:
1473+
_logger.error(
1474+
"User %s/%s has no socket_id, cannot leave project room %s",
1475+
user_id,
1476+
client_session_id,
1477+
project_uuid,
1478+
)
1479+
1480+
14521481
def create_user_notification_cb(
14531482
user_id: UserID, project_uuid: ProjectID, app: web.Application
14541483
):
@@ -1588,26 +1617,13 @@ async def close_project_for_user(
15881617
await user_session.remove(key=PROJECT_ID_KEY)
15891618

15901619
# remove the clent session from the project room
1591-
_socket_id = await user_session.get_socket_id()
1592-
if _socket_id is not None:
1593-
_logger.debug(
1594-
"User %s/%s is leaving project room %s with socket_id %s",
1595-
user_id,
1596-
client_session_id,
1597-
project_uuid,
1598-
_socket_id,
1599-
)
1600-
sio = get_socket_server(app)
1601-
await sio.leave_room(
1602-
_socket_id, SocketIORoomStr.from_project_id(project_uuid)
1603-
)
1604-
else:
1605-
_logger.warning(
1606-
"User %s/%s has no socket_id, cannot leave project room %s",
1607-
user_id,
1608-
client_session_id,
1609-
project_uuid,
1610-
)
1620+
await _leave_project_room(
1621+
app=app,
1622+
user_id=user_id,
1623+
client_session_id=client_session_id,
1624+
project_uuid=project_uuid,
1625+
user_session=user_session,
1626+
)
16111627

16121628
# check it is not opened by someone else
16131629
all_user_sessions_with_project.remove(current_user_session)

0 commit comments

Comments
 (0)