feat(auth): save OAuth credentials per-user to UserIntegration records
- Add 'Authorize' button to integration cards for OAuth types without credentials
- Add isOAuthType() helper and update info box in create/edit modal
- Accept integration_id query param in Dropbox, Google Drive, OneDrive setup views
- Store integration_id in sessionStorage on setup pages
- Add per-user flow in OAuth callbacks: PUT credentials to /api/integrations/{id}
- Preserve existing global flow as fallback when no integration_id is present
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
Dropbox integration views for setup and OAuth callback.
|
||||
"""
|
||||
|
||||
from fastapi import Request
|
||||
from fastapi import Query, Request
|
||||
|
||||
from app.views.base import APIRouter, require_login, settings, templates
|
||||
|
||||
@@ -11,7 +11,7 @@ router = APIRouter()
|
||||
|
||||
@router.get("/dropbox-setup")
|
||||
@require_login
|
||||
async def dropbox_setup_page(request: Request):
|
||||
async def dropbox_setup_page(request: Request, integration_id: int | None = Query(None)):
|
||||
"""
|
||||
Setup page for the Dropbox integration.
|
||||
Shows configuration status and setup instructions.
|
||||
@@ -28,6 +28,7 @@ async def dropbox_setup_page(request: Request):
|
||||
"app_secret_value": settings.dropbox_app_secret if settings.dropbox_app_secret else "",
|
||||
"refresh_token_value": settings.dropbox_refresh_token if settings.dropbox_refresh_token else "",
|
||||
"folder_path": settings.dropbox_folder or "/Documents/Uploads", # Default folder path
|
||||
"integration_id": integration_id,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ Google Drive integration views for setup and OAuth callback.
|
||||
|
||||
import urllib.parse
|
||||
|
||||
from fastapi import Request
|
||||
from fastapi import Query, Request
|
||||
from fastapi.responses import RedirectResponse
|
||||
|
||||
from app.views.base import APIRouter, require_login, settings, templates
|
||||
@@ -14,7 +14,7 @@ router = APIRouter()
|
||||
|
||||
@router.get("/google-drive-setup")
|
||||
@require_login
|
||||
async def google_drive_setup_page(request: Request):
|
||||
async def google_drive_setup_page(request: Request, integration_id: int | None = Query(None)):
|
||||
"""
|
||||
Setup page for the Google Drive integration.
|
||||
Shows configuration status and setup instructions.
|
||||
@@ -55,6 +55,7 @@ async def google_drive_setup_page(request: Request):
|
||||
"refresh_token_value": settings.google_drive_refresh_token or "",
|
||||
"folder_id": settings.google_drive_folder_id or "",
|
||||
"has_credentials_json": bool(settings.google_drive_credentials_json),
|
||||
"integration_id": integration_id,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
OneDrive integration views for setup and OAuth callback.
|
||||
"""
|
||||
|
||||
from fastapi import Request
|
||||
from fastapi import Query, Request
|
||||
|
||||
from app.views.base import APIRouter, require_login, settings, templates
|
||||
|
||||
@@ -11,7 +11,7 @@ router = APIRouter()
|
||||
|
||||
@router.get("/onedrive-setup")
|
||||
@require_login
|
||||
async def onedrive_setup_page(request: Request):
|
||||
async def onedrive_setup_page(request: Request, integration_id: int | None = Query(None)):
|
||||
"""
|
||||
Setup page for the OneDrive integration.
|
||||
Shows configuration status and setup instructions.
|
||||
@@ -35,6 +35,7 @@ async def onedrive_setup_page(request: Request):
|
||||
"refresh_token": bool(settings.onedrive_refresh_token),
|
||||
"refresh_token_value": settings.onedrive_refresh_token if settings.onedrive_refresh_token else "",
|
||||
"folder_path": settings.onedrive_folder_path or "Documents/Uploads", # Default folder path
|
||||
"integration_id": integration_id,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user