diff --git a/endpoints/contact.post.py b/endpoints/contact.post.py index 5895b8c..096a002 100644 --- a/endpoints/contact.post.py +++ b/endpoints/contact.post.py @@ -2,24 +2,22 @@ from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.orm import Session from core.database import get_db from schemas.contact import ContactCreate, ContactSchema -from typing import Dict, Any +from helpers.contact_helpers import validate_contact_data, create_contact, format_contact_response, sanitize_contact_input router = APIRouter() @router.post("/contact", status_code=status.HTTP_201_CREATED, response_model=ContactSchema) -async def create_contact_submission( - contact_data: Dict[str, Any], +async def submit_contact_form( + contact_data: ContactCreate, db: Session = Depends(get_db) ): - sanitized_data = sanitize_contact_input(contact_data) - validation_errors = validate_contact_data(sanitized_data) - + validation_errors = validate_contact_data(contact_data.dict()) if validation_errors: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=validation_errors ) - - contact_create = ContactCreate(**sanitized_data) - db_contact = create_contact(db=db, contact_data=contact_create) + + sanitized_data = sanitize_contact_input(contact_data.dict()) + db_contact = create_contact(db=db, contact_data=ContactCreate(**sanitized_data)) return format_contact_response(db_contact) \ No newline at end of file diff --git a/helpers/contact_helpers.py b/helpers/contact_helpers.py index 663de58..fe2dccc 100644 --- a/helpers/contact_helpers.py +++ b/helpers/contact_helpers.py @@ -3,11 +3,11 @@ 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, ValidationError +from pydantic import ValidationError def validate_contact_data(contact_data: Dict[str, Any]) -> Dict[str, str]: """ - Validates contact form submission data with enhanced validation. + Validates contact form submission data using Pydantic schema validation. Args: contact_data (Dict[str, Any]): The contact form data to validate. @@ -17,27 +17,14 @@ def validate_contact_data(contact_data: Dict[str, Any]) -> Dict[str, str]: """ errors = {} - # Validate name - if not contact_data.get("name"): - errors["name"] = "Name is required" - elif not contact_data["name"].strip(): - errors["name"] = "Name cannot consist of only whitespace" - - # Validate email with enhanced validation - if not contact_data.get("email"): - errors["email"] = "Email is required" - else: - try: - EmailStr.validate(contact_data["email"]) - except ValidationError: - errors["email"] = "Invalid email format - please provide a valid email address" - - # Validate message - if not contact_data.get("message"): - errors["message"] = "Message is required" - elif not contact_data["message"].strip(): - errors["message"] = "Message cannot consist of only whitespace" - + try: + ContactCreate(**contact_data) + except ValidationError as e: + for error in e.errors(): + field = error["loc"][0] + message = error["msg"] + errors[field] = message + return errors def create_contact(db: Session, contact_data: ContactCreate) -> Contact: @@ -55,7 +42,6 @@ def create_contact(db: Session, contact_data: ContactCreate) -> Contact: HTTPException: If there are validation errors with specific field details. """ try: - # ContactCreate schema will handle validation validated_data = contact_data.dict() db_contact = Contact(**validated_data) db.add(db_contact) @@ -83,7 +69,7 @@ def format_contact_response(contact: Contact) -> ContactSchema: def sanitize_contact_input(contact_data: Dict[str, Any]) -> Dict[str, Any]: """ - Sanitizes contact form input data with enhanced validation for required fields. + Sanitizes contact form input data using Pydantic schema validation. Args: contact_data (Dict[str, Any]): Raw contact form data. @@ -94,40 +80,12 @@ def sanitize_contact_input(contact_data: Dict[str, Any]) -> Dict[str, Any]: Raises: HTTPException: If required fields are missing or invalid with specific field details. """ - errors = {} - sanitized = {} - - # Sanitize and validate name - if "name" in contact_data: - sanitized["name"] = contact_data["name"].strip() - if not sanitized["name"]: - errors["name"] = "Name cannot be empty or consist of only whitespace" - else: - errors["name"] = "Name is required" - - # Sanitize and validate email - if "email" in contact_data: - email = contact_data["email"].lower().strip() - try: - EmailStr.validate(email) - sanitized["email"] = email - except ValidationError: - errors["email"] = "Invalid email format" - else: - errors["email"] = "Email is required" - - # Sanitize and validate message - if "message" in contact_data: - sanitized["message"] = contact_data["message"].strip() - if not sanitized["message"]: - errors["message"] = "Message cannot be empty or consist of only whitespace" - else: - errors["message"] = "Message is required" - - if errors: + try: + validated_data = ContactCreate(**contact_data) + return validated_data.dict() + except ValidationError as e: + errors = {error["loc"][0]: error["msg"] for error in e.errors()} raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=errors - ) - - return sanitized \ No newline at end of file + ) \ No newline at end of file