core/resolvers/inbox.py

130 lines
2.7 KiB
Python
Raw Normal View History

2021-07-01 18:26:04 +00:00
from orm import Message, User
from orm.base import global_session
2021-07-02 09:16:43 +00:00
from resolvers.base import mutation, query, subscription
2021-07-01 18:26:04 +00:00
from auth.authenticate import login_required
2021-07-02 09:16:43 +00:00
import asyncio
2021-07-08 07:58:49 +00:00
class MessageQueue:
new_message = asyncio.Queue()
updated_message = asyncio.Queue()
deleted_message = asyncio.Queue()
2021-07-02 09:16:43 +00:00
2021-07-01 18:26:04 +00:00
@mutation.field("createMessage")
@login_required
async def create_message(_, info, input):
auth = info.context["request"].auth
user_id = auth.user_id
new_message = Message.create(
author = user_id,
body = input["body"],
replyTo = input.get("replyTo")
)
2021-07-08 07:58:49 +00:00
MessageQueue.new_message.put_nowait(new_message)
2021-07-02 09:16:43 +00:00
2021-07-01 18:26:04 +00:00
return {
"status": True,
"message" : new_message
}
2021-07-01 18:26:04 +00:00
@query.field("getMessages")
@login_required
async def get_messages(_, info, count, page):
auth = info.context["request"].auth
user_id = auth.user_id
messages = global_session.query(Message).filter(Message.author == user_id)
return messages
2021-07-01 18:26:04 +00:00
def check_and_get_message(message_id, user_id) :
message = global_session.query(Message).filter(Message.id == message_id).first()
if not message :
raise Exception("invalid id")
if message.author != user_id :
raise Exception("access denied")
return message
2021-07-01 18:26:04 +00:00
@mutation.field("updateMessage")
@login_required
async def update_message(_, info, input):
auth = info.context["request"].auth
user_id = auth.user_id
message_id = input["id"]
try:
message = check_and_get_message(message_id, user_id)
except Exception as err:
return {
"status" : False,
"error" : err
}
message.body = input["body"]
global_session.commit()
2021-07-08 07:58:49 +00:00
MessageQueue.updated_message.put_nowait(message)
2021-07-02 09:16:43 +00:00
2021-07-01 18:26:04 +00:00
return {
"status" : True,
"message" : message
}
2021-07-01 18:26:04 +00:00
@mutation.field("deleteMessage")
@login_required
async def delete_message(_, info, id):
auth = info.context["request"].auth
user_id = auth.user_id
try:
message = check_and_get_message(id, user_id)
except Exception as err:
return {
"status" : False,
"error" : err
}
global_session.delete(message)
global_session.commit()
2021-07-08 07:58:49 +00:00
MessageQueue.deleted_message.put_nowait(message)
2021-07-02 09:16:43 +00:00
2021-07-01 18:26:04 +00:00
return {
"status" : True
}
2021-07-02 09:16:43 +00:00
@subscription.source("messageCreated")
async def new_message_generator(obj, info):
while True:
2021-07-08 07:58:49 +00:00
new_message = await MessageQueue.new_message.get()
2021-07-02 09:16:43 +00:00
yield new_message
@subscription.source("messageUpdated")
async def updated_message_generator(obj, info):
while True:
2021-07-08 07:58:49 +00:00
message = await MessageQueue.updated_message.get()
2021-07-02 09:16:43 +00:00
yield message
@subscription.source("messageDeleted")
async def deleted_message_generator(obj, info):
while True:
2021-07-08 07:58:49 +00:00
message = await MessageQueue.deleted_message.get()
2021-07-02 09:16:43 +00:00
yield new_message
@subscription.field("messageCreated")
@subscription.field("messageUpdated")
@subscription.field("messageDeleted")
def message_resolver(message, info):
return message