async def load_user_by_id( user_id: Optional[UserId] = None, principal_service: PrincipalService = Depends(get_any_principal) ) -> User: if is_blank(user_id): raise_400('User id is required.') if not principal_service.is_admin(): # console user cannot visit other users if user_id != principal_service.get_user_id(): raise_403() user_service = get_user_service(principal_service) def action() -> User: # noinspection PyTypeChecker user: User = user_service.find_by_id(user_id) if user is None: raise_404() # check tenant id if not principal_service.is_super_admin(): # tenant id must match current principal's, except current is super admin if user.tenantId != principal_service.get_tenant_id(): raise_404() # remove password clear_pwd(user) return user return trans_readonly(user_service, action)
async def load_enum_by_id( enum_id: Optional[EnumId] = None, principal_service: PrincipalService = Depends(get_console_principal) ) -> Enum: if is_blank(enum_id): raise_400('Enumeration id is required.') enum_service = get_enum_service(principal_service) def action() -> Enum: # noinspection PyTypeChecker an_enum: Enum = enum_service.find_by_id(enum_id) if an_enum is None: raise_404() # tenant id must match current principal's if an_enum.tenantId != principal_service.get_tenant_id(): raise_404() enum_item_service = get_enum_item_service(enum_service) enum_list: List[EnumItem] = enum_item_service.find_by_enum_id(enum_id) if ArrayHelper(enum_list).some( lambda x: x.tenantId != principal_service.get_tenant_id()): raise_500( None, f'Items of enumeration[enumId={an_enum.enumId}] has incorrect data, ' 'check and correct it at meta storage manually.') if enum_list is None: an_enum.items = [] else: an_enum.items = enum_list return an_enum return trans_readonly(enum_service, action)
async def find_available_spaces(principal_service: PrincipalService = Depends(get_console_principal)) -> List[Space]: space_service = get_space_service(principal_service) def action() -> List[Space]: tenant_id: TenantId = principal_service.get_tenant_id() user_id = principal_service.get_user_id() # noinspection PyTypeChecker user: User = get_user_service(space_service).find_by_id(user_id) user_group_ids = user.groupIds if user_group_ids is None or len(user_group_ids) == 0: return [] user_group_ids = ArrayHelper(user_group_ids).filter(lambda x: is_not_blank(x)).to_list() if len(user_group_ids) == 0: return [] user_group_service = get_user_group_service(space_service) user_groups = user_group_service.find_by_ids(user_group_ids, tenant_id) def gather_space_ids(distinct_space_ids: List[SpaceId], user_group: UserGroup) -> List[SpaceId]: given_space_ids = user_group.spaceIds if given_space_ids is None or len(given_space_ids) == 0: return distinct_space_ids given_space_ids = ArrayHelper(given_space_ids).filter(lambda x: is_not_blank(x)).to_list() for space_id in given_space_ids: if space_id not in distinct_space_ids: distinct_space_ids.append(space_id) return distinct_space_ids space_ids = ArrayHelper(user_groups).reduce(gather_space_ids, []) return space_service.find_by_ids(space_ids, tenant_id) return trans_readonly(space_service, action)
async def find_updated_topics( lastModified: LastModified, principal_service: PrincipalService = Depends(get_admin_principal) ) -> List[Topic]: if lastModified is None or is_blank(lastModified.at): return [] parsed, last_modified_at = is_date(lastModified.at, ask_all_date_formats()) if not parsed: return [] if not isinstance(last_modified_at, datetime): last_modified_at = datetime(year=last_modified_at.year, month=last_modified_at.month, day=last_modified_at.day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None) topic_service = get_topic_service(principal_service) def action() -> List[Topic]: return topic_service.find_modified_after( last_modified_at, principal_service.get_tenant_id()) return trans_readonly(topic_service, action)
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)
async def find_spaces_for_export(principal_service: PrincipalService = Depends(get_admin_principal)): space_service = get_space_service(principal_service) def action() -> List[Space]: tenant_id: TenantId = principal_service.get_tenant_id() return space_service.find_all(tenant_id) return trans_readonly(space_service, action)
async def find_all_pipelines(principal_service: PrincipalService = Depends( get_admin_principal)) -> List[Pipeline]: pipeline_service = get_pipeline_service(principal_service) def action() -> List[Pipeline]: tenant_id = principal_service.get_tenant_id() return pipeline_service.find_all(tenant_id) return trans_readonly(pipeline_service, action)
async def find_all_topics(principal_service: PrincipalService = Depends( get_console_principal)) -> List[Topic]: tenant_id = principal_service.get_tenant_id() topic_service = get_topic_service(principal_service) def action() -> List[Topic]: return topic_service.find_all(tenant_id) return trans_readonly(topic_service, action)
async def load_subject_by_name( name: str, principal_service: PrincipalService = Depends(get_console_principal) ) -> Subject: subject_service = get_subject_service(principal_service) def action() -> Subject: return subject_service.find_by_name(name) return trans_readonly(subject_service, action)
async def find_all_data_sources(principal_service: PrincipalService = Depends( get_any_admin_principal)) -> List[DataSource]: data_source_service = get_data_source_service(principal_service) def action() -> List[DataSource]: tenant_id = None if principal_service.is_tenant_admin(): tenant_id = principal_service.get_tenant_id() return data_source_service.find_all(tenant_id) return trans_readonly(data_source_service, action)
async def find_my_dashboards( principal_service: PrincipalService = Depends(get_console_principal) ) -> List[Dashboard]: dashboard_service = get_dashboard_service(principal_service) def action() -> List[Dashboard]: # noinspection PyTypeChecker return dashboard_service.find_all_by_user_id( principal_service.get_user_id(), principal_service.get_tenant_id()) return trans_readonly(dashboard_service, action)
async def find_all_enums(principal_service: PrincipalService = Depends( get_admin_principal)) -> List[Enum]: """ no enumeration items included, only enumeration itself """ enum_service = get_enum_service(principal_service) def action() -> List[Enum]: tenant_id = principal_service.get_tenant_id() return enum_service.find_all(tenant_id) return trans_readonly(enum_service, action)
async def find_schedulers_page_by_topic_and_frequency( criteria: TopicSnapshotSchedulerCriteria = Body(...), principal_service: PrincipalService = Depends(get_admin_principal) ) -> QueryTopicSnapshotSchedulerDataPage: scheduler_service = get_topic_snapshot_scheduler_service(principal_service) def action() -> QueryTopicSnapshotSchedulerDataPage: tenant_id: TenantId = principal_service.get_tenant_id() # noinspection PyTypeChecker return scheduler_service.find_page_by_topic_and_frequency( criteria.topicId, criteria.frequency, tenant_id, criteria) return trans_readonly(scheduler_service, action)
async def find_spaces_by_ids( space_ids: List[SpaceId], principal_service: PrincipalService = Depends(get_console_principal) ) -> List[Space]: if len(space_ids) == 0: return [] space_service = get_space_service(principal_service) def action() -> List[Space]: tenant_id: TenantId = principal_service.get_tenant_id() return space_service.find_by_ids(space_ids, tenant_id) return trans_readonly(space_service, action)
async def find_all_external_writers( principal_service: PrincipalService = Depends(get_any_admin_principal) ) -> List[ExternalWriter]: tenant_id = None if principal_service.is_tenant_admin(): tenant_id = principal_service.get_tenant_id() external_writer_service = get_external_writer_service(principal_service) def action() -> List[ExternalWriter]: return external_writer_service.find_all(tenant_id) return trans_readonly(external_writer_service, action)
async def find_user_groups_by_ids( user_group_ids: List[UserGroupId], principal_service: PrincipalService = Depends(get_admin_principal) ) -> List[UserGroup]: if len(user_group_ids) == 0: return [] user_group_service = get_user_group_service(principal_service) def action() -> List[UserGroup]: tenant_id: TenantId = principal_service.get_tenant_id() return user_group_service.find_by_ids(user_group_ids, tenant_id) return trans_readonly(user_group_service, action)
async def find_topics_by_ids( topic_ids: List[TopicId], principal_service: PrincipalService = Depends(get_console_principal) ) -> List[Topic]: if len(topic_ids) == 0: return [] topic_service = get_topic_service(principal_service) def action() -> List[Topic]: tenant_id: TenantId = principal_service.get_tenant_id() return topic_service.find_by_ids(topic_ids, tenant_id) return trans_readonly(topic_service, action)
async def find_my_connected_space_graphics( principal_service: PrincipalService = Depends(get_console_principal) ) -> List[ConnectedSpaceGraphic]: """ get my all connected space graphics """ connected_space_graphic_service = get_connected_space_graphic_service( principal_service) def action() -> List[ConnectedSpaceGraphic]: # noinspection PyTypeChecker return connected_space_graphic_service.find_all_by_user_id( principal_service.get_user_id(), principal_service.get_tenant_id()) return trans_readonly(connected_space_graphic_service, action)
async def find_spaces_by_name( query_name: Optional[str], principal_service: PrincipalService = Depends(get_console_principal) ) -> List[Space]: space_service = get_space_service(principal_service) def action() -> List[Space]: tenant_id: TenantId = principal_service.get_tenant_id() if is_blank(query_name): # noinspection PyTypeChecker return space_service.find_by_name(None, tenant_id) else: # noinspection PyTypeChecker return space_service.find_by_name(query_name, tenant_id) return trans_readonly(space_service, action)
async def find_tenants_by_name( query_name: Optional[str] = None, pageable: Pageable = Body(...), principal_service: PrincipalService = Depends(get_super_admin_principal) ) -> QueryTenantDataPage: tenant_service = get_tenant_service(principal_service) def action() -> QueryTenantDataPage: if is_blank(query_name): # noinspection PyTypeChecker return tenant_service.find_by_text(None, pageable) else: # noinspection PyTypeChecker return tenant_service.find_by_text(query_name, pageable) return trans_readonly(tenant_service, action)
async def find_user_groups_by_name( query_name: Optional[str], principal_service: PrincipalService = Depends(get_admin_principal) ) -> List[UserGroup]: user_group_service = get_user_group_service(principal_service) def action() -> List[UserGroup]: tenant_id: TenantId = principal_service.get_tenant_id() if is_blank(query_name): # noinspection PyTypeChecker return user_group_service.find_by_name(None, tenant_id) else: # noinspection PyTypeChecker return user_group_service.find_by_name(query_name, tenant_id) return trans_readonly(user_group_service, action)
async def find_spaces_page_by_name( query_name: Optional[str], pageable: Pageable = Body(...), principal_service: PrincipalService = Depends(get_console_principal) ) -> QuerySpaceDataPage: space_service = get_space_service(principal_service) def action() -> QuerySpaceDataPage: tenant_id: TenantId = principal_service.get_tenant_id() if is_blank(query_name): # noinspection PyTypeChecker return space_service.find_page_by_text(None, tenant_id, pageable) else: # noinspection PyTypeChecker return space_service.find_page_by_text(query_name, tenant_id, pageable) return trans_readonly(space_service, action)
async def find_template_connected_spaces_for_export( principal_service: PrincipalService = Depends(get_admin_principal) ) -> List[ConnectedSpaceWithSubjects]: connected_space_service = get_connected_space_service(principal_service) def action() -> List[ConnectedSpaceWithSubjects]: # noinspection PyTypeChecker connected_spaces: List[ConnectedSpace] = \ connected_space_service.find_templates_by_tenant_id(principal_service.get_tenant_id()) if len(connected_spaces) == 0: return [] else: return ArrayHelper(connected_spaces) \ .map(lambda x: load_subjects_and_reports(x, connected_space_service, False)) \ .to_list() return trans_readonly(connected_space_service, action)
async def load_shared_dashboard(dashboard_id: Optional[DashboardId], token: Optional[str]) -> StandaloneDashboard: """ load shared dashboard """ if is_blank(dashboard_id): raise_400('Dashboard id is required.') if is_blank(token): raise_400('Token is required.') principal_service: PrincipalService = get_principal_by_jwt( retrieve_authentication_manager(), token, [UserRole.CONSOLE, UserRole.ADMIN]) dashboard_service = get_dashboard_service(principal_service) def action() -> StandaloneDashboard: return load_standalone_dashboard(dashboard_id, dashboard_service, principal_service) return trans_readonly(dashboard_service, action)
async def find_users_by_name( query_name: Optional[str], principal_service: PrincipalService = Depends(get_admin_principal) ) -> List[User]: user_service = get_user_service(principal_service) def action() -> List[User]: tenant_id: TenantId = principal_service.get_tenant_id() if is_blank(query_name): users = user_service.find_by_name(None, tenant_id) else: users = user_service.find_by_name(query_name, tenant_id) ArrayHelper(users).each(clear_pwd) # noinspection PyTypeChecker return users return trans_readonly(user_service, action)
async def find_users_by_ids( user_ids: List[UserId], principal_service: PrincipalService = Depends(get_any_admin_principal) ) -> List[User]: if len(user_ids) == 0: return [] user_service = get_user_service(principal_service) def action() -> List[User]: tenant_id: Optional[TenantId] = None if principal_service.is_tenant_admin(): tenant_id = principal_service.get_tenant_id() users = user_service.find_by_ids(user_ids, tenant_id) ArrayHelper(users).each(clear_pwd) return users return trans_readonly(user_service, action)
async def load_space_by_id( space_id: Optional[SpaceId] = None, principal_service: PrincipalService = Depends(get_console_principal) ) -> Space: if is_blank(space_id): raise_400('Space id is required.') space_service = get_space_service(principal_service) def action() -> Space: # noinspection PyTypeChecker space: Space = space_service.find_by_id(space_id) if space is None: raise_404() # tenant id must match current principal's if space.tenantId != principal_service.get_tenant_id(): raise_404() return space return trans_readonly(space_service, action)
async def find_user_groups_page_by_name( query_name: Optional[str], pageable: Pageable = Body(...), principal_service: PrincipalService = Depends(get_admin_principal) ) -> QueryUserGroupDataPage: user_group_service = get_user_group_service(principal_service) def action() -> QueryUserGroupDataPage: tenant_id: TenantId = principal_service.get_tenant_id() if is_blank(query_name): # noinspection PyTypeChecker return user_group_service.find_page_by_text( None, tenant_id, pageable) else: # noinspection PyTypeChecker return user_group_service.find_page_by_text( query_name, tenant_id, pageable) return trans_readonly(user_group_service, action)
async def load_topic_by_id( topic_id: Optional[TopicId] = None, principal_service: PrincipalService = Depends(get_console_principal) ) -> Topic: if is_blank(topic_id): raise_400('Topic id is required.') topic_service = get_topic_service(principal_service) def action() -> Topic: # noinspection PyTypeChecker topic: Topic = topic_service.find_by_id(topic_id) if topic is None: raise_404() # tenant id must match current principal's if topic.tenantId != principal_service.get_tenant_id(): raise_404() return topic return trans_readonly(topic_service, action)
async def load_pipeline_by_id( pipeline_id: Optional[PipelineId], principal_service: PrincipalService = Depends(get_admin_principal) ) -> Pipeline: if is_blank(pipeline_id): raise_400('Pipeline id is required.') pipeline_service = get_pipeline_service(principal_service) def action() -> Pipeline: # noinspection PyTypeChecker pipeline: Pipeline = pipeline_service.find_by_id(pipeline_id) if pipeline is None: raise_404() # tenant id must match current principal's if pipeline.tenantId != principal_service.get_tenant_id(): raise_404() return pipeline return trans_readonly(pipeline_service, action)