1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-18 16:36:15 +00:00

add timeout in calling metadata api

This commit is contained in:
Junxiang Huang
2024-06-14 17:44:36 +08:00
parent 3fb3df016e
commit 84165cc72f
2 changed files with 36 additions and 44 deletions

View File

@@ -37,13 +37,6 @@ def scan_library(repo_id, parent_dir = '/'):
scan_result += scan_library(repo_id, posixpath.join(parent_dir, dirent.obj_name)) scan_result += scan_library(repo_id, posixpath.join(parent_dir, dirent.obj_name))
return scan_result return scan_result
def check_repo_metadata_is_enable(repo_id):
record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if record and record.enabled:
return True
return False
def list_metadata_records(repo_id, user, parent_dir=None, name=None, is_dir=None, page=None, per_page=25, order_by=None): def list_metadata_records(repo_id, user, parent_dir=None, name=None, is_dir=None, page=None, per_page=25, order_by=None):
sql = f'SELECT \ sql = f'SELECT \
`{METADATA_COLUMN_ID.name}`, \ `{METADATA_COLUMN_ID.name}`, \
@@ -134,7 +127,11 @@ class MetadataManage(APIView):
return api_error(status.HTTP_403_FORBIDDEN, error_msg) return api_error(status.HTTP_403_FORBIDDEN, error_msg)
try: try:
is_enabled = check_repo_metadata_is_enable(repo_id) record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if record and record.enabled:
is_enabled = True
else:
is_enabled = False
except Exception as e: except Exception as e:
logger.error(e) logger.error(e)
error_msg = 'Internal Server Error' error_msg = 'Internal Server Error'
@@ -261,7 +258,6 @@ class MetadataManage(APIView):
error_msg = f'The repo {repo_id} has disabledd the metadata manage.' error_msg = f'The repo {repo_id} has disabledd the metadata manage.'
return api_error(status.HTTP_409_CONFLICT, error_msg) return api_error(status.HTTP_409_CONFLICT, error_msg)
try:
metadata_server_api = MetadataServerAPI(repo_id, request.user.username) metadata_server_api = MetadataServerAPI(repo_id, request.user.username)
try: try:
metadata_server_api.delete_base() metadata_server_api.delete_base()
@@ -274,6 +270,7 @@ class MetadataManage(APIView):
error_msg = 'Internal Server Error' error_msg = 'Internal Server Error'
return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg) return api_error(status.HTTP_500_INTERNAL_SERVER_ERROR, error_msg)
try:
record.enabled = False record.enabled = False
record.save() record.save()
except Exception as e: except Exception as e:
@@ -331,7 +328,8 @@ class MetadataRecords(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# metadata enable check # metadata enable check
if not check_repo_metadata_is_enable(repo_id): record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
@@ -381,7 +379,8 @@ class MetadataRecords(APIView):
return api_error(status.HTTP_400_BAD_REQUEST, error_msg) return api_error(status.HTTP_400_BAD_REQUEST, error_msg)
# metadata enable check # metadata enable check
if not check_repo_metadata_is_enable(repo_id): record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
@@ -476,7 +475,8 @@ class MetadataRecord(APIView):
name = request.data.get('name') name = request.data.get('name')
# metadata enable check # metadata enable check
if not check_repo_metadata_is_enable(repo_id): record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)
@@ -594,7 +594,8 @@ class MetadataRecord(APIView):
def delete(self, request, repo_id, record_id): def delete(self, request, repo_id, record_id):
# metadata enable check # metadata enable check
if not check_repo_metadata_is_enable(repo_id): record = RepoMetadata.objects.filter(repo_id=repo_id).first()
if not record or not record.enabled:
error_msg = f'The metadata module is disabled for repo {repo_id}.' error_msg = f'The metadata module is disabled for repo {repo_id}.'
return api_error(status.HTTP_404_NOT_FOUND, error_msg) return api_error(status.HTTP_404_NOT_FOUND, error_msg)

View File

@@ -38,13 +38,15 @@ def parse_response(response):
pass pass
class MetadataServerAPI: class MetadataServerAPI:
def __init__(self, base_id, user): def __init__(self, base_id, user, timeout=30):
self.base_id = base_id self.base_id = base_id
self.user = user self.user = user
self.headers = self.gen_headers()
self.timeout = timeout
def gen_headers(self): def gen_headers(self):
payload = { payload = {
'exp': int(time.time()) + 300, 'exp': int(time.time()) + 3600,
'base_id': self.base_id, 'base_id': self.base_id,
'user': self.user 'user': self.user
} }
@@ -52,73 +54,62 @@ class MetadataServerAPI:
return {"Authorization": "Bearer %s" % token} return {"Authorization": "Bearer %s" % token}
def create_base(self): def create_base(self):
headers = self.gen_headers()
#create a metadata base for base_id #create a metadata base for base_id
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}' url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}'
response = requests.post(url, headers=headers) response = requests.post(url, headers=self.headers, timeout=self.timeout)
return parse_response(response) return parse_response(response)
def delete_base(self): def delete_base(self):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}' url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}'
response = requests.delete(url, headers=headers) response = requests.delete(url, headers=self.headers, timeout=self.timeout)
return parse_response(response) return parse_response(response)
def add_column(self, table, column): def add_column(self, table, column):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/columns' url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/columns'
data = { data = {
'table_id': table.id, 'table_id': table.id,
'column': column.to_build_column_dict() 'column': column.to_build_column_dict()
} }
response = requests.post(url, json=data, headers=headers) response = requests.post(url, json=data, headers=self.headers, timeout=self.timeout)
return parse_response(response) return parse_response(response)
def insert_rows(self, table, columns, rows): def insert_rows(self, table, columns, rows):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows' url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows'
data = { data = {
'table_id': table.id, 'table_id': table.id,
'column_keys': [column.key for column in columns], 'column_keys': [column.key for column in columns],
'rows': rows 'rows': rows
} }
response = requests.post(url, json=data, headers=self.headers, timeout=self.timeout)
response = requests.post(url, json=data, headers=headers)
return parse_response(response) return parse_response(response)
def update_rows(self, table, columns, rows): def update_rows(self, table, columns, rows):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows' url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows'
data = { data = {
'table_id': table.id, 'table_id': table.id,
'column_keys': [column.key for column in columns], 'column_keys': [column.key for column in columns],
'rows': rows 'rows': rows
} }
response = requests.put(url, json=data, headers=self.headers, timeout=self.timeout)
response = requests.put(url, json=data, headers=headers)
return parse_response(response) return parse_response(response)
def delete_rows(self, table, row_ids): def delete_rows(self, table, row_ids):
headers = self.gen_headers()
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows' url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/rows'
data = { data = {
'table_id': table.id, 'table_id': table.id,
'row_ids': row_ids 'row_ids': row_ids
} }
response = requests.delete(url, json=data, headers=headers) response = requests.delete(url, json=data, headers=self.headers, timeout=self.timeout)
return parse_response(response) return parse_response(response)
def query_rows(self, sql, params=[]): def query_rows(self, sql, params=[]):
headers = self.gen_headers()
post_data = { post_data = {
'sql': sql 'sql': sql
} }
if params: if params:
post_data['params'] = params post_data['params'] = params
url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/query' url = f'{METADATA_SERVER_URL}/api/v1/base/{self.base_id}/query'
response = requests.post(url, json=post_data, headers=headers) response = requests.post(url, json=post_data, headers=self.headers, timeout=self.timeout)
return parse_response(response) return parse_response(response)