author-getting-fix
All checks were successful
deploy / deploy (push) Successful in 1m4s

This commit is contained in:
Untone 2023-12-19 17:24:52 +03:00
parent d75f31072c
commit 8c1f52f99b
5 changed files with 67 additions and 55 deletions

View File

@ -1,11 +1,10 @@
import json import json
import time import time
import uuid import uuid
from typing import List
from models.chat import Chat, ChatUpdate from models.chat import Chat, ChatUpdate
from models.member import ChatMember
from services.auth import login_required from services.auth import login_required
from services.core import authors_by_user
from services.presence import notify_chat from services.presence import notify_chat
from services.rediscache import redis from services.rediscache import redis
from services.schema import mutation from services.schema import mutation
@ -22,7 +21,9 @@ async def update_chat(_, info, chat_new: ChatUpdate):
:param chat_new: dict with chat data :param chat_new: dict with chat data
:return: Result { error chat } :return: Result { error chat }
""" """
author_id = info.context["author_id"] user_id = info.context["user_id"]
author = authors_by_user[user_id]
author_id = author["id"]
chat_id = chat_new["id"] chat_id = chat_new["id"]
chat_str = await redis.execute("GET", f"chats/{chat_id}") chat_str = await redis.execute("GET", f"chats/{chat_id}")
if not chat_str: if not chat_str:
@ -51,45 +52,48 @@ async def update_chat(_, info, chat_new: ChatUpdate):
@login_required @login_required
async def create_chat(_, info, title="", members=None): async def create_chat(_, info, title="", members=None):
members = members or [] members = members or []
print("create_chat context: %r" % info.context)
author_id = info.context["author_id"]
print("create_chat members: %r" % members) print("create_chat members: %r" % members)
if author_id not in members: print("create_chat context: %r" % info.context)
members.append(int(author_id)) user_id = info.context["user_id"]
author = authors_by_user[user_id]
author_id = author["id"]
if author_id:
if author_id not in members:
members.append(int(author_id))
# NOTE: private chats has no title # NOTE: private chats has no title
# reuse private chat created before if exists # reuse private chat created before if exists
if len(members) == 2 and title == "": if len(members) == 2 and title == "":
chatset1 = set((await redis.execute("SMEMBERS", f"chats_by_author/{members[0]}")) or []) chatset1 = set((await redis.execute("SMEMBERS", f"chats_by_author/{members[0]}")) or [])
chatset2 = set((await redis.execute("SMEMBERS", f"chats_by_author/{members[1]}")) or []) chatset2 = set((await redis.execute("SMEMBERS", f"chats_by_author/{members[1]}")) or [])
for c in chatset1.intersection(chatset2): for c in chatset1.intersection(chatset2):
chat_data = await redis.execute("GET", f"chats/{c}") chat_data = await redis.execute("GET", f"chats/{c}")
if chat_data: if chat_data:
chat = json.loads(chat_data) chat = json.loads(chat_data)
if chat["title"] == "": if chat["title"] == "":
print("[inbox] createChat found old chat") print("[inbox] createChat found old chat")
return {"chat": chat, "error": "existed"} return {"chat": chat, "error": "existed"}
chat_id = str(uuid.uuid4()) chat_id = str(uuid.uuid4())
chat: Chat = { chat: Chat = {
"id": chat_id, "id": chat_id,
"members": members, "members": members,
"title": title, "title": title,
"description": "", "description": "",
"created_by": author_id, "created_by": author_id,
"created_at": int(time.time()), "created_at": int(time.time()),
"updated_at": int(time.time()), "updated_at": int(time.time()),
"admins": members if (len(members) == 2 and title == "") else [], "admins": members if (len(members) == 2 and title == "") else [],
} }
for member_id in members: for member_id in members:
await redis.execute("SADD", f"chats_by_author/{member_id}", chat_id) await redis.execute("SADD", f"chats_by_author/{member_id}", chat_id)
await notify_chat(chat, member_id, "create") await notify_chat(chat, member_id, "create")
print(f"\n\n[resolvers.chats] creating: {chat}\n\n") print(f"\n\n[resolvers.chats] creating: {chat}\n\n")
await redis.execute("SET", f"chats/{chat_id}", json.dumps(chat)) await redis.execute("SET", f"chats/{chat_id}", json.dumps(chat))
await redis.execute("SET", f"chats/{chat_id}/next_message_id", str(0)) await redis.execute("SET", f"chats/{chat_id}/next_message_id", str(0))
return {"error": None, "chat": chat} return {"error": None, "chat": chat}
@ -97,8 +101,9 @@ async def create_chat(_, info, title="", members=None):
@mutation.field("delete_chat") @mutation.field("delete_chat")
@login_required @login_required
async def delete_chat(_, info, chat_id: str): async def delete_chat(_, info, chat_id: str):
author_id = info.context["author_id"] user_id = info.context["user_id"]
author = authors_by_user[user_id]
author_id = author["id"]
chat_str = await redis.execute("GET", f"chats/{chat_id}") chat_str = await redis.execute("GET", f"chats/{chat_id}")
if chat_str: if chat_str:
chat: Chat = json.loads(chat_str) chat: Chat = json.loads(chat_str)

View File

@ -6,7 +6,7 @@ from models.chat import ChatPayload, Message
from models.member import ChatMember from models.member import ChatMember
from resolvers.chats import create_chat from resolvers.chats import create_chat
from services.auth import login_required from services.auth import login_required
from services.core import authors_by_id, get_my_followed from services.core import authors_by_id, get_my_followed, authors_by_user
from services.rediscache import redis from services.rediscache import redis
from services.schema import query from services.schema import query
@ -52,7 +52,9 @@ async def load_messages(
@login_required @login_required
async def load_chats(_, info, limit: int = 50, offset: int = 0) -> Dict[str, Union[List[Dict[str, Any]], None]]: 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""" """load :limit chats of current user with :offset"""
author_id = info.context.get("author_id") user_id = info.context["user_id"]
author = authors_by_user[user_id]
author_id = author["id"]
chats = [] chats = []
if author_id: if author_id:
cids = await redis.execute("SMEMBERS", f"chats_by_author/{author_id}") cids = await redis.execute("SMEMBERS", f"chats_by_author/{author_id}")
@ -88,13 +90,15 @@ async def load_chats(_, info, limit: int = 50, offset: int = 0) -> Dict[str, Uni
@login_required @login_required
async def load_messages_by(_, info, by, limit: int = 10, offset: int = 0): async def load_messages_by(_, info, by, limit: int = 10, offset: int = 0):
"""load :limit messages of :chat_id with :offset""" """load :limit messages of :chat_id with :offset"""
author_id = info.context["author_id"] user_id = info.context["user_id"]
user_chats = (await redis.execute("SMEMBERS", "chats_by_author/" + str(author_id))) or [] author = authors_by_user[user_id]
user_chats = [c for c in user_chats] author_id = author["id"]
if user_chats: author_chats = (await redis.execute("SMEMBERS", "chats_by_author/" + str(author_id))) or []
author_chats = [c for c in author_chats]
if author_chats:
messages = [] messages = []
by_chat = by.get("chat") by_chat = by.get("chat")
if by_chat in user_chats: if by_chat in author_chats:
chat = await redis.execute("GET", f"chats/{by_chat}") chat = await redis.execute("GET", f"chats/{by_chat}")
if not chat: if not chat:
return {"messages": [], "error": "chat not exist"} return {"messages": [], "error": "chat not exist"}

View File

@ -3,6 +3,7 @@ import time
from models.chat import Message from models.chat import Message
from services.auth import login_required from services.auth import login_required
from services.core import authors_by_user
from services.presence import notify_message from services.presence import notify_message
from services.rediscache import redis from services.rediscache import redis
from services.schema import mutation from services.schema import mutation
@ -12,7 +13,10 @@ from services.schema import mutation
@login_required @login_required
async def create_message(_, info, chat_id: str, body: str, reply_to=None): async def create_message(_, info, chat_id: str, body: str, reply_to=None):
"""Создание сообщения с телом :body для чата :chat_id с возможным ответом на :reply_to""" """Создание сообщения с телом :body для чата :chat_id с возможным ответом на :reply_to"""
author_id = info.context["author_id"]
user_id = info.context["user_id"]
author = authors_by_user[user_id]
author_id = author["id"]
# Получение данных чата из Redis # Получение данных чата из Redis
chat_data = await redis.execute("GET", f"chats/{chat_id}") chat_data = await redis.execute("GET", f"chats/{chat_id}")

View File

@ -4,7 +4,7 @@ from typing import Any, Dict, List, Union
from resolvers.load import load_messages from resolvers.load import load_messages
from services.auth import login_required from services.auth import login_required
from services.core import authors_by_id from services.core import authors_by_id, authors_by_user
from services.rediscache import redis from services.rediscache import redis
from services.schema import query from services.schema import query
@ -16,7 +16,10 @@ async def search_recipients(_, info, text: str, limit: int = 50, offset: int = 0
# TODO: maybe redis scan? # TODO: maybe redis scan?
author_id = info.context["author_id"] user_id = info.context["user_id"]
author = authors_by_user[user_id]
author_id = author["id"]
existed_chats = await redis.execute("SMEMBERS", f"/chats_by_author/{author_id}") existed_chats = await redis.execute("SMEMBERS", f"/chats_by_author/{author_id}")
if existed_chats: if existed_chats:
for chat_id in list(json.loads(existed_chats))[offset : (offset + limit)]: for chat_id in list(json.loads(existed_chats))[offset : (offset + limit)]:
@ -38,7 +41,9 @@ async def search_recipients(_, info, text: str, limit: int = 50, offset: int = 0
async def search_messages( async def search_messages(
_, info, by: Dict[str, Union[str, int]], limit: int, offset: int _, info, by: Dict[str, Union[str, int]], limit: int, offset: int
) -> Dict[str, Union[List[Dict[str, Any]], None]]: ) -> Dict[str, Union[List[Dict[str, Any]], None]]:
author_id = info.context["author_id"] user_id = info.context["user_id"]
author = authors_by_user[user_id]
author_id = author["id"]
lookup_chats = set((await redis.execute("SMEMBERS", f"chats_by_author/{author_id}")) or []) lookup_chats = set((await redis.execute("SMEMBERS", f"chats_by_author/{author_id}")) or [])
messages_set = set([]) messages_set = set([])

View File

@ -2,9 +2,6 @@ from functools import wraps
from aiohttp import ClientSession from aiohttp import ClientSession
from starlette.exceptions import HTTPException from starlette.exceptions import HTTPException
from models.member import ChatMember
from services.core import authors_by_user
from settings import AUTH_URL from settings import AUTH_URL
@ -63,9 +60,6 @@ def login_required(f):
user_id = await check_auth(req) user_id = await check_auth(req)
if user_id: if user_id:
context["user_id"] = user_id context["user_id"] = user_id
author: ChatMember | None = authors_by_user.get(user_id)
if author:
context["author_id"] = author["id"]
return await f(*args, **kwargs) return await f(*args, **kwargs)
return decorated_function return decorated_function