one subscription on messages

This commit is contained in:
knst-kotov 2021-11-24 10:36:06 +03:00
parent 36a0770675
commit 7dea19495c
2 changed files with 50 additions and 29 deletions

View File

@ -7,12 +7,30 @@ from auth.authenticate import login_required
import asyncio import asyncio
class MessageSubscriptions:
lock = asyncio.Lock()
subscriptions = []
class MessageQueue: @staticmethod
async def register_subscription(subs):
async with MessageSubscriptions.lock:
MessageSubscriptions.subscriptions.append(subs)
new_message = asyncio.Queue() @staticmethod
updated_message = asyncio.Queue() async def del_subscription(subs):
deleted_message = asyncio.Queue() async with MessageSubscriptions.lock:
MessageSubscriptions.subscriptions.remove(subs)
@staticmethod
async def put(msg):
async with MessageSubscriptions.lock:
for subs in MessageSubscriptions.subscriptions:
subs.put_nowait(msg)
class MessageResult:
def __init__(self, status, message):
self.status = status
self.message = message
@mutation.field("createMessage") @mutation.field("createMessage")
@ -27,7 +45,8 @@ async def create_message(_, info, body, replyTo = None):
replyTo = replyTo replyTo = replyTo
) )
MessageQueue.new_message.put_nowait(new_message) result = MessageResult("NEW", new_message)
await MessageSubscriptions.put(result)
return {"message" : new_message} return {"message" : new_message}
@ -68,7 +87,8 @@ async def update_message(_, info, id, body):
message.body = body message.body = body
session.commit() session.commit()
MessageQueue.updated_message.put_nowait(message) result = MessageResult("UPDATED", message)
await MessageSubscriptions.put(result)
return {"message" : message} return {"message" : message}
@ -87,31 +107,23 @@ async def delete_message(_, info, id):
session.delete(message) session.delete(message)
session.commit() session.commit()
MessageQueue.deleted_message.put_nowait(message) result = MessageResult("DELETED", message)
await MessageSubscriptions.put(result)
return {} return {}
@subscription.source("messageCreated") @subscription.source("messageChanged")
async def new_message_generator(obj, info): async def new_message_generator(obj, info):
try:
msg_queue = asyncio.Queue()
await MessageSubscriptions.register_subscription(msg_queue)
while True: while True:
new_message = await MessageQueue.new_message.get() msg = await msg_queue.get()
yield new_message yield msg
finally:
await MessageSubscriptions.del_subscription(msg_queue)
@subscription.source("messageUpdated") @subscription.field("messageChanged")
async def updated_message_generator(obj, info):
while True:
message = await MessageQueue.updated_message.get()
yield message
@subscription.source("messageDeleted")
async def deleted_message_generator(obj, info):
while True:
message = await MessageQueue.deleted_message.get()
yield new_message
@subscription.field("messageCreated")
@subscription.field("messageUpdated")
@subscription.field("messageDeleted")
def message_resolver(message, info): def message_resolver(message, info):
return message return message

View File

@ -51,6 +51,17 @@ type CommentResult {
comment: Comment comment: Comment
} }
enum MessageStatus {
NEW
UPDATED
DELETED
}
type MessageWithStatus {
status: MessageStatus!
message: Message!
}
################################### Mutation ################################### Mutation
type Mutation { type Mutation {
@ -132,9 +143,7 @@ type Query {
############################################ Subscription ############################################ Subscription
type Subscription { type Subscription {
messageCreated: Message! messageChanged: MessageWithStatus!
messageUpdated: Message!
messageDeleted: Message!
onlineUpdated: [User!]! onlineUpdated: [User!]!
shoutUpdated: Shout! shoutUpdated: Shout!