This commit is contained in:
Untone 2021-07-02 08:21:55 +03:00
commit 427ef6a81a
5 changed files with 92 additions and 27 deletions

View File

@ -63,7 +63,7 @@ class JWTAuthenticate(AuthenticationBackend):
return AuthCredentials(scopes=[], error_message=str(exc)), AuthUser(user_id=None)
scopes = User.get_permission(user_id=payload.user_id)
return AuthCredentials(scopes=scopes, logged_in=True), AuthUser(user_id=payload.user_id)
return AuthCredentials(user_id=payload.user_id, scopes=scopes, logged_in=True), AuthUser(user_id=payload.user_id)
def login_required(func):

View File

@ -1,5 +1,6 @@
from orm.rbac import Operation, Permission, Role
from orm.user import User
from orm.message import Message
from orm.base import Base, engine
__all__ = ["User", "Role", "Operation", "Permission"]

View File

@ -1,6 +1,7 @@
from typing import List
from datetime import datetime
from sqlalchemy import Column, Integer, String, ForeignKey, Datetime
from sqlalchemy import Column, Integer, String, ForeignKey, DateTime
from orm import Permission
from orm.base import Base
@ -9,10 +10,11 @@ from orm.base import Base
class Message(Base):
__tablename__ = 'message'
sender: str = Column(ForeignKey("user.id"), nullable=False, comment="Sender")
author: int = Column(ForeignKey("user.id"), nullable=False, comment="Sender")
body: str = Column(String, nullable=False, comment="Body")
createdAt: str = Column(Datetime, nullable=False, comment="Created at")
updatedAt: str = Column(Datetime, nullable=True, comment="Updated at")
replyTo: str = Column(ForeignKey("message.id", nullable=True, comment="Reply to"))
createdAt = Column(DateTime, nullable=False, default = datetime.now, comment="Created at")
updatedAt = Column(DateTime, nullable=True, comment="Updated at")
replyTo: int = Column(ForeignKey("message.id"), nullable=True, comment="Reply to")
# TODO: work in progress, udpate this code
# TODO: work in progress, udpate this code

View File

@ -1,3 +1,4 @@
from resolvers.auth import sign_in, sign_out, register
from resolvers.inbox import create_message
__all__ = ["sign_in", "sign_out", "register"]

View File

@ -1,27 +1,88 @@
from orm import message, user
from orm import Message, User
from orm.base import global_session
from ariadne import ObjectType, convert_kwargs_to_snake_case
from resolvers.base import mutation, query
query = ObjectType("Query")
from auth.authenticate import login_required
@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")
)
return {
"status": True,
"message" : new_message
}
@query.field("messages")
@convert_kwargs_to_snake_case
async def resolve_messages(obj, info, user_id):
def filter_by_userid(message):
return message["sender_id"] == user_id or \
message["recipient_id"] == user_id
@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
user_messages = filter(filter_by_userid, messages)
return {
"success": True,
"messages": user_messages
}
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
@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()
return {
"status" : True,
"message" : message
}
@query.field("userId")
@convert_kwargs_to_snake_case
async def resolve_user_id(obj, info, username):
user = users.get(username)
if user:
return user["user_id"]
@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()
return {
"status" : True
}