From 6d61e038e7df55f3929f2c52489751b00b0c93a1 Mon Sep 17 00:00:00 2001 From: Untone Date: Sat, 2 Nov 2024 22:34:20 +0300 Subject: [PATCH] create-reaction-fix-4 --- resolvers/follower.py | 17 ++++++------- resolvers/reaction.py | 58 +++++++++++++++++++------------------------ 2 files changed, 32 insertions(+), 43 deletions(-) diff --git a/resolvers/follower.py b/resolvers/follower.py index 0c4561d1..aa7d2f66 100644 --- a/resolvers/follower.py +++ b/resolvers/follower.py @@ -25,7 +25,7 @@ from utils.logger import root_logger as logger @mutation.field("follow") @login_required -async def follow(_, info, what, slug): +async def follow(_, info, what, slug="", entity_id=0): logger.debug("Начало выполнения функции 'follow'") user_id = info.context.get("user_id") follower_dict = info.context.get("author") @@ -50,8 +50,6 @@ async def follow(_, info, what, slug): entity_class, follower_class, get_cached_follows_method, cache_method = entity_classes[what] entity_type = what.lower() - - entity_id = None entity_dict = None try: @@ -63,7 +61,8 @@ async def follow(_, info, what, slug): if not entity: logger.warning(f"{what.lower()} не найден по slug: {slug}") return {"error": f"{what.lower()} not found"} - entity_id = entity.id + if not entity_id and entity: + entity_id = entity.id entity_dict = entity.dict() logger.debug(f"entity_id: {entity_id}, entity_dict: {entity_dict}") @@ -108,7 +107,7 @@ async def follow(_, info, what, slug): @mutation.field("unfollow") @login_required -async def unfollow(_, info, what, slug): +async def unfollow(_, info, what, slug="", entity_id=0): logger.debug("Начало выполнения функции 'unfollow'") user_id = info.context.get("user_id") follower_dict = info.context.get("author") @@ -134,9 +133,6 @@ async def unfollow(_, info, what, slug): entity_class, follower_class, get_cached_follows_method, cache_method = entity_classes[what] entity_type = what.lower() - # logger.debug(f"entity_class: {entity_class}, follower_class: {follower_class}, entity_type: {entity_type}") - - entity_id = None follows = [] error = None @@ -148,8 +144,9 @@ async def unfollow(_, info, what, slug): if not entity: logger.warning(f"{what.lower()} не найден по slug: {slug}") return {"error": f"{what.lower()} not found"} - entity_id = entity.id - logger.debug(f"entity_id: {entity_id}") + if entity and not entity_id: + entity_id = entity.id + logger.debug(f"entity_id: {entity_id}") sub = ( session.query(follower_class) diff --git a/resolvers/reaction.py b/resolvers/reaction.py index d5a9f2d2..c69501f2 100644 --- a/resolvers/reaction.py +++ b/resolvers/reaction.py @@ -6,7 +6,7 @@ from sqlalchemy.orm import aliased from orm.author import Author from orm.rating import PROPOSAL_REACTIONS, RATING_REACTIONS, is_negative, is_positive from orm.reaction import Reaction, ReactionKind -from orm.shout import Shout +from orm.shout import Shout, ShoutAuthor from resolvers.follower import follow from resolvers.proposals import handle_proposing from resolvers.stat import update_author_stat @@ -286,42 +286,34 @@ async def create_reaction(_, info, reaction): try: with local_session() as session: - shout = session.query(Shout).filter(Shout.id == shout_id).first() - authors = [a.id for a in shout.authors] - is_author = bool(list(filter(lambda x: x == int(author_id), authors))) - logger.debug(f"Loaded shout: {shout and shout.id}") + authors = session.query(ShoutAuthor.author).filter(ShoutAuthor.shout == shout_id).scalar() + is_author = ( + bool(list(filter(lambda x: x == int(author_id), authors))) if isinstance(authors, list) else False + ) + reaction_input["created_by"] = author_id + kind = reaction_input.get("kind") - if shout: - shout_dict = shout.dict() - reaction_input["created_by"] = author_id - kind = reaction_input.get( - "kind", ReactionKind.COMMENT.value if isinstance(reaction_input.get("body"), str) else None - ) + # handle ratings + if kind in RATING_REACTIONS: + logger.debug(f"creating rating reaction: {kind}") + error_result = prepare_new_rating(reaction_input, shout_id, session, author_id) + if error_result: + logger.error(f"Rating preparation error: {error_result}") + return error_result - logger.debug(f"Reaction kind: {kind}") + # handle all reactions + rdict = await _create_reaction(session, shout_id, is_author, author_id, reaction_input) + logger.debug(f"Created reaction result: {rdict}") - if kind in RATING_REACTIONS: - error_result = prepare_new_rating(reaction_input, shout_id, session, author_id) - if error_result: - logger.error(f"Rating preparation error: {error_result}") - return error_result + # follow if liked + if kind == ReactionKind.LIKE.value: + try: + follow(None, info, "shout", shout_id=shout_id) + except Exception: + pass - logger.debug(f"Creating reaction for shout: {shout_dict['id']}") - rdict = await _create_reaction(session, shout_id, is_author, author_id, reaction_input) - logger.debug(f"Created reaction result: {rdict}") - - # follow if liked - if kind == ReactionKind.LIKE.value: - try: - follow(None, info, "shout", shout_dict["slug"]) - except Exception: - pass - - rdict["created_by"] = author_dict - return {"reaction": rdict} - else: - logger.error(f"Shout not found with ID: {shout_id}") - return {"error": "Shout not found"} + rdict["created_by"] = author_dict + return {"reaction": rdict} except Exception as e: import traceback