from __future__ import annotations import logging from typing import Any logger = logging.getLogger(__name__) async def fetch_app_owner_open_id(client: Any) -> str | None: try: resp = await client.bot.v3.info() if not resp.success(): logger.warning("[FeishuAppOwner] Failed to fetch bot info: %s", resp.msg) return None bot_info = resp.data if hasattr(resp, "data") else {} app_owner_open_id = getattr(bot_info, "app_owner_open_id", "") or bot_info.get("app_owner_open_id", "") if app_owner_open_id: logger.info("[FeishuAppOwner] App owner open_id: %s...", app_owner_open_id[:8]) return app_owner_open_id logger.warning("[FeishuAppOwner] No app_owner_open_id in bot info response") return None except Exception as e: logger.warning("[FeishuAppOwner] fetch_app_owner_open_id failed: %s", e) return None async def resolve_app_owner_open_id(client: Any, config: dict[str, Any]) -> str: explicit = config.get("docOwnerOpenId", "") or config.get("app_owner_open_id", "") if explicit: return explicit fetched = await fetch_app_owner_open_id(client) if fetched: return fetched logger.warning("[FeishuAppOwner] Could not resolve app owner open_id, using bot_open_id fallback") return config.get("bot_open_id", "") async def validate_owner_permission( client: Any, owner_open_id: str, resource_type: str, resource_token: str, ) -> bool: try: from .tools.perm import list_file_members members = await list_file_members(client, resource_token) for member in members: if member.get("member_id") == owner_open_id and member.get("perm") == "full_access": return True return False except Exception as e: logger.warning("[FeishuAppOwner] Permission validation failed: %s", e) return False async def ensure_owner_access( client: Any, owner_open_id: str, resource_type: str, resource_token: str, ) -> bool: try: from .tools.perm import add_file_permission await add_file_permission(client, resource_token, "openid", owner_open_id, "full_access") logger.info("[FeishuAppOwner] Granted full_access to owner %s on %s", owner_open_id[:8], resource_token[:16]) return True except Exception as e: logger.warning("[FeishuAppOwner] Failed to grant owner access: %s", e) return False