diff --git a/app/main.py b/app/main.py index d950856..21ead3c 100644 --- a/app/main.py +++ b/app/main.py @@ -125,7 +125,29 @@ async def select_choice(choice_data: SelectChoice, else: update_visited_result = mongo.update_visited_cards(choice_data.user_id, choice_data.card_id) return BaseResponse(result="Select choice complite!") + +@app.patch("/like_card", status_code=200) +async def like_card(like_data: ReactionCard, + response: Response, + mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse: + result = mongo.like_card(like_data.card_id, like_data.user_id) + if not result.error and result.result: + return BaseResponse(result="Added like to card") + else: + response.status_code = status.HTTP_404_NOT_FOUND + return result +@app.patch("/dislike_card", status_code=200) +async def dislike_card(dislike_data: ReactionCard, + response: Response, + mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse: + result = mongo.dislike_card(dislike_data.card_id, dislike_data.user_id) + if not result.error and result.result: + return BaseResponse(result="Added dislike to card") + else: + response.status_code = status.HTTP_404_NOT_FOUND + return result + async def main(): config = uvicorn.Config("main:app", port=5000, log_level="debug") diff --git a/app/mongo_worker.py b/app/mongo_worker.py index 678d6ef..5ffeadc 100644 --- a/app/mongo_worker.py +++ b/app/mongo_worker.py @@ -140,31 +140,55 @@ class MongoWorker: else: return BaseResponse(result=result, error=False) - def like_card(self, card_id: int, user_id: int) -> BaseResponse: - update_card_info = self.game_data.find_one_and_update({"card_id": card_id}, - {"$inc": {"count_likes": 1}}) - if not update_card_info: - return BaseResponse(result="Card doesn't exist", error=True) + def check_user_reactions(self, user_id: int, card_id: int) -> BaseResponse: + user_info: User = self.get_user(user_id) + liked_card_ids: list = user_info.liked_card_ids + disliked_card_ids: list = user_info.disliked_card_ids + + if card_id in liked_card_ids: + return BaseResponse(result="Card already liked", error=True) + elif card_id in disliked_card_ids: + return BaseResponse(result="Card already disliked", error=True) else: + return BaseResponse(result="No reactions", error=False) + + def like_card(self, card_id: int, user_id: int) -> BaseResponse: + if self.check_user(user_id): + user_reaction = self.check_user_reactions(user_id, card_id) + if user_reaction.error: + return user_reaction + update_card_info = self.game_data.find_one_and_update({"card_id": card_id}, + {"$inc": {"count_likes": 1}}) + if not update_card_info: + return BaseResponse(result="Card doesn't exist", error=True) + add_card_to_user = self.users_data.update_one({'user_id': user_id}, {'$push': {'liked_card_ids': card_id}}) if not add_card_to_user: return BaseResponse(result="User doesn't exist", error=True) else: return BaseResponse(result=True, error=False) + else: + return BaseResponse(result="User doesn't exist", error=True) def dislike_card(self, card_id: int, user_id: int) -> BaseResponse: - update_card_info = self.game_data.find_one_and_update({"card_id": card_id}, - {"$inc": {"count_dislikes": 1}}) - if not update_card_info: - return BaseResponse(result="Card doesn't exist", error=True) - else: + if self.check_user(user_id): + user_reaction = self.check_user_reactions(user_id, card_id) + if user_reaction.error: + return user_reaction + update_card_info = self.game_data.find_one_and_update({"card_id": card_id}, + {"$inc": {"count_dislikes": 1}}) + if not update_card_info: + return BaseResponse(result="Card doesn't exist", error=True) + add_card_to_user = self.users_data.update_one({'user_id': user_id}, {'$push': {'disliked_card_ids': card_id}}) if not add_card_to_user: return BaseResponse(result="User doesn't exist", error=True) else: return BaseResponse(result=True, error=False) + else: + return BaseResponse(result="User doesn't exist", error=True) if __name__ == "__main__":