ContriBot / api /routes /auth.py
GitHub Actions
sync: backend from GitHub Actions 2026-03-21 15:55:43
3a507e4
from datetime import datetime
import logging
from fastapi import APIRouter, Depends, HTTPException
from pydantic import BaseModel
from typing import Optional, Dict, Any
from api.middleware.firebase_auth import verify_firebase_token, get_current_user
from services.supabase_service import db
logger = logging.getLogger(__name__)
router = APIRouter()
class LoginRequest(BaseModel):
firebase_token: str
github_access_token: Optional[str] = None
class SettingsUpdate(BaseModel):
display_name: Optional[str] = None
github_settings: Optional[Dict[str, Any]] = None
ai_settings: Optional[Dict[str, Any]] = None
notification_settings: Optional[Dict[str, Any]] = None
repo_defaults: Optional[Dict[str, Any]] = None
@router.post("/login")
async def login(request: LoginRequest):
logger.info(f"[AUTH_ROUTE] Login attempt with token")
user_data = await verify_firebase_token(request.firebase_token)
logger.debug(f"[AUTH_ROUTE] Verified token for UID: {user_data['uid']}")
user = await db.get_or_create_user(
firebase_uid=user_data["uid"],
email=user_data.get("email", "")
)
if request.github_access_token:
logger.info(f"[AUTH_ROUTE] Updating GitHub token for user: {user['id']}")
user = await db.update_user_github_token(user["id"], request.github_access_token)
return user
@router.get("/me")
async def get_me(current_user: dict = Depends(get_current_user)):
logger.debug(f"[AUTH_ROUTE] Getting profile for current user: {current_user['uid']}")
user = await db.get_user_by_firebase_uid(current_user["uid"])
if not user:
logger.warning(f"[AUTH_ROUTE] User {current_user['uid']} not found in database")
raise HTTPException(status_code=404, detail="User not found")
return user
@router.put("/settings")
async def update_settings(settings: SettingsUpdate, current_user: dict = Depends(get_current_user)):
logger.info(f"[AUTH_ROUTE] Updating settings for user: {current_user['uid']}")
user = await db.get_user_by_firebase_uid(current_user["uid"])
if not user:
logger.warning(f"[AUTH_ROUTE] User {current_user['uid']} not found for settings update")
raise HTTPException(status_code=404, detail="User not found")
# Merge existing settings with new settings
current_settings = user.get("settings") or {}
new_settings = {
"display_name": settings.display_name if settings.display_name is not None else current_settings.get("display_name"),
"github_settings": settings.github_settings if settings.github_settings is not None else current_settings.get("github_settings"),
"ai_settings": settings.ai_settings if settings.ai_settings is not None else current_settings.get("ai_settings"),
"notification_settings": settings.notification_settings if settings.notification_settings is not None else current_settings.get("notification_settings"),
"repo_defaults": settings.repo_defaults if settings.repo_defaults is not None else current_settings.get("repo_defaults"),
}
# Update user in Supabase
try:
logger.debug(f"[AUTH_ROUTE] Saving new settings to database for user {user['id']}")
res = db.client.table("users").update({
"settings": new_settings,
"updated_at": datetime.utcnow().isoformat()
}).eq("id", user["id"]).execute()
logger.info(f"[AUTH_ROUTE] Settings updated successfully for user {user['id']}")
except Exception as e:
logger.error(f"[AUTH_ROUTE] Error updating settings for user {user['id']}: {e}")
if "updated_at" in str(e):
res = db.client.table("users").update({
"settings": new_settings
}).eq("id", user["id"]).execute()
else:
raise e
return res.data[0] if res.data else {}
@router.post("/logout")
async def logout():
logger.info(f"[AUTH_ROUTE] Logout requested")
return {"message": "logged out"}