100 lines
2.9 KiB
Python
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 |