37 lines
1.9 KiB
Python
37 lines
1.9 KiB
Python
from sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, Enum, Boolean
|
|
from sqlalchemy.orm import relationship
|
|
from datetime import datetime
|
|
import enum
|
|
from ..config.database import Base
|
|
|
|
class ChatStatus(str, enum.Enum):
|
|
pending = 'pending'
|
|
active = 'active'
|
|
closed = 'closed'
|
|
|
|
class Chat(Base):
|
|
__tablename__ = 'chats'
|
|
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
|
|
visitor_id = Column(Integer, ForeignKey('users.id'), nullable=True)
|
|
visitor_name = Column(String(100), nullable=True)
|
|
visitor_email = Column(String(100), nullable=True)
|
|
staff_id = Column(Integer, ForeignKey('users.id'), nullable=True)
|
|
status = Column(Enum(ChatStatus), nullable=False, default=ChatStatus.pending)
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)
|
|
closed_at = Column(DateTime, nullable=True)
|
|
visitor = relationship('User', foreign_keys=[visitor_id], back_populates='visitor_chats')
|
|
staff = relationship('User', foreign_keys=[staff_id], back_populates='staff_chats')
|
|
messages = relationship('ChatMessage', back_populates='chat', cascade='all, delete-orphan', order_by='ChatMessage.created_at')
|
|
|
|
class ChatMessage(Base):
|
|
__tablename__ = 'chat_messages'
|
|
id = Column(Integer, primary_key=True, index=True, autoincrement=True)
|
|
chat_id = Column(Integer, ForeignKey('chats.id'), nullable=False)
|
|
sender_id = Column(Integer, ForeignKey('users.id'), nullable=True)
|
|
sender_type = Column(String(20), nullable=False)
|
|
message = Column(Text, nullable=False)
|
|
is_read = Column(Boolean, nullable=False, default=False)
|
|
created_at = Column(DateTime, default=datetime.utcnow, nullable=False)
|
|
chat = relationship('Chat', back_populates='messages')
|
|
sender = relationship('User', foreign_keys=[sender_id]) |