feat: Updated endpoint endpoints/contact.post.py via AI

This commit is contained in:
Backend IM Bot 2025-04-15 17:59:01 +00:00
parent 0d2ef078e4
commit 622dcd9a2f
2 changed files with 24 additions and 68 deletions

View File

@ -2,24 +2,22 @@ from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session from sqlalchemy.orm import Session
from core.database import get_db from core.database import get_db
from schemas.contact import ContactCreate, ContactSchema 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 = APIRouter()
@router.post("/contact", status_code=status.HTTP_201_CREATED, response_model=ContactSchema) @router.post("/contact", status_code=status.HTTP_201_CREATED, response_model=ContactSchema)
async def create_contact_submission( async def submit_contact_form(
contact_data: Dict[str, Any], contact_data: ContactCreate,
db: Session = Depends(get_db) db: Session = Depends(get_db)
): ):
sanitized_data = sanitize_contact_input(contact_data) validation_errors = validate_contact_data(contact_data.dict())
validation_errors = validate_contact_data(sanitized_data)
if validation_errors: if validation_errors:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail=validation_errors detail=validation_errors
) )
contact_create = ContactCreate(**sanitized_data) sanitized_data = sanitize_contact_input(contact_data.dict())
db_contact = create_contact(db=db, contact_data=contact_create) db_contact = create_contact(db=db, contact_data=ContactCreate(**sanitized_data))
return format_contact_response(db_contact) return format_contact_response(db_contact)

View File

@ -3,11 +3,11 @@ from sqlalchemy.orm import Session
from models.contact import Contact from models.contact import Contact
from schemas.contact import ContactCreate, ContactSchema from schemas.contact import ContactCreate, ContactSchema
from fastapi import HTTPException, status 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]: 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: Args:
contact_data (Dict[str, Any]): The contact form data to validate. 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 = {} errors = {}
# Validate name try:
if not contact_data.get("name"): ContactCreate(**contact_data)
errors["name"] = "Name is required" except ValidationError as e:
elif not contact_data["name"].strip(): for error in e.errors():
errors["name"] = "Name cannot consist of only whitespace" field = error["loc"][0]
message = error["msg"]
# Validate email with enhanced validation errors[field] = message
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"
return errors return errors
def create_contact(db: Session, contact_data: ContactCreate) -> Contact: 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. HTTPException: If there are validation errors with specific field details.
""" """
try: try:
# ContactCreate schema will handle validation
validated_data = contact_data.dict() validated_data = contact_data.dict()
db_contact = Contact(**validated_data) db_contact = Contact(**validated_data)
db.add(db_contact) 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]: 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: Args:
contact_data (Dict[str, Any]): Raw contact form data. 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: Raises:
HTTPException: If required fields are missing or invalid with specific field details. HTTPException: If required fields are missing or invalid with specific field details.
""" """
errors = {} try:
sanitized = {} validated_data = ContactCreate(**contact_data)
return validated_data.dict()
# Sanitize and validate name except ValidationError as e:
if "name" in contact_data: errors = {error["loc"][0]: error["msg"] for error in e.errors()}
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:
raise HTTPException( raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST, status_code=status.HTTP_400_BAD_REQUEST,
detail=errors detail=errors
) )
return sanitized