async def _generate_event_entities(
        self,
        client: httpx.AsyncClient,
        calendar: OutlookCalendarCalendarEntity,
    ) -> AsyncGenerator[ChunkEntity, None]:
        """Generate OutlookCalendarEventEntity objects and their attachments.

        Endpoint: GET /me/calendars/{calendar_id}/events
        """
        calendar_id = calendar.entity_id
        calendar_name = calendar.name
        logger.info(f"Starting event generation for calendar: {calendar_name}")

        url = f"{self.GRAPH_BASE_URL}/me/calendars/{calendar_id}/events"
        params = {"$top": 50}
        event_count = 0

        # Create breadcrumb for this calendar
        cal_breadcrumb = Breadcrumb(
            entity_id=calendar_id,
            name=calendar_name[:50] if calendar_name else "Unknown Calendar",
            type="calendar",
        )

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

                for event_data in events:
                    event_count += 1
                    event_id = event_data.get("id", "unknown")
                    event_subject = event_data.get("subject", f"Event {event_count}")

                    logger.debug(f"Processing event #{event_count}: {event_subject}")

                    try:
                        # Process the event
                        async for entity in self._process_event(client, event_data, cal_breadcrumb):
                            yield entity
                    except Exception as e:
                        logger.error(f"Error processing event {event_id}: {str(e)}")
                        # Continue with other events

                # Handle pagination
                url = data.get("@odata.nextLink")
                if url:
                    logger.debug("Following pagination to next page")
                    params = None  # params are included in the nextLink

            logger.info(
                f"Completed event generation for calendar {calendar_name}. "
                f"Total events: {event_count}"
            )

        except Exception as e:
            logger.error(f"Error generating events for calendar {calendar_name}: {str(e)}")
            raise
Generate OutlookCalendarEventEntity objects and their attachments.

        Endpoint: GET /me/calendars/{calendar_id}/events
        
backend/airweave/platform/sources/outlook_calendar.py