mekasu0124

Untitled

Jun 11th, 2024
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.77 KB | None | 0 0
  1. # backend/main.py
  2. import bcrypt
  3. import api.models.models as models
  4.  
  5. from fastapi import FastAPI, HTTPException, Depends, Response
  6.  
  7. from starlette.middleware import Middleware
  8. from starlette.middleware.cors import CORSMiddleware
  9.  
  10. from typing import Annotated
  11. from sqlalchemy.orm import Session
  12. from pydantic import BaseModel, Field
  13.  
  14. from api.database.database import SessionLocal, engine
  15. from api.routers.routes import router
  16.  
  17. from api.validation.account_validation import (
  18.     validate_email,
  19.     validate_password,
  20.     is_name_not_in_password,
  21.     validate_universal_phone_number,
  22.     hash_password
  23. )
  24.  
  25. cors_middleware = [
  26.     Middleware(
  27.         CORSMiddleware,
  28.         allow_origins=[
  29.             "http://localhost:3000",
  30.             "http://localhost:3001",
  31.             "http://127.0.0.1:3000",
  32.             "http://127.0.0.1:3001"
  33.         ],
  34.         allow_credentials=True,
  35.         allow_headers=["*"],
  36.         allow_methods=["*"]
  37.     )
  38. ]
  39.  
  40. app = FastAPI(middleware=cors_middleware)
  41. app.include_router(router)
  42.  
  43. class UserBase(BaseModel):
  44.     first_name: str = Field(alias="firstName")
  45.     last_name: str = Field(alias="lastName")
  46.     email_address: str = Field(alias="emailAddress")
  47.     phone_number: str = Field(alias="phoneNumber")
  48.     password: str = Field(alias="password")
  49.     dob: str = Field(alias="dateOfBirth")
  50.  
  51. class UserModel(UserBase):
  52.     id: int
  53.  
  54.     class Config:
  55.         from_attributes = True
  56.  
  57. class LoginModel(BaseModel):
  58.     email_address: str = Field(alias="emailAddress")
  59.     password: str = Field(alias="password")
  60.  
  61. class LoginResponseModel(BaseModel):
  62.     user_name: str = Field(alias="userName")
  63.     logged_in: bool = Field(alias="loggedIn")
  64.  
  65. def map_user_to_login_response(user: models.User):
  66.     user_name = user.first_name[0] + user.last_name[0]
  67.     return LoginResponseModel(user_name = user_name, logged_in = True)
  68.  
  69. def get_db():
  70.     db = SessionLocal()
  71.  
  72.     try:
  73.         yield db
  74.     finally:
  75.         db.close()
  76.  
  77. db_dependency = Annotated[Session, Depends(get_db)]
  78. models.Base.metadata.create_all(bind=engine)
  79.  
  80. @app.post("/create_account/")
  81. async def create_new_user(user: UserBase, db: db_dependency):
  82.     if not validate_email(user.email_address):
  83.         raise HTTPException(status_code=400, detail="Not A Valid Email")
  84.  
  85.     if not validate_password(user.password):
  86.         raise HTTPException(status_code=400, detail="Not A Valid Password")
  87.  
  88.     if not is_name_not_in_password(user.first_name, user.last_name, user.password):
  89.         raise HTTPException(status_code=400, detail="Name Cannot Be In Password")
  90.  
  91.     if not validate_universal_phone_number(user.phone_number):
  92.         raise HTTPException(status_code=400, detail="Invalid Phone Number")
  93.  
  94.     query = db.query(models.User.id).filter(models.User.email_address == user.email_address)
  95.     user_exists = db.query(query.exists()).scalar()
  96.  
  97.     if user_exists:
  98.         raise HTTPException(status_code=409, detail="User Already Exists")
  99.  
  100.     user.password = hash_password(user.password)
  101.  
  102.     user = models.User(**user.model_dump())
  103.  
  104.     db.add(user)
  105.     db.commit()
  106.     db.refresh(user)
  107.     return user
  108.  
  109. @app.get("/")
  110. async def root():
  111.     return { "message": "Welcome To Mek's Hub!" }
  112.  
  113. @app.post("/login/")
  114. async def check_user_login(user: LoginModel, db: db_dependency):
  115.     db_user = db.query(models.User).filter(models.User.email_address == user.email_addres).first()
  116.  
  117.     if db_user is None:
  118.         raise HTTPException(status_code=400, detail="Email Address/Password Invalid")
  119.  
  120.     enc_pw = db.user.password
  121.     inc_pw = user.password.encode("utf-8")
  122.  
  123.     if bcrypt.checkpw(inc_pw, enc_pw) == False:
  124.         raise HTTPException(status_code=409, detail="Email Address/Password Does Not Match")
  125.  
  126.     return map_user_to_login_response(db_user)
Advertisement
Add Comment
Please, Sign In to add comment