from collections.abc import Generator
from typing import Union
from utils.storage.local_storage import LocalStorage
from utils.storage.s3_storage import S3Storage
from config import SYS_CONF
class Storage:
def __init__(self):
self.storage_type = SYS_CONF.get('STORAGE_TYPE', 'local')
if self.storage_type == 's3':
self.storage_runner = S3Storage(SYS_CONF)
else:
self.storage_runner = LocalStorage(SYS_CONF)
def save(self, filename, data):
self.storage_runner.save(filename, data)
def load(self, filename: str, stream: bool = False) -> Union[bytes, Generator]:
if stream:
return self.load_stream(filename)
else:
return self.load_once(filename)
def load_once(self, filename: str) -> bytes:
return self.storage_runner.load_once(filename)
def load_stream(self, filename: str) -> Generator:
return self.storage_runner.load_stream(filename)
def download(self, filename, target_filepath):
self.storage_runner.download(filename, target_filepath)
def get_download_url(self, filename):
if self.storage_type == 's3':
url = f"{SYS_CONF.get('STORAGE_PUBLIC_ENDPOINT') if 'STORAGE_PUBLIC_ENDPOINT' in SYS_CONF else SYS_CONF.get('S3_ENDPOINT')}/{SYS_CONF.get('S3_BUCKET_NAME')}/{filename}"
else:
url = f"{SYS_CONF.get('STORAGE_PUBLIC_ENDPOINT') if 'STORAGE_PUBLIC_ENDPOINT' in SYS_CONF else '/api'}/static/{filename}"
return url
def exists(self, filename):
return self.storage_runner.exists(filename)
def delete(self, filename):
return self.storage_runner.delete(filename)
storage = Storage()