diff --git a/app/main.py b/app/main.py index 7bc69be..d950856 100644 --- a/app/main.py +++ b/app/main.py @@ -2,13 +2,14 @@ import uvicorn import asyncio from schemas.api_schemas import * +from schemas.base_schemas import * from mongo_worker import MongoWorker -from base_moderation import moderate_text +from tools.base_moderation import moderate_text from fastapi import FastAPI, Depends, Response, status -app = FastAPI() +app: FastAPI = FastAPI() @app.get("/check_user", status_code=200) async def check_user(user_id: NonNegativeInt, @@ -71,7 +72,7 @@ async def get_random_cards(user_id: NonNegativeInt, response.status_code = status.HTTP_404_NOT_FOUND return BaseResponse(result="No active cards", error=True) else: - result = list() + result: list[Card] = list() trys = 3 while len(result) < 10 and trys != 0: random_cards = mongo.get_random_cards(10, True) @@ -91,23 +92,43 @@ async def get_random_cards(user_id: NonNegativeInt, else: return BaseResponse(result=result) - @app.post("/add_card", status_code=201) async def add_card(new_card: AddCardBody, response: Response, mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse: if moderate_text(new_card.choice_A) and moderate_text(new_card.choice_B): - card = mongo.add_card(new_card.choice_A, - new_card.choice_B, - new_card.author_id) + card = mongo.add_card_by_api(new_card.choice_A, + new_card.choice_B, + new_card.author_id) return BaseResponse(result=card) else: response.status_code = status.HTTP_400_BAD_REQUEST return BaseResponse(result="Card has not passed base moderation", error=True) + + +@app.patch("/select_choice", status_code=200) +async def select_choice(choice_data: SelectChoice, + response: Response, + mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse: + check_visited = mongo.get_visited_cards(choice_data.user_id) + if check_visited.error: + response.status_code = status.HTTP_404_NOT_FOUND + return check_visited + elif not check_visited.error and choice_data.card_id in check_visited.result.cards_visited: + response.status_code = status.HTTP_403_FORBIDDEN + return BaseResponse(result="Card already visited!", error=True) + else: + select_choice_result = mongo.select_choice(choice_data.card_id, choice_data.choice) + if select_choice_result.error: + response.status_code = status.HTTP_404_NOT_FOUND + return select_choice_result + else: + update_visited_result = mongo.update_visited_cards(choice_data.user_id, choice_data.card_id) + return BaseResponse(result="Select choice complite!") async def main(): - config = uvicorn.Config("main:app", port=5000, log_level="info") + config = uvicorn.Config("main:app", port=5000, log_level="debug") server = uvicorn.Server(config) await server.serve() diff --git a/app/mongo_worker.py b/app/mongo_worker.py index d4424e5..678d6ef 100644 --- a/app/mongo_worker.py +++ b/app/mongo_worker.py @@ -83,7 +83,7 @@ class MongoWorker: return Visited.model_validate(update_visited) - def add_card(self, choice_A: str, choice_B: str, author_id: int) -> Card: + def add_card_by_api(self, choice_A: str, choice_B: str, author_id: int) -> Card: new_card = Card(card_id=self.get_and_update_counter(counter_name="card"), choice_A=choice_A, choice_B=choice_B, @@ -96,6 +96,15 @@ class MongoWorker: print(exception) return new_card + def add_card_by_base_model(self, new_card: Card) -> Card: + new_card.card_id = self.get_and_update_counter(counter_name="card") + try: + self.game_data.insert_one(new_card.model_dump()) + return new_card + except Exception as exception: + print(exception) + return new_card + def get_card(self, card_id: int) -> Optional[Card]: document = self.game_data.find_one({"card_id": card_id}) if document: diff --git a/app/schemas/api_schemas.py b/app/schemas/api_schemas.py index e71c99e..e8e33d0 100644 --- a/app/schemas/api_schemas.py +++ b/app/schemas/api_schemas.py @@ -19,4 +19,10 @@ class AddCardBody(BaseModel): choice_A: str choice_B: str - author_id: NonNegativeInt \ No newline at end of file + author_id: NonNegativeInt + +class SelectChoice(BaseModel): + user_id: NonNegativeInt + card_id: NonNegativeInt + + choice: typing.Literal["A", "B"] \ No newline at end of file diff --git a/app/tools/_add_base_cards.py b/app/tools/_add_base_cards.py index 403f137..83cc700 100644 --- a/app/tools/_add_base_cards.py +++ b/app/tools/_add_base_cards.py @@ -4,7 +4,7 @@ import json from datetime import datetime from pathlib import Path -sys.path.append('..') +#sys.path.append('..') from mongo_worker import MongoWorker from schemas.base_schemas import Card diff --git a/app/base_moderation.py b/app/tools/base_moderation.py similarity index 93% rename from app/base_moderation.py rename to app/tools/base_moderation.py index 5623d2f..ad6772a 100644 --- a/app/base_moderation.py +++ b/app/tools/base_moderation.py @@ -1,6 +1,6 @@ import re -from dirty_words import dirty_words_set +from tools.data.dirty_words import dirty_words_set def is_not_empty(text: str) -> bool: """Checks that the text is not empty.""" diff --git a/app/tools/data/base_cards.json b/app/tools/data/base_cards.json index f57d95e..8320fcc 100644 --- a/app/tools/data/base_cards.json +++ b/app/tools/data/base_cards.json @@ -31,8 +31,8 @@ }, { "card_id": 3, - "choice_A": "Поездка в горы", - "choice_B": "Поездка на море", + "choice_A": "Отпуск в горах", + "choice_B": "Отпуск на море", "count_choice_A": 0, "count_choice_B": 0, "count_total": 0, diff --git a/app/dirty_words.py b/app/tools/data/dirty_words.py similarity index 100% rename from app/dirty_words.py rename to app/tools/data/dirty_words.py