feat: front end for login

This commit was merged in pull request #5.
This commit is contained in:
2025-06-14 10:02:02 -04:00
parent df5b247cdd
commit 8db73f113c
19 changed files with 531 additions and 68 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+7 -3
View File
@@ -31,10 +31,10 @@ def delete_item(db: Session, item_id: int):
def authenticate_user(db: Session, username: str, password: str):
user = get_user_by_username(db, username)
user = get_user_by_username(db, username) or get_user_by_email(db, username)
if not user:
return None
if not verify_password(password, str(user.hashed_password)):
if not verify_password(password, user.hashed_password):
return None
return user
@@ -50,7 +50,11 @@ def get_user_by_email(db: Session, email: str):
def create_user(db: Session, user: schemas.UserCreate):
hashed_pw = hash_password(user.password)
db_user = models.User(
username=user.username, email=user.email, hashed_password=hashed_pw
username=user.username,
email=user.email,
hashed_password=hashed_pw,
permissions=user.permissions,
subscriber=user.subscriber,
)
db.add(db_user)
db.commit()
+10
View File
@@ -1,4 +1,5 @@
from fastapi import FastAPI, Depends, HTTPException, status
from fastapi.middleware.cors import CORSMiddleware
from fastapi.security import OAuth2PasswordRequestForm
from sqlalchemy.orm import Session
@@ -10,6 +11,14 @@ Base.metadata.create_all(bind=engine)
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000", "https://localhost:3000"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Dependency
def get_db():
@@ -81,4 +90,5 @@ def register_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
status_code=status.HTTP_400_BAD_REQUEST,
detail="Account with that email already registered",
)
# Default Cases
return crud.create_user(db, user)
+3 -1
View File
@@ -24,13 +24,15 @@ class UserBase(BaseModel):
class UserCreate(UserBase):
password: str
permissions: dict = {}
subscriber: bool = False
class UserOut(UserBase):
id: int
class Config:
orm_mode = True
from_attributes = True
# Other Schemas
+3 -3
View File
@@ -1,4 +1,3 @@
import logging
import os
from typing import Any, Mapping
from passlib.context import CryptContext
@@ -6,7 +5,8 @@ from datetime import UTC, datetime, timedelta
from jose import JWTError, jwt
from app.logger_config import Logger
pwd_context = CryptContext(schemas=["bcrypt"], deprecated="auto")
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
_logger = Logger().logger
def hash_password(password: str) -> str:
@@ -37,5 +37,5 @@ def decode_access_token(token: str) -> Mapping[Any, Any] | None:
try:
return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
except JWTError:
logging.exception(msg="Failed to Decode JWT", extra={"TOKEN": token})
_logger.exception(msg="Failed to Decode JWT", extra={"TOKEN": token})
return None