From 50a89af0d6c119f858a765506608344a1558bbcc Mon Sep 17 00:00:00 2001 From: Backend IM Bot Date: Thu, 27 Mar 2025 20:05:10 +0000 Subject: [PATCH] Add helper functions for Person --- helpers/person_helpers.py | 125 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 helpers/person_helpers.py diff --git a/helpers/person_helpers.py b/helpers/person_helpers.py new file mode 100644 index 0000000..2afe732 --- /dev/null +++ b/helpers/person_helpers.py @@ -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] \ No newline at end of file