devportal2 / backend /main.py
google-labs-jules[bot]
Add Connected Apps UI and GitHub OAuth integration
ff473e8
Raw
History Blame Contribute Delete
2.72 kB
import os
# ⚡ BULLETPROOF FIX: Wipe broken proxies before anything loads
for key in list(os.environ.keys()):
if 'proxy' in key.lower():
del os.environ[key]
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from starlette.requests import Request
# Auto-create directories to prevent crashes
os.makedirs("static", exist_ok=True)
os.makedirs("templates", exist_ok=True)
import shutil
try:
from huggingface_hub import snapshot_download
token = os.environ.get("HF_TOKEN")
if token:
print("Restoring data from HuggingFace dataset...")
# Download into a temp directory first
tmp_restore = "/tmp/hf_restore"
snapshot_download(
repo_id="Ajitdoval/devportal2-storage",
repo_type="dataset",
local_dir=tmp_restore,
token=token,
force_download=True
)
# Copy the contents from tmp_restore to ./data
# This prevents the .git / .huggingface folders from messing up local structure
os.makedirs("data", exist_ok=True)
for item in os.listdir(tmp_restore):
s = os.path.join(tmp_restore, item)
d = os.path.join("data", item)
if item.startswith('.'):
continue # Skip .gitattributes, etc.
if os.path.isdir(s):
shutil.copytree(s, d, dirs_exist_ok=True)
else:
shutil.copy2(s, d)
print("Restore complete.")
shutil.rmtree(tmp_restore)
except Exception as e:
print(f"Skipping HuggingFace restore: {e}")
from backend.database import init_db
from backend.routes_auth import router as auth_router
from backend.routes_files import router as files_router
from backend.routes_ai import router as ai_router
from backend.routes_terminal import router as terminal_router
from backend.routes_sync import router as sync_router
from backend.routes_github import router as github_router
app = FastAPI()
# Mount frontend assets
app.mount("/static", StaticFiles(directory="static"), name="static")
templates = Jinja2Templates(directory="templates")
# Initialize database
init_db()
# Include modular routes
app.include_router(auth_router)
app.include_router(files_router)
app.include_router(ai_router)
app.include_router(terminal_router)
app.include_router(sync_router)
app.include_router(github_router)
@app.get("/", response_class=HTMLResponse)
async def get(request: Request):
# FIXED: Using keyword arguments for newer Starlette/FastAPI versions
return templates.TemplateResponse(
request=request,
name="index.html"
)