Spaces:
				
			
			
	
			
			
		Paused
		
	
	
	
			
			
	
	
	
	
		
		
		Paused
		
	update profile
Browse files- app/auth.py +62 -0
    	
        app/auth.py
    CHANGED
    
    | @@ -9,6 +9,8 @@ from app.models import User | |
| 9 | 
             
            import os
         | 
| 10 | 
             
            import logging
         | 
| 11 | 
             
            from dotenv import load_dotenv
         | 
|  | |
|  | |
| 12 |  | 
| 13 | 
             
            router = APIRouter()
         | 
| 14 | 
             
            logger = logging.getLogger(__name__)
         | 
| @@ -22,6 +24,29 @@ ALGORITHM = "HS256" | |
| 22 | 
             
            # Password hashing config
         | 
| 23 | 
             
            pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
         | 
| 24 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 25 |  | 
| 26 | 
             
            # Request Schemas
         | 
| 27 | 
             
            class SignUp(BaseModel):
         | 
| @@ -38,6 +63,43 @@ class Login(BaseModel): | |
| 38 | 
             
                password: str
         | 
| 39 |  | 
| 40 |  | 
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
|  | |
| 41 | 
             
            @router.post("/auth/signup")
         | 
| 42 | 
             
            async def signup(data: SignUp, db: AsyncSession = Depends(get_db)):
         | 
| 43 | 
             
                # Check if user already exists
         | 
|  | |
| 9 | 
             
            import os
         | 
| 10 | 
             
            import logging
         | 
| 11 | 
             
            from dotenv import load_dotenv
         | 
| 12 | 
            +
            from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
         | 
| 13 | 
            +
            from jose import JWTError
         | 
| 14 |  | 
| 15 | 
             
            router = APIRouter()
         | 
| 16 | 
             
            logger = logging.getLogger(__name__)
         | 
|  | |
| 24 | 
             
            # Password hashing config
         | 
| 25 | 
             
            pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
         | 
| 26 |  | 
| 27 | 
            +
            security = HTTPBearer()
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            async def get_current_user(token: HTTPAuthorizationCredentials = Depends(security),
         | 
| 30 | 
            +
                                       db: AsyncSession = Depends(get_db)):
         | 
| 31 | 
            +
                credentials_exception = HTTPException(
         | 
| 32 | 
            +
                    status_code=401,
         | 
| 33 | 
            +
                    detail="Could not validate credentials",
         | 
| 34 | 
            +
                    headers={"WWW-Authenticate": "Bearer"},
         | 
| 35 | 
            +
                )
         | 
| 36 | 
            +
                try:
         | 
| 37 | 
            +
                    payload = jwt.decode(token.credentials, SECRET_KEY, algorithms=[ALGORITHM])
         | 
| 38 | 
            +
                    user_id: int = payload.get("user_id")
         | 
| 39 | 
            +
                    if user_id is None:
         | 
| 40 | 
            +
                        raise credentials_exception
         | 
| 41 | 
            +
                except JWTError:
         | 
| 42 | 
            +
                    raise credentials_exception
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                result = await db.execute(select(User).where(User.id == user_id))
         | 
| 45 | 
            +
                user = result.scalar_one_or_none()
         | 
| 46 | 
            +
                if user is None:
         | 
| 47 | 
            +
                    raise credentials_exception
         | 
| 48 | 
            +
                return user
         | 
| 49 | 
            +
             | 
| 50 |  | 
| 51 | 
             
            # Request Schemas
         | 
| 52 | 
             
            class SignUp(BaseModel):
         | 
|  | |
| 63 | 
             
                password: str
         | 
| 64 |  | 
| 65 |  | 
| 66 | 
            +
            class UpdateProfile(BaseModel):
         | 
| 67 | 
            +
                mobile: str | None = None
         | 
| 68 | 
            +
                name: str | None = None
         | 
| 69 | 
            +
                dob: str | None = None
         | 
| 70 | 
            +
                preparing_for: str | None = None
         | 
| 71 | 
            +
             | 
| 72 | 
            +
             | 
| 73 | 
            +
            @router.put("/auth/profile")
         | 
| 74 | 
            +
            async def update_profile(data: UpdateProfile,
         | 
| 75 | 
            +
                                     current_user: User = Depends(get_current_user),
         | 
| 76 | 
            +
                                     db: AsyncSession = Depends(get_db)):
         | 
| 77 | 
            +
                # Update user fields if provided
         | 
| 78 | 
            +
                if data.mobile is not None:
         | 
| 79 | 
            +
                    current_user.mobile = data.mobile
         | 
| 80 | 
            +
                if data.name is not None:
         | 
| 81 | 
            +
                    current_user.name = data.name
         | 
| 82 | 
            +
                if data.dob is not None:
         | 
| 83 | 
            +
                    current_user.dob = data.dob
         | 
| 84 | 
            +
                if data.preparing_for is not None:
         | 
| 85 | 
            +
                    current_user.preparing_for = data.preparing_for
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                try:
         | 
| 88 | 
            +
                    await db.commit()
         | 
| 89 | 
            +
                    await db.refresh(current_user)
         | 
| 90 | 
            +
                    return {"message": "Profile updated successfully",
         | 
| 91 | 
            +
                            "user": {"id": current_user.id,
         | 
| 92 | 
            +
                                     "email": current_user.email,
         | 
| 93 | 
            +
                                     "mobile": current_user.mobile,
         | 
| 94 | 
            +
                                     "name": current_user.name,
         | 
| 95 | 
            +
                                     "dob": current_user.dob,
         | 
| 96 | 
            +
                                     "preparing_for": current_user.preparing_for}}
         | 
| 97 | 
            +
                except Exception as e:
         | 
| 98 | 
            +
                    await db.rollback()
         | 
| 99 | 
            +
                    logger.error(f"Profile update error: {e}")
         | 
| 100 | 
            +
                    raise HTTPException(status_code=500, detail="Internal Server Error")
         | 
| 101 | 
            +
             | 
| 102 | 
            +
             | 
| 103 | 
             
            @router.post("/auth/signup")
         | 
| 104 | 
             
            async def signup(data: SignUp, db: AsyncSession = Depends(get_db)):
         | 
| 105 | 
             
                # Check if user already exists
         |