|
@@ -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
|