diff --git a/orm/comment.py b/orm/comment.py index 96fe1d75..f87aafec 100644 --- a/orm/comment.py +++ b/orm/comment.py @@ -25,8 +25,8 @@ class Comment(Base): updatedBy = Column(ForeignKey("user.id"), nullable=True, comment="Last Editor") deletedAt = Column(DateTime, nullable=True, comment="Deleted at") deletedBy = Column(ForeignKey("user.id"), nullable=True, comment="Deleted by") - shout: int = Column(ForeignKey("shout.id"), nullable=True, comment="Shout ID") - rating: int = Column(Integer, nullable=True, comment="Comment Rating") + shout: int = Column(ForeignKey("shout.id"), nullable=False, comment="Shout ID") + replyTo: int = Column(ForeignKey("comment.id"), nullable=True, comment="comment ID") ratings = relationship(CommentRating, foreign_keys=CommentRating.comment_id) old_id: str = Column(String, nullable = True) old_thread: str = Column(String, nullable = True) diff --git a/resolvers/__init__.py b/resolvers/__init__.py index cde2841d..86721717 100644 --- a/resolvers/__init__.py +++ b/resolvers/__init__.py @@ -5,6 +5,7 @@ from resolvers.zine import create_shout, get_shout_by_slug, top_month, top_overa from resolvers.profile import get_user_by_slug, get_current_user from resolvers.topics import topic_subscribe, topic_unsubscribe, topics_by_author, \ topics_by_community, topics_by_slugs +from resolvers.comments import create_comment __all__ = [ "login", diff --git a/resolvers/comments.py b/resolvers/comments.py new file mode 100644 index 00000000..16bfe87a --- /dev/null +++ b/resolvers/comments.py @@ -0,0 +1,57 @@ +from orm import Comment, CommentRating +from orm.base import local_session +from resolvers.base import mutation, query, subscription +from auth.authenticate import login_required +import asyncio +from datetime import datetime + +@mutation.field("createComment") +@login_required +async def create_comment(_, info, body, shout, replyTo = None): + auth = info.context["request"].auth + user_id = auth.user_id + + comment = Comment.create( + author = user_id, + body = body, + shout = shout, + replyTo = replyTo + ) + + return {"comment": comment} + +@mutation.field("updateComment") +@login_required +async def update_comment(_, info, id, body): + auth = info.context["request"].auth + user_id = auth.user_id + + with local_session() as session: + comment = session.query(Comment).filter(Comment.id == id).first() + if not comment: + return {"error": "invalid comment id"} + if comment.author != user_id: + return {"error": "access denied"} + + comment.body = body + comment.updatedAt = datetime.now() + + session.commit() + +@mutation.field("deleteComment") +@login_required +async def delete_comment(_, info, id): + auth = info.context["request"].auth + user_id = auth.user_id + + with local_session() as session: + comment = session.query(Comment).filter(Comment.id == id).first() + if not comment: + return {"error": "invalid comment id"} + if comment.author != user_id: + return {"error": "access denied"} + + comment.deletedAt = datetime.now() + session.commit() + + return {} diff --git a/schema.graphql b/schema.graphql index 348ca252..d74c43ac 100644 --- a/schema.graphql +++ b/schema.graphql @@ -46,6 +46,11 @@ type ShoutResult { shout: Shout } +type CommentResult { + error: String + comment: Comment +} + ################################### Mutation type Mutation { @@ -79,6 +84,10 @@ type Mutation { # topics topicSubscribe(slug: String!): Result! topicUnsubscribe(slug: String!): Result! + + createComment(body: String!, shout: Int!, replyTo: Int): CommentResult! + updateComment(id: Int!, body: String!): CommentResult! + deleteComment(id: Int!): Result! } ################################### Query @@ -199,7 +208,7 @@ type Comment { id: Int! author: Int! body: String! - replyTo: Int! + replyTo: Int createdAt: DateTime! updatedAt: DateTime updatedBy: Int