from sqlalchemy import Column, String, Integer, DateTime, Boolean, Text, ForeignKey, JSON from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import relationship from sqlalchemy.sql import func import uuid from adapters.db.session import Base class FileStorage(Base): __tablename__ = "file_storage" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) original_name = Column(String(255), nullable=False) stored_name = Column(String(255), nullable=False) file_path = Column(String(500), nullable=False) file_size = Column(Integer, nullable=False) mime_type = Column(String(100), nullable=False) storage_type = Column(String(20), nullable=False) # local, ftp storage_config_id = Column(UUID(as_uuid=True), ForeignKey("storage_configs.id"), nullable=True) uploaded_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) module_context = Column(String(50), nullable=False) # tickets, accounting, business_logo, etc. context_id = Column(UUID(as_uuid=True), nullable=True) # ticket_id, document_id, etc. developer_data = Column(JSON, nullable=True) checksum = Column(String(64), nullable=True) is_active = Column(Boolean, default=True, nullable=False) is_temporary = Column(Boolean, default=False, nullable=False) is_verified = Column(Boolean, default=False, nullable=False) verification_token = Column(String(100), nullable=True) last_verified_at = Column(DateTime(timezone=True), nullable=True) expires_at = Column(DateTime(timezone=True), nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) deleted_at = Column(DateTime(timezone=True), nullable=True) # Relationships uploader = relationship("User", foreign_keys=[uploaded_by]) storage_config = relationship("StorageConfig", foreign_keys=[storage_config_id]) class StorageConfig(Base): __tablename__ = "storage_configs" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) name = Column(String(100), nullable=False) storage_type = Column(String(20), nullable=False) # local, ftp is_default = Column(Boolean, default=False, nullable=False) is_active = Column(Boolean, default=True, nullable=False) config_data = Column(JSON, nullable=False) created_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=False) created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now(), nullable=False) # Relationships creator = relationship("User", foreign_keys=[created_by]) class FileVerification(Base): __tablename__ = "file_verifications" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) file_id = Column(UUID(as_uuid=True), ForeignKey("file_storage.id"), nullable=False) module_name = Column(String(50), nullable=False) verification_token = Column(String(100), nullable=False) verified_at = Column(DateTime(timezone=True), nullable=True) verified_by = Column(UUID(as_uuid=True), ForeignKey("users.id"), nullable=True) verification_data = Column(JSON, nullable=True) created_at = Column(DateTime(timezone=True), server_default=func.now(), nullable=False) # Relationships file = relationship("FileStorage", foreign_keys=[file_id]) verifier = relationship("User", foreign_keys=[verified_by])