feat: Updated endpoint endpoints/contact.post.py via AI
This commit is contained in:
parent
0d2ef078e4
commit
622dcd9a2f
@ -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)
|
@ -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
|
|
Loading…
x
Reference in New Issue
Block a user