from __future__ import annotations from typing import TYPE_CHECKING if TYPE_CHECKING: from googleapiclient.discovery import Resource from yuxi.utils.logging_config import logger async def check_space_membership( chat_service: Resource, space_name: str, user_name: str, ) -> bool: try: membership = chat_service.spaces().members().get(name=f"{space_name}/members/{user_name}").execute() return membership is not None except Exception as e: _log_audit_error("check_space_membership", space_name, e) return False async def list_space_members( chat_service: Resource, space_name: str, ) -> list[dict]: try: result = chat_service.spaces().members().list(parent=space_name).execute() return result.get("memberships", []) except Exception as e: _log_audit_error("list_space_members", space_name, e) return [] async def get_member_role( chat_service: Resource, space_name: str, user_name: str, ) -> str | None: try: membership = chat_service.spaces().members().get(name=f"{space_name}/members/{user_name}").execute() return membership.get("role") except Exception as e: _log_audit_error("get_member_role", space_name, e) return None def _log_audit_error(operation: str, space_name: str, error: Exception) -> None: try: from googleapiclient.errors import HttpError if isinstance(error, HttpError): logger.warning( f"Audit operation '{operation}' failed for {space_name}: HTTP {error.resp.status} {error.resp.reason}" ) return except ImportError: pass logger.warning(f"Audit operation '{operation}' failed for {space_name}: {error}")