Spaces:
Sleeping
Sleeping
| """ | |
| 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 | |
| # ============================================================================= | |
| 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." | |
| ) | |