Add helper functions for Person

This commit is contained in:
Backend IM Bot 2025-03-27 20:05:10 +00:00
parent b6c7f083af
commit 50a89af0d6

125
helpers/person_helpers.py Normal file
View File

@ -0,0 +1,125 @@
from typing import List, Optional, Dict, Union
from datetime import datetime
import re
from sqlalchemy.orm import Session
from pydantic import BaseModel, EmailStr
from models.person import Person
def validate_phone_number(phone: str) -> bool:
"""
Validate phone number format.
Args:
phone: Phone number string to validate
Returns:
bool: True if valid format, False otherwise
"""
pattern = r'^\+?1?\d{9,15}$'
return bool(re.match(pattern, phone))
def get_people_over_50(db: Session) -> List[Person]:
"""
Get all people over 50 years old.
Args:
db: Database session
Returns:
List of Person objects over 50
"""
return db.query(Person).filter(Person.age > 50, Person.is_active == True).all()
def format_person_name(first_name: str, last_name: str) -> str:
"""
Format person's full name.
Args:
first_name: Person's first name
last_name: Person's last name
Returns:
Formatted full name string
"""
return f"{first_name.strip().title()} {last_name.strip().title()}"
def create_person_safely(
db: Session,
first_name: str,
last_name: str,
age: int,
email: str,
phone: Optional[str] = None
) -> Union[Person, Dict[str, str]]:
"""
Create new person with validation.
Args:
db: Database session
first_name: Person's first name
last_name: Person's last name
age: Person's age
email: Person's email
phone: Optional phone number
Returns:
Person object if created successfully, error dict otherwise
"""
# Validate required fields
if not all([first_name, last_name, age, email]):
return {"error": "Missing required fields"}
# Validate age
if not isinstance(age, int) or age < 0:
return {"error": "Invalid age"}
# Validate email format
email_pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'
if not re.match(email_pattern, email):
return {"error": "Invalid email format"}
# Check if email exists
if db.query(Person).filter(Person.email == email).first():
return {"error": "Email already exists"}
# Validate phone if provided
if phone and not validate_phone_number(phone):
return {"error": "Invalid phone number format"}
person = Person(
first_name=first_name,
last_name=last_name,
age=age,
email=email,
phone=phone,
is_active=True
)
db.add(person)
db.commit()
db.refresh(person)
return person
def get_active_seniors(db: Session, min_age: int = 50) -> List[Dict]:
"""
Get formatted list of active people over minimum age.
Args:
db: Database session
min_age: Minimum age to filter by
Returns:
List of formatted person dictionaries
"""
seniors = db.query(Person).filter(
Person.age >= min_age,
Person.is_active == True
).all()
return [{
"full_name": format_person_name(p.first_name, p.last_name),
"age": p.age,
"email": p.email,
"phone": p.phone
} for p in seniors]