93 lines
3.9 KiB
Python
93 lines
3.9 KiB
Python
from fastapi import Depends, Query
|
|
from fastapi import APIRouter
|
|
from fastapi.responses import RedirectResponse
|
|
from fastapi_jwt_auth import AuthJWT
|
|
from fastapi_sqlalchemy import db
|
|
from sqlalchemy.orm import sessionmaker
|
|
from fastapi import HTTPException
|
|
|
|
import superagi
|
|
import json
|
|
import requests
|
|
from datetime import datetime, timedelta
|
|
from superagi.models.db import connect_db
|
|
import http.client as http_client
|
|
from superagi.helper.auth import get_current_user, check_auth
|
|
from superagi.models.tool_config import ToolConfig
|
|
from superagi.models.toolkit import Toolkit
|
|
from superagi.models.oauth_tokens import OauthTokens
|
|
from superagi.config.config import get_config
|
|
from superagi.helper.encyption_helper import decrypt_data, is_encrypted
|
|
|
|
router = APIRouter()
|
|
|
|
@router.get('/oauth-tokens')
|
|
async def google_auth_calendar(code: str = Query(...), state: str = Query(...)):
|
|
toolkit_id = int(state)
|
|
client_id = db.session.query(ToolConfig).filter(ToolConfig.key == "GOOGLE_CLIENT_ID", ToolConfig.toolkit_id == toolkit_id).first()
|
|
if(is_encrypted(client_id.value)):
|
|
client_id = decrypt_data(client_id.value)
|
|
else:
|
|
client_id = client_id.value
|
|
client_secret = db.session.query(ToolConfig).filter(ToolConfig.key == "GOOGLE_CLIENT_SECRET", ToolConfig.toolkit_id == toolkit_id).first()
|
|
if(is_encrypted(client_secret.value)):
|
|
client_secret = decrypt_data(client_secret.value)
|
|
else:
|
|
client_secret = client_secret.value
|
|
token_uri = 'https://oauth2.googleapis.com/token'
|
|
scope = 'https://www.googleapis.com/auth/calendar'
|
|
env = get_config("ENV", "DEV")
|
|
if env == "DEV":
|
|
redirect_uri = "http://localhost:3000/api/google/oauth-tokens"
|
|
else:
|
|
redirect_uri = "https://app.superagi.com/api/google/oauth-tokens"
|
|
params = {
|
|
'client_id': client_id,
|
|
'client_secret': client_secret,
|
|
'redirect_uri': redirect_uri,
|
|
'scope': scope,
|
|
'grant_type': 'authorization_code',
|
|
'code': code,
|
|
'access_type': 'offline',
|
|
'approval_prompt': 'force'
|
|
}
|
|
response = requests.post(token_uri, data=params)
|
|
if response.status_code != 200:
|
|
raise HTTPException(status_code=400, detail="Invalid Client Secret")
|
|
response = response.json()
|
|
expire_time = datetime.utcnow() + timedelta(seconds=response['expires_in'])
|
|
expire_time = expire_time - timedelta(minutes=5)
|
|
response['expiry'] = expire_time.strftime("%Y-%m-%dT%H:%M:%S.%fZ")
|
|
response_data = json.dumps(response)
|
|
frontend_url = superagi.config.config.get_config("FRONTEND_URL", "http://localhost:3000")
|
|
redirect_url_success = f"{frontend_url}/google_calendar_creds/?{response_data}"
|
|
return RedirectResponse(url=redirect_url_success)
|
|
|
|
@router.post("/send_google_creds/toolkit_id/{toolkit_id}")
|
|
def send_google_calendar_configs(google_creds: dict, toolkit_id: int, Authorize: AuthJWT = Depends(check_auth)):
|
|
engine = connect_db()
|
|
Session = sessionmaker(bind=engine)
|
|
session = Session()
|
|
current_user = get_current_user(Authorize)
|
|
user_id = current_user.id
|
|
toolkit = db.session.query(Toolkit).filter(Toolkit.id == toolkit_id).first()
|
|
google_creds = json.dumps(google_creds)
|
|
print(google_creds)
|
|
tokens = OauthTokens().add_or_update(session, toolkit_id, user_id, toolkit.organisation_id, "GOOGLE_CALENDAR_OAUTH_TOKENS", google_creds)
|
|
if tokens:
|
|
success = True
|
|
else:
|
|
success = False
|
|
return success
|
|
|
|
|
|
@router.get("/get_google_creds/toolkit_id/{toolkit_id}")
|
|
def get_google_calendar_tool_configs(toolkit_id: int):
|
|
google_calendar_config = db.session.query(ToolConfig).filter(ToolConfig.toolkit_id == toolkit_id,
|
|
ToolConfig.key == "GOOGLE_CLIENT_ID").first()
|
|
if is_encrypted(google_calendar_config.value):
|
|
google_calendar_config.value = decrypt_data(google_calendar_config.value)
|
|
return {
|
|
"client_id": google_calendar_config.value
|
|
}
|