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