KillerKing93/Transformers-TextEngine-OpenAPI
0
1#!/usr/bin/env python2# -*- coding: utf-8 -*-3"""4Database models for AI Marketplace Platform5 6Tables:7- Suppliers: Business entities that list products8- Products: Items for sale with stock and pricing9- Users: Platform users with location and AI access10- Conversations: Chat sessions for tracking11- Messages: Individual messages in conversations12"""13 14from datetime import datetime15from typing import Optional16from sqlalchemy import Column, Integer, String, Float, Boolean, DateTime, ForeignKey, Text, Index17from sqlalchemy.orm import relationship, declarative_base18 19Base = declarative_base()20 21 22class Supplier(Base):23 __tablename__ = "suppliers"24 25 id = Column(Integer, primary_key=True, index=True)26 name = Column(String(255), nullable=False)27 business_name = Column(String(255), nullable=False)28 email = Column(String(255), unique=True, nullable=False, index=True)29 hashed_password = Column(String(255)) # For authentication30 phone = Column(String(50))31 address = Column(Text)32 latitude = Column(Float, nullable=False) # For location-based search33 longitude = Column(Float, nullable=False)34 city = Column(String(100), index=True)35 province = Column(String(100))36 is_active = Column(Boolean, default=True)37 registration_date = Column(DateTime, default=datetime.utcnow)38 updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)39 40 # Relationships41 products = relationship("Product", back_populates="supplier", cascade="all, delete-orphan")42 43 __table_args__ = (44 Index('idx_supplier_location', 'latitude', 'longitude'),45 )46 47 48class Product(Base):49 __tablename__ = "products"50 51 id = Column(Integer, primary_key=True, index=True)52 supplier_id = Column(Integer, ForeignKey("suppliers.id", ondelete="CASCADE"), nullable=False)53 name = Column(String(255), nullable=False, index=True)54 description = Column(Text)55 price = Column(Float, nullable=False)56 stock_quantity = Column(Integer, nullable=False, default=0)57 category = Column(String(100), index=True)58 tags = Column(Text) # Comma-separated tags for search59 sku = Column(String(100), unique=True, index=True)60 is_available = Column(Boolean, default=True)61 created_at = Column(DateTime, default=datetime.utcnow)62 updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)63 64 # Relationships65 supplier = relationship("Supplier", back_populates="products")66 67 __table_args__ = (68 Index('idx_product_search', 'name', 'category'),69 Index('idx_product_price', 'price'),70 )71 72 73class User(Base):74 __tablename__ = "users"75 76 id = Column(Integer, primary_key=True, index=True)77 name = Column(String(255), nullable=False)78 email = Column(String(255), unique=True, nullable=False, index=True)79 hashed_password = Column(String(255)) # For authentication80 phone = Column(String(50))81 latitude = Column(Float)82 longitude = Column(Float)83 city = Column(String(100))84 province = Column(String(100))85 role = Column(String(20), default="user") # user, supplier, admin86 ai_access_enabled = Column(Boolean, default=False) # Premium feature flag87 preferences = Column(Text) # JSON string for user preferences88 created_at = Column(DateTime, default=datetime.utcnow)89 updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)90 91 # Relationships92 conversations = relationship("Conversation", back_populates="user", cascade="all, delete-orphan")93 94 __table_args__ = (95 Index('idx_user_location', 'latitude', 'longitude'),96 )97 98 99class Conversation(Base):100 __tablename__ = "conversations"101 102 id = Column(Integer, primary_key=True, index=True)103 user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False)104 session_id = Column(String(255), unique=True, nullable=False, index=True)105 title = Column(String(255)) # Auto-generated from first message106 created_at = Column(DateTime, default=datetime.utcnow)107 updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)108 109 # Relationships110 user = relationship("User", back_populates="conversations")111 messages = relationship("Message", back_populates="conversation", cascade="all, delete-orphan")112 113 114class Message(Base):115 __tablename__ = "messages"116 117 id = Column(Integer, primary_key=True, index=True)118 conversation_id = Column(Integer, ForeignKey("conversations.id", ondelete="CASCADE"), nullable=False)119 role = Column(String(20), nullable=False) # "user" or "assistant"120 content = Column(Text, nullable=False)121 timestamp = Column(DateTime, default=datetime.utcnow, index=True)122 123 # Relationships124 conversation = relationship("Conversation", back_populates="messages")125 126 __table_args__ = (127 Index('idx_message_conversation', 'conversation_id', 'timestamp'),128 )129 