File size: 2,084 Bytes
afd56bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
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")