get messages from redis

This commit is contained in:
knst-kotov 2022-01-28 15:52:14 +03:00
parent ab42c3b60c
commit 3828e92c19
2 changed files with 23 additions and 31 deletions

View File

@ -60,20 +60,25 @@ async def create_chat(_, info, description):
return { "chatId" : chat_id }
@query.field("enterChat")
@login_required
async def enter_chat(_, info, chatId):
chat = await redis.execute("GET", f"chats/{chatId}")
if not chat:
return { "error" : "chat not exist" }
chat = json.loads(chat)
message_ids = await redis.lrange(f"chats/{chatId}/message_ids", 0, 10)
async def load_messages(chatId, size, page):
message_ids = await redis.lrange(f"chats/{chatId}/message_ids",
size * (page -1), size * page - 1)
messages = []
if message_ids:
message_keys = [f"chats/{chatId}/messages/{id.decode('UTF-8')}" for id in message_ids]
messages = await redis.mget(*message_keys)
messages = [json.loads(msg) for msg in messages]
return messages
@query.field("enterChat")
@login_required
async def enter_chat(_, info, chatId, size):
chat = await redis.execute("GET", f"chats/{chatId}")
if not chat:
return { "error" : "chat not exist" }
chat = json.loads(chat)
messages = await load_messages(chatId, size, 1)
return {
"chat" : chat,
@ -112,26 +117,15 @@ async def create_message(_, info, chatId, body, replyTo = None):
@query.field("getMessages")
@login_required
async def get_messages(_, info, count, page):
auth = info.context["request"].auth
user_id = auth.user_id
async def get_messages(_, info, chatId, size, page):
chat = await redis.execute("GET", f"chats/{chatId}")
if not chat:
return { "error" : "chat not exist" }
with local_session() as session:
messages = session.query(Message).filter(Message.author == user_id)
messages = await load_messages(chatId, size, page)
return messages
def check_and_get_message(message_id, user_id, session) :
message = session.query(Message).filter(Message.id == message_id).first()
if not message :
raise Exception("invalid id")
if message.author != user_id :
raise Exception("access denied")
return message
@mutation.field("updateMessage")
@login_required
async def update_message(_, info, chatId, id, body):

View File

@ -167,7 +167,8 @@ type Query {
getUserRoles(slug: String!): [Role]!
# messages
getMessages(count: Int = 100, page: Int = 1): [Message!]!
enterChat(chatId: String!, size: Int = 50): EnterChatResult!
getMessages(chatId: String!, size: Int!, page: Int!): [Message]!
# shouts
getShoutBySlug(slug: String!): Shout!
@ -192,9 +193,6 @@ type Query {
# communities
getCommunity(slug: String): Community!
getCommunities: [Community]!
#messages
enterChat(chatId: String!): EnterChatResult!
}
############################################ Subscription