-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
172 lines (142 loc) · 5.45 KB
/
main.py
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
from fastapi import FastAPI, Depends, HTTPException
from models.database_model import Base, engine, Tutor, SessionLocal,Topic, tutor_topic_association, Message,Registered_User
from models.sampleInsert import populate_db
from dotenv import load_dotenv
from sqlalchemy.orm import Session, joinedload
from fastapi.middleware.cors import CORSMiddleware
from models.createUser import createUser, createTutorHelper, getUsersByEmail, viewTopics
from models.createUser import UserCreate, TutorCreate
from models.search import searchTutorsTopics, searchTutorsClasses, searchTutorsLanguage, searchTutorsAll, SearchInput, getUserTutors
load_dotenv()
app = FastAPI()
origins = [
"*",
]
app.add_middleware(
CORSMiddleware,
allow_origins=origins,
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Dependency
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.get("/")
async def root():
return {"message": "Hello World"}
@app.on_event("startup")
async def gen():
Base.metadata.create_all(engine)
@app.get("/populate")
async def populate():
populate_response = populate_db()
if populate_response == 'Database populated successfully':
return {"message": "Database populated successfully"}
else:
raise HTTPException(status_code=500, detail=populate_response)
@app.post("/search")
async def searchTutors(type: str, input: SearchInput, db: Session = Depends(get_db)):
print(type)
if(type == "Subject"):
tutors = searchTutorsTopics(input.text, db)
elif (type == "Classes"):
tutors = searchTutorsClasses(input.text, db)
elif (type == "Language"):
tutors = searchTutorsLanguage(input.text, db)
else:
tutors = searchTutorsAll(db)
return tutors
@app.get("/userTutors")
async def getUserTutors(user_id: str, db: Session = Depends(get_db)):
tutors = getUserTutors(user_id, db)
return tutors
# create a new user
@app.post("/createUsers", response_model=UserCreate)
async def createUsers(user:UserCreate, db: Session = Depends(get_db))-> Registered_User:
registered_userEmail = getUsersByEmail(user.email, db)
if registered_userEmail:
raise HTTPException(status_code=400, detail="User already registered")
new_user = createUser(user, db)
return new_user
@app.get("/tutor")
async def fetchTutors(id:int, db: Session = Depends(get_db)):
tutor = db.query(Tutor).join(Registered_User, Tutor.user_email == Registered_User.email) \
.options(joinedload(Tutor.user), joinedload(Tutor.topics), joinedload(Tutor.times)) \
.filter(Registered_User.id == id) \
.first()
if tutor:
return tutor
else:
print("No tutor found with that ID.")
return None
# create a new tutor
@app.post("/createTutor", response_model=None)
async def createTutor(user:TutorCreate, db: Session = Depends(get_db))-> Tutor:
try:
new_tutor = createTutorHelper(user, db)
topics = [topic.name for topic in new_tutor.topics]
return {
"email": new_tutor.user_email,
"topics": topics,
"cv_link": new_tutor.cv_link,
"description": new_tutor.description,
"classes": new_tutor.classes,
"price": new_tutor.price,
"average_ratings": new_tutor.average_ratings,
"times_available": new_tutor.times_available,
"main_languages": new_tutor.main_languages,
"prefer_in_person": new_tutor.prefer_in_person,
"other_languages": new_tutor.other_languages,
"profile_picture_link": new_tutor.profile_picture_link,
"video_link": new_tutor.video_link
}
except IntegrityError as e:
if e and 'Duplicate entry' in str(e):
raise HTTPException(status_code=400, detail="User already exist in Database")
else:
raise HTTPException(status_code=400, detail=f'Error: {e}')
except Exception as e:
raise HTTPException(status_code=500, detail=f'Error: {e}')
#get user's information
@app.post("/user/{user_email}")
def get_user_with_messages(user_email: str, db: Session = Depends(get_db)):
user = getUsersByEmail(user_email, db)
messages = [message.message_text for message in user.messages]
return {
"email": user.email,
"firstName": user.first_name,
"lastName": user.last_name,
"email": user.email,
"adminStatus": user.admin_status,
"verifiedStatus": user.verified_status,
"messages": messages
}
# get all topics
@app.get("/getTopics")
async def getTopics(db: Session = Depends(get_db)):
return viewTopics(db)
@app.post("/message")
async def postMessage(sender_id: str, receiver_id: str, text: str, db: Session = Depends(get_db)):
# Check if sender and receiver exist
sender = db.query(Registered_User).filter(Registered_User.id == sender_id).first()
if not sender:
raise HTTPException(status_code=404, detail="Sender not found")
receiver = db.query(Registered_User).filter(Registered_User.id == receiver_id).first()
if not receiver:
raise HTTPException(status_code=404, detail="Receiver not found")
# Create a new message instance
new_message = Message(
receiver_id=receiver_id,
message_text=text,
sender_id=sender_id
)
# Add the new message to the database session and commit
db.add(new_message)
db.commit()
db.refresh(new_message)
return new_message