From 8f6719eb7209056dafda82c5fa354a09bd481314 Mon Sep 17 00:00:00 2001 From: IgorVolochay Date: Sun, 2 Mar 2025 17:14:20 +0300 Subject: [PATCH] fix: rework /get_random_cards, add visited cards functional --- app/main.py | 40 ++++++++++++++++++++++++++++++++++------ app/mongo_worker.py | 19 +++++++++++++++---- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/app/main.py b/app/main.py index c14b8f6..7bc69be 100644 --- a/app/main.py +++ b/app/main.py @@ -55,14 +55,42 @@ async def get_card(card_id: NonNegativeInt, return BaseResponse(result="There is no card with this card_id", error=True) @app.get("/get_random_cards", status_code=200) -async def get_random_cards(response: Response, +async def get_random_cards(user_id: NonNegativeInt, + response: Response, mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse: - result = mongo.get_random_cards(10, True) - if result: - return BaseResponse(result=result) + cards_visited = mongo.get_visited_cards(user_id) + + if cards_visited.result == "User doesn't exist": + response.status_code = status.HTTP_401_UNAUTHORIZED + return BaseResponse(result="User doesn't exist", error=True) + elif not cards_visited.result.cards_visited: + random_cards = mongo.get_random_cards(10, True) + if random_cards: + return BaseResponse(result=random_cards) + else: + response.status_code = status.HTTP_404_NOT_FOUND + return BaseResponse(result="No active cards", error=True) else: - response.status_code = status.HTTP_404_NOT_FOUND - return BaseResponse(result="No active cards", error=True) + result = list() + trys = 3 + while len(result) < 10 and trys != 0: + random_cards = mongo.get_random_cards(10, True) + if not random_cards: + response.status_code = status.HTTP_404_NOT_FOUND + return BaseResponse(result="No active cards", error=True) + filtered_cards, filtered_cards_id = mongo.filter_cards(random_cards, cards_visited.result.cards_visited) + trys -= 1 + if not filtered_cards: + continue + else: + result.extend(filtered_cards) + cards_visited.result.cards_visited.update(filtered_cards_id) + if not result: + response.status_code = status.HTTP_404_NOT_FOUND + return BaseResponse(result="No active cards fo this user", error=True) + else: + return BaseResponse(result=result) + @app.post("/add_card", status_code=201) async def add_card(new_card: AddCardBody, diff --git a/app/mongo_worker.py b/app/mongo_worker.py index 7f1de2c..7559cfb 100644 --- a/app/mongo_worker.py +++ b/app/mongo_worker.py @@ -57,12 +57,23 @@ class MongoWorker: return counter["counter"] - def get_visited_cards(self, user_id: int) -> Optional[Visited]: + def get_visited_cards(self, user_id: int) -> BaseResponse: document = self.visited_data.find_one({"user_id": user_id}) if not document: - return None + check_user = self.check_user(user_id) + if check_user: + return BaseResponse(result=Visited(user_id=user_id, + cards_visited=set())) + else: + return BaseResponse(result="User doesn't exist", error=True) else: - return Visited.model_validate(document) + return BaseResponse(result=Visited.model_validate(document)) + + def filter_cards(self, random_cards: list[Card], cards_visited: set) -> tuple[list[Optional[Card]], int]: + filtered_cards = [card for card in random_cards if card.card_id not in cards_visited] + filtered_cards_id = [filtered_card.card_id for filtered_card in filtered_cards] + + return filtered_cards, filtered_cards_id def update_visited_cards(self, user_id: int, visited_card_id: int) -> Visited: update_visited = self.visited_data.find_one_and_update({"user_id": user_id}, @@ -159,4 +170,4 @@ if __name__ == "__main__": #print(mongo.like_card(1, 455412573)) #print(mongo.dislike_card(1, 455412573)) print(mongo.update_visited_cards(123, 2)) - print(mongo.get_visited_cards(12)) + print(mongo.get_visited_cards(123).result.cards_visited)