From 9d783c1c7459462759fe2c14ddbe0ece6fd7604b Mon Sep 17 00:00:00 2001 From: tonyrewin Date: Tue, 13 Dec 2022 03:44:35 +0300 Subject: [PATCH] scope-passed --- resolvers/inbox/chats.py | 3 ++- resolvers/inbox/messages.py | 13 ++++++++++--- services/inbox/sse.py | 14 +++++++++----- validations/inbox.py | 28 ++++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 validations/inbox.py diff --git a/resolvers/inbox/chats.py b/resolvers/inbox/chats.py index 56e80423..828f769c 100644 --- a/resolvers/inbox/chats.py +++ b/resolvers/inbox/chats.py @@ -6,11 +6,12 @@ from auth.authenticate import login_required from auth.credentials import AuthCredentials from base.redis import redis from base.resolvers import mutation +from validations.inbox import Chat @mutation.field("updateChat") @login_required -async def update_chat(_, info, chat_new: dict): +async def update_chat(_, info, chat_new: Chat): """ updating chat requires info["request"].user.slug to be in chat["admins"] diff --git a/resolvers/inbox/messages.py b/resolvers/inbox/messages.py index a099b32e..1200c322 100644 --- a/resolvers/inbox/messages.py +++ b/resolvers/inbox/messages.py @@ -1,13 +1,15 @@ import asyncio import json +from typing import Any from datetime import datetime, timezone - +from graphql.type import GraphQLResolveInfo from auth.authenticate import login_required from auth.credentials import AuthCredentials from base.redis import redis from base.resolvers import mutation, subscription from services.inbox.helpers import ChatFollowing, MessageResult from services.inbox.storage import MessagesStorage +from validations.inbox import Message @mutation.field("createMessage") @@ -142,8 +144,7 @@ async def mark_as_read(_, info, chat_id: str, messages: [int]): @subscription.source("newMessage") -@login_required -async def message_generator(obj, info): +async def message_generator(_, info: GraphQLResolveInfo): print(f"[resolvers.messages] generator {info}") auth: AuthCredentials = info.context["request"].auth user_id = auth.user_id @@ -172,3 +173,9 @@ async def message_generator(obj, info): yield msg finally: await MessagesStorage.remove_chat(following_chat) + + +@subscription.field("newMessage") +@login_required +async def message_resolver(message: Message, info: Any): + return message diff --git a/services/inbox/sse.py b/services/inbox/sse.py index 2db1fbc5..e5d3e613 100644 --- a/services/inbox/sse.py +++ b/services/inbox/sse.py @@ -1,14 +1,18 @@ from sse_starlette.sse import EventSourceResponse -from starlette.requests import Request +from starlette.requests import Request, GraphQLResolveInfo from resolvers.inbox.messages import message_generator from base.exceptions import Unauthorized +# https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md + async def sse_messages(request: Request): - print(f'[SSE] {request.scope}') # FIXME: DOES NOT HAPPEN TO BE CALLED - # https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md - if request['user']: - event_generator = await message_generator(None, request.scope) + print(f'[SSE] request\n{request}\n') + info = GraphQLResolveInfo() + info.context['request'] = request.scope + user_id = request.scope['user'].user_id + if user_id: + event_generator = await message_generator(None, info) return EventSourceResponse(event_generator) else: raise Unauthorized("Please login") diff --git a/validations/inbox.py b/validations/inbox.py new file mode 100644 index 00000000..d03cca05 --- /dev/null +++ b/validations/inbox.py @@ -0,0 +1,28 @@ +from typing import Optional, Text, List +from pydantic import BaseModel + + +class Message(BaseModel): + id: int + body: Text + author: int + chatId: Text + createdAt: int + updatedAt: Optional[int] + replyTo: Optional[int] + + +class Member(BaseModel): + id: int + name: Text + pic: Optional[Text] + # TODO: extend chat member model + + +class Chat(BaseModel): + createdAt: int + createdBy: int + users: List[int] + updatedAt: Optional[int] + title: Optional[Text] + description: Optional[Text]