| 
					
				 | 
			
			
				@@ -26,6 +26,7 @@ class NotionOAuth(OAuthDataSource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _TOKEN_URL = 'https://api.notion.com/v1/oauth/token' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _NOTION_PAGE_SEARCH = "https://api.notion.com/v1/search" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     _NOTION_BLOCK_SEARCH = "https://api.notion.com/v1/blocks" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    _NOTION_BOT_USER = "https://api.notion.com/v1/users/me" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def get_authorization_url(self): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         params = { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -84,6 +85,41 @@ class NotionOAuth(OAuthDataSource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             db.session.add(new_data_source_binding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             db.session.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def save_internal_access_token(self, access_token: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        workspace_name = self.notion_workspace_name(access_token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        workspace_icon = None 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        workspace_id = current_user.current_tenant_id 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # get all authorized pages 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        pages = self.get_authorized_pages(access_token) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        source_info = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'workspace_name': workspace_name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'workspace_icon': workspace_icon, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'workspace_id': workspace_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'pages': pages, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'total': len(pages) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        # save data source binding 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        data_source_binding = DataSourceBinding.query.filter( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            db.and_( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                DataSourceBinding.tenant_id == current_user.current_tenant_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                DataSourceBinding.provider == 'notion', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                DataSourceBinding.access_token == access_token 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ).first() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if data_source_binding: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data_source_binding.source_info = source_info 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data_source_binding.disabled = False 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            db.session.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            new_data_source_binding = DataSourceBinding( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                tenant_id=current_user.current_tenant_id, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                access_token=access_token, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                source_info=source_info, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                provider='notion' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            db.session.add(new_data_source_binding) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            db.session.commit() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def sync_data_source(self, binding_id: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         # save data source binding 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         data_source_binding = DataSourceBinding.query.filter( 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -222,7 +258,10 @@ class NotionOAuth(OAuthDataSource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         response = requests.post(url=self._NOTION_PAGE_SEARCH, json=data, headers=headers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         response_json = response.json() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        results = response_json['results'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if 'results' in response_json: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            results = response_json['results'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            results = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return results 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def notion_block_parent_page_id(self, access_token: str, block_id: str): 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -238,6 +277,20 @@ class NotionOAuth(OAuthDataSource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return self.notion_block_parent_page_id(access_token, parent[parent_type]) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return parent[parent_type] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    def notion_workspace_name(self, access_token: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        headers = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'Authorization': f"Bearer {access_token}", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            'Notion-Version': '2022-06-28', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response = requests.get(url=self._NOTION_BOT_USER, headers=headers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        response_json = response.json() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if 'object' in response_json and response_json['object'] == 'user': 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            user_type = response_json['type'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            user_info = response_json[user_type] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if 'workspace_name' in user_info: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                return user_info['workspace_name'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return 'workspace' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     def notion_database_search(self, access_token: str): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         data = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             'filter': { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -252,5 +305,8 @@ class NotionOAuth(OAuthDataSource): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         response = requests.post(url=self._NOTION_PAGE_SEARCH, json=data, headers=headers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         response_json = response.json() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        results = response_json['results'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if 'results' in response_json: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            results = response_json['results'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            results = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return results 
			 |