from typing import Dict from sqlalchemy.orm import Session from fastapi import HTTPException from models.contact import Contact from schemas.contact import ContactCreate, ContactSchema def validate_contact_data(contact_data: ContactCreate) -> Dict[str, str]: """ Validates contact form submission data. Args: contact_data (ContactCreate): The contact form data to validate. Returns: Dict[str, str]: Dictionary containing validation errors, if any. """ errors = {} # Check required fields if not contact_data.name or not contact_data.name.strip(): errors["name"] = "Name is required" elif len(contact_data.name) > 255: errors["name"] = "Name must not exceed 255 characters" if not contact_data.email: errors["email"] = "Email is required" if not contact_data.message or not contact_data.message.strip(): errors["message"] = "Message is required" return errors def create_contact(db: Session, contact_data: ContactCreate) -> Contact: """ Creates a new contact submission in the database after validation. Args: db (Session): The database session. contact_data (ContactCreate): The validated contact form data. Returns: Contact: The newly created contact object. Raises: HTTPException: If validation fails or database operation fails. """ # Validate contact data validation_errors = validate_contact_data(contact_data) if validation_errors: raise HTTPException( status_code=400, detail={"message": "Validation failed", "errors": validation_errors} ) try: # Create new contact db_contact = Contact(**contact_data.dict()) db.add(db_contact) db.commit() db.refresh(db_contact) return db_contact except Exception as e: db.rollback() raise HTTPException( status_code=500, detail={"message": "Failed to create contact", "error": str(e)} ) def sanitize_contact_data(contact_data: ContactCreate) -> ContactCreate: """ Sanitizes contact form input data. Args: contact_data (ContactCreate): The raw contact form data. Returns: ContactCreate: The sanitized contact form data. """ # Create a new dict with sanitized values sanitized_data = ContactCreate( name=contact_data.name.strip(), email=contact_data.email.strip().lower(), message=contact_data.message.strip() ) return sanitized_data def format_contact_response(contact: Contact) -> ContactSchema: """ Formats a contact database object into a response schema. Args: contact (Contact): The contact database object. Returns: ContactSchema: The formatted contact response. """ return ContactSchema.from_orm(contact)