Skip to content

Commit 0743bd8

Browse files
feat: add conversation events
1 parent 615c826 commit 0743bd8

File tree

3 files changed

+80
-20
lines changed

3 files changed

+80
-20
lines changed

services/web/server/src/simcore_service_webserver/conversations/_conversation_message_service.py

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,10 @@
1616
from models_library.rest_pagination import PageTotalCount
1717
from models_library.users import UserID
1818

19-
from ..projects._groups_repository import list_project_groups
20-
from ..users._users_service import get_users_in_group
21-
2219
# Import or define SocketMessageDict
2320
from ..users.api import get_user_primary_group_id
2421
from . import _conversation_message_repository
22+
from ._conversation_service import _get_recipients
2523
from ._socketio import (
2624
notify_conversation_message_created,
2725
notify_conversation_message_deleted,
@@ -31,16 +29,6 @@
3129
_logger = logging.getLogger(__name__)
3230

3331

34-
async def _get_recipients(app: web.Application, project_id: ProjectID) -> set[UserID]:
35-
groups = await list_project_groups(app, project_id=project_id)
36-
return {
37-
user
38-
for group in groups
39-
if group.read
40-
for user in await get_users_in_group(app, gid=group.gid)
41-
}
42-
43-
4432
async def create_message(
4533
app: web.Application,
4634
*,

services/web/server/src/simcore_service_webserver/conversations/_conversation_service.py

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,25 @@
1616
from models_library.rest_pagination import PageTotalCount
1717
from models_library.users import UserID
1818

19+
from ..conversations._socketio import notify_conversation_created
20+
from ..projects._groups_repository import list_project_groups
21+
from ..users._users_service import get_users_in_group
1922
from ..users.api import get_user_primary_group_id
2023
from . import _conversation_repository
2124

2225
_logger = logging.getLogger(__name__)
2326

2427

28+
async def _get_recipients(app: web.Application, project_id: ProjectID) -> set[UserID]:
29+
groups = await list_project_groups(app, project_id=project_id)
30+
return {
31+
user
32+
for group in groups
33+
if group.read
34+
for user in await get_users_in_group(app, gid=group.gid)
35+
}
36+
37+
2538
async def create_conversation(
2639
app: web.Application,
2740
*,
@@ -37,7 +50,7 @@ async def create_conversation(
3750

3851
_user_group_id = await get_user_primary_group_id(app, user_id=user_id)
3952

40-
return await _conversation_repository.create(
53+
created_conversation = await _conversation_repository.create(
4154
app,
4255
name=name,
4356
project_uuid=project_uuid,
@@ -46,6 +59,15 @@ async def create_conversation(
4659
product_name=product_name,
4760
)
4861

62+
await notify_conversation_created(
63+
app,
64+
recipients=await _get_recipients(app, project_uuid),
65+
project_id=project_uuid,
66+
conversation=created_conversation,
67+
)
68+
69+
return created_conversation
70+
4971

5072
async def get_conversation(
5173
app: web.Application,

services/web/server/src/simcore_service_webserver/conversations/_socketio.py

Lines changed: 56 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,15 @@
33

44
from aiohttp import web
55
from models_library.conversations import (
6+
ConversationGetDB,
67
ConversationID,
78
ConversationMessageGetDB,
89
ConversationMessageID,
910
ConversationMessageType,
11+
ConversationType,
1012
)
1113
from models_library.groups import GroupID
14+
from models_library.products import ProductName
1215
from models_library.projects import ProjectID
1316
from models_library.socketio import SocketMessageDict
1417
from models_library.users import UserID
@@ -20,6 +23,10 @@
2023

2124
_MAX_CONCURRENT_SENDS: Final[int] = 3
2225

26+
SOCKET_IO_CONVERSATION_CREATED_EVENT: Final[str] = "conversation:created"
27+
SOCKET_IO_CONVERSATION_DELETED_EVENT: Final[str] = "conversation:deleted"
28+
SOCKET_IO_CONVERSATION_UPDATED_EVENT: Final[str] = "conversation:updated"
29+
2330
SOCKET_IO_CONVERSATION_MESSAGE_CREATED_EVENT: Final[str] = (
2431
"conversation:message:created"
2532
)
@@ -31,7 +38,30 @@
3138
)
3239

3340

34-
class BaseConversationMessage(BaseModel):
41+
class BaseEvent(BaseModel):
42+
model_config = ConfigDict(
43+
populate_by_name=True,
44+
from_attributes=True,
45+
alias_generator=AliasGenerator(
46+
serialization_alias=to_camel,
47+
),
48+
)
49+
50+
51+
class BaseConversationEvent(BaseEvent):
52+
product_name: ProductName
53+
project_id: ProjectID | None
54+
user_group_id: GroupID
55+
conversation_id: ConversationID
56+
type: ConversationType
57+
58+
59+
class ConversationCreatedOrUpdatedEvent(BaseConversationEvent):
60+
created: datetime.datetime
61+
modified: datetime.datetime
62+
63+
64+
class BaseConversationMessageEvent(BaseEvent):
3565
conversation_id: ConversationID
3666
message_id: ConversationMessageID
3767
user_group_id: GroupID
@@ -46,13 +76,13 @@ class BaseConversationMessage(BaseModel):
4676
)
4777

4878

49-
class ConversationMessageCreatedOrUpdated(BaseConversationMessage):
79+
class ConversationMessageCreatedOrUpdatedEvent(BaseConversationMessageEvent):
5080
content: str
5181
created: datetime.datetime
5282
modified: datetime.datetime
5383

5484

55-
class ConversationMessageDeleted(BaseConversationMessage): ...
85+
class ConversationMessageDeletedEvent(BaseConversationMessageEvent): ...
5686

5787

5888
async def _send_message_to_recipients(
@@ -72,6 +102,26 @@ async def _send_message_to_recipients(
72102
...
73103

74104

105+
async def notify_conversation_created(
106+
app: web.Application,
107+
*,
108+
recipients: set[UserID],
109+
project_id: ProjectID,
110+
conversation: ConversationGetDB,
111+
) -> None:
112+
notification_message = SocketMessageDict(
113+
event_type=SOCKET_IO_CONVERSATION_CREATED_EVENT,
114+
data={
115+
"projectId": project_id,
116+
**ConversationCreatedOrUpdatedEvent(**conversation.model_dump()).model_dump(
117+
mode="json", by_alias=True
118+
),
119+
},
120+
)
121+
122+
await _send_message_to_recipients(app, recipients, notification_message)
123+
124+
75125
async def notify_conversation_message_created(
76126
app: web.Application,
77127
*,
@@ -83,7 +133,7 @@ async def notify_conversation_message_created(
83133
event_type=SOCKET_IO_CONVERSATION_MESSAGE_CREATED_EVENT,
84134
data={
85135
"projectId": project_id,
86-
**ConversationMessageCreatedOrUpdated(
136+
**ConversationMessageCreatedOrUpdatedEvent(
87137
**conversation_message.model_dump()
88138
).model_dump(mode="json", by_alias=True),
89139
},
@@ -104,7 +154,7 @@ async def notify_conversation_message_updated(
104154
event_type=SOCKET_IO_CONVERSATION_MESSAGE_UPDATED_EVENT,
105155
data={
106156
"projectId": project_id,
107-
**ConversationMessageCreatedOrUpdated(
157+
**ConversationMessageCreatedOrUpdatedEvent(
108158
**conversation_message.model_dump()
109159
).model_dump(mode="json", by_alias=True),
110160
},
@@ -127,7 +177,7 @@ async def notify_conversation_message_deleted(
127177
event_type=SOCKET_IO_CONVERSATION_MESSAGE_DELETED_EVENT,
128178
data={
129179
"projectId": project_id,
130-
**ConversationMessageDeleted(
180+
**ConversationMessageDeletedEvent(
131181
conversation_id=conversation_id,
132182
message_id=message_id,
133183
user_group_id=user_group_id,

0 commit comments

Comments
 (0)