From 41d74f5a87f3a6874764f61e71d774c2a2b02b0a Mon Sep 17 00:00:00 2001 From: codebane Date: Tue, 24 Oct 2023 14:51:03 +0300 Subject: [PATCH] adding external storage --- .../upload/local_upload_strategy.py | 32 +++++++++++++++++++ .../upload/minio_upload_strategy.py | 32 +++++++++++++++++++ .../upload/upload_stragegy_interface.py | 7 ++++ .../upload/upload_strategy_factory.py | 13 ++++++++ dj_backend_server/docker-compose.yaml | 15 +++++++++ 5 files changed, 99 insertions(+) create mode 100644 dj_backend_server/api/utils/strategies/upload/local_upload_strategy.py create mode 100644 dj_backend_server/api/utils/strategies/upload/minio_upload_strategy.py create mode 100644 dj_backend_server/api/utils/strategies/upload/upload_stragegy_interface.py create mode 100644 dj_backend_server/api/utils/strategies/upload/upload_strategy_factory.py diff --git a/dj_backend_server/api/utils/strategies/upload/local_upload_strategy.py b/dj_backend_server/api/utils/strategies/upload/local_upload_strategy.py new file mode 100644 index 00000000..87ac9651 --- /dev/null +++ b/dj_backend_server/api/utils/strategies/upload/local_upload_strategy.py @@ -0,0 +1,32 @@ +from .upload_stragegy_interface import UploadStrategy +import os +from uuid import uuid4 + +class LocalUploadStrategy(UploadStrategy): + + def __init__(self, upload_dir='uploads'): + self.upload_dir = upload_dir + + def upload_files(self, files): + uploaded_files = [] + for file in files: + file_name = file.name + file_ext = os.path.splitext(file_name)[1] + + # Generate unique file name + unique_name = str(uuid4()) + file_ext + file_path = os.path.join(self.upload_dir, unique_name) + + # Create upload dir if doesn't exist + if not os.path.exists(self.upload_dir): + os.makedirs(self.upload_dir) + + # Save file + with open(file_path, 'wb+') as f: + for chunk in file.chunks(): + f.write(chunk) + + uploaded_file = {'name': file_name, 'path': file_path} + uploaded_files.append(uploaded_file) + + return uploaded_files \ No newline at end of file diff --git a/dj_backend_server/api/utils/strategies/upload/minio_upload_strategy.py b/dj_backend_server/api/utils/strategies/upload/minio_upload_strategy.py new file mode 100644 index 00000000..a8e70e4e --- /dev/null +++ b/dj_backend_server/api/utils/strategies/upload/minio_upload_strategy.py @@ -0,0 +1,32 @@ +from minio import Minio +from minio.error import ResponseError +from .upload_stragegy_interface import UploadStrategy +from uuid import uuid4 +import os + +class MinioUploadStrategy(UploadStrategy): + + def __init__(self, endpoint, access_key, secret_key, bucket_name): + self.minio_client = Minio(endpoint, access_key=access_key, secret_key=secret_key, secure=True) + self.bucket_name = bucket_name + + def upload_files(self, files): + uploaded_files = [] + try: + for file in files: + file_name = file.name + file_ext = os.path.splitext(file_name)[1] + + # Generate unique file name + unique_name = str(uuid4()) + file_ext + + # Upload file + self.minio_client.fput_object(self.bucket_name, unique_name, file) + + uploaded_file = {'name': file_name, 'path': unique_name} + uploaded_files.append(uploaded_file) + + except ResponseError as err: + print(err) + + return uploaded_files \ No newline at end of file diff --git a/dj_backend_server/api/utils/strategies/upload/upload_stragegy_interface.py b/dj_backend_server/api/utils/strategies/upload/upload_stragegy_interface.py new file mode 100644 index 00000000..8b632a08 --- /dev/null +++ b/dj_backend_server/api/utils/strategies/upload/upload_stragegy_interface.py @@ -0,0 +1,7 @@ +from abc import ABC, abstractmethod + +class UploadStrategy(ABC): + + @abstractmethod + def upload_files(self, files): + pass \ No newline at end of file diff --git a/dj_backend_server/api/utils/strategies/upload/upload_strategy_factory.py b/dj_backend_server/api/utils/strategies/upload/upload_strategy_factory.py new file mode 100644 index 00000000..4cf7d5ee --- /dev/null +++ b/dj_backend_server/api/utils/strategies/upload/upload_strategy_factory.py @@ -0,0 +1,13 @@ +from api.utils.strategies.upload.local_upload_strategy import LocalUploadStrategy +from api.utils.strategies.upload.minio_upload_strategy import MinioUploadStrategy + +class UploadStrategyFactory: + + @staticmethod + def get_strategy(strategy_type): + if strategy_type == 'local': + return LocalUploadStrategy() + elif strategy_type == 'minio': + return MinioUploadStrategy() + else: + raise ValueError(f'Invalid strategy {strategy_type}') \ No newline at end of file diff --git a/dj_backend_server/docker-compose.yaml b/dj_backend_server/docker-compose.yaml index 4b618388..64b492d0 100644 --- a/dj_backend_server/docker-compose.yaml +++ b/dj_backend_server/docker-compose.yaml @@ -78,6 +78,21 @@ services: command: celery -A dj_backend_server worker --loglevel=info networks: - openchat_network + + minio: + image: minio/minio + container_name: minio + environment: + MINIO_ACCESS_KEY: your-access-key + MINIO_SECRET_KEY: your-secret-key + ports: + - "9000:9000" + volumes: + - minio-data:/data + command: server /data + networks: + - openchat_network + redis: image: redis:latest