- In Scaleway, we only have one bucket, and store information for each tenant in separate folders
- Added staging configuration to scaleway
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
from minio import Minio
|
||||
from minio.error import S3Error
|
||||
from flask import Flask
|
||||
from flask import Flask, current_app
|
||||
import io
|
||||
from werkzeug.datastructures import FileStorage
|
||||
|
||||
@@ -21,27 +21,51 @@ class MinioClient:
|
||||
app.logger.info(f"MinIO client initialized with endpoint: {app.config['MINIO_ENDPOINT']}")
|
||||
|
||||
def generate_bucket_name(self, tenant_id):
|
||||
return f"tenant-{tenant_id}-bucket"
|
||||
tenant_base = current_app.config.get('OBJECT_STORAGE_TENANT_BASE', 'bucket')
|
||||
if tenant_base == 'bucket':
|
||||
return f"tenant-{tenant_id}-bucket"
|
||||
elif tenant_base == 'folder':
|
||||
return current_app.config.get('OBJECT_STORAGE_BUCKET_NAME')
|
||||
else:
|
||||
raise ValueError(f"Invalid OBJECT_STORAGE_TENANT_BASE value: {tenant_base}")
|
||||
|
||||
def create_tenant_bucket(self, tenant_id):
|
||||
bucket_name = self.generate_bucket_name(tenant_id)
|
||||
try:
|
||||
if not self.client.bucket_exists(bucket_name):
|
||||
self.client.make_bucket(bucket_name)
|
||||
tenant_base = current_app.config.get('OBJECT_STORAGE_TENANT_BASE', 'bucket')
|
||||
if tenant_base == 'bucket':
|
||||
bucket_name = self.generate_bucket_name(tenant_id)
|
||||
try:
|
||||
if not self.client.bucket_exists(bucket_name):
|
||||
self.client.make_bucket(bucket_name)
|
||||
return bucket_name
|
||||
return bucket_name
|
||||
return bucket_name
|
||||
except S3Error as err:
|
||||
raise Exception(f"Error occurred while creating bucket: {err}")
|
||||
except S3Error as err:
|
||||
raise Exception(f"Error occurred while creating bucket: {err}")
|
||||
elif tenant_base == 'folder': # In this case, we are working within a predefined bucket
|
||||
return current_app.config.get('OBJECT_STORAGE_BUCKET_NAME')
|
||||
else:
|
||||
raise ValueError(f"Invalid OBJECT_STORAGE_TENANT_BASE value: {tenant_base}")
|
||||
|
||||
def generate_object_name(self, document_id, language, version_id, filename):
|
||||
return f"{document_id}/{language}/{version_id}/{filename}"
|
||||
def generate_object_name(self, tenant_id, document_id, language, version_id, filename):
|
||||
tenant_base = current_app.config.get('OBJECT_STORAGE_TENANT_BASE', 'bucket')
|
||||
if tenant_base == 'bucket':
|
||||
return f"{document_id}/{language}/{version_id}/{filename}"
|
||||
elif tenant_base == 'folder':
|
||||
return f"tenant-{tenant_id}/documents/{document_id}/{language}/{version_id}/{filename}"
|
||||
else:
|
||||
raise ValueError(f"Invalid OBJECT_STORAGE_TENANT_BASE value: {tenant_base}")
|
||||
|
||||
def generate_asset_name(self, asset_id, asset_type, content_type):
|
||||
return f"assets/{asset_type}/{asset_id}.{content_type}"
|
||||
def generate_asset_name(self, tenant_id, asset_id, asset_type, content_type):
|
||||
tenant_base = current_app.config.get('OBJECT_STORAGE_TENANT_BASE', 'bucket')
|
||||
if tenant_base == 'bucket':
|
||||
return f"assets/{asset_type}/{asset_id}.{content_type}"
|
||||
elif tenant_base == 'folder':
|
||||
return f"tenant-{tenant_id}/assets/{asset_type}/{asset_id}.{content_type}"
|
||||
else:
|
||||
raise ValueError(f"Invalid OBJECT_STORAGE_TENANT_BASE value: {tenant_base}")
|
||||
|
||||
def upload_document_file(self, tenant_id, document_id, language, version_id, filename, file_data):
|
||||
bucket_name = self.generate_bucket_name(tenant_id)
|
||||
object_name = self.generate_object_name(document_id, language, version_id, filename)
|
||||
object_name = self.generate_object_name(tenant_id, document_id, language, version_id, filename)
|
||||
|
||||
try:
|
||||
if isinstance(file_data, FileStorage):
|
||||
@@ -63,7 +87,7 @@ class MinioClient:
|
||||
def upload_asset_file(self, tenant_id: int, asset_id: int, asset_type: str, file_type: str,
|
||||
file_data: bytes | FileStorage | io.BytesIO | str, ) -> tuple[str, str, int]:
|
||||
bucket_name = self.generate_bucket_name(tenant_id)
|
||||
object_name = self.generate_asset_name(asset_id, asset_type, file_type)
|
||||
object_name = self.generate_asset_name(tenant_id, asset_id, asset_type, file_type)
|
||||
|
||||
try:
|
||||
if isinstance(file_data, FileStorage):
|
||||
@@ -111,7 +135,7 @@ class MinioClient:
|
||||
|
||||
def delete_document_file(self, tenant_id, document_id, language, version_id, filename):
|
||||
bucket_name = self.generate_bucket_name(tenant_id)
|
||||
object_name = self.generate_object_name(document_id, language, version_id, filename)
|
||||
object_name = self.generate_object_name(tenant_id, document_id, language, version_id, filename)
|
||||
try:
|
||||
self.client.remove_object(bucket_name, object_name)
|
||||
return True
|
||||
|
||||
Reference in New Issue
Block a user