one subscription on messages
This commit is contained in:
parent
36a0770675
commit
7dea19495c
|
@ -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):
|
||||||
while True:
|
try:
|
||||||
new_message = await MessageQueue.new_message.get()
|
msg_queue = asyncio.Queue()
|
||||||
yield new_message
|
await MessageSubscriptions.register_subscription(msg_queue)
|
||||||
|
while True:
|
||||||
|
msg = await msg_queue.get()
|
||||||
|
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
|
||||||
|
|
|
@ -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!
|
||||||
|
|
Loading…
Reference in New Issue
Block a user