async def _generate_calendar_entities(
        self, client: httpx.AsyncClient
    ) -> AsyncGenerator[OutlookCalendarCalendarEntity, None]:
        """Generate OutlookCalendarCalendarEntity objects for each calendar.

        Endpoint: GET /me/calendars
        """
        logger.info("Starting calendar entity generation")
        url = f"{self.GRAPH_BASE_URL}/me/calendars"
        calendar_count = 0

        try:
            while url:
                logger.debug(f"Fetching calendars from: {url}")
                data = await self._get_with_auth(client, url)
                calendars = data.get("value", [])
                logger.info(f"Retrieved {len(calendars)} calendars")

                for calendar_data in calendars:
                    calendar_count += 1
                    calendar_id = calendar_data["id"]
                    calendar_name = calendar_data.get("name", "Unknown Calendar")

                    logger.debug(f"Processing calendar #{calendar_count}: {calendar_name}")

                    yield OutlookCalendarCalendarEntity(
                        entity_id=calendar_id,
                        breadcrumbs=[],
                        name=calendar_name,
                        color=calendar_data.get("color"),
                        hex_color=calendar_data.get("hexColor"),
                        change_key=calendar_data.get("changeKey"),
                        can_edit=calendar_data.get("canEdit", False),
                        can_share=calendar_data.get("canShare", False),
                        can_view_private_items=calendar_data.get("canViewPrivateItems", False),
                        is_default_calendar=calendar_data.get("isDefaultCalendar", False),
                        is_removable=calendar_data.get("isRemovable", True),
                        is_tallying_responses=calendar_data.get("isTallyingResponses", False),
                        owner=calendar_data.get("owner"),
                        allowed_online_meeting_providers=calendar_data.get(
                            "allowedOnlineMeetingProviders", []
                        ),
                        default_online_meeting_provider=calendar_data.get(
                            "defaultOnlineMeetingProvider"
                        ),
                    )

                # Handle pagination
                url = data.get("@odata.nextLink")
                if url:
                    logger.debug("Following pagination to next page")

            logger.info(f"Completed calendar generation. Total calendars: {calendar_count}")

        except Exception as e:
            logger.error(f"Error generating calendar entities: {str(e)}")
            raise
Generate OutlookCalendarCalendarEntity objects for each calendar.

        Endpoint: GET /me/calendars
        
backend/airweave/platform/sources/outlook_calendar.py