async def init_tenant(
    tenant_id: Optional[TenantId],
    principal_service: PrincipalService = Depends(get_any_admin_principal)
) -> None:
    if is_blank(tenant_id):
        if principal_service.is_super_admin():
            raise_400('Tenant id is required.')
        elif principal_service.is_tenant_admin():
            tenant_id = principal_service.get_tenant_id()
    else:
        if principal_service.get_tenant_id(
        ) != tenant_id and principal_service.is_tenant_admin():
            raise_400(f'Tenant[{tenant_id}] does not match principal.')
        elif principal_service.is_super_admin():
            tenant: Optional[Tenant] = get_tenant_service(
                principal_service).find_by_id(tenant_id)
            if tenant is None:
                raise_404(f'Tenant[id={tenant_id}] not found.')

    meta_tenant_service = get_meta_tenant_service(principal_service)

    def action() -> None:
        topics = ask_pipeline_monitor_topics()
        create_topics_and_pipelines(
            topics, lambda source_topics: ask_pipeline_monitor_pipelines(
                source_topics), tenant_id, meta_tenant_service,
            principal_service)
        topics = ask_dqc_topics()
        create_topics_and_pipelines(
            topics, lambda source_topics: ask_dqc_pipelines(source_topics),
            tenant_id, meta_tenant_service, principal_service)

    trans(meta_tenant_service, action)
Beispiel #2
0
def validate_user(a_tuple: UserBasedTuple, user_service: UserService,
                  principal_service: PrincipalService) -> None:
    if not principal_service.is_admin():
        raise_403()

    if is_blank(a_tuple.userId):
        if principal_service.is_super_admin():
            raise_400('User id is required.')
        elif principal_service.is_tenant_admin():
            a_tuple.userId = principal_service.get_user_id()
        else:
            raise_403()
    else:
        if a_tuple.userId == principal_service.get_user_id():
            if principal_service.is_super_admin():
                raise_400(f'Incorrect user id[{a_tuple.userId}].')
        else:
            user: Optional[User] = user_service.find_by_id(a_tuple.userId)
            if user is None:
                raise_400('User id is required.')
            if principal_service.is_super_admin():
                if user.tenantId == principal_service.get_tenant_id():
                    raise_400(f'Incorrect user id[{a_tuple.userId}].')
            elif principal_service.is_tenant_admin():
                if user.tenantId != principal_service.get_tenant_id():
                    raise_400(f'Incorrect user id[{a_tuple.userId}].')
def prepare_and_validate_request(
		request: MixImportDataRequest,
		user_service: UserService, principal_service: PrincipalService) -> None:
	tenant_id = validate_tenant_id(request, user_service, principal_service)
	clear_data_source_id(request.topics)
	clear_user_group_ids(request.spaces)

	def set_user_id_to_report(report: Report, user_id: UserId) -> None:
		report.userId = user_id

	def set_user_id_to_subject(subject: SubjectWithReports, user_id: UserId) -> None:
		subject.userId = user_id
		ArrayHelper(subject.reports) \
			.flatten() \
			.filter(lambda x: x is not None) \
			.each(lambda x: set_user_id_to_report(x, user_id))

	def set_user_id_to_connected_space(connected_space: ConnectedSpaceWithSubjects, user_id: UserId) -> None:
		connected_space.userId = user_id
		ArrayHelper(connected_space.subjects) \
			.flatten() \
			.filter(lambda x: x is not None) \
			.each(lambda x: set_user_id_to_subject(x, user_id))

	if principal_service.is_super_admin():
		# to find a tenant admin
		tenant_admin: Optional[User] = user_service.find_admin(tenant_id)
		if tenant_admin is None:
			raise_400(f'Admin user on tenant[{tenant_id}] to receive imported data is not found.')
	elif principal_service.is_tenant_admin():
		ArrayHelper(request.connectedSpaces).each(
			lambda x: set_user_id_to_connected_space(x, principal_service.get_user_id()))
	else:
		raise_403()
async def fetch_topic_by_name(
    query_name: Optional[str] = None,
    tenant_id: Optional[TenantId] = None,
    principal_service: PrincipalService = Depends(get_any_admin_principal)
) -> List[Topic]:
    if is_blank(query_name):
        raise_400('Name criteria is required.')

    if principal_service.is_tenant_admin():
        if is_not_blank(
                tenant_id) and tenant_id != principal_service.get_tenant_id():
            raise_400('Tenant id is incorrect.')
        else:
            tenant_id = principal_service.get_tenant_id()

    if principal_service.is_super_admin() and is_blank(tenant_id):
        raise_400('Tenant id is required.')

    topic_service = get_topic_service(principal_service)

    def action() -> List[Topic]:
        topic_index_service = get_topic_index_service(topic_service)
        factor_index_list = topic_index_service.find(query_name, tenant_id)
        if len(factor_index_list) == 0:
            return []

        topic_ids: List[TopicId] = []
        for factor_index in factor_index_list:
            if factor_index.topicId not in topic_ids:
                topic_ids.append(factor_index.topicId)
        return topic_service.find_by_ids(topic_ids, tenant_id)

    return trans_readonly(topic_service, action)
def validate_tenant_id(
		request: MixImportDataRequest,
		user_service: UserService, principal_service: PrincipalService) -> TenantId:
	if principal_service.is_super_admin():
		return validate_tenant_id_when_super_admin(request, user_service, principal_service)
	elif principal_service.is_tenant_admin():
		return validate_tenant_id_when_tenant_admin(request, principal_service)
	else:
		raise_403()
def fake_to_tenant(principal_service: PrincipalService,
                   tenant_id: TenantId) -> PrincipalService:
    if principal_service.is_super_admin():
        # fake principal as tenant admin
        return PrincipalService(
            User(userId=principal_service.get_user_id(),
                 tenantId=tenant_id,
                 name=principal_service.get_user_name(),
                 role=UserRole.ADMIN))
    else:
        return principal_service
def validate_tenant_id(tenant_id: Optional[TenantId],
                       principal_service: PrincipalService) -> TenantId:
    if principal_service.is_tenant_admin():
        if is_not_blank(
                tenant_id) and tenant_id != principal_service.get_tenant_id():
            raise_400('Tenant id is incorrect.')
        return principal_service.get_tenant_id()
    elif principal_service.is_super_admin():
        if is_blank(tenant_id):
            raise_400('Tenant id is required.')
        return tenant_id
Beispiel #8
0
def validate_tenant(a_tuple: Union[UserBasedTuple, TenantBasedTuple],
                    user_service: UserService,
                    principal_service: PrincipalService) -> None:
    if not principal_service.is_admin():
        raise_403()

    if is_blank(a_tuple.tenantId):
        if principal_service.is_super_admin():
            raise_400('Tenant id is required.')
        elif principal_service.is_tenant_admin():
            a_tuple.tenantId = principal_service.get_tenant_id()
    else:
        if principal_service.is_tenant_admin():
            if a_tuple.tenantId != principal_service.get_tenant_id():
                raise_403()
        elif principal_service.is_super_admin():
            if a_tuple.tenantId == principal_service.get_tenant_id():
                raise_400(f'Incorrect tenant id[{a_tuple.tenantId}].')
            tenant_service = get_tenant_service(user_service)
            tenant: Optional[Tenant] = tenant_service.find_by_id(
                a_tuple.tenantId)
            if tenant is None:
                raise_400(f'Incorrect tenant id[{a_tuple.tenantId}].')
Beispiel #9
0
def validate_tenant_id(a_tuple: Union[TenantBasedTuple, UserBasedTuple],
                       principal_service: PrincipalService) -> None:
    """
	validate tenant id of tuple.\n
	a. for super admin, tenant id is required,\
	b. for not super admin, tenant id must be same as current principal,\n
	c. for not super admin and no tenant id, set as current principal.
	"""
    tenant_id = a_tuple.tenantId
    if principal_service.is_super_admin():
        if is_blank(tenant_id):
            raise_400('Tenant id is required.')
    elif is_not_blank(tenant_id):
        if tenant_id != principal_service.get_tenant_id():
            raise_403()
    else:
        # assign tenant id by current principal
        a_tuple.tenantId = principal_service.get_tenant_id()
Beispiel #10
0
async def load_tenant_by_id(
    tenant_id: Optional[TenantId] = None,
    principal_service: PrincipalService = Depends(get_any_principal)
) -> Tenant:
    if is_blank(tenant_id):
        raise_400('Tenant id is required.')
    if not principal_service.is_super_admin():
        if tenant_id != principal_service.get_tenant_id():
            raise_403()

    tenant_service = get_tenant_service(principal_service)

    def action() -> Tenant:
        # noinspection PyTypeChecker
        tenant: Tenant = tenant_service.find_by_id(tenant_id)
        if tenant is None:
            raise_404()
        return tenant

    return trans_readonly(tenant_service, action)
Beispiel #11
0
async def load_external_writer_by_id(
    writer_id: Optional[ExternalWriterId] = None,
    principal_service: PrincipalService = Depends(get_any_admin_principal)
) -> ExternalWriter:
    if is_blank(writer_id):
        raise_400('External writer id is required.')
    if not principal_service.is_super_admin():
        if writer_id != principal_service.get_tenant_id():
            raise_403()

    external_writer_service = get_external_writer_service(principal_service)

    def action() -> ExternalWriter:
        # noinspection PyTypeChecker
        external_writer: ExternalWriter = external_writer_service.find_by_id(
            writer_id)
        if external_writer is None:
            raise_404()
        return external_writer

    return trans_readonly(external_writer_service, action)
async def load_data_source_by_id(
    data_source_id: Optional[DataSourceId] = None,
    principal_service: PrincipalService = Depends(get_any_admin_principal)
) -> DataSource:
    if is_blank(data_source_id):
        raise_400('Data source id is required.')
    if not principal_service.is_super_admin():
        if data_source_id != principal_service.get_tenant_id():
            raise_403()

    data_source_service = get_data_source_service(principal_service)

    def action() -> DataSource:
        # noinspection PyTypeChecker
        data_source: DataSource = data_source_service.find_by_id(
            data_source_id)
        if data_source is None:
            raise_404()
        return data_source

    return trans_readonly(data_source_service, action)
Beispiel #13
0
def ask_principal_service(principal_service: PrincipalService,
                          tenant_id: Optional[TenantId]) -> PrincipalService:
    if principal_service.is_tenant_admin():
        if is_blank(tenant_id):
            return principal_service
        elif tenant_id != principal_service.get_tenant_id():
            raise_400(
                f'Tenant id[{tenant_id}] does not match current principal.')
        else:
            return principal_service
    elif principal_service.is_super_admin():
        if is_blank(tenant_id):
            raise_400('Tenant id is required.')
        tenant_service = get_tenant_service(principal_service)
        tenant: Optional[Tenant] = tenant_service.find_by_id(tenant_id)
        if tenant is None:
            raise_404(f'Tenant[id={tenant_id}] not found.')
        return PrincipalService(
            User(tenantId=tenant_id,
                 userId=principal_service.get_user_id(),
                 name=principal_service.get_user_name(),
                 role=UserRole.ADMIN))
Beispiel #14
0
async def fetch_pipeline_logs(
		criteria: PipelineMonitorLogCriteria, principal_service: PrincipalService = Depends(get_any_admin_principal)
) -> PipelineMonitorLogDataPage:
	if principal_service.is_super_admin():
		if is_blank(criteria.tenantId):
			raise_400('Tenant id is required.')
		# fake principal as tenant admin
		principal_service = PrincipalService(User(
			userId=principal_service.get_user_id(), tenantId=criteria.tenantId,
			name=principal_service.get_user_name(), role=UserRole.ADMIN))
	else:
		criteria.tenantId = principal_service.get_tenant_id()

	page = PipelineMonitorLogDataService(principal_service).page(criteria)

	# translate dataId to string
	def translate_data_id_to_str(log: PipelineMonitorLog) -> None:
		log.dataId = str(log.dataId)

	page.data = ArrayHelper(page.data).each(translate_data_id_to_str).to_list()
	# noinspection PyTypeChecker
	return page