File size: 3,009 Bytes
9869f13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bcc8074
 
9869f13
bcc8074
 
 
9869f13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8d69ae4
9869f13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7296d4a
9869f13
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""
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."
        )