add community subscription; unify subscription interface

This commit is contained in:
knst-kotov
2022-06-12 10:51:22 +03:00
parent f89cb47daf
commit 39070dc359
6 changed files with 76 additions and 33 deletions

View File

@@ -1,10 +1,12 @@
from orm import Community
from orm import Community, CommunitySubscription
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
from sqlalchemy import and_
@mutation.field("createCommunity")
@login_required
async def create_community(_, info, title, desc):
@@ -68,3 +70,19 @@ async def get_communities(_, info):
with local_session() as session:
communities = session.query(Community)
return communities
def community_subscribe(user, slug):
CommunitySubscription.create(
subscriber = user.slug,
community = slug
)
def community_unsubscribe(user, slug):
with local_session() as session:
sub = session.query(CommunitySubscription).\
filter(and_(CommunitySubscription.subscriber == user.slug, CommunitySubscription.community == slug)).\
first()
if not sub:
raise Exception("subscription not exist")
session.delete(sub)
session.commit()

View File

@@ -4,6 +4,8 @@ from orm.comment import Comment
from orm.base import local_session
from orm.topic import Topic, TopicSubscription
from resolvers.base import mutation, query, subscription
from resolvers.topics import topic_subscribe, topic_unsubscribe
from resolvers.community import community_subscribe, community_unsubscribe
from auth.authenticate import login_required
from inbox_resolvers.inbox import get_total_unread_messages_for_user
@@ -133,30 +135,53 @@ async def rate_user(_, info, slug, value):
return {}
@mutation.field("authorSubscribe")
@login_required
async def author_subscribe(_, info, slug):
user = info.context["request"].user
def author_subscribe(user, slug):
AuthorSubscription.create(
subscriber = user.slug,
author = slug
)
return {}
@mutation.field("authorUnsubscribe")
@login_required
async def author_unsubscribe(_, info, slug):
user = info.context["request"].user
def author_unsubscribe(user, slug):
with local_session() as session:
sub = session.query(AuthorSubscription).\
filter(and_(AuthorSubscription.subscriber == user.slug, AuthorSubscription.author == slug)).\
first()
if not sub:
return { "error" : "subscription not exist" }
raise Exception("subscription not exist")
session.delete(sub)
session.commit()
@mutation.field("subscribe")
@login_required
async def subscribe(_, info, subscription, slug):
user = info.context["request"].user
try:
if subscription == "AUTHOR":
author_subscribe(user, slug)
elif subscription == "TOPIC":
topic_subscribe(user, slug)
elif subscription == "COMMUNITY":
community_subscribe(user, slug)
except Exception as e:
return {"error" : e}
return {}
@mutation.field("unsubscribe")
@login_required
async def unsubscribe(_, info, subscription, slug):
user = info.context["request"].user
try:
if subscription == "AUTHOR":
author_unsubscribe(user, slug)
elif subscription == "TOPIC":
topic_unsubscribe(user, slug)
elif subscription == "COMMUNITY":
community_unsubscribe(user, slug)
except Exception as e:
return {"error" : e}
return {}

View File

@@ -60,29 +60,17 @@ async def update_topic(_, info, input):
return { "topic" : topic }
@mutation.field("topicSubscribe")
@login_required
async def topic_subscribe(_, info, slug):
user = info.context["request"].user
def topic_subscribe(user, slug):
TopicSubscription.create(
subscriber = user.slug,
topic = slug)
return {}
@mutation.field("topicUnsubscribe")
@login_required
async def topic_unsubscribe(_, info, slug):
user = info.context["request"].user
def topic_unsubscribe(user, slug):
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" }
raise Exception("subscription not exist")
session.delete(sub)
session.commit()
return {}