from typing import List, Optional import re from pydantic import EmailStr, validator from models import Intern def validate_phone_number(phone_number: str) -> bool: """ Validate a phone number format. Args: phone_number: The phone number to validate Returns: bool: True if phone number format is valid, False otherwise """ pattern = r'^\+?\d{10,13}$' return bool(re.match(pattern, phone_number)) def get_all_interns(db_session) -> List[Intern]: """ Get a list of all interns from the database. Args: db_session: The database session Returns: List[Intern]: A list of Intern objects """ return db_session.query(Intern).all() def get_intern_by_email(db_session, email: EmailStr) -> Optional[Intern]: """ Get an intern by their email address. Args: db_session: The database session email: Email to search for Returns: Intern object if found, None otherwise """ return db_session.query(Intern).filter(Intern.email == email).first() class InternBase: first_name: str last_name: str email: EmailStr phone_number: str track: str bio: Optional[str] = None @validator('phone_number') def validate_phone_number(cls, phone_number): if not validate_phone_number(phone_number): raise ValueError('Invalid phone number format') return phone_number def create_intern(db_session, intern_data: InternBase) -> Intern: """ Create a new intern in the database. Args: db_session: The database session intern_data: The data for the new intern Returns: Intern: The created Intern object """ existing_intern = get_intern_by_email(db_session, intern_data.email) if existing_intern: raise ValueError('Email already registered') new_intern = Intern(**intern_data.dict()) db_session.add(new_intern) db_session.commit() db_session.refresh(new_intern) return new_intern