|
@@ -42,6 +42,7 @@ from core.model_runtime.errors.invoke import InvokeAuthorizationError
|
|
|
from core.plugin.impl.exc import PluginDaemonClientSideError
|
|
from core.plugin.impl.exc import PluginDaemonClientSideError
|
|
|
from core.rag.extractor.entity.datasource_type import DatasourceType
|
|
from core.rag.extractor.entity.datasource_type import DatasourceType
|
|
|
from core.rag.extractor.entity.extract_setting import ExtractSetting
|
|
from core.rag.extractor.entity.extract_setting import ExtractSetting
|
|
|
|
|
+from core.file import helpers as file_helpers
|
|
|
from extensions.ext_database import db
|
|
from extensions.ext_database import db
|
|
|
from fields.document_fields import (
|
|
from fields.document_fields import (
|
|
|
dataset_and_document_fields,
|
|
dataset_and_document_fields,
|
|
@@ -1010,6 +1011,55 @@ class WebsiteDocumentSyncApi(DocumentResource):
|
|
|
return {"result": "success"}, 200
|
|
return {"result": "success"}, 200
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class DocDownloadFileApi(DocumentResource):
|
|
|
|
|
+ @setup_required
|
|
|
|
|
+ @login_required
|
|
|
|
|
+ @account_initialization_required
|
|
|
|
|
+ def get(self, dataset_id, document_id):
|
|
|
|
|
+ """Get upload file download URL for a document.
|
|
|
|
|
+
|
|
|
|
|
+ Returns download information and signed URL for the uploaded file
|
|
|
|
|
+ associated with this document.
|
|
|
|
|
+ """
|
|
|
|
|
+ dataset_id = str(dataset_id)
|
|
|
|
|
+ document_id = str(document_id)
|
|
|
|
|
+ document = self.get_document(dataset_id, document_id)
|
|
|
|
|
+
|
|
|
|
|
+ # Check if document is based on uploaded file
|
|
|
|
|
+ if document.data_source_type != "upload_file":
|
|
|
|
|
+ raise ValueError(f"Document data source type ({document.data_source_type}) is not upload_file.")
|
|
|
|
|
+
|
|
|
|
|
+ data_source_info = document.data_source_info_dict
|
|
|
|
|
+ if not data_source_info or "upload_file_id" not in data_source_info:
|
|
|
|
|
+ raise ValueError("Upload file id not found in document data source info.")
|
|
|
|
|
+
|
|
|
|
|
+ file_id = data_source_info["upload_file_id"]
|
|
|
|
|
+ upload_file = (
|
|
|
|
|
+ db.session.query(UploadFile)
|
|
|
|
|
+ .where(UploadFile.tenant_id == document.tenant_id, UploadFile.id == file_id)
|
|
|
|
|
+ .first()
|
|
|
|
|
+ )
|
|
|
|
|
+
|
|
|
|
|
+ if not upload_file:
|
|
|
|
|
+ raise NotFound("Upload file not found.")
|
|
|
|
|
+
|
|
|
|
|
+ # Generate signed URL
|
|
|
|
|
+ url = file_helpers.get_signed_file_url(upload_file_id=upload_file.id)
|
|
|
|
|
+ download_url = f"{url}&as_attachment=true"
|
|
|
|
|
+
|
|
|
|
|
+ return {
|
|
|
|
|
+ "id": upload_file.id,
|
|
|
|
|
+ "name": upload_file.name,
|
|
|
|
|
+ "size": upload_file.size,
|
|
|
|
|
+ "extension": upload_file.extension,
|
|
|
|
|
+ "url": url,
|
|
|
|
|
+ "download_url": download_url,
|
|
|
|
|
+ "mime_type": upload_file.mime_type,
|
|
|
|
|
+ "created_by": upload_file.created_by,
|
|
|
|
|
+ "created_at": upload_file.created_at.timestamp(),
|
|
|
|
|
+ }, 200
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
api.add_resource(GetProcessRuleApi, "/datasets/process-rule")
|
|
api.add_resource(GetProcessRuleApi, "/datasets/process-rule")
|
|
|
api.add_resource(DatasetDocumentListApi, "/datasets/<uuid:dataset_id>/documents")
|
|
api.add_resource(DatasetDocumentListApi, "/datasets/<uuid:dataset_id>/documents")
|
|
|
api.add_resource(DatasetInitApi, "/datasets/init")
|
|
api.add_resource(DatasetInitApi, "/datasets/init")
|
|
@@ -1029,5 +1079,5 @@ api.add_resource(DocumentPauseApi, "/datasets/<uuid:dataset_id>/documents/<uuid:
|
|
|
api.add_resource(DocumentRecoverApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/processing/resume")
|
|
api.add_resource(DocumentRecoverApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/processing/resume")
|
|
|
api.add_resource(DocumentRetryApi, "/datasets/<uuid:dataset_id>/retry")
|
|
api.add_resource(DocumentRetryApi, "/datasets/<uuid:dataset_id>/retry")
|
|
|
api.add_resource(DocumentRenameApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/rename")
|
|
api.add_resource(DocumentRenameApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/rename")
|
|
|
-
|
|
|
|
|
|
|
+api.add_resource(DocDownloadFileApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/download")
|
|
|
api.add_resource(WebsiteDocumentSyncApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/website-sync")
|
|
api.add_resource(WebsiteDocumentSyncApi, "/datasets/<uuid:dataset_id>/documents/<uuid:document_id>/website-sync")
|