from typing import Optional, Dict, Any from sqlalchemy.orm import Session from email_validator import validate_email, EmailNotValidError from models.contact_form import ContactForm from schemas.contact_form import ContactFormCreate def create_contact_form(db: Session, contact_form_data: ContactFormCreate) -> ContactForm: """ Creates a new contact form submission in the database after validating inputs. Args: db (Session): The database session. contact_form_data (ContactFormCreate): The data for the contact form to create. Returns: ContactForm: The newly created contact form object. Raises: HTTPException: If any required field is missing or invalid. """ # Create a new contact form instance db_contact_form = ContactForm( name=contact_form_data.name, email=contact_form_data.email, message=contact_form_data.message ) # Add to database, commit, and refresh db.add(db_contact_form) db.commit() db.refresh(db_contact_form) return db_contact_form def validate_contact_form_data(data: Dict[str, Any]) -> Dict[str, str]: """ Validates contact form data, checking for required fields and using email_validator package for email validation. Args: data (Dict[str, Any]): The contact form data to validate. Returns: Dict[str, str]: A dictionary of validation errors, empty if validation passes. """ errors = {} # Check required fields with specific error messages if not data.get("name"): errors["name"] = "Name is required" elif not isinstance(data.get("name"), str) or len(data.get("name").strip()) == 0: errors["name"] = "Name must be a non-empty string" # Email validation with detailed error handling if not data.get("email"): errors["email"] = "Email is required" else: try: # Validate email format using email_validator package validate_email(data["email"], check_deliverability=True) except EmailNotValidError as e: errors["email"] = f"Invalid email format: {str(e)}" # Message validation if not data.get("message"): errors["message"] = "Message is required" elif not isinstance(data.get("message"), str) or len(data.get("message").strip()) == 0: errors["message"] = "Message must be a non-empty string" return errors def get_contact_form_by_id(db: Session, contact_form_id: str) -> Optional[ContactForm]: """ Retrieves a contact form submission by its ID. Args: db (Session): The database session. contact_form_id (str): The ID of the contact form to retrieve. Returns: Optional[ContactForm]: The contact form object if found, otherwise None. """ return db.query(ContactForm).filter(ContactForm.id == contact_form_id).first() def get_all_contact_forms(db: Session, skip: int = 0, limit: int = 100) -> list[ContactForm]: """ Retrieves all contact form submissions with pagination. Args: db (Session): The database session. skip (int, optional): Number of records to skip. Defaults to 0. limit (int, optional): Maximum number of records to return. Defaults to 100. Returns: list[ContactForm]: A list of contact form objects. """ return db.query(ContactForm).offset(skip).limit(limit).all() def get_contact_forms_by_email(db: Session, email: str) -> list[ContactForm]: """ Retrieves all contact form submissions from a specific email address. Args: db (Session): The database session. email (str): The email address to filter by. Returns: list[ContactForm]: A list of contact form objects from the specified email. """ return db.query(ContactForm).filter(ContactForm.email == email).all()