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=[])