This commit is contained in:
2023-08-06 14:05:34 +02:00
parent 217adb85ed
commit 2f1fdecd5f
21 changed files with 273 additions and 1053 deletions

View File

@@ -1,4 +1,4 @@
from app.models import UploadBackends
from app.serializers import UploadBackend
from app.services.storages import BotStorage, StoragesContainer, UserStorage
@@ -39,8 +39,8 @@ class FileDownloader:
return user_storages[cls._user_storage_index]
@classmethod
async def _download_via(cls, message_id: int, storage_type: UploadBackends):
if storage_type == UploadBackends.bot:
async def _download_via(cls, message_id: int, storage_type: UploadBackend):
if storage_type == UploadBackend.bot:
storage = cls.get_bot_storage()
else:
storage = cls.get_user_storage()
@@ -52,9 +52,7 @@ class FileDownloader:
if not cls.bot_storages and not cls.user_storages:
raise ValueError("Files storage not exist!")
if (
data := await cls._download_via(message_id, UploadBackends.bot)
) is not None:
if (data := await cls._download_via(message_id, UploadBackend.bot)) is not None:
return data
return await cls._download_via(message_id, UploadBackends.user)
return await cls._download_via(message_id, UploadBackend.user)

View File

@@ -1,12 +1,12 @@
from typing import Any, Optional
from typing import Any, BinaryIO, Optional
from fastapi import UploadFile
from app.models import UploadBackends, UploadedFile
from app.serializers import Data, UploadBackend, UploadedFile
from app.services.storages import BotStorage, StoragesContainer, UserStorage
class Wrapper:
class Wrapper(BinaryIO):
def __init__(self, wrapped: Any, filename: str) -> None:
self.wrapped = wrapped
self.filename = filename
@@ -39,24 +39,26 @@ class FileUploader:
self.file = file
self.caption = caption
self.upload_data: Optional[dict] = None
self.upload_backend: Optional[UploadBackends] = None
self.upload_data: Optional[Data] = None
self.upload_backend: Optional[UploadBackend] = None
async def _upload(self) -> bool:
if not self.bot_storages and not self.user_storages:
raise ValueError("Files storage not exist!")
if await self._upload_via(UploadBackends.bot):
if await self._upload_via(UploadBackend.bot):
return True
return await self._upload_via(UploadBackends.user)
return await self._upload_via(UploadBackend.user)
async def _upload_via(self, storage_type: UploadBackends) -> bool:
if storage_type == UploadBackends.bot:
async def _upload_via(self, storage_type: UploadBackend) -> bool:
if storage_type == UploadBackend.bot:
storage = self.get_bot_storage()
else:
storage = self.get_user_storage()
assert self.file.filename
wrapped = Wrapper(self.file.file, self.file.filename)
data = await storage.upload(wrapped, caption=self.caption)
@@ -69,11 +71,11 @@ class FileUploader:
return True
async def _save_to_db(self) -> UploadedFile:
return await UploadedFile.objects.create(
backend=self.upload_backend,
data=self.upload_data,
)
def get_result(self) -> UploadedFile:
assert self.upload_backend is not None
assert self.upload_data is not None
return UploadedFile(backend=self.upload_backend, data=self.upload_data)
@classmethod
def get_bot_storage(cls) -> BotStorage:
@@ -107,4 +109,4 @@ class FileUploader:
if not upload_result:
return None
return await uploader._save_to_db()
return uploader.get_result()

View File

@@ -25,9 +25,12 @@ class BaseStorage:
self, file: telethon.hints.FileLike, caption: Optional[str] = None
) -> Optional[tuple[Union[str, int], int]]:
try:
message = await self.client.send_file(
entity=self.channel_id, file=file, caption=caption
)
if caption:
message = await self.client.send_file(
entity=self.channel_id, file=file, caption=caption
)
else:
message = await self.client.send_file(entity=self.channel_id, file=file)
except telethon.errors.FilePartInvalidError:
return None
except telethon.errors.PhotoInvalidError: