Spaces:
Runtime error
Runtime error
from fastapi import FastAPI | |
from fastapi.middleware.cors import CORSMiddleware | |
from pydantic import BaseModel | |
from google.oauth2.credentials import Credentials | |
from googleapiclient.discovery import build | |
from google.auth.transport.requests import Request as GoogleRequest | |
import os | |
import logging | |
app = FastAPI() | |
# CORS settings (update with your frontends if needed) | |
origins = [ | |
"*", | |
] | |
app.add_middleware( | |
CORSMiddleware, | |
allow_origins=origins, | |
allow_credentials=True, | |
allow_methods=["*"], | |
allow_headers=["*"], | |
) | |
# Schema for incoming request | |
class EventDetails(BaseModel): | |
summary: str | |
location: str | None = '' | |
description: str | None = '' | |
attendees: list[dict] | None = [] | |
start: str # ISO format datetime | |
end: str # ISO format datetime | |
timeZone: str | None = 'Asia/Kolkata' | |
async def root(): | |
return {"message": "FastAPI Google Calendar Scheduler is running!"} | |
async def schedule_event(event_details: EventDetails): | |
SCOPES = ['https://www.googleapis.com/auth/calendar'] | |
creds = None | |
if os.path.exists('token.json'): | |
creds = Credentials.from_authorized_user_file('token.json', SCOPES) | |
if not creds or not creds.valid: | |
if creds and creds.expired and creds.refresh_token: | |
creds.refresh(GoogleRequest()) | |
else: | |
return { | |
"status": "error", | |
"message": "Missing or invalid token. Please run locally to generate token.json." | |
} | |
try: | |
service = build('calendar', 'v3', credentials=creds) | |
event = { | |
'summary': event_details.summary, | |
'location': event_details.location, | |
'description': event_details.description, | |
'attendees': event_details.attendees, | |
'start': { | |
'dateTime': event_details.start, | |
'timeZone': event_details.timeZone, | |
}, | |
'end': { | |
'dateTime': event_details.end, | |
'timeZone': event_details.timeZone, | |
}, | |
'reminders': { | |
'useDefault': False, | |
'overrides': [ | |
{'method': 'email', 'minutes': 24 * 60}, | |
{'method': 'popup', 'minutes': 10}, | |
], | |
}, | |
} | |
created_event = service.events().insert(calendarId='primary', body=event, sendUpdates='all').execute() | |
return { | |
"status": "success", | |
"event_link": created_event.get('htmlLink'), | |
"message": f"Event created: {created_event.get('summary')}" | |
} | |
except Exception as e: | |
return { | |
"status": "error", | |
"message": str(e) | |
} | |