import datetime from sqlalchemy import Column, String, Integer, DateTime, ForeignKey, Boolean from sqlalchemy.orm import relationship from core.subscription.db import Base class User(Base): __tablename__ = "users" clerk_id = Column(String, primary_key=True, index=True) tier = Column(String, default="free") stripe_customer_id = Column(String, nullable=True) stripe_subscription_id = Column(String, nullable=True) gdpr_consent_accepted = Column(Boolean, default=False) gdpr_consent_timestamp = Column(DateTime, nullable=True) ai_disclaimer_enabled = Column(Boolean, default=True) created_at = Column( DateTime, default=lambda: datetime.datetime.now(datetime.timezone.utc) ) usage = relationship( "UserUsage", back_populates="user", uselist=False, cascade="all, delete-orphan" ) logs = relationship("UsageLog", back_populates="user", cascade="all, delete-orphan") class UserUsage(Base): __tablename__ = "user_usage" # user_id tożsamy z clerk_id user_id = Column(String, ForeignKey("users.clerk_id"), primary_key=True, index=True) wizard_iterations_today = Column(Integer, default=0) tokens_used_month = Column(Integer, default=0) last_reset_daily = Column( DateTime, default=lambda: datetime.datetime.now(datetime.timezone.utc) ) last_reset_monthly = Column( DateTime, default=lambda: datetime.datetime.now(datetime.timezone.utc) ) user = relationship("User", back_populates="usage") class UsageLog(Base): __tablename__ = "usage_logs" id = Column(Integer, primary_key=True, index=True, autoincrement=True) user_id = Column(String, ForeignKey("users.clerk_id"), index=True) action_type = Column(String, index=True) # np. 'wizard_iteration', 'llm_call' tokens_cost = Column(Integer, default=0) details = Column(String, nullable=True) # opcjonalnie info json timestamp = Column( DateTime, default=lambda: datetime.datetime.now(datetime.timezone.utc) ) user = relationship("User", back_populates="logs")