ShreyasGosavi's picture
Upload 37 files
53bec59 verified
"""
Database Models and Session Management
"""
from datetime import datetime
from typing import Optional
from sqlalchemy import (
Boolean, Column, DateTime, Float, Integer, String, Text, JSON, ForeignKey, Index
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, Session
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import QueuePool
from src.core.config import settings
# Create declarative base
Base = declarative_base()
# Database Models
class User(Base):
"""User model for authentication"""
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
email = Column(String(255), unique=True, index=True, nullable=False)
hashed_password = Column(String(255), nullable=False)
full_name = Column(String(255))
is_active = Column(Boolean, default=True)
is_superuser = Column(Boolean, default=False)
created_at = Column(DateTime, default=datetime.utcnow)
updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow)
# Relationships
api_keys = relationship("APIKey", back_populates="user", cascade="all, delete-orphan")
requests = relationship("RequestLog", back_populates="user", cascade="all, delete-orphan")
class APIKey(Base):
"""API Key model for API authentication"""
__tablename__ = "api_keys"
id = Column(Integer, primary_key=True, index=True)
key = Column(String(64), unique=True, index=True, nullable=False)
name = Column(String(255))
user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
is_active = Column(Boolean, default=True)
rate_limit_per_minute = Column(Integer, default=60)
rate_limit_per_hour = Column(Integer, default=1000)
created_at = Column(DateTime, default=datetime.utcnow)
last_used_at = Column(DateTime)
expires_at = Column(DateTime)
# Relationships
user = relationship("User", back_populates="api_keys")
# Indexes
__table_args__ = (
Index('idx_apikey_user_active', 'user_id', 'is_active'),
)
class RequestLog(Base):
"""Request logging for analytics and debugging"""
__tablename__ = "request_logs"
id = Column(Integer, primary_key=True, index=True)
request_id = Column(String(64), unique=True, index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=True)
api_key_id = Column(Integer, ForeignKey("api_keys.id"), nullable=True)
# Request details
method = Column(String(10))
path = Column(String(500))
query_params = Column(JSON)
status_code = Column(Integer)
# Performance
duration_ms = Column(Float)
# Client info
ip_address = Column(String(45))
user_agent = Column(Text)
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow, index=True)
# Relationships
user = relationship("User", back_populates="requests")
# Indexes
__table_args__ = (
Index('idx_request_user_created', 'user_id', 'created_at'),
Index('idx_request_created', 'created_at'),
)
class PredictionLog(Base):
"""ML prediction logging for analytics"""
__tablename__ = "prediction_logs"
id = Column(Integer, primary_key=True, index=True)
request_id = Column(String(64), index=True)
user_id = Column(Integer, ForeignKey("users.id"), nullable=True)
# Prediction details
model_type = Column(String(50), index=True) # deepfake, ai_text, anomaly
input_type = Column(String(20)) # text, image, video, audio
input_size = Column(Integer) # bytes or character count
# Results
prediction = Column(String(50))
confidence = Column(Float)
details = Column(JSON)
# Performance
duration_ms = Column(Float)
cached = Column(Boolean, default=False)
# Timestamps
created_at = Column(DateTime, default=datetime.utcnow, index=True)
# Indexes
__table_args__ = (
Index('idx_prediction_model_created', 'model_type', 'created_at'),
Index('idx_prediction_user_created', 'user_id', 'created_at'),
)
class SystemMetric(Base):
"""System performance metrics"""
__tablename__ = "system_metrics"
id = Column(Integer, primary_key=True, index=True)
metric_name = Column(String(100), index=True)
metric_value = Column(Float)
labels = Column(JSON)
created_at = Column(DateTime, default=datetime.utcnow, index=True)
# Indexes
__table_args__ = (
Index('idx_metric_name_created', 'metric_name', 'created_at'),
)
# Database Engine and Session
engine = create_engine(
settings.DATABASE_URL,
poolclass=QueuePool,
pool_size=10,
max_overflow=20,
pool_pre_ping=True,
echo=settings.DEBUG
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
# Dependency for FastAPI
def get_db():
"""Get database session"""
db = SessionLocal()
try:
yield db
finally:
db.close()
# Database initialization
def create_tables():
"""Create all tables"""
Base.metadata.create_all(bind=engine)
def drop_tables():
"""Drop all tables (use with caution!)"""
Base.metadata.drop_all(bind=engine)
if __name__ == "__main__":
print("Creating database tables...")
create_tables()
print("Tables created successfully!")