add methods for messaging
This commit is contained in:
parent
4f2f4187fe
commit
7b5065616f
|
@ -63,7 +63,7 @@ class JWTAuthenticate(AuthenticationBackend):
|
||||||
return AuthCredentials(scopes=[], error_message=str(exc)), AuthUser(user_id=None)
|
return AuthCredentials(scopes=[], error_message=str(exc)), AuthUser(user_id=None)
|
||||||
|
|
||||||
scopes = User.get_permission(user_id=payload.user_id)
|
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):
|
def login_required(func):
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from orm.rbac import Operation, Permission, Role
|
from orm.rbac import Operation, Permission, Role
|
||||||
from orm.user import User
|
from orm.user import User
|
||||||
|
from orm.message import Message
|
||||||
from orm.base import Base, engine
|
from orm.base import Base, engine
|
||||||
|
|
||||||
__all__ = ["User", "Role", "Operation", "Permission"]
|
__all__ = ["User", "Role", "Operation", "Permission"]
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from typing import List
|
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 import Permission
|
||||||
from orm.base import Base
|
from orm.base import Base
|
||||||
|
@ -9,10 +10,11 @@ from orm.base import Base
|
||||||
class Message(Base):
|
class Message(Base):
|
||||||
__tablename__ = 'message'
|
__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")
|
body: str = Column(String, nullable=False, comment="Body")
|
||||||
createdAt: str = Column(Datetime, nullable=False, comment="Created at")
|
createdAt = Column(DateTime, nullable=False, default = datetime.now, comment="Created at")
|
||||||
updatedAt: str = Column(Datetime, nullable=True, comment="Updated at")
|
updatedAt = Column(DateTime, nullable=True, comment="Updated at")
|
||||||
replyTo: str = Column(ForeignKey("message.id", nullable=True, comment="Reply to"))
|
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
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
from resolvers.auth import sign_in, sign_out, register
|
from resolvers.auth import sign_in, sign_out, register
|
||||||
|
from resolvers.inbox import create_message
|
||||||
|
|
||||||
__all__ = ["sign_in", "sign_out", "register"]
|
__all__ = ["sign_in", "sign_out", "register"]
|
||||||
|
|
|
@ -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")
|
@query.field("getMessages")
|
||||||
@convert_kwargs_to_snake_case
|
@login_required
|
||||||
async def resolve_messages(obj, info, user_id):
|
async def get_messages(_, info, count, page):
|
||||||
def filter_by_userid(message):
|
auth = info.context["request"].auth
|
||||||
return message["sender_id"] == user_id or \
|
user_id = auth.user_id
|
||||||
message["recipient_id"] == user_id
|
|
||||||
|
messages = global_session.query(Message).filter(Message.author == user_id)
|
||||||
|
|
||||||
|
return messages
|
||||||
|
|
||||||
user_messages = filter(filter_by_userid, messages)
|
def check_and_get_message(message_id, user_id) :
|
||||||
return {
|
message = global_session.query(Message).filter(Message.id == message_id).first()
|
||||||
"success": True,
|
|
||||||
"messages": user_messages
|
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")
|
@mutation.field("deleteMessage")
|
||||||
@convert_kwargs_to_snake_case
|
@login_required
|
||||||
async def resolve_user_id(obj, info, username):
|
async def delete_message(_, info, id):
|
||||||
user = users.get(username)
|
auth = info.context["request"].auth
|
||||||
if user:
|
user_id = auth.user_id
|
||||||
return user["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
|
||||||
|
}
|
||||||
|
|
|
@ -35,12 +35,3 @@ type signOutPayload {
|
||||||
status: Boolean!
|
status: Boolean!
|
||||||
error: String
|
error: String
|
||||||
}
|
}
|
||||||
|
|
||||||
type Query{
|
|
||||||
signIn(id: Int!, password: String!): signInPayload!
|
|
||||||
signOut: signOutPayload!
|
|
||||||
}
|
|
||||||
|
|
||||||
type Mutation{
|
|
||||||
registerUser(input: registerUserInput!): User!
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,2 +1,23 @@
|
||||||
|
|
||||||
scalar DateTime
|
scalar DateTime
|
||||||
|
|
||||||
|
type Query {
|
||||||
|
signIn(id: Int!, password: String!): signInPayload!
|
||||||
|
signOut: signOutPayload!
|
||||||
|
|
||||||
|
getMessages(count: Int = 100, page: Int = 1): [Message!]!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Mutation {
|
||||||
|
registerUser(input: registerUserInput!): User!
|
||||||
|
|
||||||
|
createMessage(input: MessageInput!): createMessagePayload!
|
||||||
|
updateMessage(input: updateMessageInput!): createMessagePayload!
|
||||||
|
deleteMessage(id: Int!): deleteMessagePayload!
|
||||||
|
}
|
||||||
|
|
||||||
|
type Subscription {
|
||||||
|
messageCreated: Message!
|
||||||
|
messageUpdated: Message!
|
||||||
|
messageDeleted: Message!
|
||||||
|
}
|
||||||
|
|
31
schema/schema.messages.graphql
Normal file
31
schema/schema.messages.graphql
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
|
||||||
|
type Message {
|
||||||
|
author: Int!
|
||||||
|
body: String!
|
||||||
|
createdAt: DateTime!
|
||||||
|
id: Int!
|
||||||
|
replyTo: Int
|
||||||
|
updatedAt: DateTime!
|
||||||
|
visibleForUsers: [Int]
|
||||||
|
}
|
||||||
|
|
||||||
|
type createMessagePayload {
|
||||||
|
status: Boolean!
|
||||||
|
error: String
|
||||||
|
message: Message
|
||||||
|
}
|
||||||
|
|
||||||
|
type deleteMessagePayload {
|
||||||
|
status: Boolean!
|
||||||
|
error: String
|
||||||
|
}
|
||||||
|
|
||||||
|
input MessageInput {
|
||||||
|
body: String!
|
||||||
|
replyTo: Int
|
||||||
|
}
|
||||||
|
|
||||||
|
input updateMessageInput {
|
||||||
|
id: Int!
|
||||||
|
body: String!
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user