scope-passed

This commit is contained in:
tonyrewin 2022-12-13 03:44:35 +03:00
parent 4df9390b2d
commit 9d783c1c74
4 changed files with 49 additions and 9 deletions

View File

@ -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"]

View File

@ -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

View File

@ -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")

28
validations/inbox.py Normal file
View File

@ -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]