From 68f7733f912ce047d700c28237f25bfab0cce417 Mon Sep 17 00:00:00 2001 From: knst-kotov Date: Sun, 30 Jan 2022 11:50:29 +0300 Subject: [PATCH] fix topic subscription --- orm/topic.py | 2 +- resolvers/topics.py | 32 +++++++++++++++++++++----------- schema.graphql | 2 +- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/orm/topic.py b/orm/topic.py index b7be86c3..5d95988a 100644 --- a/orm/topic.py +++ b/orm/topic.py @@ -9,8 +9,8 @@ class TopicSubscription(Base): __tablename__ = "topic_subscription" id = None + subscriber = Column(ForeignKey('user.slug'), primary_key = True) topic = Column(ForeignKey('topic.slug'), primary_key = True) - user = Column(ForeignKey('user.id'), primary_key = True) createdAt: str = Column(DateTime, nullable=False, default = datetime.now, comment="Created at") class Topic(Base): diff --git a/resolvers/topics.py b/resolvers/topics.py index 0eaaa678..c4773743 100644 --- a/resolvers/topics.py +++ b/resolvers/topics.py @@ -7,6 +7,8 @@ from resolvers.zine import ShoutSubscriptions from auth.authenticate import login_required import asyncio +from sqlalchemy import func, and_ + @query.field("topicsBySlugs") async def topics_by_slugs(_, info, slugs = None): with local_session() as session: @@ -62,27 +64,35 @@ async def update_topic(_, info, input): @mutation.field("topicSubscribe") @login_required async def topic_subscribe(_, info, slug): - auth = info.context["request"].auth - user_id = auth.user_id - sub = TopicSubscription.create({ user: user_id, topic: slug }) - return {} # type Result + user = info.context["request"].user + + TopicSubscription.create( + subscriber = user.slug, + topic = slug) + + return {} @mutation.field("topicUnsubscribe") @login_required async def topic_unsubscribe(_, info, slug): - auth = info.context["request"].auth - user_id = auth.user_id - sub = session.query(TopicSubscription).filter(TopicSubscription.user == user_id and TopicSubscription.topic == slug).first() + user = info.context["request"].user + with local_session() as session: + sub = session.query(TopicSubscription).\ + filter(and_(TopicSubscription.subscriber == user.slug, TopicSubscription.topic == slug)).\ + first() + if not sub: + return { "error" : "subscription not exist" } session.delete(sub) - return {} # type Result - return { "error": "session error" } + session.commit() + + return {} @subscription.source("topicUpdated") -async def new_shout_generator(obj, info, user_id): +async def new_shout_generator(obj, info, user_slug): try: with local_session() as session: - topics = session.query(TopicSubscription.topic).filter(TopicSubscription.user == user_id).all() + topics = session.query(TopicSubscription.topic).filter(TopicSubscription.subscriber == user_slug).all() topics = set([item.topic for item in topics]) shouts_queue = asyncio.Queue() await ShoutSubscriptions.register_subscription(shouts_queue) diff --git a/schema.graphql b/schema.graphql index 888e5419..10b0892f 100644 --- a/schema.graphql +++ b/schema.graphql @@ -205,7 +205,7 @@ type Subscription { onlineUpdated: [User!]! shoutUpdated: Shout! userUpdated: User! - topicUpdated(user_id: Int!): Shout! + topicUpdated(user_slug: String!): Shout! commentUpdated(shout: String!): CommentUpdatedResult! }