Skip to content

Commit 245648d

Browse files
committed
added editing messages
1 parent cdd332a commit 245648d

4 files changed

Lines changed: 106 additions & 0 deletions

File tree

chats/consumers.py

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ async def receive_json(self, content, **kwargs):
9090
EventType.TYPING,
9191
EventType.READ_MESSAGE,
9292
EventType.DELETE_MESSAGE,
93+
EventType.EDIT_MESSAGE,
9394
]:
9495
room_name = f"{EventGroupType.CHATS_RELATED}_{event.content.get('chat_id')}"
9596
try:
@@ -112,6 +113,8 @@ async def __process_chat_related_event(self, event, room_name):
112113
await self.__process_read_message_event(event, room_name)
113114
elif event.type == EventType.DELETE_MESSAGE:
114115
await self.__process_delete_message_event(event, room_name)
116+
elif event.type == EventType.EDIT_MESSAGE:
117+
await self.__process_edit_message_event(event, room_name)
115118

116119
async def __process_new_message_event(self, event, room_name):
117120
if event.content["chat_type"] == ChatType.DIRECT:
@@ -149,9 +152,11 @@ async def __process_new_direct_message_event(self, event: Event):
149152
"content": {
150153
"message_id": msg.id,
151154
"chat_id": msg.chat_id,
155+
"chat_type": ChatType.PROJECT,
152156
"author_id": msg.author.pk,
153157
"text": msg.text,
154158
"created_at": msg.created_at.timestamp(),
159+
"is_edited": msg.is_edited,
155160
},
156161
}
157162
# send message to user's channel
@@ -193,6 +198,7 @@ async def __process_new_project_message_event(self, event: Event, room_name: str
193198
"author_id": msg.author.pk,
194199
"text": msg.text,
195200
"created_at": msg.created_at.timestamp(),
201+
"is_edited": msg.is_edited,
196202
},
197203
},
198204
)
@@ -280,6 +286,12 @@ async def __process_delete_message_event(self, event: Event, room_name: str):
280286
elif event.content["chat_type"] == ChatType.PROJECT:
281287
await self.__process_delete_project_message_event(event, room_name)
282288

289+
async def __process_edit_message_event(self, event, room_name):
290+
if event.content["chat_type"] == ChatType.DIRECT:
291+
await self.__process_edit_direct_message_event(event)
292+
elif event.content["chat_type"] == ChatType.PROJECT:
293+
await self.__process_edit_project_message_event(event, room_name)
294+
283295
async def __process_delete_direct_message_event(self, event):
284296
message_id = event.content["message_id"]
285297

@@ -349,6 +361,9 @@ async def set_online(self, event: Event):
349361
async def set_offline(self, event: Event):
350362
await self.send(json.dumps(event))
351363

364+
async def edit_message(self, event: Event):
365+
await self.send(json.dumps(event))
366+
352367
async def __process_general_event(self, event: Event, room_name: str):
353368
cache_key = get_user_online_cache_key(self.user)
354369
if event.type == EventType.SET_ONLINE:
@@ -371,6 +386,72 @@ async def __process_general_event(self, event: Event, room_name: str):
371386
else:
372387
raise ValueError("Unknown event type")
373388

389+
async def __process_edit_direct_message_event(self, event):
390+
chat_id, other_user = await get_chat_and_user_ids_from_content(
391+
event.content, self.user
392+
)
393+
# if chat_id == 17_7, then chat_id will be == 7_17
394+
chat_id = DirectChat.get_chat_id_from_users(self.user, other_user)
395+
396+
# check if chat exists ( this raises exception if not )
397+
await sync_to_async(DirectChat.objects.get)(pk=chat_id)
398+
399+
msg = await sync_to_async(DirectChatMessage.objects.get)(
400+
pk=event.content["message_id"]
401+
)
402+
msg.text = event.content["message"]
403+
msg.is_edited = True
404+
await sync_to_async(msg.save)()
405+
content = {
406+
"type": EventType.EDIT_MESSAGE,
407+
"content": {
408+
"message_id": msg.id,
409+
"chat_id": msg.chat_id,
410+
"author_id": msg.author_id,
411+
"text": msg.text,
412+
"created_at": msg.created_at.timestamp(),
413+
"is_edited": msg.is_edited,
414+
},
415+
}
416+
# send message to user's channel
417+
other_user_channel = cache.get(get_user_channel_cache_key(other_user), None)
418+
await self.channel_layer.send(self.channel_name, content)
419+
420+
if other_user_channel is None:
421+
return
422+
423+
await self.channel_layer.send(other_user_channel, content)
424+
425+
async def __process_edit_project_message_event(self, event, room_name):
426+
chat_id = event.content["chat_id"]
427+
chat = await sync_to_async(ProjectChat.objects.get)(pk=chat_id)
428+
429+
# check that user is in this chat
430+
users = await sync_to_async(chat.get_users)()
431+
if self.user not in users:
432+
raise UserNotInChatException(
433+
f"User {self.user.id} is not in project chat {chat_id}"
434+
)
435+
436+
message = await sync_to_async(ProjectChatMessage.objects.get)(
437+
pk=event.content["message_id"]
438+
)
439+
message.text = event.content["text"]
440+
message.is_edited = True
441+
await sync_to_async(message.save)()
442+
content = {
443+
"message_id": message.id,
444+
"chat_id": message.chat_id,
445+
"author_id": message.author.pk,
446+
"text": message.text,
447+
"created_at": message.created_at.timestamp(),
448+
"is_edited": message.is_edited,
449+
}
450+
await self.channel_layer.group_send(
451+
room_name,
452+
{"type": EventType.EDIT_MESSAGE, "content": content},
453+
)
454+
374455

375456
class NotificationConsumer(AsyncJsonWebsocketConsumer):
376457
# TODO: implement this
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.1.3 on 2023-03-12 19:12
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("chats", "0003_reply_to_constaint"),
10+
]
11+
12+
operations = [
13+
migrations.AddField(
14+
model_name="directchatmessage",
15+
name="is_edited",
16+
field=models.BooleanField(default=False),
17+
),
18+
migrations.AddField(
19+
model_name="projectchatmessage",
20+
name="is_edited",
21+
field=models.BooleanField(default=False),
22+
),
23+
]

chats/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -196,6 +196,7 @@ class BaseMessage(models.Model):
196196
text = models.TextField(max_length=8192)
197197
is_read = models.BooleanField(default=False)
198198
is_deleted = models.BooleanField(default=False)
199+
is_edited = models.BooleanField(default=False)
199200
created_at = models.DateTimeField(auto_now_add=True)
200201

201202
def __str__(self):

chats/websockets_settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ class EventType(str, Enum):
1313
DELETE_MESSAGE = "delete_message"
1414
READ_MESSAGE = "message_read"
1515
TYPING = "user_typing"
16+
EDIT_MESSAGE = "edit_message"
1617

1718
# GENERAL EVENTS
1819
SET_ONLINE = "set_online"

0 commit comments

Comments
 (0)