from sqlalchemy import Column, Integer, String, ForeignKey, Text, Table, Boolean, DateTime from sqlalchemy.orm import relationship from .database import Base from datetime import datetime class SubscriptionPlans(Base): __tablename__ = "subscription_plans" id = Column(Integer, primary_key=True, index=True) name = Column(String, unique=True, index=True) # "Free", "Pro", "Ultra" max_heirs = Column(Integer, default=1) weekly_token_limit = Column(Integer, default=1000) max_assets = Column(Integer, default=5) max_storage_mb = Column(Integer, default=10) can_use_ai_proxy = Column(Boolean, default=False) description = Column(Text, nullable=True) users = relationship("User", back_populates="subscription_plans") class User(Base): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) username = Column(String, index=True) email = Column(String, unique=True, index=True) hashed_password = Column(String) tier = Column(String, ForeignKey("subscription_plans.name"), default="Free") tier_expires_at = Column(DateTime) last_active_at = Column(DateTime) subscription_plans = relationship("SubscriptionPlans", back_populates="users") # System keys public_key = Column(String) private_key = Column(String) # Encrypted or raw? Storing raw for now as per req is_admin = Column(Boolean, default=False) guale = Column(Boolean, default=False) assets = relationship("Asset", foreign_keys="Asset.author_id", back_populates="author") inherited_assets = relationship("Asset", foreign_keys="Asset.heir_id", back_populates="heir") class Asset(Base): __tablename__ = "assets" id = Column(Integer, primary_key=True, index=True) title = Column(String, index=True) content_outer_encrypted = Column(Text) author_id = Column(Integer, ForeignKey("users.id")) heir_id = Column(Integer, ForeignKey("users.id")) type = Column(String, index=True, nullable=True) # Key shard for this asset private_key_shard = Column(String) author = relationship("User", foreign_keys=[author_id], back_populates="assets") heir = relationship("User", foreign_keys=[heir_id], back_populates="inherited_assets") created_at = Column(DateTime, default=datetime.utcnow) updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) class AIConfig(Base): __tablename__ = "ai_configs" id = Column(Integer, primary_key=True, index=True) provider_name = Column(String, unique=True, index=True) api_key = Column(String) api_url = Column(String) default_model = Column(String) is_active = Column(Boolean, default=True) class UserTokenUsage(Base): __tablename__ = "user_token_usage" id = Column(Integer, primary_key=True, index=True) user_id = Column(Integer, ForeignKey("users.id"), unique=True) tokens_used = Column(Integer, default=0) last_reset_at = Column(DateTime) user = relationship("User", backref="token_usage", uselist=False) class AIRole(Base): __tablename__ = "ai_roles" id = Column(Integer, primary_key=True, index=True) name = Column(String, index=True) description = Column(Text) systemPrompt = Column(Text) icon = Column(String) iconFamily = Column(String)