60 lines
3.1 KiB
Python
60 lines
3.1 KiB
Python
from typing import Optional
|
|
from sqlalchemy.orm import Session
|
|
from models.user import User
|
|
from schemas.user import UserLogin
|
|
|
|
def authenticate_user(db: Session, user_data: UserLogin) -> Optional[User]:
|
|
"""
|
|
Authenticate a user by checking if the provided email and password match a record in the database.
|
|
|
|
Args:
|
|
db (Session): The SQLAlchemy database session.
|
|
user_data (UserLogin): The user login data containing email and password.
|
|
|
|
Returns:
|
|
Optional[User]: The User object if authentication is successful, None otherwise.
|
|
"""
|
|
user = db.query(User).filter(User.email == user_data.email).first()
|
|
if user and user.verify_password(user_data.password):
|
|
return user
|
|
return None
|
|
|
|
def get_user_with_phone(db: Session, user_data: UserLogin) -> Optional[User]:
|
|
"""
|
|
Retrieve a user object from the database, including the phone number, based on the provided login data.
|
|
|
|
Args:
|
|
db (Session): The SQLAlchemy database session.
|
|
user_data (UserLogin): The user login data containing email and password.
|
|
|
|
Returns:
|
|
Optional[User]: The User object with phone number if found, None otherwise.
|
|
"""
|
|
user = authenticate_user(db, user_data)
|
|
if user:
|
|
return db.query(User).filter(User.email == user_data.email).first()
|
|
return None
|
|
|
|
def authenticate_user_and_get_phone(db: Session, user_data: UserLogin) -> Optional[User]:
|
|
"""
|
|
Authenticate a user and retrieve the user object with the phone number.
|
|
|
|
Args:
|
|
db (Session): The SQLAlchemy database session.
|
|
user_data (UserLogin): The user login data containing email and password.
|
|
|
|
Returns:
|
|
Optional[User]: The User object with phone number if authentication is successful, None otherwise.
|
|
"""
|
|
return get_user_with_phone(db, user_data)
|
|
```
|
|
|
|
These helper functions are designed to work with the provided `login` endpoint. Here's a breakdown of their functionality:
|
|
|
|
1. `authenticate_user(db, user_data)`: This function takes a database session and a `UserLogin` object as input. It queries the database for a user with the provided email and checks if the password matches. If the user is found and the password is correct, it returns the `User` object. Otherwise, it returns `None`.
|
|
|
|
2. `get_user_with_phone(db, user_data)`: This function first calls `authenticate_user` to authenticate the user based on the provided login data. If the user is authenticated successfully, it retrieves the `User` object from the database, including the phone number, by querying with the email address. If the user is not authenticated, it returns `None`.
|
|
|
|
3. `authenticate_user_and_get_phone(db, user_data)`: This function is a convenience function that combines the functionality of `authenticate_user` and `get_user_with_phone`. It authenticates the user and retrieves the `User` object with the phone number in a single function call.
|
|
|
|
These helper functions assume that the `User` model has a `verify_password` method to check the provided password against the stored password hash. Additionally, the `User` model should have a `phone` attribute to store the user's phone number. |