From 54f2370cf551571c3a296460fbabf4278daf84f4 Mon Sep 17 00:00:00 2001 From: Robert Date: Sun, 3 Mar 2024 17:58:43 +0700 Subject: [PATCH] file uploader logic --- .../dependencies/file_uploader_service.py | 21 +++++++++ chain_service/services/file_uploader.py | 45 +++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 chain_service/dependencies/file_uploader_service.py create mode 100644 chain_service/services/file_uploader.py diff --git a/chain_service/dependencies/file_uploader_service.py b/chain_service/dependencies/file_uploader_service.py new file mode 100644 index 0000000..495df3d --- /dev/null +++ b/chain_service/dependencies/file_uploader_service.py @@ -0,0 +1,21 @@ +from chain_service.services.file_uploader import FileUploaderService + +from .planfix_client import PlanfixClientDependency +from .uploaded_file_repository import UploadedFileRepositoryDependency + +from fastapi import Depends +from typing import Annotated + + +def get_file_uploader_service( + planfix_client: PlanfixClientDependency, + uploaded_file_repository: UploadedFileRepositoryDependency, +) -> FileUploaderService: + return FileUploaderService( + planfix_client=planfix_client, uploaded_file_repository=uploaded_file_repository + ) + + +FileUploaderServiceDependency = Annotated[ + FileUploaderService, Depends(get_file_uploader_service) +] diff --git a/chain_service/services/file_uploader.py b/chain_service/services/file_uploader.py new file mode 100644 index 0000000..e2ec343 --- /dev/null +++ b/chain_service/services/file_uploader.py @@ -0,0 +1,45 @@ +from chain_service.database.models.chain import Chain +from chain_service.database.models.uploaded_file import UploadedFile +from chain_service.repositories.uploaded_file import UploadedFileRepository + +from loguru import logger +from planfix_client import PlanfixClient +from planfix_client.exceptions import PlanfixAPIError + + +class FileUploaderService: + + def __init__( + self, + planfix_client: PlanfixClient, + uploaded_file_repository: UploadedFileRepository, + ): + self.planfix_client = planfix_client + self.uploaded_file_repository = uploaded_file_repository + + async def upload_from_chain(self, chain: Chain): + files_to_upload = list() + + for action in chain.actions: + file_urls_to_upload = [*files_to_upload, *action.file_urls] + + for file_url in file_urls_to_upload: + await self.upload_file_by_url(file_url) + + async def upload_file_by_url(self, file_url: str): + try: + uploaded_file = await self.uploaded_file_repository.get_by_file_url( + file_url + ) + + if uploaded_file: + return + + uploaded_file_id = await self.planfix_client.upload_file_from_url(file_url) + + await self.uploaded_file_repository.upsert( + UploadedFile(file_id=uploaded_file_id, file_url=file_url) + ) + + except PlanfixAPIError: + logger.exception(f"Error while uploading to planfix {file_url=}")