apigateway / routers /contact.py
jebin2's picture
refactor
bcc8074
"""
Contact Router - API endpoint for customer support contact form.
Endpoints:
- POST /contact - Submit a contact form (requires authentication)
"""
import logging
from typing import Optional
from fastapi import APIRouter, Depends, HTTPException, Request, status
from pydantic import BaseModel, EmailStr
from sqlalchemy.ext.asyncio import AsyncSession
from core.database import get_db
from core.models import User, Contact
logger = logging.getLogger(__name__)
router = APIRouter(prefix="/contact", tags=["contact"])
# =============================================================================
# Request/Response Models
# =============================================================================
class ContactRequest(BaseModel):
"""Request to submit a contact form."""
subject: Optional[str] = None
message: str
class ContactResponse(BaseModel):
"""Response after contact form submission."""
success: bool
message: str
# =============================================================================
# Endpoints
# =============================================================================
@router.post("", response_model=ContactResponse)
async def submit_contact(
request_body: ContactRequest,
request: Request,
db: AsyncSession = Depends(get_db)
):
"""
Submit a contact form for customer support.
Requires authentication - user is authenticated by AuthMiddleware.
User is available in request.state.user
"""
# Get authenticated user from middleware
user = request.state.user
# Validate message
if not request_body.message or not request_body.message.strip():
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Message cannot be empty"
)
# Get client IP
client_ip = request.headers.get("X-Forwarded-For", request.client.host if request.client else None)
if client_ip:
client_ip = client_ip.split(",")[0].strip()
try:
# Create contact record
contact = Contact(
user_id=user.id, # Integer FK to users.id
email=user.email,
subject=request_body.subject.strip() if request_body.subject else None,
message=request_body.message.strip(),
ip_address=client_ip
)
db.add(contact)
await db.commit()
logger.info(
f"Contact form submitted: user={user.user_id}, email={user.email}, "
f"subject={request_body.subject}"
)
return ContactResponse(
success=True,
message="Your message has been received. We will get back to you shortly."
)
except Exception as e:
logger.error(f"Error saving contact form: {e}")
await db.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to submit contact form. Please try again."
)