File size: 5,212 Bytes
c4d486b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a066e5a
 
 
 
 
 
 
 
 
 
 
 
e5b256c
a066e5a
 
 
 
e5b256c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
from datetime import datetime, timezone
import uuid
from sqlalchemy import (
    Column,
    String,
    Text,
    DateTime,
    Float,
    Integer,
    Boolean,
    ForeignKey,
)
from sqlalchemy.orm import relationship
from sqlalchemy.dialects.postgresql import UUID

# Absolute import from project root
from app.models.database import Base


class UserPreference(Base):
    __tablename__ = "user_preferences"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)

    # Preference details
    preference_type = Column(
        String(50), nullable=False
    )  # e.g., "name", "product_interest", "communication_style"
    preference_key = Column(
        String(100), nullable=False
    )  # e.g., "user_name", "preferred_products", "formality_level"
    preference_value = Column(
        Text, nullable=False
    )  # e.g., "John", "toys,gifts", "casual"

    # Learning metadata
    confidence_score = Column(
        Float, default=1.0
    )  # How confident the model is (0.0-1.0)
    learned_from_messages = Column(
        Integer, default=1
    )  # Number of messages that taught us this
    first_learned = Column(DateTime, default=lambda: datetime.now(timezone.utc))
    last_updated = Column(DateTime, default=lambda: datetime.now(timezone.utc))

    # Relationship
    user = relationship("User", back_populates="preferences")

    def __repr__(self):
        return f"<UserPreference(id={self.id} user_id={self.user_id} {self.preference_key}={self.preference_value})>"


class ConversationTopic(Base):
    __tablename__ = "conversation_topics"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    conversation_id = Column(
        UUID(as_uuid=True), ForeignKey("conversations.id"), nullable=False
    )

    # Topic details
    topic = Column(
        String(100), nullable=False
    )  # "product_inquiry", "order_management", "support"
    subtopic = Column(String(100))  # "toys", "cancellation", "shipping_issue"
    keywords = Column(Text)  # JSON list of relevant keywords

    # Topic metadata
    first_mentioned = Column(DateTime, default=lambda: datetime.now(timezone.utc))
    message_count = Column(Integer, default=1)  # How many messages discussed this topic
    importance_score = Column(
        Float, default=1.0
    )  # How important this topic was (0.0-1.0)

    # Relationships
    conversation = relationship("Conversation", back_populates="topics")

    def __repr__(self):
        return f"<ConversationTopic(topic={self.topic}, subtopic={self.subtopic})>"


class UserInsight(Base):
    __tablename__ = "user_insights"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    user_id = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False)

    # Insight details
    insight_type = Column(
        String(50), nullable=False
    )  # "behavior_pattern", "preference_trend", "interaction_style"
    insight_key = Column(
        String(100), nullable=False
    )  # "most_active_time", "preferred_topics", "question_complexity"
    insight_value = Column(Text, nullable=False)  # "morning", "toys,gifts", "simple"
    insight_description = Column(Text)  # Human-readable explanation

    # Analytics metadata
    confidence_level = Column(Float, default=1.0)  # Statistical confidence (0.0-1.0)
    based_on_messages = Column(Integer, default=0)  # Number of messages analyzed
    last_calculated = Column(DateTime, default=lambda: datetime.now(timezone.utc))
    is_active = Column(Boolean, default=True)  # Is this insight still relevant?

    # Relationships
    user = relationship("User", back_populates="insights")

    def __repr__(self):
        return f"<UserInsight(id={self.id} user_id={self.user_id}, {self.insight_key}={self.insight_value})>"


class KnowledgeBase(Base):
    __tablename__ = "knowledge_base"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
    updated_at = Column(
        DateTime,
        default=lambda: datetime.now(timezone.utc),
        onupdate=lambda: datetime.now(timezone.utc),
    )
    tenant_id = Column(UUID(as_uuid=True), ForeignKey("tenants.id"), nullable=False)
    entry = Column(Text, nullable=False)

    def __repr__(self):
        return f"<KnowledgeBase(id={self.id} tenant_id={self.tenant_id})>"


class Tenant(Base):
    __tablename__ = "tenants"

    id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
    name = Column(String(255), nullable=False)
    api_key = Column(String(255), unique=True, nullable=False)
    is_active = Column(Boolean, default=True)
    created_at = Column(DateTime, default=lambda: datetime.now(timezone.utc))
    updated_at = Column(
        DateTime,
        default=lambda: datetime.now(timezone.utc),
        onupdate=lambda: datetime.now(timezone.utc),
    )

    # Relationships
    users = relationship("User", back_populates="tenant")
    conversations = relationship("Conversation", back_populates="tenant")

    def __repr__(self):
        return f"<Tenant(id={self.id} name={self.name})>"