From 56ae39ca01aaacc063f0c7af152b583d0901b70e Mon Sep 17 00:00:00 2001 From: chihlasm Date: Thu, 5 Mar 2026 01:39:29 -0500 Subject: [PATCH] feat: add SurveyInvite model Co-Authored-By: Claude Opus 4.6 --- backend/alembic/env.py | 2 ++ backend/app/models/__init__.py | 4 ++++ backend/app/models/survey_invite.py | 26 ++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 backend/app/models/survey_invite.py diff --git a/backend/alembic/env.py b/backend/alembic/env.py index 0dd0b50f..2361292a 100644 --- a/backend/alembic/env.py +++ b/backend/alembic/env.py @@ -14,6 +14,8 @@ from app.models.email_verification_token import EmailVerificationToken from app.models.tree_embedding import TreeEmbedding from app.models.copilot_conversation import CopilotConversation from app.models.assistant_chat import AssistantChat +from app.models.survey_response import SurveyResponse +from app.models.survey_invite import SurveyInvite from app.core.config import settings # this is the Alembic Config object diff --git a/backend/app/models/__init__.py b/backend/app/models/__init__.py index 6ffa2f8e..7045ba6a 100644 --- a/backend/app/models/__init__.py +++ b/backend/app/models/__init__.py @@ -32,6 +32,8 @@ from .ai_chat_session import AIChatSession from .tree_embedding import TreeEmbedding from .copilot_conversation import CopilotConversation from .assistant_chat import AssistantChat +from .survey_response import SurveyResponse +from .survey_invite import SurveyInvite __all__ = [ "User", @@ -75,4 +77,6 @@ __all__ = [ "TreeEmbedding", "CopilotConversation", "AssistantChat", + "SurveyResponse", + "SurveyInvite", ] diff --git a/backend/app/models/survey_invite.py b/backend/app/models/survey_invite.py new file mode 100644 index 00000000..5f32eed0 --- /dev/null +++ b/backend/app/models/survey_invite.py @@ -0,0 +1,26 @@ +"""Survey invite tracking for FlowPilot research.""" +import secrets +import uuid +from datetime import datetime, timezone + +from sqlalchemy import Boolean, Column, DateTime, String +from sqlalchemy.dialects.postgresql import UUID + +from app.core.database import Base + + +def _generate_token() -> str: + return secrets.token_urlsafe(16) + + +class SurveyInvite(Base): + __tablename__ = "survey_invites" + + id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) + token = Column(String(32), unique=True, nullable=False, default=_generate_token) + recipient_name = Column(String(255), nullable=False) + recipient_email = Column(String(255), nullable=True) + status = Column(String(20), nullable=False, default="pending") + email_sent = Column(Boolean, nullable=False, default=False) + created_at = Column(DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), nullable=False) + completed_at = Column(DateTime(timezone=True), nullable=True)