change ws response

This commit is contained in:
xoliqberdiyev
2026-04-21 14:45:01 +05:00
parent 11605e6e6c
commit 7d6618155f
3 changed files with 27 additions and 22 deletions

View File

@@ -41,7 +41,7 @@ class ChatConsumer(AsyncWebsocketConsumer):
async def receive(self, text_data): async def receive(self, text_data):
user = self.scope.get("user") user = self.scope.get("user")
if not user or isinstance(user, AnonymousUser): if not user or isinstance(user, AnonymousUser):
await self.close(code=4001) await self.close(code=401)
return return
try: try:
@@ -53,13 +53,10 @@ class ChatConsumer(AsyncWebsocketConsumer):
message_type = data.get("message_type", "text") message_type = data.get("message_type", "text")
text = (data.get("text") or "").strip() text = (data.get("text") or "").strip()
# Matn xabari uchun text majburiy
if message_type == "text" and not text: if message_type == "text" and not text:
await self.send(text_data=json.dumps({"error": "Matn bo'sh bo'lishi mumkin emas."})) await self.send(text_data=json.dumps({"error": "Matn bo'sh bo'lishi mumkin emas."}))
return return
# WS orqali faqat matn + caption saqlanadi.
# Fayl yuklash uchun REST /chat/messages/ POST ishlatiladi.
if message_type != "text": if message_type != "text":
await self.send( await self.send(
text_data=json.dumps( text_data=json.dumps(
@@ -68,22 +65,29 @@ class ChatConsumer(AsyncWebsocketConsumer):
) )
return return
# DB ga saqlash — post_save signal WS ga broadcast qiladi
await self._save_message(user, text) await self._save_message(user, text)
async def chat_message(self, event): # Uz
await self.send( # Bu funksiya ishlatilmayapti, shuning uchun commentga olib qoydim, bu funksiya orniga /core/apps/chat/tasks/message.py ichida rest api yordamida message
text_data=json.dumps( # yuborilsa ishlatiladigan task bor.
{
"id": event["id"], # En
"message_type": event["message_type"], # This function is not used, so I commented it out. Instead, a task is used in /core/apps/chat/tasks/message.py
"text": event["text"], # to send message when message is added from REST API.
"file_url": event["file_url"],
"sender": event["sender"], # async def chat_message(self, event):
"created_at": event["created_at"], # await self.send(
} # text_data=json.dumps(
) # {
) # "id": event["id"],
# "message_type": event["message_type"],
# "text": event["text"],
# "file_url": event["file_url"],
# "sender": event["sender"],
# "created_at": event["created_at"],
# }
# )
# )
@database_sync_to_async @database_sync_to_async
def _save_message(self, user, text): def _save_message(self, user, text):

View File

@@ -78,5 +78,6 @@ class CreateChatmessageSerializer(serializers.ModelSerializer):
request = self.context["request"] request = self.context["request"]
message = super().create(validated_data) message = super().create(validated_data)
file_url = request.build_absolute_uri(message.file.url) if message.file else None file_url = request.build_absolute_uri(message.file.url) if message.file else None
send_message_to_chat.delay(message.id, file_url) avatar_url = request.build_absolute_uri(self.context['request'].user.avatar.url) if self.context['request'].user.avatar else None
send_message_to_chat.delay(message.id, file_url, avatar_url)
return message return message

View File

@@ -7,7 +7,7 @@ from core.apps.chat.models import ChatmessageModel
@shared_task @shared_task
def send_message_to_chat(message_id, file_url): def send_message_to_chat(message_id, file_url, avatar_url):
try: try:
message = ChatmessageModel.objects.get(id=message_id) message = ChatmessageModel.objects.get(id=message_id)
except ChatmessageModel.DoesNotExist: except ChatmessageModel.DoesNotExist:
@@ -24,12 +24,12 @@ def send_message_to_chat(message_id, file_url):
"id": sender_obj.id, "id": sender_obj.id,
"full_name": full_name, "full_name": full_name,
"role": sender_obj.role, "role": sender_obj.role,
"phone": sender_obj.phone,
"avatar": avatar_url,
} }
else: else:
sender_data = None sender_data = None
# file_url = request.build_absolute_uri(message.file.url) if message.file else None
async_to_sync(channel_layer.group_send)( async_to_sync(channel_layer.group_send)(
f"chat_room_{message.room_id}", f"chat_room_{message.room_id}",
{ {