Briefly / controllers /integrations_handler.py
Ayush456's picture
fix: update payment routing and google drive integration logic
b40feb1
Raw
History Blame Contribute Delete
4.92 kB
from .mongo import users_collection
from fastapi import HTTPException
from pydantic import BaseModel
import os
from bson.objectid import ObjectId
BACKEND_URL = os.getenv("BACKEND_URL", "http://localhost:8000")
class AppTokenPayload(BaseModel):
app_name: str
token: str
OAUTH_CONFIG = {
"notion": {
"auth_url": "https://api.notion.com/v1/oauth/authorize",
"token_url": "https://api.notion.com/v1/oauth/token",
"auth_params": {
"client_id": os.getenv("NOTION_CLIENT_ID"),
"response_type": "code",
"owner": "user",
"redirect_uri": f"{BACKEND_URL}/notion/callback",
},
"get_token_kwargs": lambda code, cfg: {
"auth": (os.getenv("NOTION_CLIENT_ID"), os.getenv("NOTION_CLIENT_SECRET")),
"json": {"grant_type": "authorization_code", "code": code, "redirect_uri": cfg["auth_params"]["redirect_uri"]}
}
},
"google_drive": {
"auth_url": "https://accounts.google.com/o/oauth2/v2/auth",
"token_url": "https://oauth2.googleapis.com/token",
"auth_params": {
"client_id": os.getenv("GOOGLE_CLIENT_ID"),
"response_type": "code",
"scope": "https://www.googleapis.com/auth/drive",
"redirect_uri": f"{BACKEND_URL}/google_drive/callback",
"access_type": "offline",
"prompt": "consent",
},
"get_token_kwargs": lambda code, cfg: {
"headers": {"Content-Type": "application/x-www-form-urlencoded"},
"data": {
"client_id": cfg["auth_params"]["client_id"],
"client_secret": os.getenv("GOOGLE_CLIENT_SECRET"),
"grant_type": "authorization_code",
"code": code,
"redirect_uri": cfg["auth_params"]["redirect_uri"]
}
}
},
"linear": {
"auth_url": "https://linear.app/oauth/authorize",
"token_url": "https://api.linear.app/oauth/token",
"auth_params": {
"client_id": os.getenv("LINEAR_CLIENT_ID"),
"response_type": "code",
"scope": "read,write",
"redirect_uri": f"{BACKEND_URL}/linear/callback",
"prompt": "consent"
},
"get_token_kwargs": lambda code, cfg: {
"headers": {
"Content-Type": "application/x-www-form-urlencoded"
},
"data": {
"client_id": cfg["auth_params"]["client_id"],
"client_secret": os.getenv("LINEAR_CLIENT_SECRET"),
"grant_type": "authorization_code",
"code": code,
"redirect_uri": cfg["auth_params"]["redirect_uri"]
}
}
},
"slack": {
"auth_url": "https://slack.com/oauth/v2/authorize",
"token_url": "https://slack.com/api/oauth.v2.access",
"auth_params": {
"client_id": os.getenv("SLACK_CLIENT_ID"),
"scope": "channels:read,groups:read,users:read,users.profile:read,chat:write,reactions:write,channels:history,groups:history",
"redirect_uri": f"{BACKEND_URL}/slack/callback",
},
"get_token_kwargs": lambda code, cfg: {
"headers": {"Content-Type": "application/x-www-form-urlencoded"},
"data": {
"client_id": cfg["auth_params"]["client_id"],
"client_secret": os.getenv("SLACK_CLIENT_SECRET"),
"code": code,
"redirect_uri": cfg["auth_params"]["redirect_uri"]
}
}
}
}
async def save_app_token(payload: AppTokenPayload, current_username: str):
result = users_collection.update_one(
{"name": current_username},
{"$set": {f"app_tokens.{payload.app_name}": payload.token}}
)
if result.matched_count == 0:
raise HTTPException(status_code=404, detail="User not found")
return {"message": f"Token for {payload.app_name} saved successfully", "status_code": 200}
async def get_all_app_tokens(user_id: str):
if user_id == "guest":
return {"app_tokens": {}}
user = users_collection.find_one({"_id": ObjectId(user_id)}, {"app_tokens": 1, "_id": 0})
app_tokens = user.get("app_tokens") if user else None
print(user, app_tokens)
if app_tokens is None:
app_tokens = {}
return {"app_tokens": app_tokens,"status_code": 200}
async def get_specific_app_token(app_name: str, current_username: str):
user = users_collection.find_one({"name": current_username}, {f"app_tokens.{app_name}": 1, "_id": 0})
if not user or "app_tokens" not in user or app_name not in user["app_tokens"]:
raise HTTPException(status_code=404, detail=f"Token for '{app_name}' not found")
return {
"app_name": app_name,
"token": user["app_tokens"][app_name],
"status_code": 200
}