mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-06-04 20:05:16 +02:00
feat(file-storage): add document_files model and enum
This commit is contained in:
parent
1bb1022d35
commit
72174c780a
3 changed files with 88 additions and 0 deletions
11
surfsense_backend/app/file_storage/persistence/__init__.py
Normal file
11
surfsense_backend/app/file_storage/persistence/__init__.py
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
"""Models and enums for the document file-storage tables."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from .enums import DocumentFileKind
|
||||||
|
from .models import DocumentFile
|
||||||
|
|
||||||
|
__all__ = [
|
||||||
|
"DocumentFile",
|
||||||
|
"DocumentFileKind",
|
||||||
|
]
|
||||||
11
surfsense_backend/app/file_storage/persistence/enums.py
Normal file
11
surfsense_backend/app/file_storage/persistence/enums.py
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
"""DocumentFile kinds: the original upload plus future derived artifacts."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from enum import StrEnum
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentFileKind(StrEnum):
|
||||||
|
ORIGINAL = "ORIGINAL"
|
||||||
|
REDACTED = "REDACTED"
|
||||||
|
FILLED_FORM = "FILLED_FORM"
|
||||||
66
surfsense_backend/app/file_storage/persistence/models.py
Normal file
66
surfsense_backend/app/file_storage/persistence/models.py
Normal file
|
|
@ -0,0 +1,66 @@
|
||||||
|
"""``document_files`` table: durable blobs associated with a document."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
from sqlalchemy import (
|
||||||
|
BigInteger,
|
||||||
|
Column,
|
||||||
|
Enum as SQLAlchemyEnum,
|
||||||
|
ForeignKey,
|
||||||
|
Integer,
|
||||||
|
String,
|
||||||
|
)
|
||||||
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
|
from sqlalchemy.orm import relationship
|
||||||
|
|
||||||
|
from app.db import BaseModel, TimestampMixin
|
||||||
|
|
||||||
|
from .enums import DocumentFileKind
|
||||||
|
|
||||||
|
|
||||||
|
class DocumentFile(BaseModel, TimestampMixin):
|
||||||
|
"""One stored file for a document (its original upload, or a derived copy)."""
|
||||||
|
|
||||||
|
__tablename__ = "document_files"
|
||||||
|
|
||||||
|
document_id = Column(
|
||||||
|
Integer,
|
||||||
|
ForeignKey("documents.id", ondelete="CASCADE"),
|
||||||
|
nullable=False,
|
||||||
|
index=True,
|
||||||
|
)
|
||||||
|
search_space_id = Column(
|
||||||
|
Integer,
|
||||||
|
ForeignKey("searchspaces.id", ondelete="CASCADE"),
|
||||||
|
nullable=False,
|
||||||
|
index=True,
|
||||||
|
)
|
||||||
|
kind = Column(
|
||||||
|
SQLAlchemyEnum(
|
||||||
|
DocumentFileKind,
|
||||||
|
name="document_file_kind",
|
||||||
|
values_callable=lambda x: [e.value for e in x],
|
||||||
|
),
|
||||||
|
nullable=False,
|
||||||
|
default=DocumentFileKind.ORIGINAL,
|
||||||
|
server_default=DocumentFileKind.ORIGINAL.value,
|
||||||
|
index=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
# Where the bytes live: the backend that stored them and its object key.
|
||||||
|
storage_backend = Column(String(32), nullable=False)
|
||||||
|
storage_key = Column(String, nullable=False)
|
||||||
|
|
||||||
|
original_filename = Column(String, nullable=False)
|
||||||
|
mime_type = Column(String, nullable=True)
|
||||||
|
size_bytes = Column(BigInteger, nullable=False)
|
||||||
|
checksum_sha256 = Column(String(64), nullable=True)
|
||||||
|
|
||||||
|
created_by_id = Column(
|
||||||
|
UUID(as_uuid=True),
|
||||||
|
ForeignKey("user.id", ondelete="SET NULL"),
|
||||||
|
nullable=True,
|
||||||
|
index=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
document = relationship("Document", back_populates="files")
|
||||||
Loading…
Add table
Add a link
Reference in a new issue