diff --git a/mipac/actions/drive.py b/mipac/actions/drive.py index 1060bdd..daab97b 100644 --- a/mipac/actions/drive.py +++ b/mipac/actions/drive.py @@ -8,6 +8,7 @@ from mipac.http import HTTPClient, Route from mipac.models.drive import File, Folder from mipac.types.drive import IDriveFile from mipac.utils.format import bool_to_string, remove_dict_empty +from mipac.utils.util import deprecated if TYPE_CHECKING: from mipac.manager.client import ClientManager @@ -15,37 +16,43 @@ if TYPE_CHECKING: __all__ = ('DriveActions', 'FileActions', 'FolderActions') -class FileActions(AbstractAction): +class ClientFileActions(AbstractAction): def __init__( - self, file_id: str | None = None, *, session: HTTPClient, client: ClientManager + self, + file_id: str | None = None, + folder_id: str | None = None, + *, + session: HTTPClient, + client: ClientManager ) -> None: - self.__session: HTTPClient = session - self.__client: ClientManager = client - self.__file_id = file_id + self._session: HTTPClient = session + self._client: ClientManager = client + self._file_id = file_id + self._folder_id = folder_id - async def show_file(self, file_id: str | None = None, url: str | None = None) -> File: + async def remove(self, file_id: str | None = None) -> bool: """ - ファイルの情報を取得します。 + 指定したIDのファイルを削除します Parameters ---------- file_id : str | None, default=None - ファイルのID - url : str | None, default=None - ファイルのURL + 削除するファイルのID Returns ------- - File - ファイルの情報 + bool + 削除に成功したかどうか """ - data = remove_dict_empty({'fileId': file_id, 'url': url}) - res: IDriveFile = await self.__session.request( - Route('POST', '/api/admin/drive/show-file'), json=data, auth=True, lower=True, + file_id = file_id or self._file_id + return bool( + await self._session.request( + Route('POST', '/api/drive/files/delete'), json={'fileId': file_id}, auth=True, + ) ) - return File(res, client=self.__client) + @deprecated async def remove_file(self, file_id: str | None = None) -> bool: """ 指定したIDのファイルを削除します @@ -61,13 +68,48 @@ class FileActions(AbstractAction): 削除に成功したかどうか """ - file_id = file_id or self.__file_id + file_id = file_id or self._file_id return bool( - await self.__session.request( + await self._session.request( Route('POST', '/api/drive/files/delete'), json={'fileId': file_id}, auth=True, ) ) + +class FileActions(ClientFileActions): + def __init__( + self, + file_id: str | None = None, + folder_id: str | None = None, + *, + session: HTTPClient, + client: ClientManager + ) -> None: + super().__init__(file_id=file_id, folder_id=folder_id, session=session, client=client) + + async def show_file(self, file_id: str | None = None, url: str | None = None) -> File: + """ + ファイルの情報を取得します。 + + Parameters + ---------- + file_id : str | None, default=None + ファイルのID + url : str | None, default=None + ファイルのURL + + Returns + ------- + File + ファイルの情報 + """ + + data = remove_dict_empty({'fileId': file_id, 'url': url}) + res: IDriveFile = await self._session.request( + Route('POST', '/api/admin/drive/show-file'), json=data, auth=True, lower=True, + ) + return File(res, client=self._client) + async def get_files( self, limit: int = 10, @@ -95,6 +137,8 @@ class FileActions(AbstractAction): if limit > 100: raise ParameterError('limit must be less than 100') + folder_id = self._folder_id or folder_id + data = { 'limit': limit, 'sinceId': since_id, @@ -102,10 +146,10 @@ class FileActions(AbstractAction): 'folderId': folder_id, 'Type': file_type, } - res: list[IDriveFile] = await self.__session.request( + res: list[IDriveFile] = await self._session.request( Route('POST', '/api/drive/files'), json=data, auth=True, lower=True ) - return [File(i, client=self.__client) for i in res] + return [File(i, client=self._client) for i in res] async def upload_file( self, @@ -140,6 +184,8 @@ class FileActions(AbstractAction): アップロードしたファイルの情報 """ file_byte = open(file, 'rb') if file else None + folder_id = self._folder_id or folder_id + data = { 'file': file_byte, 'name': file_name, @@ -148,19 +194,19 @@ class FileActions(AbstractAction): 'isSensitive': bool_to_string(is_sensitive), 'force': bool_to_string(force), } - res: IDriveFile = await self.__session.request( + res: IDriveFile = await self._session.request( Route('POST', '/api/drive/files/create'), data=data, auth=True, lower=True, ) - return File(res, client=self.__client) + return File(res, client=self._client) -class FolderActions(AbstractAction): +class ClientFolderActions(AbstractAction): def __init__( self, folder_id: str | None = None, *, session: HTTPClient, client: ClientManager ): - self.__folder_id = folder_id - self.__session: HTTPClient = session - self.__client: ClientManager = client + self._folder_id = folder_id + self._session: HTTPClient = session + self._client: ClientManager = client async def create(self, name: str, parent_id: str | None = None) -> bool: """ @@ -178,10 +224,10 @@ class FolderActions(AbstractAction): bool 作成に成功したか否か """ - parent_id = parent_id or self.__folder_id + parent_id = parent_id or self._folder_id data = {'name': name, 'parent_id': parent_id} - res: bool = await self.__session.request( + res: bool = await self._session.request( Route('POST', '/api/drive/folders/create'), json=data, lower=True, auth=True, ) return bool(res) @@ -198,9 +244,9 @@ class FolderActions(AbstractAction): bool 削除に成功したか否か """ - folder_id = folder_id or self.__folder_id + folder_id = folder_id or self._folder_id data = {'folderId': folder_id} - res: bool = await self.__session.request( + res: bool = await self._session.request( Route('POST', '/api/drive/folders/delete'), json=data, lower=True, auth=True, ) return bool(res) @@ -232,7 +278,7 @@ class FolderActions(AbstractAction): if limit > 100: raise ParameterError('limit must be less than 100') - folder_id = folder_id or self.__folder_id + folder_id = folder_id or self._folder_id data = { 'limit': limit, 'sinceId': since_id, @@ -240,16 +286,23 @@ class FolderActions(AbstractAction): 'folderId': folder_id, 'Type': file_type, } - res: list[IDriveFile] = await self.__session.request( + res: list[IDriveFile] = await self._session.request( Route('POST', '/api/drive/files'), json=data, auth=True, lower=True ) - return [File(i, client=self.__client) for i in res] + return [File(i, client=self._client) for i in res] + + +class FolderActions(ClientFolderActions): + def __init__( + self, folder_id: str | None = None, *, session: HTTPClient, client: ClientManager + ): + super().__init__(folder_id=folder_id, session=session, client=client) class DriveActions(AbstractAction): def __init__(self, session: HTTPClient, client: ClientManager): - self.__session: HTTPClient = session - self.__client: ClientManager = client + self._session: HTTPClient = session + self._client: ClientManager = client async def get_folders( self, @@ -279,7 +332,7 @@ class DriveActions(AbstractAction): 'untilId': until_id, 'folderId': folder_id, } - data = await self.__session.request( + data = await self._session.request( Route('POST', '/api/drive/folders'), json=data, lower=True, auth=True, ) - return [Folder(i, client=self.__client) for i in data] + return [Folder(i, client=self._client) for i in data] diff --git a/mipac/manager/drive.py b/mipac/manager/drive.py index f910419..92494fd 100644 --- a/mipac/manager/drive.py +++ b/mipac/manager/drive.py @@ -3,7 +3,13 @@ from __future__ import annotations from typing import TYPE_CHECKING from mipac.abstract.manager import AbstractManager -from mipac.actions.drive import DriveActions, FileActions, FolderActions +from mipac.actions.drive import ( + ClientFileActions, + ClientFolderActions, + DriveActions, + FileActions, + FolderActions, +) from mipac.http import HTTPClient if TYPE_CHECKING: @@ -12,11 +18,43 @@ if TYPE_CHECKING: __all__ = ['FolderManager', 'FileManager', 'DriveManager'] +class ClientFileManager(AbstractManager): + def __init__( + self, + file_id: str | None = None, + folder_id: str | None = None, + *, + session: HTTPClient, + client: ClientManager + ): + self.__session: HTTPClient = session + self.__client: ClientManager = client + self.__file_id: str | None = file_id + self.__folder_id: str | None = folder_id + + @property + def action(self) -> ClientFileActions: + return ClientFileActions( + file_id=self.__file_id, + folder_id=self.__folder_id, + client=self.__client, + session=self.__session, + ) + + class FileManager(AbstractManager): - def __init__(self, file_id: str | None = None, *, session: HTTPClient, client: ClientManager): + def __init__( + self, + file_id: str | None = None, + folder_id: str | None = None, + *, + session: HTTPClient, + client: ClientManager + ): self.__session: HTTPClient = session self.__client: ClientManager = client self.__file_id = file_id + self.__folder_id: str | None = folder_id @property def action(self) -> FileActions: @@ -28,7 +66,36 @@ class FileManager(AbstractManager): FileActions ファイルに対するアクション """ - return FileActions(file_id=self.__file_id, client=self.__client, session=self.__session,) + return FileActions( + file_id=self.__file_id, + folder_id=self.__folder_id, + client=self.__client, + session=self.__session, + ) + + +class ClientFolderManager(AbstractManager): + def __init__( + self, folder_id: str | None = None, *, session: HTTPClient, client: ClientManager + ): + self.__folder_id = folder_id + self.__session: HTTPClient = session + self.__client: ClientManager = client + self.file: FileManager = FileManager(folder_id=folder_id, session=session, client=client) + + @property + def action(self) -> ClientFolderActions: + """ + フォルダーの操作を行うインスタンスを返します + + Returns + ------- + FolderActions + フォルダーに対するアクション + """ + return ClientFolderActions( + folder_id=self.__folder_id, session=self.__session, client=self.__client, + ) class FolderManager(AbstractManager): @@ -38,7 +105,7 @@ class FolderManager(AbstractManager): self.__folder_id = folder_id self.__session: HTTPClient = session self.__client: ClientManager = client - self.file: FileManager = FileManager(session=session, client=client) + self.file: FileManager = FileManager(folder_id=folder_id, session=session, client=client) @property def action(self) -> FolderActions: @@ -55,7 +122,12 @@ class FolderManager(AbstractManager): ) def _get_file_instance(self, file_id: str) -> FileManager: - return FileManager(file_id=file_id, session=self.__session, client=self.__client) + return FileManager( + file_id=file_id, + folder_id=self.__folder_id, + session=self.__session, + client=self.__client, + ) class DriveManager(AbstractManager): @@ -79,3 +151,15 @@ class DriveManager(AbstractManager): def _get_folder_instance(self, folder_id: str) -> FolderManager: return FolderManager(session=self.__session, client=self.__client, folder_id=folder_id) + + def _get_client_folder_instance(self, folder_id: str) -> ClientFolderManager: + return ClientFolderManager( + folder_id=folder_id, session=self.__session, client=self.__client + ) + + def _get_client_file_instance( + self, file_id: str, folder_id: str | None = None + ) -> ClientFileManager: + return ClientFileManager( + file_id=file_id, folder_id=folder_id, session=self.__session, client=self.__client + ) diff --git a/mipac/models/drive.py b/mipac/models/drive.py index f1d2461..b98609b 100644 --- a/mipac/models/drive.py +++ b/mipac/models/drive.py @@ -2,9 +2,11 @@ from __future__ import annotations from typing import TYPE_CHECKING, Any + if TYPE_CHECKING: from mipac.manager.client import ClientManager from mipac.types import FolderPayload, IDriveFile, IFileProperties + from mipac.manager.drive import ClientFileManager, ClientFolderManager __all__ = ['FileProperties', 'File', 'Folder'] @@ -64,6 +66,10 @@ class Folder: def parent(self) -> dict[str, Any]: return self.__folder['parent'] + @property + def api(self) -> ClientFolderManager: + return self.__client.drive._get_client_folder_instance(folder_id=self.id) + class File: def __init__(self, file: IDriveFile, *, client: ClientManager): @@ -113,3 +119,7 @@ class File: @property def properties(self) -> FileProperties: return FileProperties(self.__file['properties']) + + @property + def api(self) -> ClientFileManager: + return self.__client.drive._get_client_file_instance(file_id=self.id)