""" File change model for tracking file operations during work sessions. This model records all file modifications, creations, deletions, and renames performed during work sessions. """ from datetime import datetime from typing import Optional from sqlalchemy import CHAR, CheckConstraint, ForeignKey, Index, Integer, String, Text from sqlalchemy.orm import Mapped, mapped_column, relationship from sqlalchemy.sql import func from api.models.base import Base, UUIDMixin class FileChange(UUIDMixin, Base): """ Track file changes during work sessions. Records all file operations including creations, modifications, deletions, renames, and backups performed during work items. Attributes: id: UUID primary key work_item_id: Reference to the work item session_id: Reference to the session file_path: Path to the file that was changed change_type: Type of change (created, modified, deleted, renamed, backed_up) backup_path: Path to backup if one was created size_bytes: File size in bytes description: Description of the change created_at: When the change was recorded """ __tablename__ = "file_changes" # Foreign keys work_item_id: Mapped[str] = mapped_column( CHAR(36), ForeignKey("work_items.id", ondelete="CASCADE"), nullable=False, doc="Reference to work item", ) session_id: Mapped[str] = mapped_column( CHAR(36), ForeignKey("sessions.id", ondelete="CASCADE"), nullable=False, doc="Reference to session", ) # File details file_path: Mapped[str] = mapped_column( String(1000), nullable=False, doc="Path to the file that was changed", ) change_type: Mapped[Optional[str]] = mapped_column( String(50), nullable=True, doc="Type of change", ) backup_path: Mapped[Optional[str]] = mapped_column( String(1000), nullable=True, doc="Path to backup file if created", ) size_bytes: Mapped[Optional[int]] = mapped_column( Integer, nullable=True, doc="File size in bytes", ) description: Mapped[Optional[str]] = mapped_column( Text, nullable=True, doc="Description of the change", ) # Timestamp created_at: Mapped[datetime] = mapped_column( nullable=False, server_default=func.now(), doc="When the change was recorded", ) # Table constraints __table_args__ = ( CheckConstraint( "change_type IN ('created', 'modified', 'deleted', 'renamed', 'backed_up')", name="ck_file_changes_type", ), Index("idx_file_changes_work_item", "work_item_id"), Index("idx_file_changes_session", "session_id"), ) def __repr__(self) -> str: """String representation of the file change.""" return f""