contact-project-p9bfld/helpers/contact_helpers.py

100 lines
2.9 KiB
Python

from typing import Dict, Any
from sqlalchemy.orm import Session
from models.contact import Contact
from schemas.contact import ContactCreate, ContactSchema
from fastapi import HTTPException, status
from pydantic import EmailStr
def validate_contact_data(contact_data: Dict[str, Any]) -> Dict[str, str]:
"""
Validates contact form submission data.
Args:
contact_data (Dict[str, Any]): The contact form data to validate.
Returns:
Dict[str, str]: Dictionary of validation errors, empty if valid.
"""
errors = {}
# Check required fields
if not contact_data.get("name"):
errors["name"] = "Name is required"
elif len(contact_data["name"].strip()) < 1:
errors["name"] = "Name cannot be empty"
if not contact_data.get("email"):
errors["email"] = "Email is required"
elif not isinstance(contact_data["email"], EmailStr):
errors["email"] = "Invalid email format"
if not contact_data.get("message"):
errors["message"] = "Message is required"
elif len(contact_data["message"].strip()) < 1:
errors["message"] = "Message cannot be empty"
return errors
def create_contact(db: Session, contact_data: ContactCreate) -> Contact:
"""
Creates a new contact submission in the database.
Args:
db (Session): The database session.
contact_data (ContactCreate): The validated contact form data.
Returns:
Contact: The newly created contact object.
Raises:
HTTPException: If there are validation errors.
"""
# Validate data
validation_errors = validate_contact_data(contact_data.dict())
if validation_errors:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=validation_errors
)
# Create new contact
db_contact = Contact(**contact_data.dict())
db.add(db_contact)
db.commit()
db.refresh(db_contact)
return db_contact
def format_contact_response(contact: Contact) -> ContactSchema:
"""
Formats a contact database object into the response schema.
Args:
contact (Contact): The contact database object.
Returns:
ContactSchema: The formatted contact response.
"""
return ContactSchema.from_orm(contact)
def sanitize_contact_input(contact_data: Dict[str, Any]) -> Dict[str, Any]:
"""
Sanitizes contact form input data.
Args:
contact_data (Dict[str, Any]): Raw contact form data.
Returns:
Dict[str, Any]: Sanitized contact form data.
"""
sanitized = {}
if "name" in contact_data:
sanitized["name"] = contact_data["name"].strip()
if "email" in contact_data:
sanitized["email"] = contact_data["email"].lower().strip()
if "message" in contact_data:
sanitized["message"] = contact_data["message"].strip()
return sanitized