ForcePilot/backend/package/yuxi/channels/adapters/googlechat/audit.py

61 lines
1.7 KiB
Python
Raw Normal View History

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}")