45 lines
1.6 KiB
Python
45 lines
1.6 KiB
Python
"""
|
|
Activity log model for audit trail
|
|
"""
|
|
|
|
import uuid
|
|
from datetime import datetime
|
|
from typing import Optional
|
|
|
|
from sqlalchemy import Column, String, Integer, DateTime, Text, ForeignKey, Index
|
|
from sqlalchemy.orm import relationship
|
|
from sqlalchemy.sql import func
|
|
from sqlalchemy.dialects.sqlite import JSON
|
|
|
|
from ..core.database import Base
|
|
|
|
|
|
class ActivityLog(Base):
|
|
"""Activity log for audit trail"""
|
|
|
|
__tablename__ = "activity_log"
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
timestamp = Column(DateTime, default=func.now(), nullable=False)
|
|
event_type = Column(String, nullable=False) # playlist_added, video_downloaded, check_completed, etc.
|
|
|
|
# Optional foreign keys
|
|
playlist_id = Column(String, ForeignKey("playlists.id", ondelete="CASCADE"), nullable=True)
|
|
video_id = Column(String, ForeignKey("videos.id", ondelete="CASCADE"), nullable=True)
|
|
|
|
# Details as JSON blob
|
|
details = Column(Text, nullable=True) # JSON string with additional details
|
|
|
|
# Relationships
|
|
playlist = relationship("PlaylistSubscription")
|
|
video = relationship("VideoRecord")
|
|
|
|
def __repr__(self):
|
|
return f"<ActivityLog(id='{self.id}', event_type='{self.event_type}', timestamp='{self.timestamp}')>"
|
|
|
|
|
|
# Create indexes for better query performance
|
|
Index("idx_activity_log_timestamp", ActivityLog.timestamp)
|
|
Index("idx_activity_log_event_type", ActivityLog.event_type)
|
|
Index("idx_activity_log_playlist_id", ActivityLog.playlist_id)
|
|
Index("idx_activity_log_video_id", ActivityLog.video_id) |