From 93c1727be34cbadf368d0e8f83f15cbebe26efeb Mon Sep 17 00:00:00 2001 From: Untone Date: Mon, 18 Dec 2023 20:59:20 +0300 Subject: [PATCH] load-recipients-fix --- resolvers/load.py | 63 ++++++++++++++++++++++++----------------------- services/core.py | 4 +-- 2 files changed, 33 insertions(+), 34 deletions(-) diff --git a/resolvers/load.py b/resolvers/load.py index 3e5bc76..08bc7a5 100644 --- a/resolvers/load.py +++ b/resolvers/load.py @@ -53,34 +53,35 @@ async def load_messages( async def load_chats(_, info, limit: int = 50, offset: int = 0) -> Dict[str, Union[List[Dict[str, Any]], None]]: """load :limit chats of current user with :offset""" author_id = info.context["author_id"] - cids = (await redis.execute("SMEMBERS", f"chats_by_author/{author_id}")) or [] - members_online = (await redis.execute("SMEMBERS", "authors-online")) or [] - cids = list(cids)[offset : (offset + limit)] + cids = await redis.execute("SMEMBERS", f"chats_by_author/{author_id}") chats = [] - lock = asyncio.Lock() - if len(cids) == 0: - print(f"[resolvers.load] no chats for user with id={author_id}") - r = await create_chat(None, info, members=[1]) # member with id = 1 is discours - print(f"[resolvers.load] created chat: {r['chat_id']}") - cids.append(r["chat"]["id"]) - all_authors: List[ChatMember] = await get_all_authors() - authors = {a["id"]: a for a in all_authors} - for cid in cids: - async with lock: - chat_str = await redis.execute("GET", f"chats/{cid}") - print(f"[resolvers.load] redis GET by {cid}: {chat_str}") - if chat_str: - c: ChatPayload = json.loads(chat_str) - c["messages"] = await load_messages(cid, 5, 0) - c["unread"] = await get_unread_counter(cid, author_id) - member_ids = c["members"].copy() - c["members"] = [] - for member_id in member_ids: - a = authors.get(member_id) - if a: - a["online"] = a.get("id") in members_online - c["members"].append(a) - chats.append(c) + if cids: + members_online = (await redis.execute("SMEMBERS", "authors-online")) or [] + cids = list(cids)[offset : (offset + limit)] + lock = asyncio.Lock() + if len(cids) == 0: + print(f"[resolvers.load] no chats for user with id={author_id}") + r = await create_chat(None, info, members=[1]) # member with id = 1 is discours + print(f"[resolvers.load] created chat: {r['chat_id']}") + cids.append(r["chat"]["id"]) + all_authors: List[ChatMember] = await get_all_authors() + authors = {a["id"]: a for a in all_authors} + for cid in cids: + async with lock: + chat_str: str = await redis.execute("GET", f"chats/{cid}") + print(f"[resolvers.load] redis GET by {cid}: {chat_str}") + if chat_str: + c: ChatPayload = json.loads(chat_str) + c["messages"] = await load_messages(cid, 5, 0) + c["unread"] = await get_unread_counter(cid, author_id) + member_ids = c["members"].copy() + c["members"] = [] + for member_id in member_ids: + a = authors.get(member_id) + if a: + a["online"] = a.get("id") in members_online + c["members"].append(a) + chats.append(c) return {"chats": chats, "error": None} @@ -114,15 +115,15 @@ async def load_messages_by(_, info, by, limit: int = 10, offset: int = 0): @query.field("load_recipients") async def load_recipients(_, _info, limit=50, offset=0): """load possible chat participants""" - onliners = (await redis.execute("SMEMBERS", "authors-online")) or [] + onliners: List[int] = (await redis.execute("SMEMBERS", "authors-online")) or [] r = [] - all_authors: List[ChatMember] = await get_all_authors() + all_authors: List[ChatMember] = await get_all_authors(limit, offset) my_followings: List[ChatMember] = await get_my_followed() if all_authors: if len(my_followings) < limit: - my_followings = my_followings + list(all_authors)[0 : limit - len(my_followings)] + my_followings = my_followings + list(all_authors)[offset : limit - len(my_followings)] for a in my_followings: - a["online"] = a["id"] in onliners + a["online"] = bool(a["id"] in list(onliners)) r.append(a) # NOTE: maybe sort members here diff --git a/services/core.py b/services/core.py index f45ae31..d3ce8bb 100644 --- a/services/core.py +++ b/services/core.py @@ -38,9 +38,7 @@ async def get_my_followed() -> List[ChatMember]: "variables": None, } - result = await _request_endpoint(query_name, gql) - - return result.get("authors", []) + return await _request_endpoint(query_name, gql) or [] async def get_author(user: str = ""):