hesabixArc/hesabixAPI/adapters/db/models/file_storage.py
2025-09-21 19:53:21 +03:30

73 lines
3.5 KiB
Python

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])