scope-passed
This commit is contained in:
parent
4df9390b2d
commit
9d783c1c74
|
@ -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"]
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
28
validations/inbox.py
Normal 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]
|
Loading…
Reference in New Issue
Block a user