from __future__ import annotations from typing import Any try: import lark_oapi HAS_LARK_SDK = True except ImportError: HAS_LARK_SDK = False lark_oapi = None # type: ignore async def list_file_members( client: Any, file_token: str, member_type: str = "", page_size: int = 50, ) -> list[dict[str, Any]]: if not HAS_LARK_SDK or not client: return [] members: list[dict[str, Any]] = [] page_token = "" try: while True: request = ( lark_oapi.api.drive.v1.ListPermissionMemberRequest.builder() .token(file_token) .type(member_type) .page_size(page_size) .page_token(page_token) .build() ) resp = await client.drive.v1.permission_member.list(request) if not resp.success(): break data = resp.data if hasattr(resp, "data") else {} items = data.get("items", []) for item in items: members.append( { "member_type": item.get("member_type", ""), "member_id": item.get("member_id", ""), "perm": item.get("perm", ""), "name": item.get("name", ""), "type": item.get("type", ""), } ) page_token = data.get("page_token", "") if not page_token or not items: break except Exception as e: raise RuntimeError(f"获取权限成员列表失败: {e}") from e return members async def add_file_permission( client: Any, file_token: str, member_type: str, member_id: str, perm: str = "view", ) -> dict[str, Any]: if not HAS_LARK_SDK or not client: raise RuntimeError("SDK 不可用") try: request_body = ( lark_oapi.api.drive.v1.CreatePermissionMemberRequestBody.builder() .member_type(member_type) .member_id(member_id) .perm(perm) .build() ) request = ( lark_oapi.api.drive.v1.CreatePermissionMemberRequest.builder() .token(file_token) .type(member_type) .request_body(request_body) .build() ) resp = await client.drive.v1.permission_member.create(request) if not resp.success(): raise RuntimeError(f"添加权限失败: {resp.msg}") data = resp.data if hasattr(resp, "data") else {} member = data.get("member", {}) or data return { "member_type": member.get("member_type", member_type), "member_id": member.get("member_id", member_id), "perm": member.get("perm", perm), } except Exception as e: raise RuntimeError(f"添加权限失败: {e}") from e async def remove_file_permission( client: Any, file_token: str, member_type: str, member_id: str, ) -> bool: if not HAS_LARK_SDK or not client: raise RuntimeError("SDK 不可用") try: request = ( lark_oapi.api.drive.v1.DeletePermissionMemberRequest.builder() .token(file_token) .type(member_type) .member_id(member_id) .build() ) resp = await client.drive.v1.permission_member.delete(request) return resp.success() except Exception as e: raise RuntimeError(f"移除权限失败: {e}") from e async def transfer_file_owner( client: Any, file_token: str, member_type: str, member_id: str, ) -> bool: if not HAS_LARK_SDK or not client: raise RuntimeError("SDK 不可用") try: request_body = ( lark_oapi.api.drive.v1.TransferOwnerPermissionMemberRequestBody.builder() .member_type(member_type) .member_id(member_id) .build() ) request = ( lark_oapi.api.drive.v1.TransferOwnerPermissionMemberRequest.builder() .token(file_token) .type(member_type) .request_body(request_body) .build() ) resp = await client.drive.v1.permission_member.transfer_owner(request) return resp.success() except Exception as e: raise RuntimeError(f"转移所有者失败: {e}") from e