-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.py
108 lines (88 loc) · 2.47 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
from typing import Dict
from fastapi import (
status,
HTTPException,
UploadFile,
FastAPI,
Depends,
File,
Body
)
from fastapi.security import OAuth2PasswordBearer
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
import cloudinary
import cloudinary.uploader
from db_initializer import get_db
from models import users as user_model
from services.db import users as user_db_services
from schemas.users import (
CreateUserSchema,
UserLoginSchema,
UserSchema
)
app = FastAPI()
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")
@app.post('/login', response_model=Dict)
def login(
payload: OAuth2PasswordRequestForm = Depends(),
session: Session = Depends(get_db)
):
"""Processes user's authentication and returns a token
on successful authentication.
request body:
- username: Unique identifier for a user e.g email,
phone number, name
- password:
"""
try:
user:user_model.User = user_db_services.get_user(
session=session, email=payload.username
)
except:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid user credentials"
)
is_validated:bool = user.validate_password(payload.password)
if not is_validated:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Invalid user credentials"
)
return user.generate_token()
@app.post('/signup', response_model=UserSchema)
def signup(
payload: CreateUserSchema = Body(),
session:Session=Depends(get_db)
):
"""Processes request to register user account."""
payload.hashed_password = user_model.User.hash_password(payload.hashed_password)
return user_db_services.create_user(session, user=payload)
@app.get("/profile/{id}", response_model=UserSchema)
def profile(
id:int,
session:Session=Depends(get_db),
token: str = Depends(oauth2_scheme),
):
"""Processes request to retrieve the requesting user
profile
"""
return user_db_services.get_user_by_id(session=session, id=id)
@app.post('/upload-profile-image', response_model=str)
def upload_profile_image(
# token: str = Depends(oauth2_scheme),
file:UploadFile = File(description="User profile image"),
):
"""Processes request to upload profile image"""
# utilizes cloudinary to upload profile
# collect image url and save to db
# return response
cloudinary.uploader.upload(
file.file,
overwrite=True,
unique_filename=False,
public_id="test_image",
)
image_url = cloudinary.CloudinaryImage("test_image").build_url()
return image_url