diff --git a/resolvers/messages.py b/resolvers/messages.py index 1e52c30..3d26a53 100644 --- a/resolvers/messages.py +++ b/resolvers/messages.py @@ -12,23 +12,26 @@ from validators.chat import Message @mutation.field("createMessage") @login_required async def create_message(_, info, chat: str, body: str, reply_to=None): - """ - create message with - :body for - :chat_id replying to - :reply_to optionally - """ + """Создание сообщения с телом :body для чата :chat_id с возможным ответом на :reply_to""" author_id = info.context["author_id"] + # Получение данных чата из Redis chat_data = await redis.execute("GET", f"chats/{chat}") print(f"[resolvers.messages] debug chat data: {chat_data}") + + # Если данных чата нет, возвращаем ошибку if not chat_data: return {"error": "chat is not exist"} else: + # Преобразование данных чата из строки JSON в словарь chat_dict = json.loads(chat_data) print(chat_dict) + + # Получение ID следующего сообщения message_id = await redis.execute("GET", f"chats/{chat_dict['id']}/next_message_id") message_id = int(message_id) if message_id else 0 + + # Создание нового сообщения new_message: Message = { "chat": chat_dict["id"], "id": message_id, @@ -37,24 +40,37 @@ async def create_message(_, info, chat: str, body: str, reply_to=None): "createdAt": int(datetime.now(tz=timezone.utc).timestamp()), "updatedAt": None, } + + # Если есть ответ, добавляем его в сообщение if reply_to: new_message["replyTo"] = reply_to + + # Обновление времени последнего обновления чата chat_dict["updatedAt"] = new_message["createdAt"] - await redis.execute("SET", f"chats/{chat_dict['id']}", json.dumps(chat)) + + # Запись обновленных данных чата обратно в Redis + await redis.execute("SET", f"chats/{chat_dict['id']}", json.dumps(chat_dict)) print(f"[inbox] creating message {new_message}") + + # Запись нового сообщения в Redis await redis.execute( "SET", f"chats/{chat_dict['id']}/messages/{message_id}", json.dumps(new_message), ) + + # Добавление ID нового сообщения в список ID сообщений чата await redis.execute("LPUSH", f"chats/{chat_dict['id']}/message_ids", str(message_id)) + + # Обновление ID следующего сообщения await redis.execute("SET", f"chats/{chat_dict['id']}/next_message_id", str(message_id + 1)) + # Добавление нового сообщения в список непрочитанных сообщений для каждого участника чата members = chat_dict["members"] for member_id in members: await redis.execute("LPUSH", f"chats/{chat_dict['id']}/unread/{member_id}", str(message_id)) - # subscribe on updates + # Отправка уведомления о новом сообщении await notify_message(new_message, chat_dict["id"]) return {"message": new_message, "error": None}