David Prince
production: clean source snapshot — no history bloat
71b4454
Raw
History Blame Contribute Delete
2.72 kB
from sqlalchemy import Column, Integer, String, DateTime, Text, JSON, Boolean, ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship
from datetime import datetime
Base = declarative_base()
class APIKey(Base):
__tablename__ = "api_keys"
id = Column(Integer, primary_key=True)
key_id = Column(String(64), unique=True, nullable=False)
name = Column(String(128), nullable=False)
key_hash = Column(String(128), nullable=False) # hashed key
user_id = Column(String(64), nullable=True)
roles = Column(JSON, default=[]) # list of roles
permissions = Column(JSON, default=[]) # list of permissions
expires_at = Column(DateTime, nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
last_used_at = Column(DateTime, nullable=True)
is_active = Column(Boolean, default=True)
class Secret(Base):
__tablename__ = "secrets"
id = Column(Integer, primary_key=True)
secret_id = Column(String(64), unique=True, nullable=False)
name = Column(String(128), nullable=False)
value_encrypted = Column(Text, nullable=False) # store encrypted
user_id = Column(String(64), nullable=True)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
expires_at = Column(DateTime, nullable=True)
class Role(Base):
__tablename__ = "roles"
id = Column(Integer, primary_key=True)
role_id = Column(String(64), unique=True, nullable=False)
name = Column(String(64), nullable=False)
permissions = Column(JSON, default=[]) # list of permission strings
class RateLimitRule(Base):
__tablename__ = "rate_limit_rules"
id = Column(Integer, primary_key=True)
rule_id = Column(String(64), unique=True, nullable=False)
path = Column(String(256), nullable=False) # e.g., "/v1/models/generate"
method = Column(String(16), nullable=False) # GET, POST, etc.
limit = Column(Integer, default=100) # max requests
window_seconds = Column(Integer, default=60) # time window
user_id = Column(String(64), nullable=True) # optional per-user override
class JWTToken(Base):
__tablename__ = "jwt_tokens"
id = Column(Integer, primary_key=True)
token_id = Column(String(64), unique=True, nullable=False)
user_id = Column(String(64), nullable=False)
jti = Column(String(64), nullable=False) # JWT ID
expires_at = Column(DateTime, nullable=False)
created_at = Column(DateTime, default=datetime.utcnow)
revoked = Column(Boolean, default=False)