mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-01 03:46:25 +02:00
feat: enhance Composio and Google Drive connector functionality
- Added support for extracting connected account IDs from query parameters in the Composio callback, accommodating both camelCase and snake_case formats. - Improved logging for received query parameters in the Composio callback to enhance debugging. - Updated Google Drive folder listing logs to remove unnecessary emoji for consistency. - Expanded the connector dialog to include Composio Google Drive as a recognized connector type, improving user interface clarity.
This commit is contained in:
parent
8a0b8346a5
commit
6a41b0f608
4 changed files with 20 additions and 13 deletions
|
|
@ -14,7 +14,7 @@ Endpoints:
|
||||||
import logging
|
import logging
|
||||||
from uuid import UUID
|
from uuid import UUID
|
||||||
|
|
||||||
from fastapi import APIRouter, Depends, HTTPException, Query
|
from fastapi import APIRouter, Depends, HTTPException, Query, Request
|
||||||
from fastapi.responses import RedirectResponse
|
from fastapi.responses import RedirectResponse
|
||||||
from pydantic import ValidationError
|
from pydantic import ValidationError
|
||||||
from sqlalchemy.exc import IntegrityError
|
from sqlalchemy.exc import IntegrityError
|
||||||
|
|
@ -170,9 +170,8 @@ async def initiate_composio_auth(
|
||||||
|
|
||||||
@router.get("/auth/composio/connector/callback")
|
@router.get("/auth/composio/connector/callback")
|
||||||
async def composio_callback(
|
async def composio_callback(
|
||||||
|
request: Request,
|
||||||
state: str | None = None,
|
state: str | None = None,
|
||||||
connectedAccountId: str | None = None, # Composio sends camelCase
|
|
||||||
connected_account_id: str | None = None, # Fallback snake_case
|
|
||||||
error: str | None = None,
|
error: str | None = None,
|
||||||
session: AsyncSession = Depends(get_async_session),
|
session: AsyncSession = Depends(get_async_session),
|
||||||
):
|
):
|
||||||
|
|
@ -239,14 +238,16 @@ async def composio_callback(
|
||||||
|
|
||||||
# Initialize Composio service
|
# Initialize Composio service
|
||||||
service = ComposioService()
|
service = ComposioService()
|
||||||
entity_id = f"surfsense_{user_id}"
|
|
||||||
|
|
||||||
# Use camelCase param if provided (Composio's format), fallback to snake_case
|
# Extract connected_account_id from query params (accepts both camelCase and snake_case)
|
||||||
final_connected_account_id = connectedAccountId or connected_account_id
|
query_params = request.query_params
|
||||||
|
final_connected_account_id = query_params.get(
|
||||||
|
"connectedAccountId"
|
||||||
|
) or query_params.get("connected_account_id")
|
||||||
|
|
||||||
# DEBUG: Log all query parameters received
|
# DEBUG: Log query parameter received
|
||||||
logger.info(
|
logger.info(
|
||||||
f"DEBUG: Callback received - connectedAccountId: {connectedAccountId}, connected_account_id: {connected_account_id}, using: {final_connected_account_id}"
|
f"DEBUG: Callback received - connectedAccountId: {query_params.get('connectedAccountId')}, connected_account_id: {query_params.get('connected_account_id')}, using: {final_connected_account_id}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# If we still don't have a connected_account_id, warn but continue
|
# If we still don't have a connected_account_id, warn but continue
|
||||||
|
|
@ -448,7 +449,7 @@ async def list_composio_drive_folders(
|
||||||
entity_id = f"surfsense_{user.id}"
|
entity_id = f"surfsense_{user.id}"
|
||||||
|
|
||||||
# Fetch files/folders from Composio Google Drive
|
# Fetch files/folders from Composio Google Drive
|
||||||
files, next_token, error = await service.get_drive_files(
|
files, _next_token, error = await service.get_drive_files(
|
||||||
connected_account_id=composio_connected_account_id,
|
connected_account_id=composio_connected_account_id,
|
||||||
entity_id=entity_id,
|
entity_id=entity_id,
|
||||||
folder_id=parent_id,
|
folder_id=parent_id,
|
||||||
|
|
@ -502,7 +503,7 @@ async def list_composio_drive_folders(
|
||||||
file_count = len(files_list)
|
file_count = len(files_list)
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"✅ Listed {len(items)} total items ({folder_count} folders, {file_count} files) for Composio connector {connector_id}"
|
f"Listed {len(items)} total items ({folder_count} folders, {file_count} files) for Composio connector {connector_id}"
|
||||||
+ (f" in folder {parent_id}" if parent_id else " in ROOT")
|
+ (f" in folder {parent_id}" if parent_id else " in ROOT")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -402,7 +402,7 @@ async def list_google_drive_folders(
|
||||||
file_count = len(items) - folder_count
|
file_count = len(items) - folder_count
|
||||||
|
|
||||||
logger.info(
|
logger.info(
|
||||||
f"✅ Listed {len(items)} total items ({folder_count} folders, {file_count} files) for connector {connector_id}"
|
f"Listed {len(items)} total items ({folder_count} folders, {file_count} files) for connector {connector_id}"
|
||||||
+ (f" in folder {parent_id}" if parent_id else " in ROOT")
|
+ (f" in folder {parent_id}" if parent_id else " in ROOT")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1182,8 +1182,11 @@ export const useConnectorDialog = () => {
|
||||||
if (!editingConnector.is_indexable) {
|
if (!editingConnector.is_indexable) {
|
||||||
// Non-indexable connectors (like Tavily API) don't need re-indexing
|
// Non-indexable connectors (like Tavily API) don't need re-indexing
|
||||||
indexingDescription = "Settings saved.";
|
indexingDescription = "Settings saved.";
|
||||||
} else if (editingConnector.connector_type === "GOOGLE_DRIVE_CONNECTOR") {
|
} else if (
|
||||||
// Google Drive uses folder selection from config, not date ranges
|
editingConnector.connector_type === "GOOGLE_DRIVE_CONNECTOR" ||
|
||||||
|
editingConnector.connector_type === "COMPOSIO_GOOGLE_DRIVE_CONNECTOR"
|
||||||
|
) {
|
||||||
|
// Google Drive (both regular and Composio) uses folder selection from config, not date ranges
|
||||||
const selectedFolders = (connectorConfig || editingConnector.config)?.selected_folders as
|
const selectedFolders = (connectorConfig || editingConnector.config)?.selected_folders as
|
||||||
| Array<{ id: string; name: string }>
|
| Array<{ id: string; name: string }>
|
||||||
| undefined;
|
| undefined;
|
||||||
|
|
|
||||||
|
|
@ -79,6 +79,9 @@ function getConnectorTypeDisplayName(connectorType: string): string {
|
||||||
GOOGLE_CALENDAR_CONNECTOR: "Google Calendar",
|
GOOGLE_CALENDAR_CONNECTOR: "Google Calendar",
|
||||||
GOOGLE_GMAIL_CONNECTOR: "Gmail",
|
GOOGLE_GMAIL_CONNECTOR: "Gmail",
|
||||||
GOOGLE_DRIVE_CONNECTOR: "Google Drive",
|
GOOGLE_DRIVE_CONNECTOR: "Google Drive",
|
||||||
|
COMPOSIO_GOOGLE_DRIVE_CONNECTOR: "Composio Google Drive",
|
||||||
|
COMPOSIO_GMAIL_CONNECTOR: "Composio Gmail",
|
||||||
|
COMPOSIO_GOOGLE_CALENDAR_CONNECTOR: "Composio Google Calendar",
|
||||||
LINEAR_CONNECTOR: "Linear",
|
LINEAR_CONNECTOR: "Linear",
|
||||||
NOTION_CONNECTOR: "Notion",
|
NOTION_CONNECTOR: "Notion",
|
||||||
SLACK_CONNECTOR: "Slack",
|
SLACK_CONNECTOR: "Slack",
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue