From 670f759be618db664941e66b4ed6fef4d3434019 Mon Sep 17 00:00:00 2001
From: Maxim Podosochnyy <podosochnyy@perx.ru>
Date: Fri, 15 Mar 2024 14:26:30 +0700
Subject: [PATCH] =?UTF-8?q?=D0=98=D0=B7=20PerxisDataProvider=20=D0=B2?=
 =?UTF-8?q?=D1=8B=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20=D0=BB=D0=BE=D0=B3?=
 =?UTF-8?q?=D0=B8=D0=BA=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?=
 =?UTF-8?q?=D1=81=20item=20=D0=B8=20referrence?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 README.md          |  8 +++++
 perxis/provider.py | 77 ++++++++++++++++++++++++++++++++--------------
 setup.py           |  2 +-
 3 files changed, 63 insertions(+), 24 deletions(-)

diff --git a/README.md b/README.md
index cc96338..2d70479 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,13 @@
 # perxis-python
 
+## Работа с perxis
+В модуле `perxis.provider` есть классы: 
+1. `PerxisItemsWrapper` - является обёрткой над `grpc`, реализует внутри себя логику для работы с `items`. Экземпляр `ItemsStub` ожидается внешний, поэтому класс можно использовать, например, при разработке расширений
+2. `PerxisReferencesWrapper` - является обёрткой над `grpc`, реализует внутри себя логику для работы с `references`. Экземпляр `ReferencesStub` ожидается внешний, поэтому класс можно использовать, например, при разработке расширений
+3. `PerxisFilesWrapper` - обёртка над `grpc` для работы с файлами. Экземпляр `FilesStub` ожидается внешний, класс можно использовать при разработке расширений
+4. `PerxisDataProvider` - Провайдер данных для работы с `items` и `references` для конкретного пространства и окружения. Сама логика работы реализована в классах `PerxisItemsWrapper` и `PerxisReferencesWrapper`, экземпляр `PerxisDataProvider` создаёт `stub'ы` сервисов на базе переданного при инициализации канала. Данный класс можно использовать во внешних приложениях. Использовать его при разработке расширений не получится так как класс подразумевает динамическое создние `stub'ов`
+5. `PerxisFileProvider` - Провайдер для работы с файлами, создающий `FilesStub` на базе переданного при инициализации канала. Внутри себя задействует экземпляр `PerxisFilesWrapper` 
+
 ## Расширения
 ### Локальная разработка
 Для работы расширения требуется указание системного контекста при выполнении запросов. Это возможно только в случае прямой
diff --git a/perxis/provider.py b/perxis/provider.py
index 39ec678..2b0ea48 100644
--- a/perxis/provider.py
+++ b/perxis/provider.py
@@ -13,6 +13,50 @@ DEFAULT_PAGE_SIZE: int = 100
 DEFAULT_PART_SIZE: int = 1024 * 5
 
 
+class PerxisFilesWrapper:
+    __stub: files_pb2_grpc.FilesStub
+
+    def __init__(self, stub: files_pb2_grpc.FilesStub) -> None:
+        self.__stub = stub
+
+    async def start_upload(
+        self, file_name: str, file_size: int
+    ) -> files_pb2.StartUploadResponse:
+        message = await self.__stub.StartUpload(
+            files_pb2.StartUploadRequest(
+                upload=files_pb2.MultipartUpload(
+                    file=files_pb2.File(
+                        name=file_name, size=file_size
+                    )
+                )
+            )
+        )
+        return message
+
+    async def complete_upload(
+        self,
+        file_id: str,
+        upload_id: str,
+        parts: list[str],
+        part_size: int = DEFAULT_PART_SIZE
+    ) -> files_pb2.CompleteUploadResponse:
+        message = await self.__stub.CompleteUpload(
+            files_pb2.CompleteUploadRequest(
+                upload=files_pb2.MultipartUpload(
+                    file=files_pb2.File(id=file_id),
+                    upload_id=upload_id,
+                    part_size=part_size,
+                    parts=[
+                        files_pb2.CompletedPart(id=value, number=index)
+                        for index, value in enumerate(parts, 1)
+                    ],
+
+                )
+            )
+        )
+        return message
+
+
 class PerxisReferencesWrapper:
     __references: references_pb2_grpc.ReferencesStub
 
@@ -359,21 +403,18 @@ class PerxisDataProvider:
 
 
 class PerxisFileProvider:
+    __files_wrapper: PerxisFilesWrapper
+
     def __init__(self, channel: GrpcChannel) -> None:
-        self._stub = files_pb2_grpc.FilesStub(channel.channel)
+        self.__files_wrapper = PerxisFilesWrapper(
+            stub=files_pb2_grpc.FilesStub(channel.channel)
+        )
 
     async def start_upload(
         self, file_name: str, file_size: int
     ) -> files_pb2.StartUploadResponse:
-        message = await self._stub.StartUpload(
-            files_pb2.StartUploadRequest(
-                upload=files_pb2.MultipartUpload(
-                    file=files_pb2.File(
-                        name=file_name, size=file_size
-                    )
-                )
-            )
-        )
+        message = await self.__files_wrapper.start_upload(file_name, file_size)
+
         return message
 
     async def complete_upload(
@@ -383,18 +424,8 @@ class PerxisFileProvider:
         parts: list[str],
         part_size: int = DEFAULT_PART_SIZE
     ) -> files_pb2.CompleteUploadResponse:
-        message = await self._stub.CompleteUpload(
-            files_pb2.CompleteUploadRequest(
-                upload=files_pb2.MultipartUpload(
-                    file=files_pb2.File(id=file_id),
-                    upload_id=upload_id,
-                    part_size=part_size,
-                    parts=[
-                        files_pb2.CompletedPart(id=value, number=index)
-                        for index, value in enumerate(parts, 1)
-                    ],
-
-                )
-            )
+        message = await self.__files_wrapper.complete_upload(
+            file_id, upload_id, parts, part_size
         )
+
         return message
diff --git a/setup.py b/setup.py
index 5f82c5f..d7bed58 100644
--- a/setup.py
+++ b/setup.py
@@ -14,7 +14,7 @@ def load_requirements():
 
 setup(
     name='perxis',
-    version='1.4.0',
+    version='1.4.1',
     description='Perxis python client',
     long_description=long_description,
     long_description_content_type='text/markdown',
-- 
GitLab