diff --git a/application/api/connector/routes.py b/application/api/connector/routes.py index 3c5d8b53..8b7e69a5 100644 --- a/application/api/connector/routes.py +++ b/application/api/connector/routes.py @@ -210,8 +210,7 @@ class ConnectorFiles(Resource): "folder_id": fields.String(required=False), "limit": fields.Integer(required=False), "page_token": fields.String(required=False), - "search_query": fields.String(required=False), - "shared": fields.Boolean(required=False) + "search_query": fields.String(required=False) })) @api.doc(description="List files from a connector provider (supports pagination and search)") def post(self): @@ -223,8 +222,7 @@ class ConnectorFiles(Resource): limit = data.get('limit', 10) page_token = data.get('page_token') search_query = data.get('search_query') - shared = data.get('shared', False) - + if not provider or not session_token: return make_response(jsonify({"success": False, "error": "provider and session_token are required"}), 400) @@ -243,7 +241,6 @@ class ConnectorFiles(Resource): 'session_token': session_token, 'folder_id': folder_id, 'page_token': page_token, - 'shared': shared } if search_query: input_config['search_query'] = search_query diff --git a/application/parser/connectors/share_point/auth.py b/application/parser/connectors/share_point/auth.py index 980dbd79..ee0e20f1 100644 --- a/application/parser/connectors/share_point/auth.py +++ b/application/parser/connectors/share_point/auth.py @@ -18,6 +18,7 @@ class SharePointAuth(BaseConnectorAuth): SCOPES = [ "Files.Read", + "Sites.Read.All", "User.Read", ] diff --git a/application/parser/connectors/share_point/loader.py b/application/parser/connectors/share_point/loader.py index d6362f64..168e0bc0 100644 --- a/application/parser/connectors/share_point/loader.py +++ b/application/parser/connectors/share_point/loader.py @@ -132,17 +132,9 @@ class SharePointLoader(BaseConnectorLoader): load_content = not list_only page_token = inputs.get('page_token') search_query = inputs.get('search_query') - shared = inputs.get('shared', False) self.next_page_token = None - if shared and not file_ids and not folder_id: - documents = self._list_shared_items( - limit=limit, - load_content=load_content, - page_token=page_token, - search_query=search_query - ) - elif file_ids: + if file_ids: for file_id in file_ids: try: doc = self._load_file_by_id(file_id, load_content=load_content) @@ -266,87 +258,7 @@ class SharePointLoader(BaseConnectorLoader): logging.error(f"Error listing items under parent {parent_id}: {e}") return documents - def _list_shared_items(self, limit: int = 100, load_content: bool = False, - page_token: Optional[str] = None, - search_query: Optional[str] = None) -> List[Document]: - self._ensure_valid_token() - documents: List[Document] = [] - try: - url = f"{self.GRAPH_API_BASE}/me/drive/sharedWithMe" - params = {'$top': min(100, limit) if limit else 100} - if page_token: - params['$skipToken'] = page_token - - response = requests.get(url, headers=self._get_headers(), params=params) - response.raise_for_status() - results = response.json() - - for item in results.get('value', []): - remote = item.get('remoteItem', {}) - drive_id = remote.get('parentReference', {}).get('driveId') - item_id = remote.get('id') - name = remote.get('name', item.get('name', 'Unknown')) - - if not drive_id or not item_id: - continue - - if search_query and search_query.lower() not in name.lower(): - continue - - composite_id = f"{drive_id}:{item_id}" - - if 'folder' in remote: - doc_metadata = { - 'file_name': name, - 'mime_type': 'folder', - 'size': remote.get('size'), - 'created_time': remote.get('createdDateTime'), - 'modified_time': remote.get('lastModifiedDateTime'), - 'source': 'share_point', - 'is_folder': True - } - documents.append(Document(text="", doc_id=composite_id, extra_info=doc_metadata)) - elif 'file' in remote: - mime_type = remote.get('file', {}).get('mimeType', 'application/octet-stream') - if mime_type not in self.SUPPORTED_MIME_TYPES: - continue - - doc_metadata = { - 'file_name': name, - 'mime_type': mime_type, - 'size': remote.get('size'), - 'created_time': remote.get('createdDateTime'), - 'modified_time': remote.get('lastModifiedDateTime'), - 'source': 'share_point' - } - - if load_content: - content = self._download_file_content(composite_id) - if content is None: - continue - documents.append(Document(text=content, doc_id=composite_id, extra_info=doc_metadata)) - else: - documents.append(Document(text="", doc_id=composite_id, extra_info=doc_metadata)) - - if limit and len(documents) >= limit: - break - - next_link = results.get('@odata.nextLink') - if next_link: - from urllib.parse import urlparse, parse_qs - parsed = urlparse(next_link) - query_params = parse_qs(parsed.query) - skiptoken_list = query_params.get('$skiptoken') - self.next_page_token = skiptoken_list[0] if skiptoken_list else None - else: - self.next_page_token = None - - return documents - - except Exception as e: - logging.error(f"Error listing shared items: {e}") - return documents def _download_file_content(self, file_id: str) -> Optional[str]: diff --git a/frontend/src/components/FilePicker.tsx b/frontend/src/components/FilePicker.tsx index 3ba2ec70..6b2b0771 100644 --- a/frontend/src/components/FilePicker.tsx +++ b/frontend/src/components/FilePicker.tsx @@ -92,7 +92,6 @@ export const FilePicker: React.FC = ({ const [authError, setAuthError] = useState(''); const [isConnected, setIsConnected] = useState(false); const [userEmail, setUserEmail] = useState(''); - const [shared, setShared] = useState(false); const scrollContainerRef = useRef(null); const searchTimeoutRef = useRef | null>(null); @@ -112,7 +111,6 @@ export const FilePicker: React.FC = ({ folderId: string | null, pageToken?: string, searchQuery = '', - isShared = false, ) => { // Cancel any in-flight request so stale responses never overwrite new state abortControllerRef.current?.abort(); @@ -135,9 +133,6 @@ export const FilePicker: React.FC = ({ page_token: pageToken, search_query: searchQuery, }; - if (isShared) { - body.shared = true; - } const response = await fetch(`${apiHost}/api/connectors/files`, { method: 'POST', headers: { @@ -223,7 +218,7 @@ export const FilePicker: React.FC = ({ name: getProviderConfig(provider).rootName, }, ]); - loadCloudFiles(sessionToken, null, undefined, '', false); + loadCloudFiles(sessionToken, null, undefined, ''); } else { removeSessionToken(provider); setIsConnected(false); @@ -258,7 +253,6 @@ export const FilePicker: React.FC = ({ currentFolderId, nextPageToken, searchQuery, - shared, ); } } @@ -270,7 +264,6 @@ export const FilePicker: React.FC = ({ searchQuery, provider, loadCloudFiles, - shared, ]); useEffect(() => { @@ -300,7 +293,7 @@ export const FilePicker: React.FC = ({ searchTimeoutRef.current = setTimeout(() => { const sessionToken = getSessionToken(provider); if (sessionToken) { - loadCloudFiles(sessionToken, currentFolderId, undefined, query, shared); + loadCloudFiles(sessionToken, currentFolderId, undefined, query); } }, 300); }; @@ -318,7 +311,7 @@ export const FilePicker: React.FC = ({ const sessionToken = getSessionToken(provider); if (sessionToken) { - loadCloudFiles(sessionToken, folderId, undefined, '', shared); + loadCloudFiles(sessionToken, folderId, undefined, ''); } }; @@ -334,27 +327,11 @@ export const FilePicker: React.FC = ({ const sessionToken = getSessionToken(provider); if (sessionToken) { - loadCloudFiles(sessionToken, newFolderId, undefined, '', shared); + loadCloudFiles(sessionToken, newFolderId, undefined, ''); } }; - const handleTabSwitch = (isShared: boolean) => { - if (isShared === shared) return; - setShared(isShared); - setFiles([]); - setCurrentFolderId(null); - setSearchQuery(''); - setNextPageToken(null); - setHasMoreFiles(false); - const rootName = isShared - ? t('filePicker.sharedWithMe') - : getProviderConfig(provider).rootName; - setFolderPath([{ id: null, name: rootName }]); - const sessionToken = getSessionToken(provider); - if (sessionToken) { - loadCloudFiles(sessionToken, null, undefined, '', isShared); - } - }; + const handleFileSelect = (fileId: string, isFolder: boolean) => { if (isFolder) { @@ -387,7 +364,7 @@ export const FilePicker: React.FC = ({ if (data.session_token) { setSessionToken(provider, data.session_token); - loadCloudFiles(data.session_token, null, undefined, '', shared); + loadCloudFiles(data.session_token, null, undefined, ''); } }} onError={(error) => { @@ -433,30 +410,6 @@ export const FilePicker: React.FC = ({ {isConnected && (
- {provider === 'share_point' && ( -
- - -
- )}
{folderPath.map((path, index) => (