""" 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." )