File size: 2,771 Bytes
4e4dcb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c8ffb23
 
 
 
4e4dcb2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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'

@app.get("/")
async def root():
    return {"message": "FastAPI Google Calendar Scheduler is running!"}

@app.post("/schedule")
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)
        }