from fastapi import FastAPI, Request from fastapi.responses import RedirectResponse, HTMLResponse from google.oauth2.credentials import Credentials from fastapi.staticfiles import StaticFiles from google_manager.constants import SCOPES from pages.load_page import load_page import google_auth_oauthlib.flow from starlette.middleware.sessions import SessionMiddleware import gradio as gr from gpt_summary import Ui from utils import credentials_to_dict # Create an instance of the FastAPI app app = FastAPI() # Add Session middleware to the app app.add_middleware(SessionMiddleware, secret_key="mysecret") # Mount the static files directory app.mount("/assets", StaticFiles(directory="assets"), name="assets") @app.get("/", response_class=HTMLResponse) async def home(request: Request): # Load the html content of the auth page html_content = load_page("./pages/auth_page.html") if "credentials" not in request.session: return HTMLResponse(content=html_content, status_code=200) else: return RedirectResponse("/gradio/?__theme=dark") # Define the endpoint for Google authentication @app.get("/auth") async def authorize(request: Request): flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( "credentials.json", scopes=SCOPES ) # for dev # flow.redirect_uri = "http://127.0.0.1:8000/auth_callback" # for production flow.redirect_uri = ( request.url.scheme + "://" + request.url.hostname + (":" + str(request.url.port) if request.url.port else "") + app.url_path_for("auth_callback") ) authorization_url, state = flow.authorization_url( access_type="offline", include_granted_scopes="true", ) request.session["state"] = state return RedirectResponse(url=authorization_url) # Define the callback endpoint after successful authentication @app.get("/auth_callback") async def auth_callback(request: Request): state = request.session["state"] flow = google_auth_oauthlib.flow.Flow.from_client_secrets_file( "credentials.json", scopes=SCOPES, state=state ) # for dev # flow.redirect_uri = "http://127.0.0.1:8000/auth_callback" # for production flow.redirect_uri = ( request.url.scheme + "://" + request.url.hostname + (":" + str(request.url.port) if request.url.port else "") + app.url_path_for("auth_callback") ) # Use the authorization server's response to fetch the OAuth 2.0 tokens. authorization_response = str(request.url) flow.fetch_token(authorization_response=authorization_response) credentials = flow.credentials request.session["credentials"] = credentials_to_dict(credentials) return RedirectResponse("/gradio?__theme=dark") # Mount the Gradio UI app = gr.mount_gradio_app(app, Ui, path="/gradio")