import logging from yuxi.channel.extensions.confluence.gateway import ConfluenceGateway from yuxi.channel.extensions.confluence.types import OutboundResult logger = logging.getLogger(__name__) class ConfluenceLabelManager: def __init__(self, gateway: ConfluenceGateway): self._gateway = gateway async def get_page_labels(self, page_id: str, account_id: str = "default") -> list[dict]: client = self._gateway.get_client(account_id) if client is None: return [] try: result = await client._request("GET", f"/wiki/api/v2/pages/{page_id}/labels") return result.get("results", []) except Exception as e: logger.error("Failed to get labels for page %s: %s", page_id, e) return [] async def add_page_label( self, page_id: str, label: str, prefix: str = "global", account_id: str = "default", ) -> OutboundResult: client = self._gateway.get_client(account_id) if client is None: return OutboundResult(success=False, error="Client not found") try: result = await client._request( "POST", f"/wiki/api/v2/pages/{page_id}/labels", json={"prefix": prefix, "name": label}, ) return OutboundResult(success=True, comment_id=result.get("id", "")) except Exception as e: logger.error("Failed to add label '%s' to page %s: %s", label, page_id, e) return OutboundResult(success=False, error=str(e)) async def delete_page_label( self, page_id: str, label_id: str, account_id: str = "default", ) -> OutboundResult: client = self._gateway.get_client(account_id) if client is None: return OutboundResult(success=False, error="Client not found") try: await client._request( "DELETE", f"/wiki/api/v2/pages/{page_id}/labels/{label_id}", ) return OutboundResult(success=True, comment_id=label_id) except Exception as e: logger.error("Failed to delete label %s from page %s: %s", label_id, page_id, e) return OutboundResult(success=False, error=str(e)) async def get_label_pages( self, label_id: str, limit: int = 25, account_id: str = "default", ) -> list[dict]: client = self._gateway.get_client(account_id) if client is None: return [] try: result = await client._request( "GET", f"/wiki/api/v2/labels/{label_id}/pages", params={"limit": limit}, ) return result.get("results", []) except Exception as e: logger.error("Failed to get pages for label %s: %s", label_id, e) return []