53 lines
2.4 KiB
Python
53 lines
2.4 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from pydantic import BaseModel, EmailStr
|
|
from typing import Optional
|
|
import logging
|
|
from ..config.database import get_db
|
|
from ..models.user import User
|
|
from ..models.role import Role
|
|
from ..models.system_settings import SystemSettings
|
|
from ..utils.mailer import send_email
|
|
from ..utils.html_sanitizer import sanitize_text_for_html
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter(prefix='/contact', tags=['contact'])
|
|
|
|
class ContactForm(BaseModel):
|
|
name: str
|
|
email: EmailStr
|
|
subject: str
|
|
message: str
|
|
phone: Optional[str] = None
|
|
|
|
def get_admin_email(db: Session) -> str:
|
|
company_email_setting = db.query(SystemSettings).filter(SystemSettings.key == 'company_email').first()
|
|
if company_email_setting and company_email_setting.value:
|
|
return company_email_setting.value
|
|
admin_email_setting = db.query(SystemSettings).filter(SystemSettings.key == 'admin_email').first()
|
|
if admin_email_setting and admin_email_setting.value:
|
|
return admin_email_setting.value
|
|
admin_role = db.query(Role).filter(Role.name == 'admin').first()
|
|
if admin_role:
|
|
admin_user = db.query(User).filter(User.role_id == admin_role.id, User.is_active == True).first()
|
|
if admin_user:
|
|
return admin_user.email
|
|
from ..config.settings import settings
|
|
if settings.SMTP_FROM_EMAIL:
|
|
return settings.SMTP_FROM_EMAIL
|
|
raise HTTPException(status_code=500, detail='Admin email not configured. Please set company_email in system settings or ensure an admin user exists.')
|
|
|
|
@router.post('/submit')
|
|
async def submit_contact_form(contact_data: ContactForm, db: Session=Depends(get_db)):
|
|
try:
|
|
admin_email = get_admin_email(db)
|
|
subject = f'Contact Form: {contact_data.subject}'
|
|
html_body = f
|
|
text_body = f
|
|
await send_email(to=admin_email, subject=subject, html=html_body, text=text_body)
|
|
logger.info(f'Contact form submitted successfully. Email sent to {admin_email}')
|
|
return {'status': 'success', 'message': 'Thank you for contacting us! We will get back to you soon.'}
|
|
except HTTPException:
|
|
raise
|
|
except Exception as e:
|
|
logger.error(f'Failed to submit contact form: {type(e).__name__}: {str(e)}', exc_info=True)
|
|
raise HTTPException(status_code=500, detail='Failed to submit contact form. Please try again later.') |