85 lines
3.3 KiB
Python
85 lines
3.3 KiB
Python
import json
|
|
import logging
|
|
import os
|
|
|
|
from common.const import PERMISSION_TRAIN_ALL
|
|
from common.ddb_service.client import DynamoDbUtilsService
|
|
from common.response import ok, not_found, forbidden
|
|
from common.util import generate_presign_url
|
|
from libs.data_types import DatasetItem, DatasetInfo
|
|
from libs.utils import get_permissions_by_username, get_user_roles, check_user_permissions, permissions_check, \
|
|
response_error
|
|
|
|
dataset_item_table = os.environ.get('DATASET_ITEM_TABLE')
|
|
dataset_info_table = os.environ.get('DATASET_INFO_TABLE')
|
|
bucket_name = os.environ.get('S3_BUCKET')
|
|
user_table = os.environ.get('MULTI_USER_TABLE')
|
|
|
|
logger = logging.getLogger(__name__)
|
|
logger.setLevel(os.environ.get('LOG_LEVEL') or logging.ERROR)
|
|
|
|
ddb_service = DynamoDbUtilsService(logger=logger)
|
|
|
|
|
|
# GET /dataset/{name}
|
|
def handler(event, context):
|
|
_filter = {}
|
|
|
|
try:
|
|
logger.info(json.dumps(event))
|
|
|
|
requester_name = permissions_check(event, [PERMISSION_TRAIN_ALL])
|
|
|
|
dataset_name = event['pathParameters']['id']
|
|
|
|
dataset_info_rows = ddb_service.get_item(table=dataset_info_table, key_values={
|
|
'dataset_name': dataset_name
|
|
})
|
|
|
|
if not dataset_info_rows or len(dataset_info_rows) == 0:
|
|
return not_found(message=f'dataset {dataset_name} is not found')
|
|
|
|
dataset_info = DatasetInfo(**dataset_info_rows)
|
|
|
|
requestor_permissions = get_permissions_by_username(ddb_service, user_table, requester_name)
|
|
requestor_roles = get_user_roles(ddb_service=ddb_service, user_table_name=user_table, username=requester_name)
|
|
|
|
if not (
|
|
(dataset_info.allowed_roles_or_users and check_user_permissions(dataset_info.allowed_roles_or_users,
|
|
requestor_roles,
|
|
requester_name)) or # permission in dataset
|
|
(not dataset_info.allowed_roles_or_users and 'user' in requestor_permissions and 'all' in
|
|
requestor_permissions['user']) # legacy data for super admin
|
|
):
|
|
return forbidden(message='no permission to view dataset')
|
|
|
|
rows = ddb_service.query_items(table=dataset_item_table, key_values={
|
|
'dataset_name': dataset_name
|
|
})
|
|
|
|
resp = []
|
|
for row in rows:
|
|
item = DatasetItem(**ddb_service.deserialize(row))
|
|
resp.append({
|
|
'key': item.sort_key,
|
|
'name': item.name,
|
|
'type': item.type,
|
|
'preview_url': generate_presign_url(bucket_name, item.get_s3_key(dataset_info.prefix), expires=3600 * 24,
|
|
method='get_object'),
|
|
'dataStatus': item.data_status.value,
|
|
**item.params
|
|
})
|
|
|
|
return ok(data={
|
|
'dataset_name': dataset_name,
|
|
'datasetName': dataset_info.dataset_name,
|
|
'prefix': dataset_info.prefix,
|
|
's3': f's3://{bucket_name}/{dataset_info.get_s3_key()}',
|
|
'status': dataset_info.dataset_status.value,
|
|
'timestamp': dataset_info.timestamp,
|
|
'data': resp,
|
|
**dataset_info.params
|
|
}, decimal=True)
|
|
except Exception as e:
|
|
return response_error(e)
|