"""انتهای فرم‌ها — ثبت پیام تماس و عضویت در خبرنامه. هر فرم یک دامنهٔ پنهان (honeypot) دارد: ربات‌ها همهٔ فیلدها را پُر می‌کنند؛ در آن حالت پاسخ موفقِ قلابی برمی‌گردد و چیزی ذخیره نمی‌شود. """ from datetime import datetime, timezone from fastapi import APIRouter, Depends, Request from sqlalchemy.orm import Session from .. import models from ..database import get_db from ..rate_limit import contact_limiter, newsletter_limiter from ..schemas import ContactIn, ContactMessageOut, NewsletterIn, SubscriberOut router = APIRouter() def _fake_contact(payload: ContactIn) -> ContactMessageOut: """پاسخ موفق بدون ذخیره — تا ربات متوجه تله نشود.""" return ContactMessageOut( id=0, name=payload.name.strip(), phone=payload.phone.strip(), note="", is_read=True, created_at=datetime.now(timezone.utc), ) def _fake_subscriber(payload: NewsletterIn) -> SubscriberOut: return SubscriberOut( id=0, email=str(payload.email).lower(), is_active=True, created_at=datetime.now(timezone.utc), ) @router.post("/contact", response_model=ContactMessageOut, status_code=201) def submit_contact(payload: ContactIn, request: Request, db: Session = Depends(get_db)): contact_limiter.hit(request) if payload.website: return _fake_contact(payload) message = models.ContactMessage( name=payload.name.strip(), phone=payload.phone.strip(), note=payload.note.strip(), ) db.add(message) db.commit() db.refresh(message) return message @router.post("/newsletter", response_model=SubscriberOut, status_code=201) def subscribe(payload: NewsletterIn, request: Request, db: Session = Depends(get_db)): newsletter_limiter.hit(request) if payload.website: return _fake_subscriber(payload) email = str(payload.email).lower() subscriber = db.query(models.Subscriber).filter(models.Subscriber.email == email).first() if subscriber is not None: if not subscriber.is_active: subscriber.is_active = True db.commit() db.refresh(subscriber) return subscriber subscriber = models.Subscriber(email=email) db.add(subscriber) db.commit() db.refresh(subscriber) return subscriber