Files
thisORthat/app/main.py
T

115 lines
4.5 KiB
Python

import uvicorn
import asyncio
from schemas.api_schemas import *
from mongo_worker import MongoWorker
from base_moderation import moderate_text
from fastapi import FastAPI, Depends, Response, status
app = FastAPI()
@app.get("/check_user", status_code=200)
async def check_user(user_id: NonNegativeInt,
mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse:
result = mongo.check_user(user_id)
return BaseResponse(result=result)
@app.get("/get_user", status_code=200)
async def get_user(user_id: NonNegativeInt,
response: Response,
mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse:
if mongo.check_user(user_id):
result = mongo.get_user(user_id)
return BaseResponse(result=result)
else:
response.status_code = status.HTTP_404_NOT_FOUND
return BaseResponse(result="User doesn't exist", error=True)
@app.post("/add_user", status_code=201)
async def add_user(new_user: AddUserBody,
response: Response,
mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse:
if not mongo.check_user(new_user.user_id):
result = mongo.add_user(new_user.user_id,
new_user.username,
new_user.first_name,
new_user.last_name,
new_user.photo_url)
return BaseResponse(result=result)
else:
response.status_code = status.HTTP_409_CONFLICT
return BaseResponse(result="User already exist", error=True)
@app.get("/get_card", status_code=200)
async def get_card(card_id: NonNegativeInt,
response: Response,
mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse:
card = mongo.get_card(card_id)
if card:
return BaseResponse(result=card)
else:
response.status_code = status.HTTP_404_NOT_FOUND
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(user_id: NonNegativeInt,
response: Response,
mongo: MongoWorker = Depends(MongoWorker)) -> BaseResponse:
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:
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,
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)
return BaseResponse(result=card)
else:
response.status_code = status.HTTP_400_BAD_REQUEST
return BaseResponse(result="Card has not passed base moderation", error=True)
async def main():
config = uvicorn.Config("main:app", port=5000, log_level="info")
server = uvicorn.Server(config)
await server.serve()
if __name__ == "__main__":
asyncio.run(main())