Spaces:
Sleeping
Sleeping
File size: 4,099 Bytes
b21b232 c8df78e 86e971c b21b232 86e971c b21b232 86e971c b21b232 86e971c b21b232 86e971c b21b232 c8df78e b21b232 8ad2ef4 b21b232 8ebe686 b21b232 86e971c b21b232 86e971c b21b232 86e971c b21b232 8ebe686 b21b232 86e971c b21b232 86e971c b21b232 86e971c b21b232 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# Import required libraries
from fastapi import FastAPI, HTTPException
#import redis
from dotenv import load_dotenv
import os
from modules.redistribute import redistribute, insert_element_at_position, handle_text_content
#from modules.models.api import Input, Output, NewItem, UUID
from modules.database import BoostDatabase, UserDatabase, User
from _models.request import RankingRequest
from _models.response import RankingResponse, NewItem
from modules.models.api import UUID
# Load environment variables from .env file
load_dotenv('../.env')
# Access environment variables
redis_port = os.getenv("REDIS_PORT")
fastapi_port = os.getenv("FASTAPI_PORT")
#print("Redis port:", redis_port)
print("FastAPI port:", fastapi_port)
app = FastAPI()
boost_db = BoostDatabase('data/boost_bank.csv')
user_db = UserDatabase()
# Define a health check endpoint
@app.get("/")
async def health_check():
return {"status": "ok"}
# Define FastAPI routes and logic
@app.post("/rank")
async def rerank_items(input_data: RankingRequest) -> RankingResponse:
# who is the user?
user = input_data.session.user_id
date = input_data.session.current_time
platform = input_data.session.platform
items = input_data.items
# TODO consider sampling them?
reranked_ids, first_topic, insertion_pos = redistribute(platform=platform, items=items)
#reranked_ids = [ for id_ in reranked_ids]
print("Receiving boost on: ", first_topic)
print("Position: ", insertion_pos)
user_in_db = user_db.get_user(user_id=user)
# if user already exists -> has boosting records
if user_in_db:
# has been boosted today?
print(user_in_db)
if user_in_db.is_boosted_today():
# return only reranked items, no insertion
return RankingResponse(ranked_ids=reranked_ids, new_items=[])
# user exists and not boosted today yet
else:
new_items = []
boosts_received = user_in_db.boosts
# there was some civic content in the batch
if first_topic != "non-civic":
fetched_boost = boost_db.get_random_boost(topic=first_topic,
platform=platform,
blacklist_ids=boosts_received)
user_db.add_boost_to_user(user_id=user, boost=fetched_boost)
user_db.update_user_boosted_today(user_id=user, date=date)
# insert boost before first civic in batch
reranked_ids = insert_element_at_position(lst=reranked_ids,
element=UUID(fetched_boost['id']),
position=insertion_pos)
return RankingResponse(ranked_ids=reranked_ids, new_items=[NewItem(id=fetched_boost["id"], url=fetched_boost["url"])])
# no civic content to boost on
else:
return RankingResponse(ranked_ids=reranked_ids, new_items=[])
# user doesn't exist
else:
if first_topic != "non-civic":
fetched_boost = boost_db.get_random_boost(topic=first_topic,
platform=platform,
blacklist_ids=[])
user_db.add_user(user_id=user,
user=User(user_id=user, last_boost=date, boosts=[fetched_boost]))
# insert boost before first civic in batch
reranked_ids = insert_element_at_position(lst=reranked_ids,
element=fetched_boost['id'],
position=insertion_pos)
return RankingResponse(ranked_ids=reranked_ids, new_items=[NewItem(id=fetched_boost["id"], url=fetched_boost["url"])])
# no civic content to boost on
else:
return RankingResponse(ranked_ids=reranked_ids, new_items=[])
|