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 auth.credentials import AuthCredentials
from base.redis import redis from base.redis import redis
from base.resolvers import mutation from base.resolvers import mutation
from validations.inbox import Chat
@mutation.field("updateChat") @mutation.field("updateChat")
@login_required @login_required
async def update_chat(_, info, chat_new: dict): async def update_chat(_, info, chat_new: Chat):
""" """
updating chat updating chat
requires info["request"].user.slug to be in chat["admins"] requires info["request"].user.slug to be in chat["admins"]

View File

@ -1,13 +1,15 @@
import asyncio import asyncio
import json import json
from typing import Any
from datetime import datetime, timezone from datetime import datetime, timezone
from graphql.type import GraphQLResolveInfo
from auth.authenticate import login_required from auth.authenticate import login_required
from auth.credentials import AuthCredentials from auth.credentials import AuthCredentials
from base.redis import redis from base.redis import redis
from base.resolvers import mutation, subscription from base.resolvers import mutation, subscription
from services.inbox.helpers import ChatFollowing, MessageResult from services.inbox.helpers import ChatFollowing, MessageResult
from services.inbox.storage import MessagesStorage from services.inbox.storage import MessagesStorage
from validations.inbox import Message
@mutation.field("createMessage") @mutation.field("createMessage")
@ -142,8 +144,7 @@ async def mark_as_read(_, info, chat_id: str, messages: [int]):
@subscription.source("newMessage") @subscription.source("newMessage")
@login_required async def message_generator(_, info: GraphQLResolveInfo):
async def message_generator(obj, info):
print(f"[resolvers.messages] generator {info}") print(f"[resolvers.messages] generator {info}")
auth: AuthCredentials = info.context["request"].auth auth: AuthCredentials = info.context["request"].auth
user_id = auth.user_id user_id = auth.user_id
@ -172,3 +173,9 @@ async def message_generator(obj, info):
yield msg yield msg
finally: finally:
await MessagesStorage.remove_chat(following_chat) 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 sse_starlette.sse import EventSourceResponse
from starlette.requests import Request from starlette.requests import Request, GraphQLResolveInfo
from resolvers.inbox.messages import message_generator from resolvers.inbox.messages import message_generator
from base.exceptions import Unauthorized from base.exceptions import Unauthorized
# https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md
async def sse_messages(request: Request): async def sse_messages(request: Request):
print(f'[SSE] {request.scope}') # FIXME: DOES NOT HAPPEN TO BE CALLED print(f'[SSE] request\n{request}\n')
# https://github.com/enisdenjo/graphql-sse/blob/master/PROTOCOL.md info = GraphQLResolveInfo()
if request['user']: info.context['request'] = request.scope
event_generator = await message_generator(None, request.scope) user_id = request.scope['user'].user_id
if user_id:
event_generator = await message_generator(None, info)
return EventSourceResponse(event_generator) return EventSourceResponse(event_generator)
else: else:
raise Unauthorized("Please login") 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]