""" Calendar operations for Microsoft Graph API. """ import os from datetime import datetime, timedelta from apis.microsoft_graph.client import fetch_with_aiohttp async def fetch_calendar_events(headers, days_back=1, days_forward=6, start_date=None, end_date=None): """ Fetch calendar events from Microsoft Graph API. Args: headers (dict): Headers including authentication. days_back (int): Number of days to look back. days_forward (int): Number of days to look forward. start_date (datetime): Optional start date, overrides days_back if provided. end_date (datetime): Optional end date, overrides days_forward if provided. Returns: tuple: (events, total_count) where events is a list of event dictionaries and total_count is the total number of events. """ # Calculate date range if start_date is None: start_date = datetime.now() - timedelta(days=days_back) if end_date is None: end_date = start_date + timedelta(days=days_forward) # Format dates for API start_date_str = start_date.strftime('%Y-%m-%dT00:00:00Z') end_date_str = end_date.strftime('%Y-%m-%dT23:59:59Z') # Prepare the API query calendar_url = ( f'https://graph.microsoft.com/v1.0/me/calendarView?' f'startDateTime={start_date_str}&endDateTime={end_date_str}&' f'$select=id,subject,organizer,start,end,location,isAllDay,showAs,sensitivity' ) events = [] # Make the API request response_data = await fetch_with_aiohttp(calendar_url, headers) events.extend(response_data.get('value', [])) # Check if there are more events (pagination) next_link = response_data.get('@odata.nextLink') while next_link: response_data = await fetch_with_aiohttp(next_link, headers) events.extend(response_data.get('value', [])) next_link = response_data.get('@odata.nextLink') # Return events and total count return events, len(events)