from __future__ import annotations import logging from .graph import MSTeamsGraphClient logger = logging.getLogger(__name__) async def get_joined_teams( graph_client: MSTeamsGraphClient, *, limit: int = 50, ) -> list[dict]: path = f"/me/joinedTeams?$top={limit}" try: data = await graph_client.fetch_json(path) return _parse_teams(data) except Exception as e: logger.warning("Failed to get joined teams: %s", e) return [] async def get_team( graph_client: MSTeamsGraphClient, team_id: str, ) -> dict | None: path = f"/teams/{team_id}" try: data = await graph_client.fetch_json(path) return _parse_team(data) except Exception as e: logger.warning("Failed to get team %s: %s", team_id, e) return None async def get_team_channels( graph_client: MSTeamsGraphClient, team_id: str, *, limit: int = 50, ) -> list[dict]: path = f"/teams/{team_id}/channels?$top={limit}" try: data = await graph_client.fetch_json(path) return _parse_channels(data) except Exception as e: logger.warning("Failed to get channels for team %s: %s", team_id, e) return [] async def get_channel( graph_client: MSTeamsGraphClient, team_id: str, channel_id: str, ) -> dict | None: path = f"/teams/{team_id}/channels/{channel_id}" try: data = await graph_client.fetch_json(path) return _parse_channel(data) except Exception as e: logger.warning("Failed to get channel %s in team %s: %s", channel_id, team_id, e) return None async def create_channel( graph_client: MSTeamsGraphClient, team_id: str, name: str, *, description: str = "", membership_type: str = "standard", ) -> dict | None: path = f"/teams/{team_id}/channels" body = { "displayName": name, "description": description, "membershipType": membership_type, } try: data = await graph_client.fetch_json(path, method="POST", body=body) return _parse_channel(data) except Exception as e: logger.warning("Failed to create channel %s in team %s: %s", name, team_id, e) return None async def rename_group_chat( graph_client: MSTeamsGraphClient, chat_id: str, new_topic: str, ) -> bool: path = f"/chats/{chat_id}" body = {"topic": new_topic} try: await graph_client.fetch_json(path, method="PATCH", body=body) return True except Exception as e: logger.warning("Failed to rename group chat %s: %s", chat_id, e) return False def _parse_team(data: dict) -> dict: return { "id": data.get("id", ""), "display_name": data.get("displayName", ""), "description": data.get("description", ""), "visibility": data.get("visibility", ""), "created_at": data.get("createdDateTime", ""), "member_count": data.get("summary", {}).get("membersCount", 0), } def _parse_teams(data: dict) -> list[dict]: teams = data.get("value", []) return [_parse_team(t) for t in teams] def _parse_channel(data: dict) -> dict: return { "id": data.get("id", ""), "display_name": data.get("displayName", ""), "description": data.get("description", ""), "membership_type": data.get("membershipType", "standard"), "created_at": data.get("createdDateTime", ""), } def _parse_channels(data: dict) -> list[dict]: channels = data.get("value", []) return [_parse_channel(ch) for ch in channels]