├── .editorconfig ├── .github ├── CODEOWNERS ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── config.yml │ └── feature_request.md ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml ├── release-drafter.yaml └── workflows │ ├── cve.yaml │ ├── main-build.yaml │ ├── release-build.yaml │ ├── release-drafter.yaml │ ├── run-playwright-tests.yml │ ├── run-pr-tests.yaml │ ├── sonar-backend.yaml │ └── sonar-frontend.yaml ├── .gitignore ├── .prettierignore ├── .prettierrc.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── README.md ├── SECURITY.md ├── build.gradle ├── buildSrc ├── build.gradle ├── settings.gradle └── src │ └── main │ └── groovy │ └── org │ └── opendatadiscovery │ └── internal │ └── plugin │ ├── Constants.groovy │ ├── JooqGenerateExtension.groovy │ ├── JooqGeneratePlugin.groovy │ ├── JooqGenerateTask.groovy │ └── JooqGeneratorStrategy.groovy ├── config └── checkstyle │ ├── checkstyle.xml │ └── suppressions.xml ├── docker ├── .env ├── README.md ├── config │ ├── collector_config.yaml │ ├── dump.sql │ └── injector │ │ ├── datasources │ │ └── datasources.json │ │ └── samples │ │ ├── 01_airflow_ingestion.json │ │ ├── 02_bookshop_datalake_ingestion.json │ │ ├── 03_bookshop_tr_ingestion.json │ │ ├── 04_etl_ingestion.json │ │ ├── 05_kafka_del_ingestion.json │ │ ├── 06_kinesis_consumer_ingestion.json │ │ ├── 07_kinesis_ingestion.json │ │ ├── 08_s3_ingestion.json │ │ ├── 09_snowflake_ingestion.json │ │ └── 10_ge_ingestion.json ├── demo.yaml └── examples │ ├── .env │ ├── README.md │ ├── config │ ├── alert_rules.yaml │ ├── alertmanager.yaml │ ├── otel_collector.yaml │ └── prometheus.yaml │ ├── ldap.yaml │ ├── ldap │ └── sample.ldif │ └── oauth2.yaml ├── gradle.properties ├── gradle ├── libs.versions.toml └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── images ├── amazon-athena-logo.png ├── amazon-glue-logo.jpg ├── amazon-redshift-logo.jpg ├── amazon-sagemaker-logo.jpg ├── apache-airflow-logo.jpg ├── apache-kafka-logo.jpg ├── apache-spark-logo.png ├── bigquery-logo.png ├── cassandra.png ├── clickhouse-logo.png ├── cube-logo.svg ├── dbt-logo.jpg ├── dvc-logo.jpg ├── dynamodb-logo.png ├── elasticsearch.png ├── feast.png ├── great-expectations-logo.jpg ├── hive.png ├── kinesis.png ├── kubeflow-logo.jpg ├── mariadb.svg ├── mongodb.png ├── mssql.png ├── mysql-logo.jpg ├── neo4j.png ├── odbc.png ├── odd-data-catalog-ui.jpg ├── open-data-discovery-platform-logo.png ├── open-data-discovery-platform-odd-logo.png ├── oracle-logo.jpg ├── postgresql-logo.jpg ├── presto-logo.svg ├── quicksight.png ├── s3.png ├── sagemaker-featurestore.png ├── sagemaker.png ├── snowflake-logo.jpg ├── sqs.png ├── superset.svg ├── tableau-logo.png ├── tarantool.png ├── trino-og.png └── vertica-logo.svg ├── injector ├── inject.py └── start.sh ├── odd-platform-api-contract ├── build.gradle └── templates │ ├── api.mustache │ └── formParams.mustache ├── odd-platform-api ├── build.gradle └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── opendatadiscovery │ │ │ └── oddplatform │ │ │ ├── ODDPlatformApplication.java │ │ │ ├── annotation │ │ │ ├── ReactiveCustomTransactional.java │ │ │ └── ReactiveTransactional.java │ │ │ ├── auth │ │ │ ├── AuthIdentityProvider.java │ │ │ ├── AuthIdentityProviderImpl.java │ │ │ ├── ODDLDAPProperties.java │ │ │ ├── ODDOAuth2Properties.java │ │ │ ├── ODDOAuth2PropertiesConverter.java │ │ │ ├── Provider.java │ │ │ ├── S2sTokenProvider.java │ │ │ ├── authorization │ │ │ │ └── AuthorizationCustomizer.java │ │ │ ├── condition │ │ │ │ ├── AbstractProviderCondition.java │ │ │ │ ├── AuthorizationManagerCondition.java │ │ │ │ ├── AzureCondition.java │ │ │ │ ├── CognitoCondition.java │ │ │ │ ├── CustomProviderCondition.java │ │ │ │ ├── GithubCondition.java │ │ │ │ ├── GoogleCondition.java │ │ │ │ └── ODDIAMCondition.java │ │ │ ├── filter │ │ │ │ ├── AbstractIngestionFilter.java │ │ │ │ ├── IngestionDataEntitiesFilter.java │ │ │ │ ├── IngestionDataSourceFilter.java │ │ │ │ └── S2sAuthenticationFilter.java │ │ │ ├── handler │ │ │ │ ├── OAuthUserHandler.java │ │ │ │ └── impl │ │ │ │ │ ├── AbstractOIDCUserHandler.java │ │ │ │ │ ├── AzureUserHandler.java │ │ │ │ │ ├── CognitoUserHandler.java │ │ │ │ │ ├── CustomOIDCUserHandler.java │ │ │ │ │ ├── GithubUserHandler.java │ │ │ │ │ ├── GoogleUserHandler.java │ │ │ │ │ └── ODDIAMUserHandler.java │ │ │ ├── logout │ │ │ │ ├── AzureLogoutSuccessHandler.java │ │ │ │ ├── CognitoLogoutSuccessHandler.java │ │ │ │ ├── GithubLogoutSuccessHandler.java │ │ │ │ ├── GoogleLogoutSuccessHandler.java │ │ │ │ ├── LogoutSuccessHandler.java │ │ │ │ ├── OAuthLogoutSuccessHandler.java │ │ │ │ └── ODDIAMLogoutSuccessHandler.java │ │ │ ├── manager │ │ │ │ ├── AuthorizationManagerType.java │ │ │ │ ├── ReactiveAuthorizationManagerFactory.java │ │ │ │ ├── ReactiveNonContextPermissionAuthorizationManager.java │ │ │ │ ├── ReactiveResourcePermissionAuthorizationManager.java │ │ │ │ └── extractor │ │ │ │ │ ├── AlertResourceExtractor.java │ │ │ │ │ ├── DatasetFieldResourceExtractor.java │ │ │ │ │ ├── ResourceExtractor.java │ │ │ │ │ └── URLResourceExtractor.java │ │ │ ├── mapper │ │ │ │ └── GrantedAuthorityExtractor.java │ │ │ ├── session │ │ │ │ ├── JooqSessionRepository.java │ │ │ │ ├── PostgreSQLSessionHousekeepingJob.java │ │ │ │ ├── PostgreSQLSessionHousekeepingJobHandler.java │ │ │ │ └── SessionConstants.java │ │ │ └── util │ │ │ │ ├── SecurityConstants.java │ │ │ │ ├── SecurityRule.java │ │ │ │ └── UriUtils.java │ │ │ ├── config │ │ │ ├── AdditionalLinkConfiguration.java │ │ │ ├── CORSConfiguration.java │ │ │ ├── DataSourceConfiguration.java │ │ │ ├── DisabledAuthSecurityConfiguration.java │ │ │ ├── LDAPSecurityConfiguration.java │ │ │ ├── LoginFormSecurityConfiguration.java │ │ │ ├── MetricExporterConfiguration.java │ │ │ ├── MinioConfig.java │ │ │ ├── OAuthSecurityConfiguration.java │ │ │ ├── ODDPlatformConfiguration.java │ │ │ ├── R2DBCConfiguration.java │ │ │ ├── ResourceProviderWebFilter.java │ │ │ ├── SchedulingConfiguration.java │ │ │ ├── SessionConfiguration.java │ │ │ ├── SlackMessageGeneratorCondition.java │ │ │ ├── SlackMessageGeneratorConfiguration.java │ │ │ ├── SwaggerUIConfiguration.java │ │ │ ├── WebClientConfiguration.java │ │ │ └── properties │ │ │ │ ├── AdditionalLinkProperties.java │ │ │ │ ├── GenAIProperties.java │ │ │ │ └── MetricExporterProperties.java │ │ │ ├── controller │ │ │ ├── ActivityController.java │ │ │ ├── AlertController.java │ │ │ ├── AlertManagerController.java │ │ │ ├── AppInfoController.java │ │ │ ├── CollectorController.java │ │ │ ├── DataEntityAttachmentController.java │ │ │ ├── DataEntityController.java │ │ │ ├── DataEntityRunController.java │ │ │ ├── DataQualityController.java │ │ │ ├── DataQualityRunsController.java │ │ │ ├── DataSourceController.java │ │ │ ├── DatasetController.java │ │ │ ├── DatasetFieldController.java │ │ │ ├── DirectoryController.java │ │ │ ├── FeatureController.java │ │ │ ├── GenAIController.java │ │ │ ├── IdentityController.java │ │ │ ├── IngestionController.java │ │ │ ├── IntegrationController.java │ │ │ ├── LinksController.java │ │ │ ├── MetadataFieldController.java │ │ │ ├── NamespaceController.java │ │ │ ├── OwnerAssociationRequestController.java │ │ │ ├── OwnerController.java │ │ │ ├── PermissionController.java │ │ │ ├── PolicyController.java │ │ │ ├── QueryExampleController.java │ │ │ ├── ReferenceDataController.java │ │ │ ├── RelationshipController.java │ │ │ ├── RoleController.java │ │ │ ├── SearchController.java │ │ │ ├── TagController.java │ │ │ ├── TermController.java │ │ │ ├── TitleController.java │ │ │ └── exception │ │ │ │ └── ControllerAdvice.java │ │ │ ├── datacollaboration │ │ │ ├── client │ │ │ │ ├── SlackAPIClient.java │ │ │ │ └── SlackAPIClientImpl.java │ │ │ ├── config │ │ │ │ ├── ConditionalOnDataCollaboration.java │ │ │ │ ├── DataCollaborationConfiguration.java │ │ │ │ ├── DataCollaborationFeatureCondition.java │ │ │ │ └── DataCollaborationProperties.java │ │ │ ├── controller │ │ │ │ ├── DataCollaborationController.java │ │ │ │ ├── EventApiController.java │ │ │ │ └── parser │ │ │ │ │ ├── ParseResult.java │ │ │ │ │ └── SlackEventParser.java │ │ │ ├── dto │ │ │ │ ├── DataEntityMessageContext.java │ │ │ │ ├── MessageChannelDto.java │ │ │ │ ├── MessageEventActionDto.java │ │ │ │ ├── MessageEventDto.java │ │ │ │ ├── MessageEventPayload.java │ │ │ │ ├── MessageEventRequest.java │ │ │ │ ├── MessageEventStateDto.java │ │ │ │ ├── MessageProviderDto.java │ │ │ │ ├── MessageProviderIdentity.java │ │ │ │ ├── MessageStateDto.java │ │ │ │ └── MessageUserDto.java │ │ │ ├── exception │ │ │ │ ├── DataCollaborationMessageEventProcessingException.java │ │ │ │ ├── DataCollaborationMessageSenderException.java │ │ │ │ └── SlackAPIException.java │ │ │ ├── job │ │ │ │ ├── DataCollaborationMessageEventProcessor.java │ │ │ │ ├── DataCollaborationMessageEventProcessorStarter.java │ │ │ │ ├── DataCollaborationMessageSenderJob.java │ │ │ │ └── DataCollaborationMessageSenderStarter.java │ │ │ ├── repository │ │ │ │ ├── DataCollaborationRepository.java │ │ │ │ ├── DataCollaborationRepositoryFactory.java │ │ │ │ └── DataCollaborationRepositoryImpl.java │ │ │ └── service │ │ │ │ ├── DataCollaborationService.java │ │ │ │ ├── DataCollaborationServiceImpl.java │ │ │ │ ├── MessageProviderClient.java │ │ │ │ ├── MessageProviderClientFactory.java │ │ │ │ ├── MessageProviderClientFactoryImpl.java │ │ │ │ ├── MessageProviderEventHandler.java │ │ │ │ ├── MessageProviderEventHandlerFactory.java │ │ │ │ ├── MessageProviderEventHandlerFactoryImpl.java │ │ │ │ ├── MessageProviderUserProfileResolver.java │ │ │ │ ├── MessageProviderUserProfileResolverImpl.java │ │ │ │ ├── NoOpMessageProviderUserProfileResolver.java │ │ │ │ ├── SlackMessageProviderClient.java │ │ │ │ └── SlackMessageProviderEventHandler.java │ │ │ ├── dto │ │ │ ├── AssociatedOwnerDto.java │ │ │ ├── CollectorDto.java │ │ │ ├── DataEntityClassDto.java │ │ │ ├── DataEntityDetailsDto.java │ │ │ ├── DataEntityDimensionsDto.java │ │ │ ├── DataEntityDomainInfoDto.java │ │ │ ├── DataEntityDto.java │ │ │ ├── DataEntityFilledField.java │ │ │ ├── DataEntityGroupItemDto.java │ │ │ ├── DataEntityHighlightDto.java │ │ │ ├── DataEntitySpecificAttributesDelta.java │ │ │ ├── DataEntityStatusDto.java │ │ │ ├── DataEntityTotalDelta.java │ │ │ ├── DataEntityTypeDto.java │ │ │ ├── DataQualityCategory.java │ │ │ ├── DataQualityTestFiltersDto.java │ │ │ ├── DataSourceDto.java │ │ │ ├── DatasetFieldDto.java │ │ │ ├── DatasetFieldTermsDto.java │ │ │ ├── DatasetFieldWithTagsDto.java │ │ │ ├── DatasetStructureDelta.java │ │ │ ├── DatasetStructureDto.java │ │ │ ├── DatasetTestReportDto.java │ │ │ ├── EnumValueDto.java │ │ │ ├── EnumValueOrigin.java │ │ │ ├── ErdRelationshipDetailsDto.java │ │ │ ├── FacetStateDto.java │ │ │ ├── FacetType.java │ │ │ ├── FileDto.java │ │ │ ├── FileUploadStatus.java │ │ │ ├── LookupTableColumnDto.java │ │ │ ├── LookupTableColumnTypes.java │ │ │ ├── LookupTableDto.java │ │ │ ├── MessageDto.java │ │ │ ├── OwnerAssociationRequestActivityDto.java │ │ │ ├── OwnerAssociationRequestActivityType.java │ │ │ ├── OwnerAssociationRequestDto.java │ │ │ ├── OwnerDto.java │ │ │ ├── OwnershipDto.java │ │ │ ├── OwnershipPair.java │ │ │ ├── QueryExampleDto.java │ │ │ ├── ReferenceTableColumnDto.java │ │ │ ├── ReferenceTableDto.java │ │ │ ├── RelationshipDetailsDto.java │ │ │ ├── RelationshipDto.java │ │ │ ├── RelationshipStatusDto.java │ │ │ ├── RelationshipTypeDto.java │ │ │ ├── RoleDto.java │ │ │ ├── SLA.java │ │ │ ├── SearchFilterDto.java │ │ │ ├── SearchFilterId.java │ │ │ ├── TagDto.java │ │ │ ├── TagOrigin.java │ │ │ ├── TestStatusWithSeverityDto.java │ │ │ ├── TokenDto.java │ │ │ ├── activity │ │ │ │ ├── ActivityContextInfo.java │ │ │ │ ├── ActivityCreateEvent.java │ │ │ │ ├── ActivityDto.java │ │ │ │ ├── ActivityEventTypeDto.java │ │ │ │ ├── AlertHaltConfigActivityStateDto.java │ │ │ │ ├── AlertReceivedActivityStateDto.java │ │ │ │ ├── AlertStatusUpdatedActivityStateDto.java │ │ │ │ ├── BusinessNameActivityStateDto.java │ │ │ │ ├── CustomGroupActivityStateDto.java │ │ │ │ ├── CustomGroupEntityActivityStateDto.java │ │ │ │ ├── DataEntityCreatedActivityStateDto.java │ │ │ │ ├── DataEntityStatusUpdatedDto.java │ │ │ │ ├── DatasetFieldEnumValuesActivityStateDto.java │ │ │ │ ├── DatasetFieldInformationActivityStateDto.java │ │ │ │ ├── DatasetFieldTagActivityStateDto.java │ │ │ │ ├── DatasetFieldTermsActivityStateDto.java │ │ │ │ ├── DatasetFieldValuesActivityStateDto.java │ │ │ │ ├── DescriptionActivityStateDto.java │ │ │ │ ├── OwnershipActivityStateDto.java │ │ │ │ ├── TagActivityStateDto.java │ │ │ │ └── TermActivityStateDto.java │ │ │ ├── alert │ │ │ │ ├── AlertDto.java │ │ │ │ ├── AlertStatusEnum.java │ │ │ │ ├── AlertTypeEnum.java │ │ │ │ └── ExternalAlert.java │ │ │ ├── attributes │ │ │ │ ├── AttributeNames.java │ │ │ │ ├── DataConsumerAttributes.java │ │ │ │ ├── DataEntityAttributes.java │ │ │ │ ├── DataEntityGroupAttributes.java │ │ │ │ ├── DataInputAttributes.java │ │ │ │ ├── DataQualityTestAttributes.java │ │ │ │ ├── DataSetAttributes.java │ │ │ │ ├── DataTransformerAttributes.java │ │ │ │ └── LinkedUrlAttribute.java │ │ │ ├── dataset │ │ │ │ └── DatasetVersionFields.java │ │ │ ├── ingestion │ │ │ │ ├── DataEntityIngestionDto.java │ │ │ │ ├── EnrichedDataEntityIngestionDto.java │ │ │ │ ├── HashableDatasetField.java │ │ │ │ ├── IngestionMetricLabelsDto.java │ │ │ │ ├── IngestionMetricPointDto.java │ │ │ │ ├── IngestionMetricsRequest.java │ │ │ │ ├── IngestionRequest.java │ │ │ │ └── IngestionTaskRun.java │ │ │ ├── lineage │ │ │ │ ├── DataEntityGroupLineageDto.java │ │ │ │ ├── DataEntityLineageDto.java │ │ │ │ ├── DataEntityLineageStreamDto.java │ │ │ │ ├── LineageDepth.java │ │ │ │ ├── LineageNodeDto.java │ │ │ │ └── LineageStreamKind.java │ │ │ ├── metadata │ │ │ │ ├── DatasetFieldMetadataDto.java │ │ │ │ ├── MetadataBinding.java │ │ │ │ ├── MetadataDto.java │ │ │ │ ├── MetadataInfo.java │ │ │ │ ├── MetadataKey.java │ │ │ │ ├── MetadataOrigin.java │ │ │ │ └── MetadataTypeEnum.java │ │ │ ├── metric │ │ │ │ ├── ExternalMetricLastValueDto.java │ │ │ │ ├── MetricLabelValueDto.java │ │ │ │ ├── MetricSeriesDto.java │ │ │ │ ├── MetricSeriesValueType.java │ │ │ │ ├── SystemMetricLabel.java │ │ │ │ └── prometheus │ │ │ │ │ ├── PrometheusData.java │ │ │ │ │ ├── PrometheusMetric.java │ │ │ │ │ └── PrometheusResponse.java │ │ │ ├── policy │ │ │ │ ├── DataEntityPolicyResolverContext.java │ │ │ │ ├── PolicyConditionDto.java │ │ │ │ ├── PolicyConditionKeyDto.java │ │ │ │ ├── PolicyConditionUnaryDto.java │ │ │ │ ├── PolicyDto.java │ │ │ │ ├── PolicyPermissionDto.java │ │ │ │ ├── PolicyResourceDto.java │ │ │ │ ├── PolicyStatementDto.java │ │ │ │ ├── PolicyTypeDto.java │ │ │ │ ├── QueryExamplePolicyResolverContext.java │ │ │ │ └── TermPolicyResolverContext.java │ │ │ ├── security │ │ │ │ ├── UserDto.java │ │ │ │ └── UserProviderRole.java │ │ │ └── term │ │ │ │ ├── DescriptionParsedTerms.java │ │ │ │ ├── LinkedTermDto.java │ │ │ │ ├── TermBaseInfoDto.java │ │ │ │ ├── TermDetailsDto.java │ │ │ │ ├── TermDto.java │ │ │ │ ├── TermOwnershipDto.java │ │ │ │ └── TermRefDto.java │ │ │ ├── exception │ │ │ ├── BadUserRequestException.java │ │ │ ├── CascadeDeleteException.java │ │ │ ├── DataEntityClassTypeValidationException.java │ │ │ ├── DatabaseException.java │ │ │ ├── ErrorCode.java │ │ │ ├── ExceptionWithErrorCode.java │ │ │ ├── GenAIException.java │ │ │ ├── MinioException.java │ │ │ ├── NotFoundException.java │ │ │ ├── PrometheusException.java │ │ │ └── UniqueConstraintException.java │ │ │ ├── housekeeping │ │ │ ├── HousekeepingJobManager.java │ │ │ ├── config │ │ │ │ └── HousekeepingTTLProperties.java │ │ │ └── job │ │ │ │ ├── ActivityEmptyPartitionsHousekeepingJob.java │ │ │ │ ├── AlertHousekeepingJob.java │ │ │ │ ├── DataEntityHousekeepingJob.java │ │ │ │ ├── EmptyPartitionsHousekeepingJob.java │ │ │ │ ├── HousekeepingJob.java │ │ │ │ ├── MessageEmptyPartitionsHousekeepingJob.java │ │ │ │ └── SearchFacetsHousekeepingJob.java │ │ │ ├── integration │ │ │ ├── IntegrationRegistry.java │ │ │ ├── IntegrationRegistryFactory.java │ │ │ ├── ResourceFilesIntegrationRegistry.java │ │ │ ├── StaticArgumentMappingContext.java │ │ │ ├── config │ │ │ │ └── IntegrationConfiguration.java │ │ │ ├── dto │ │ │ │ ├── IntegrationCodeSnippetArgumentDto.java │ │ │ │ ├── IntegrationCodeSnippetArgumentTypeEnum.java │ │ │ │ ├── IntegrationCodeSnippetDto.java │ │ │ │ ├── IntegrationContentBlockDto.java │ │ │ │ ├── IntegrationOverviewDto.java │ │ │ │ └── IntegrationPreviewDto.java │ │ │ ├── mapper │ │ │ │ └── IntegrationMapper.java │ │ │ ├── serde │ │ │ │ └── IntegrationDeserializer.java │ │ │ └── service │ │ │ │ ├── IntegrationService.java │ │ │ │ └── IntegrationServiceImpl.java │ │ │ ├── leaderelection │ │ │ ├── PostgreSQLLeaderElectionManager.java │ │ │ └── PostgreSQLLeaderElectionManagerImpl.java │ │ │ ├── mapper │ │ │ ├── ActivityMapper.java │ │ │ ├── AlertHaltConfigMapper.java │ │ │ ├── AlertMapper.java │ │ │ ├── AssociatedOwnerMapper.java │ │ │ ├── AssociatedOwnerMapperImpl.java │ │ │ ├── CollectorMapper.java │ │ │ ├── DataEntityMapper.java │ │ │ ├── DataEntityMapperImpl.java │ │ │ ├── DataEntityRunMapper.java │ │ │ ├── DataEntityStatusMapper.java │ │ │ ├── DataEntityTaskRunMapper.java │ │ │ ├── DataEntityTaskRunMapperImpl.java │ │ │ ├── DataQualityCategoryMapper.java │ │ │ ├── DataQualityCategoryMapperImpl.java │ │ │ ├── DataQualityMapper.java │ │ │ ├── DataQualityTestFiltersMapper.java │ │ │ ├── DataSourceMapper.java │ │ │ ├── DataSourceSafeMapper.java │ │ │ ├── DatasetFieldApiMapper.java │ │ │ ├── DatasetFieldListMapper.java │ │ │ ├── DatasetFieldListMapperImpl.java │ │ │ ├── DatasetVersionMapper.java │ │ │ ├── DateTimeMapper.java │ │ │ ├── EnumValueMapper.java │ │ │ ├── ErdRelationshipMapper.java │ │ │ ├── FacetStateMapper.java │ │ │ ├── FacetStateMapperImpl.java │ │ │ ├── FileMapper.java │ │ │ ├── GraphRelationshipMapper.java │ │ │ ├── LineageMapper.java │ │ │ ├── LinkMapper.java │ │ │ ├── LookupTableDefinitionMapper.java │ │ │ ├── LookupTableMapper.java │ │ │ ├── LookupTableRowMapper.java │ │ │ ├── MapperConfig.java │ │ │ ├── MessageMapper.java │ │ │ ├── MetadataFieldMapper.java │ │ │ ├── MetadataFieldMapperImpl.java │ │ │ ├── MetadataFieldValueMapper.java │ │ │ ├── MetadataFieldValueMapperImpl.java │ │ │ ├── MetricsMapper.java │ │ │ ├── MetricsMapperImpl.java │ │ │ ├── NamespaceMapper.java │ │ │ ├── OwnerAssociationRequestActivityMapper.java │ │ │ ├── OwnerAssociationRequestMapper.java │ │ │ ├── OwnerMapper.java │ │ │ ├── OwnershipMapper.java │ │ │ ├── PolicyMapper.java │ │ │ ├── PrometheusMetricsMapper.java │ │ │ ├── PrometheusMetricsMapperImpl.java │ │ │ ├── QueryExampleMapper.java │ │ │ ├── RelationshipMapper.java │ │ │ ├── RoleMapper.java │ │ │ ├── SearchMapper.java │ │ │ ├── SearchMapperImpl.java │ │ │ ├── TablesDashboardMapper.java │ │ │ ├── TablesDashboardMapperImpl.java │ │ │ ├── TagMapper.java │ │ │ ├── TermMapper.java │ │ │ ├── TitleMapper.java │ │ │ ├── TokenMapper.java │ │ │ └── ingestion │ │ │ │ ├── DataSourceIngestionMapper.java │ │ │ │ ├── DataSourceIngestionMapperImpl.java │ │ │ │ ├── DatasetERDRelationIngestionMapper.java │ │ │ │ ├── DatasetERDRelationIngestionMapperImpl.java │ │ │ │ ├── DatasetFieldIngestionMapper.java │ │ │ │ ├── DatasetGraphRelationIngestionMapper.java │ │ │ │ ├── DatasetGraphRelationIngestionMapperImpl.java │ │ │ │ ├── DatasetRelationIngestionMapper.java │ │ │ │ ├── DatasetRelationIngestionMapperImpl.java │ │ │ │ ├── IngestionMapper.java │ │ │ │ ├── IngestionMapperImpl.java │ │ │ │ └── IngestionMetricsMapper.java │ │ │ ├── notification │ │ │ ├── NotificationSubscriber.java │ │ │ ├── NotificationSubscriberStarter.java │ │ │ ├── PGConnectionFactory.java │ │ │ ├── config │ │ │ │ ├── ConditionalOnNotifications.java │ │ │ │ ├── EmailSenderProperties.java │ │ │ │ ├── NotificationConfiguration.java │ │ │ │ ├── NotificationsFeatureCondition.java │ │ │ │ └── NotificationsProperties.java │ │ │ ├── dto │ │ │ │ ├── AlertNotificationMessage.java │ │ │ │ ├── DecodedWALMessage.java │ │ │ │ └── NotificationMessage.java │ │ │ ├── exception │ │ │ │ ├── NotificationSenderException.java │ │ │ │ └── NotificationSubscriberException.java │ │ │ ├── processor │ │ │ │ ├── AlertNotificationMessageProcessor.java │ │ │ │ ├── PostgresWALMessageProcessor.java │ │ │ │ └── message │ │ │ │ │ ├── MrkdwnUtils.java │ │ │ │ │ ├── SlackEmojiUtils.java │ │ │ │ │ └── SlackMessageGenerator.java │ │ │ ├── sender │ │ │ │ ├── AbstractNotificationSender.java │ │ │ │ ├── EmailNotificationSender.java │ │ │ │ ├── NotificationSender.java │ │ │ │ ├── SlackNotificationSender.java │ │ │ │ └── WebhookNotificationSender.java │ │ │ ├── translator │ │ │ │ ├── AlertNotificationMessageTranslator.java │ │ │ │ └── NotificationMessageTranslator.java │ │ │ └── wal │ │ │ │ └── PostgresWALMessageDecoder.java │ │ │ ├── partition │ │ │ ├── PostgreSQLPartitionCreationJob.java │ │ │ ├── manager │ │ │ │ ├── AbstractPartitionManager.java │ │ │ │ ├── ActivityTablePartitionManager.java │ │ │ │ ├── MessageTablePartitionManager.java │ │ │ │ ├── PartitionManager.java │ │ │ │ └── TablePartition.java │ │ │ └── service │ │ │ │ ├── PartitionService.java │ │ │ │ └── PartitionServiceImpl.java │ │ │ ├── repository │ │ │ ├── AlertHaltConfigRepository.java │ │ │ ├── AlertHaltConfigRepositoryImpl.java │ │ │ ├── mapper │ │ │ │ ├── DataEntityDtoMapper.java │ │ │ │ ├── DatasetFieldTermsDtoMapper.java │ │ │ │ └── RoleRecordMapper.java │ │ │ ├── metric │ │ │ │ ├── ExternalMetricLastValueRepository.java │ │ │ │ ├── ExternalMetricLastValueRepositoryImpl.java │ │ │ │ ├── MetricEntityRepository.java │ │ │ │ ├── MetricEntityRepositoryImpl.java │ │ │ │ ├── MetricFamilyRepository.java │ │ │ │ ├── MetricFamilyRepositoryImpl.java │ │ │ │ ├── MetricLabelRepository.java │ │ │ │ ├── MetricLabelRepositoryImpl.java │ │ │ │ ├── MetricLabelValueRepository.java │ │ │ │ ├── MetricLabelValueRepositoryImpl.java │ │ │ │ ├── MetricPointRepository.java │ │ │ │ ├── MetricPointRepositoryImpl.java │ │ │ │ ├── MetricSeriesRepository.java │ │ │ │ └── MetricSeriesRepositoryImpl.java │ │ │ ├── reactive │ │ │ │ ├── DataEntityDescriptionUnhandledTermRepository.java │ │ │ │ ├── DataEntityDescriptionUnhandledTermRepositoryImpl.java │ │ │ │ ├── DatasetFieldDescriptionUnhandledTermRepository.java │ │ │ │ ├── DatasetFieldDescriptionUnhandledTermRepositoryImpl.java │ │ │ │ ├── FileRepository.java │ │ │ │ ├── FileRepositoryImpl.java │ │ │ │ ├── LinkRepository.java │ │ │ │ ├── LinkRepositoryImpl.java │ │ │ │ ├── ReactiveAbstractCRUDRepository.java │ │ │ │ ├── ReactiveAbstractSoftDeleteCRUDRepository.java │ │ │ │ ├── ReactiveActivityRepository.java │ │ │ │ ├── ReactiveActivityRepositoryImpl.java │ │ │ │ ├── ReactiveAlertRepository.java │ │ │ │ ├── ReactiveAlertRepositoryImpl.java │ │ │ │ ├── ReactiveCRUDRepository.java │ │ │ │ ├── ReactiveCollectorRepository.java │ │ │ │ ├── ReactiveCollectorRepositoryImpl.java │ │ │ │ ├── ReactiveDataEntityFilledRepository.java │ │ │ │ ├── ReactiveDataEntityFilledRepositoryImpl.java │ │ │ │ ├── ReactiveDataEntityQueryExampleRelationRepository.java │ │ │ │ ├── ReactiveDataEntityQueryExampleRelationRepositoryImpl.java │ │ │ │ ├── ReactiveDataEntityRelationshipRepository.java │ │ │ │ ├── ReactiveDataEntityRelationshipRepositoryImpl.java │ │ │ │ ├── ReactiveDataEntityRepository.java │ │ │ │ ├── ReactiveDataEntityRepositoryImpl.java │ │ │ │ ├── ReactiveDataEntityStatisticsRepository.java │ │ │ │ ├── ReactiveDataEntityStatisticsRepositoryImpl.java │ │ │ │ ├── ReactiveDataEntityTaskRunRepository.java │ │ │ │ ├── ReactiveDataEntityTaskRunRepositoryImpl.java │ │ │ │ ├── ReactiveDataQualityRepository.java │ │ │ │ ├── ReactiveDataQualityRepositoryImpl.java │ │ │ │ ├── ReactiveDataQualityRunsRepository.java │ │ │ │ ├── ReactiveDataQualityRunsRepositoryImpl.java │ │ │ │ ├── ReactiveDataQualityTestRelationRepository.java │ │ │ │ ├── ReactiveDataQualityTestRelationRepositoryImpl.java │ │ │ │ ├── ReactiveDataSourceRepository.java │ │ │ │ ├── ReactiveDataSourceRepositoryImpl.java │ │ │ │ ├── ReactiveDatasetFieldMetadataValueRepository.java │ │ │ │ ├── ReactiveDatasetFieldMetadataValueRepositoryImpl.java │ │ │ │ ├── ReactiveDatasetFieldRepository.java │ │ │ │ ├── ReactiveDatasetFieldRepositoryImpl.java │ │ │ │ ├── ReactiveDatasetStructureRepository.java │ │ │ │ ├── ReactiveDatasetStructureRepositoryImpl.java │ │ │ │ ├── ReactiveDatasetVersionRepository.java │ │ │ │ ├── ReactiveDatasetVersionRepositoryImpl.java │ │ │ │ ├── ReactiveERDRelationshipsRepository.java │ │ │ │ ├── ReactiveERDRelationshipsRepositoryImpl.java │ │ │ │ ├── ReactiveEnumValueRepository.java │ │ │ │ ├── ReactiveEnumValueRepositoryImpl.java │ │ │ │ ├── ReactiveGraphRelationshipsRepository.java │ │ │ │ ├── ReactiveGraphRelationshipsRepositoryImpl.java │ │ │ │ ├── ReactiveGroupEntityRelationRepository.java │ │ │ │ ├── ReactiveGroupEntityRelationRepositoryImpl.java │ │ │ │ ├── ReactiveGroupParentGroupRelationRepository.java │ │ │ │ ├── ReactiveGroupParentGroupRelationRepositoryImpl.java │ │ │ │ ├── ReactiveLineageRepository.java │ │ │ │ ├── ReactiveLineageRepositoryImpl.java │ │ │ │ ├── ReactiveLookupTableDefinitionRepository.java │ │ │ │ ├── ReactiveLookupTableDefinitionRepositoryImpl.java │ │ │ │ ├── ReactiveLookupTableRepository.java │ │ │ │ ├── ReactiveLookupTableRepositoryImpl.java │ │ │ │ ├── ReactiveLookupTableSearchEntrypointRepository.java │ │ │ │ ├── ReactiveLookupTableSearchEntrypointRepositoryImpl.java │ │ │ │ ├── ReactiveMessageRepository.java │ │ │ │ ├── ReactiveMessageRepositoryImpl.java │ │ │ │ ├── ReactiveMetadataFieldRepository.java │ │ │ │ ├── ReactiveMetadataFieldRepositoryImpl.java │ │ │ │ ├── ReactiveMetadataFieldValueRepository.java │ │ │ │ ├── ReactiveMetadataFieldValueRepositoryImpl.java │ │ │ │ ├── ReactiveNamespaceRepository.java │ │ │ │ ├── ReactiveNamespaceRepositoryImpl.java │ │ │ │ ├── ReactiveOwnerAssociationRequestActivityRepository.java │ │ │ │ ├── ReactiveOwnerAssociationRequestActivityRepositoryImpl.java │ │ │ │ ├── ReactiveOwnerAssociationRequestRepository.java │ │ │ │ ├── ReactiveOwnerAssociationRequestRepositoryImpl.java │ │ │ │ ├── ReactiveOwnerRepository.java │ │ │ │ ├── ReactiveOwnerRepositoryImpl.java │ │ │ │ ├── ReactiveOwnerToRoleRepository.java │ │ │ │ ├── ReactiveOwnerToRoleRepositoryImpl.java │ │ │ │ ├── ReactiveOwnershipRepository.java │ │ │ │ ├── ReactiveOwnershipRepositoryImpl.java │ │ │ │ ├── ReactivePolicyRepository.java │ │ │ │ ├── ReactivePolicyRepositoryImpl.java │ │ │ │ ├── ReactiveQueryExampleRepository.java │ │ │ │ ├── ReactiveQueryExampleRepositoryImpl.java │ │ │ │ ├── ReactiveQueryExampleSearchEntrypointRepository.java │ │ │ │ ├── ReactiveQueryExampleSearchEntrypointRepositoryImpl.java │ │ │ │ ├── ReactiveRelationshipsRepository.java │ │ │ │ ├── ReactiveRelationshipsRepositoryImpl.java │ │ │ │ ├── ReactiveRoleRepository.java │ │ │ │ ├── ReactiveRoleRepositoryImpl.java │ │ │ │ ├── ReactiveRoleToPolicyRepository.java │ │ │ │ ├── ReactiveRoleToPolicyRepositoryImpl.java │ │ │ │ ├── ReactiveSearchEntrypointRepository.java │ │ │ │ ├── ReactiveSearchEntrypointRepositoryImpl.java │ │ │ │ ├── ReactiveSearchFacetRepository.java │ │ │ │ ├── ReactiveSearchFacetRepositoryImpl.java │ │ │ │ ├── ReactiveTagRepository.java │ │ │ │ ├── ReactiveTagRepositoryImpl.java │ │ │ │ ├── ReactiveTermOwnershipRepository.java │ │ │ │ ├── ReactiveTermOwnershipRepositoryImpl.java │ │ │ │ ├── ReactiveTermQueryExampleRelationRepository.java │ │ │ │ ├── ReactiveTermQueryExampleRelationRepositoryImpl.java │ │ │ │ ├── ReactiveTermRepository.java │ │ │ │ ├── ReactiveTermRepositoryImpl.java │ │ │ │ ├── ReactiveTermSearchEntrypointRepository.java │ │ │ │ ├── ReactiveTermSearchEntrypointRepositoryImpl.java │ │ │ │ ├── ReactiveTitleRepository.java │ │ │ │ ├── ReactiveTitleRepositoryImpl.java │ │ │ │ ├── ReactiveTokenRepository.java │ │ │ │ ├── ReactiveTokenRepositoryImpl.java │ │ │ │ ├── ReactiveUserOwnerMappingRepository.java │ │ │ │ ├── ReactiveUserOwnerMappingRepositoryImpl.java │ │ │ │ ├── ReferenceDataRepository.java │ │ │ │ ├── ReferenceDataRepositoryImpl.java │ │ │ │ ├── TermDefinitionUnhandledTermRepository.java │ │ │ │ ├── TermDefinitionUnhandledTermRepositoryImpl.java │ │ │ │ ├── TermRelationsRepository.java │ │ │ │ └── TermRelationsRepositoryImpl.java │ │ │ └── util │ │ │ │ ├── DataEntityCTEQueryConfig.java │ │ │ │ ├── ExceptionUtils.java │ │ │ │ ├── FTSConfig.java │ │ │ │ ├── FTSConstants.java │ │ │ │ ├── FTSEntity.java │ │ │ │ ├── JooqFTSHelper.java │ │ │ │ ├── JooqQueryHelper.java │ │ │ │ ├── JooqReactiveOperations.java │ │ │ │ ├── JooqReactiveOperationsCustomTables.java │ │ │ │ ├── JooqRecordHelper.java │ │ │ │ └── OrderByField.java │ │ │ ├── service │ │ │ ├── AlertHaltConfigService.java │ │ │ ├── AlertHaltConfigServiceImpl.java │ │ │ ├── AlertLocator.java │ │ │ ├── AlertLocatorImpl.java │ │ │ ├── AlertService.java │ │ │ ├── AlertServiceImpl.java │ │ │ ├── CachingByteArraySLAResourceResolver.java │ │ │ ├── CollectorService.java │ │ │ ├── CollectorServiceImpl.java │ │ │ ├── DataEntityFilledService.java │ │ │ ├── DataEntityFilledServiceImpl.java │ │ │ ├── DataEntityGroupService.java │ │ │ ├── DataEntityGroupServiceImpl.java │ │ │ ├── DataEntityInternalStateService.java │ │ │ ├── DataEntityInternalStateServiceImpl.java │ │ │ ├── DataEntityLookupTableService.java │ │ │ ├── DataEntityLookupTableServiceImpl.java │ │ │ ├── DataEntityRelationsService.java │ │ │ ├── DataEntityRelationsServiceImpl.java │ │ │ ├── DataEntityRunService.java │ │ │ ├── DataEntityRunServiceImpl.java │ │ │ ├── DataEntityService.java │ │ │ ├── DataEntityServiceImpl.java │ │ │ ├── DataEntityStaleDetector.java │ │ │ ├── DataEntityStatisticsService.java │ │ │ ├── DataEntityStatisticsServiceImpl.java │ │ │ ├── DataQualityRunsService.java │ │ │ ├── DataQualityRunsServiceImpl.java │ │ │ ├── DataQualityService.java │ │ │ ├── DataQualityServiceImpl.java │ │ │ ├── DataSourceIngestionService.java │ │ │ ├── DataSourceIngestionServiceImpl.java │ │ │ ├── DataSourceService.java │ │ │ ├── DataSourceServiceImpl.java │ │ │ ├── DatasetFieldInternalInformationService.java │ │ │ ├── DatasetFieldInternalInformationServiceImpl.java │ │ │ ├── DatasetFieldService.java │ │ │ ├── DatasetFieldServiceImpl.java │ │ │ ├── DatasetStructureService.java │ │ │ ├── DatasetStructureServiceImpl.java │ │ │ ├── DatasetVersionService.java │ │ │ ├── DatasetVersionServiceImpl.java │ │ │ ├── DirectoryService.java │ │ │ ├── DirectoryServiceImpl.java │ │ │ ├── ERDRelationshipsIngestionService.java │ │ │ ├── ERDRelationshipsIngestionServiceImpl.java │ │ │ ├── EnumValueService.java │ │ │ ├── EnumValueServiceImpl.java │ │ │ ├── ExternalMetricReader.java │ │ │ ├── GraphRelationshipsIngestionService.java │ │ │ ├── GraphRelationshipsIngestionServiceImpl.java │ │ │ ├── IdentityService.java │ │ │ ├── IdentityServiceImpl.java │ │ │ ├── InternalMetricReader.java │ │ │ ├── LineageService.java │ │ │ ├── LineageServiceImpl.java │ │ │ ├── LookupDataSearchService.java │ │ │ ├── LookupDataSearchServiceImpl.java │ │ │ ├── LookupDataService.java │ │ │ ├── LookupDataServiceImpl.java │ │ │ ├── MessageService.java │ │ │ ├── MessageServiceImpl.java │ │ │ ├── MetadataFieldService.java │ │ │ ├── MetadataFieldServiceImpl.java │ │ │ ├── MetricReader.java │ │ │ ├── MetricService.java │ │ │ ├── MetricServiceImpl.java │ │ │ ├── NamespaceService.java │ │ │ ├── NamespaceServiceImpl.java │ │ │ ├── OwnerAssociationRequestActivityService.java │ │ │ ├── OwnerAssociationRequestActivityServiceImpl.java │ │ │ ├── OwnerAssociationRequestService.java │ │ │ ├── OwnerAssociationRequestServiceImpl.java │ │ │ ├── OwnerService.java │ │ │ ├── OwnerServiceImpl.java │ │ │ ├── OwnershipService.java │ │ │ ├── OwnershipServiceImpl.java │ │ │ ├── PolicyJSONValidator.java │ │ │ ├── PolicyService.java │ │ │ ├── PolicyServiceImpl.java │ │ │ ├── QueryExampleSearchService.java │ │ │ ├── QueryExampleSearchServiceImpl.java │ │ │ ├── QueryExampleService.java │ │ │ ├── QueryExampleServiceImpl.java │ │ │ ├── ReferenceDataService.java │ │ │ ├── ReferenceDataServiceImpl.java │ │ │ ├── RelationshipsService.java │ │ │ ├── RelationshipsServiceImpl.java │ │ │ ├── RoleService.java │ │ │ ├── RoleServiceImpl.java │ │ │ ├── SLAResourceResolver.java │ │ │ ├── TagService.java │ │ │ ├── TagServiceImpl.java │ │ │ ├── TitleService.java │ │ │ ├── TitleServiceImpl.java │ │ │ ├── TokenGenerator.java │ │ │ ├── TokenGeneratorImpl.java │ │ │ ├── UserOwnerMappingService.java │ │ │ ├── UserOwnerMappingServiceImpl.java │ │ │ ├── activity │ │ │ │ ├── ActivityAspect.java │ │ │ │ ├── ActivityLog.java │ │ │ │ ├── ActivityParameter.java │ │ │ │ ├── ActivityService.java │ │ │ │ ├── ActivityServiceImpl.java │ │ │ │ └── handler │ │ │ │ │ ├── AbstractCustomGroupActivityHandler.java │ │ │ │ │ ├── AbstractOwnershipActivityHandler.java │ │ │ │ │ ├── ActivityHandler.java │ │ │ │ │ ├── AlertHaltConfigUpdatedActivityHandler.java │ │ │ │ │ ├── AlertStatusUpdatedHandler.java │ │ │ │ │ ├── BusinessNameUpdatedActivityHandler.java │ │ │ │ │ ├── CustomGroupCreatedActivityHandler.java │ │ │ │ │ ├── CustomGroupUpdatedActivityHandler.java │ │ │ │ │ ├── DataEntityCreatedActivityHandler.java │ │ │ │ │ ├── DataEntityStatusUpdatedActivityHandler.java │ │ │ │ │ ├── DatasetFieldInformationUpdatedActivityHandler.java │ │ │ │ │ ├── DatasetFieldTermAssignmentActivityHandler.java │ │ │ │ │ ├── DatasetFieldValuesUpdatedActivityHandler.java │ │ │ │ │ ├── DescriptionUpdatedActivityHandler.java │ │ │ │ │ ├── OwnershipCreatedActivityHandler.java │ │ │ │ │ ├── OwnershipDeletedActivityHandler.java │ │ │ │ │ ├── OwnershipUpdatedActivityHandler.java │ │ │ │ │ ├── TagActivityHandlerImpl.java │ │ │ │ │ └── TermAssignmentActivityHandler.java │ │ │ ├── attachment │ │ │ │ ├── AttachmentService.java │ │ │ │ ├── AttachmentServiceImpl.java │ │ │ │ ├── FilePathConstructor.java │ │ │ │ ├── FileService.java │ │ │ │ ├── FileServiceImpl.java │ │ │ │ ├── FileUploadService.java │ │ │ │ ├── LinkService.java │ │ │ │ ├── LinkServiceImpl.java │ │ │ │ ├── local │ │ │ │ │ ├── LocalFilePathConstructor.java │ │ │ │ │ └── LocalFileUploadServiceImpl.java │ │ │ │ └── remote │ │ │ │ │ ├── RemoteFilePathConstructor.java │ │ │ │ │ └── RemoteFileUploadServiceImpl.java │ │ │ ├── feature │ │ │ │ ├── FeatureResolver.java │ │ │ │ └── FeatureResolverImpl.java │ │ │ ├── genai │ │ │ │ ├── GenAIService.java │ │ │ │ └── GenAIServiceImpl.java │ │ │ ├── ingestion │ │ │ │ ├── DatasetFieldMetadataIngestionService.java │ │ │ │ ├── DatasetFieldMetadataIngestionServiceImpl.java │ │ │ │ ├── DatasetVersionHashCalculator.java │ │ │ │ ├── EnumValuesIngestionService.java │ │ │ │ ├── EnumValuesIngestionServiceImpl.java │ │ │ │ ├── IngestionService.java │ │ │ │ ├── IngestionServiceImpl.java │ │ │ │ ├── alert │ │ │ │ │ ├── AlertAction.java │ │ │ │ │ ├── AlertActionResolver.java │ │ │ │ │ ├── AlertActionResolverFactory.java │ │ │ │ │ ├── AlertActionResolverImpl.java │ │ │ │ │ ├── AlertBISCandidate.java │ │ │ │ │ └── IngestionTaskRunAlertState.java │ │ │ │ ├── metric │ │ │ │ │ ├── ExternalIngestionMetricsServiceImpl.java │ │ │ │ │ ├── IngestionMetricsService.java │ │ │ │ │ ├── InternalIngestionMetricsServiceImpl.java │ │ │ │ │ └── extractors │ │ │ │ │ │ ├── external │ │ │ │ │ │ ├── AbstractTimeSeriesExtractor.java │ │ │ │ │ │ ├── CounterTimeSeriesExtractor.java │ │ │ │ │ │ ├── GaugeTimeSeriesExtractor.java │ │ │ │ │ │ ├── HistogramTimeSeriesExtractor.java │ │ │ │ │ │ ├── SummaryTimeSeriesExtractor.java │ │ │ │ │ │ └── TimeSeriesExtractor.java │ │ │ │ │ │ └── internal │ │ │ │ │ │ ├── AbstractMetricSeriesExtractor.java │ │ │ │ │ │ ├── CounterMetricsSeriesExtractor.java │ │ │ │ │ │ ├── GaugeMetricSeriesExtractor.java │ │ │ │ │ │ ├── HistogramMetricSeriesExtractor.java │ │ │ │ │ │ ├── MetricSeriesExtractor.java │ │ │ │ │ │ └── SummaryMetricsSeriesExtractor.java │ │ │ │ ├── processor │ │ │ │ │ ├── ActivityIngestionRequestProcessor.java │ │ │ │ │ ├── AlertIngestionRequestProcessor.java │ │ │ │ │ ├── DataQualityTestRelationIngestionRequestProcessor.java │ │ │ │ │ ├── DatasetStructureIngestionRequestProcessor.java │ │ │ │ │ ├── ExternalTagIngestionRequestProcessor.java │ │ │ │ │ ├── FTSVectorsIngestionRequestProcessor.java │ │ │ │ │ ├── GroupEntityRelationIngestionRequestProcessor.java │ │ │ │ │ ├── GroupParentGroupIngestionRequestProcessor.java │ │ │ │ │ ├── HollowDataEntityIngestionRequestProcessor.java │ │ │ │ │ ├── IngestionProcessingPhase.java │ │ │ │ │ ├── IngestionProcessorChain.java │ │ │ │ │ ├── IngestionRequestProcessor.java │ │ │ │ │ ├── LineageIngestionRequestProcessor.java │ │ │ │ │ ├── MetadataIngestionRequestProcessor.java │ │ │ │ │ ├── RelationshipIngestionRequestProcessor.java │ │ │ │ │ ├── TaskRunIngestionRequestProcessor.java │ │ │ │ │ └── UsageReportIngestionRequestProcessor.java │ │ │ │ └── util │ │ │ │ │ └── DateTimeUtil.java │ │ │ ├── job │ │ │ │ └── DataEntityStatusSwitchJob.java │ │ │ ├── metadata │ │ │ │ └── MetadataParser.java │ │ │ ├── metric │ │ │ │ ├── NoOpOTLPMetricService.java │ │ │ │ ├── OTLPMetricService.java │ │ │ │ ├── OTLPMetricServiceImpl.java │ │ │ │ ├── dto │ │ │ │ │ └── MetricDataTriplet.java │ │ │ │ └── extractors │ │ │ │ │ ├── BinaryDatasetFieldStatExtractor.java │ │ │ │ │ ├── BooleanDatasetFieldStatExtractor.java │ │ │ │ │ ├── ComplexDatasetFieldStatExtractor.java │ │ │ │ │ ├── DatasetFieldMetricExtractor.java │ │ │ │ │ ├── DatasetFieldStatExtractor.java │ │ │ │ │ ├── DatasetMetricExtractor.java │ │ │ │ │ ├── DatetimeDatasetFieldStatExtractor.java │ │ │ │ │ ├── ExtractorUtils.java │ │ │ │ │ ├── IntegerDatasetFieldStatExtractor.java │ │ │ │ │ ├── MetricExtractor.java │ │ │ │ │ ├── NumberDatasetFieldStatExtractor.java │ │ │ │ │ ├── StringDatasetFieldStatExtractor.java │ │ │ │ │ └── TaskRunMetricExtractor.java │ │ │ ├── permission │ │ │ │ ├── PermissionService.java │ │ │ │ ├── PermissionServiceImpl.java │ │ │ │ └── extractor │ │ │ │ │ ├── AbstractContextualPermissionExtractor.java │ │ │ │ │ ├── ContextualPermissionExtractor.java │ │ │ │ │ ├── DataEntityPermissionExtractor.java │ │ │ │ │ ├── ManagementPermissionExtractor.java │ │ │ │ │ ├── NoContextPermissionExtractor.java │ │ │ │ │ ├── PermissionExtractor.java │ │ │ │ │ ├── QueryExamplePermissionExtractor.java │ │ │ │ │ └── TermPermissionExtractor.java │ │ │ ├── policy │ │ │ │ ├── PolicyPermissionExtractor.java │ │ │ │ ├── comparer │ │ │ │ │ ├── ArrayFieldComparer.java │ │ │ │ │ ├── Comparer.java │ │ │ │ │ ├── SimpleFieldComparer.java │ │ │ │ │ ├── dataentity │ │ │ │ │ │ ├── DataEntityClassFieldComparer.java │ │ │ │ │ │ ├── DataEntityComparorFactory.java │ │ │ │ │ │ ├── DataEntityDataSourceFieldComparer.java │ │ │ │ │ │ ├── DataEntityFieldComparer.java │ │ │ │ │ │ ├── DataEntityNamespaceFieldComparer.java │ │ │ │ │ │ ├── DataEntityOwnerFieldComparer.java │ │ │ │ │ │ ├── DataEntityOwnerTitleFieldComparer.java │ │ │ │ │ │ ├── DataEntityTagFieldComparer.java │ │ │ │ │ │ └── DataEntityTypeFieldComparer.java │ │ │ │ │ ├── queryexample │ │ │ │ │ │ ├── QueryExampleComparorFactory.java │ │ │ │ │ │ └── QueryExampleFieldComparer.java │ │ │ │ │ └── term │ │ │ │ │ │ ├── TermComparorFactory.java │ │ │ │ │ │ ├── TermFieldComparer.java │ │ │ │ │ │ ├── TermNamespaceFieldComparer.java │ │ │ │ │ │ ├── TermOwnerFieldComparer.java │ │ │ │ │ │ ├── TermOwnerTitleFieldComparer.java │ │ │ │ │ │ └── TermTagFieldComparer.java │ │ │ │ └── resolver │ │ │ │ │ ├── AbstractConditionResolver.java │ │ │ │ │ ├── ConditionResolver.java │ │ │ │ │ ├── DataEntityConditionResolver.java │ │ │ │ │ ├── NoContextConditionResolver.java │ │ │ │ │ ├── QueryExampleConditionResolver.java │ │ │ │ │ └── TermConditionResolver.java │ │ │ ├── search │ │ │ │ ├── DataEntityHighlightConverter.java │ │ │ │ ├── DataEntityHighlightService.java │ │ │ │ ├── DataEntityHighlightServiceImpl.java │ │ │ │ ├── SearchService.java │ │ │ │ └── SearchServiceImpl.java │ │ │ ├── sla │ │ │ │ └── SLACalculator.java │ │ │ └── term │ │ │ │ ├── TermOwnershipService.java │ │ │ │ ├── TermOwnershipServiceImpl.java │ │ │ │ ├── TermSearchService.java │ │ │ │ ├── TermSearchServiceImpl.java │ │ │ │ ├── TermService.java │ │ │ │ └── TermServiceImpl.java │ │ │ └── utils │ │ │ ├── ActivityParameterNames.java │ │ │ ├── BlockingOperationUtils.java │ │ │ ├── FileUtils.java │ │ │ ├── GsonHelper.java │ │ │ ├── JSONBDeserializer.java │ │ │ ├── JSONBSerializer.java │ │ │ ├── JSONSerDeUtils.java │ │ │ ├── MappingUtils.java │ │ │ ├── MetricUtils.java │ │ │ ├── OddrnUtils.java │ │ │ ├── OperationUtils.java │ │ │ ├── Page.java │ │ │ ├── Pair.java │ │ │ ├── ProviderUtils.java │ │ │ ├── UUIDHelper.java │ │ │ └── lookup │ │ │ └── validators │ │ │ ├── LookupBooleanValidator.java │ │ │ ├── LookupCharValidator.java │ │ │ ├── LookupDateValidator.java │ │ │ ├── LookupDecimalValidator.java │ │ │ ├── LookupIntegerValidator.java │ │ │ ├── LookupJSONBValidator.java │ │ │ ├── LookupTimestampValidator.java │ │ │ ├── LookupTypesValidator.java │ │ │ └── LookupUUIDValidator.java │ ├── proto │ │ ├── gogoproto │ │ │ └── gogo.proto │ │ ├── remote.proto │ │ └── types.proto │ └── resources │ │ ├── application.yml │ │ ├── bootstrap.yml │ │ ├── db │ │ └── migration │ │ │ ├── V0_0_10__add_counters.sql │ │ │ ├── V0_0_11__add_namespace_support.sql │ │ │ ├── V0_0_12__change_alert_data_entity_reference_to_oddrn.sql │ │ │ ├── V0_0_13__add_alert_messenger_oddrn.sql │ │ │ ├── V0_0_14__normalize_fts_process.sql │ │ │ ├── V0_0_15__drop_dataset_revisions.sql │ │ │ ├── V0_0_16__add_datasetfield_oddrn_index.sql │ │ │ ├── V0_0_17__add_establisher_into_lineage.sql │ │ │ ├── V0_0_18__pull_push_data_sources.sql │ │ │ ├── V0_0_19__add_microservice_subtype.sql │ │ │ ├── V0_0_1__init.sql │ │ │ ├── V0_0_20__api_call_support.sql │ │ │ ├── V0_0_21__add_data_entity_group_relation.sql │ │ │ ├── V0_0_22__refactor_types_and_subtypes.sql │ │ │ ├── V0_0_23__add_deg_subtypes.sql │ │ │ ├── V0_0_24__remove_type_tables.sql │ │ │ ├── V0_0_25__add_dataset_field_enum_values.sql │ │ │ ├── V0_0_26__remove_length_constraints.sql │ │ │ ├── V0_0_27__add_status_updated_by_to_alerts.sql │ │ │ ├── V0_0_28__add_token.sql │ │ │ ├── V0_0_29__add_collector.sql │ │ │ ├── V0_0_2__add_lineage.sql │ │ │ ├── V0_0_30__rename_type_and_subtype.sql │ │ │ ├── V0_0_31__add_deleted_at_field.sql │ │ │ ├── V0_0_32__remove_oddrn_from_collector.sql │ │ │ ├── V0_0_33__add_token_constraints.sql │ │ │ ├── V0_0_34__add_collector_to_data_source.sql │ │ │ ├── V0_0_35__add_terms.sql │ │ │ ├── V0_0_36__refactor_unique_index.sql │ │ │ ├── V0_0_37__update_view_count.sql │ │ │ ├── V0_0_38__add_deleted_at_to_label.sql │ │ │ ├── V0_0_39__add_data_entity_fields.sql │ │ │ ├── V0_0_3__add_ownership.sql │ │ │ ├── V0_0_40__add_deleted_at_enum_value.sql │ │ │ ├── V0_0_41__add_session_tables.sql │ │ │ ├── V0_0_42__additional_indexes_to_dq_test_tables.sql │ │ │ ├── V0_0_43__additional_keys_to_dq_test_relation.sql │ │ │ ├── V0_0_44__dataqatest_severity.sql │ │ │ ├── V0_0_45__last_runs_table.sql │ │ │ ├── V0_0_46__primary_and_sort_key_for_dataset_field.sql │ │ │ ├── V0_0_47__add_tag_external_attribute.sql │ │ │ ├── V0_0_48__add_activity.sql │ │ │ ├── V0_0_49__add_data_entity_statistics_table.sql │ │ │ ├── V0_0_4__add_user_owner_mapping.sql │ │ │ ├── V0_0_50__rename_data_qa_severity.sql │ │ │ ├── V0_0_51__add_owner_association_request.sql │ │ │ ├── V0_0_52__introduce_housekeeping.sql │ │ │ ├── V0_0_53__rename_role_to_title.sql │ │ │ ├── V0_0_54__external_statistics_labels.sql │ │ │ ├── V0_0_55__add_policies_and_roles.sql │ │ │ ├── V0_0_56__add_predefined_roles_and_policies.sql │ │ │ ├── V0_0_57__change_tag_unique_constraint_semantics.sql │ │ │ ├── V0_0_58__rename_constraints.sql │ │ │ ├── V0_0_59__data_collaboration.sql │ │ │ ├── V0_0_5__add_job_run.sql │ │ │ ├── V0_0_60__alert_codes.sql │ │ │ ├── V0_0_61__introduce_stacked_alerts.sql │ │ │ ├── V0_0_62__introduce_alert_halting.sql │ │ │ ├── V0_0_63__add_try_count_to_message.sql │ │ │ ├── V0_0_64__remove_is_deleted_field.sql │ │ │ ├── V0_0_65__rename_tag_activity_type.sql │ │ │ ├── V0_0_66__add_dataset_field_default_value.sql │ │ │ ├── V0_0_67__add_metrics.sql │ │ │ ├── V0_0_68__clear_dataset_version_hash.sql │ │ │ ├── V0_0_69__add_entity_types_statistics.sql │ │ │ ├── V0_0_6__add_dataqa_flow.sql │ │ │ ├── V0_0_70__introduce_external_enum_values.sql │ │ │ ├── V0_0_71__datasource_refactor.sql │ │ │ ├── V0_0_72__dataset_field_reference_type.sql │ │ │ ├── V0_0_73__attachments.sql │ │ │ ├── V0_0_74__dataset_field_terms.sql │ │ │ ├── V0_0_75__utc_timezone.sql │ │ │ ├── V0_0_76__term_relations_hard_delete.sql │ │ │ ├── V0_0_77__data_entity_term_description.sql │ │ │ ├── V0_0_78__description_unhandled_term.sql │ │ │ ├── V0_0_79__data_deprecation.sql │ │ │ ├── V0_0_7__add_alert_flow.sql │ │ │ ├── V0_0_80__metadata_stale.sql │ │ │ ├── V0_0_81__dataset_field_internal_name.sql │ │ │ ├── V0_0_82__add_tag_to_dataset_field.sql │ │ │ ├── V0_0_83__added_category_field_to_dataset_expectation.sql │ │ │ ├── V0_0_84__create_query_example.sql │ │ │ ├── V0_0_85__remove_length_constraint_for_description.sql │ │ │ ├── V0_0_86__create_schema_and_tables_for_custom_tables.sql │ │ │ ├── V0_0_87__create_relation_tables.sql │ │ │ ├── V0_0_88__add_query_example_policy.sql │ │ │ ├── V0_0_89__update_user_owner.sql │ │ │ ├── V0_0_8__change_topic_subtype_name.sql │ │ │ ├── V0_0_90__added_query_example_to_term_relations.sql │ │ │ ├── V0_0_91__add_term_to_term.sql │ │ │ └── V0_0_9__normalize_dataset_structure.sql │ │ ├── schema │ │ └── policy_schema.json │ │ ├── sla │ │ ├── sla_green.png │ │ ├── sla_red.png │ │ └── sla_yellow.png │ │ ├── static │ │ └── img │ │ │ ├── cognito.png │ │ │ ├── github.png │ │ │ ├── google.png │ │ │ ├── keycloak.png │ │ │ └── okta.png │ │ └── templates │ │ ├── email.ftlh │ │ └── oauth2_login.html │ └── test │ ├── java │ └── org │ │ └── opendatadiscovery │ │ └── oddplatform │ │ ├── BaseIngestionTest.java │ │ ├── BaseIntegrationTest.java │ │ ├── api │ │ ├── DataEntityStatusChangeTest.java │ │ ├── DirectoryTest.java │ │ ├── HealthAPITest.java │ │ └── ingestion │ │ │ ├── AlertIngestionTest.java │ │ │ ├── DataEntityStatisticsTest.java │ │ │ ├── DatasetFieldIngestionTest.java │ │ │ ├── DatasetIngestionTest.java │ │ │ ├── DatasetVersionDiffTest.java │ │ │ ├── LineageIngestionTest.java │ │ │ ├── LoadIngestionTest.java │ │ │ ├── MetadataIngestionTest.java │ │ │ ├── MetricsIngestionTest.java │ │ │ ├── PrometheusMetricsIngestionTest.java │ │ │ └── utils │ │ │ ├── IngestionMetricModelMapper.java │ │ │ ├── IngestionModelGenerator.java │ │ │ └── IngestionModelMapper.java │ │ ├── json │ │ ├── JsonSchemaTest.java │ │ └── PolicyDeserializerTest.java │ │ ├── mapper │ │ ├── ActivityMapperTest.java │ │ ├── AlertMapperTest.java │ │ ├── DatasetFieldApiMapperTest.java │ │ ├── DatasetVersionMapperTest.java │ │ ├── EnumValueMapperTest.java │ │ ├── LineageMapperTest.java │ │ ├── MetadataFieldMapperTest.java │ │ ├── MetadataFieldValueMapperTest.java │ │ └── OwnerAssociationRequestMapperTest.java │ │ ├── repository │ │ ├── CollectorRepositoryImplTest.java │ │ ├── DataEntityRunRepositoryImplTest.java │ │ ├── DataQualityRepositoryImplTest.java │ │ ├── DataSourceRepositoryImplTest.java │ │ ├── EnumValueRepositoryImplTest.java │ │ ├── LineageRepositoryTest.java │ │ ├── MetadataFieldValueRepositoryImplTest.java │ │ ├── NamespaceRepositoryImplTest.java │ │ ├── OwnerRepositoryImplTest.java │ │ ├── OwnershipRepositoryImplTest.java │ │ ├── QueryExampleRepositoryTest.java │ │ ├── ReactiveDataQualityRunsRepositoryTest.java │ │ ├── ReactiveDatasetFieldRepositoryImplTest.java │ │ ├── ReactiveDatasetVersionRepositoryImplTest.java │ │ ├── ReactiveMetadataFieldRepositoryImplTest.java │ │ ├── ReactiveMetadataFieldValueRepositoryImplTest.java │ │ ├── ReactiveOwnerAssociationRequestRepositoryImplTest.java │ │ ├── TagRepositoryImplTest.java │ │ └── TitlesRepositoryImplTest.java │ │ ├── service │ │ ├── DataEntityServiceTest.java │ │ ├── DataSourceIngestionServiceTest.java │ │ ├── EnumValueServiceTest.java │ │ ├── LineageServiceTest.java │ │ ├── LookupDataServiceTest.java │ │ ├── MetadataParserTest.java │ │ ├── NamespaceServiceImplTest.java │ │ ├── OwnershipServiceImplTest.java │ │ ├── QueryExampleServiceTest.java │ │ ├── integration │ │ │ └── DataEntityDomainsTest.java │ │ └── sla │ │ │ ├── SLAColourTest.java │ │ │ └── SLAReportTest.java │ │ └── utils │ │ ├── DataEntityTaskRunPojoEndTimeComparator.java │ │ ├── JSONTestUtils.java │ │ ├── OffsetDateTimeComparator.java │ │ ├── RecordFactory.java │ │ └── lookup │ │ └── validators │ │ └── LookupTypesValidatorTest.java │ └── resources │ ├── application-integration-test.yml │ ├── fixtures │ └── ingestion │ │ └── dag │ │ ├── dag.json │ │ └── lineage.json │ ├── ingestion │ ├── datasource │ │ └── datasources.json │ └── samples │ │ ├── 01_airflow_ingestion.json │ │ ├── 02_bookshop_datalake_ingestion.json │ │ ├── 03_bookshop_tr_ingestion.json │ │ ├── 04_etl_ingestion.json │ │ ├── 05_kafka_del_ingestion.json │ │ ├── 06_kinesis_consumer_ingestion.json │ │ ├── 07_kinesis_ingestion.json │ │ ├── 08_s3_ingestion.json │ │ ├── 09_snowflake_ingestion.json │ │ └── 10_ge_ingestion.json │ ├── metrics │ ├── gauge_and_count.json │ ├── histogram_and_summary.json │ └── prometheus │ │ ├── gauge_and_count.json │ │ └── histogram_and_summary.json │ ├── policy │ ├── invalid │ │ ├── additional_properties.json │ │ ├── data_entity_invalid_condition_key.json │ │ ├── data_entity_invalid_permissions.json │ │ ├── empty_policy.json │ │ ├── management_invalid_permissions.json │ │ ├── management_with_conditions.json │ │ ├── missed_permissions.json │ │ ├── missed_resource.json │ │ ├── term_invalid_condition_key.json │ │ └── term_invalid_permissions.json │ ├── policy.json │ └── valid │ │ ├── combined_policy.json │ │ ├── data_entity.json │ │ ├── data_entity_without_conditions.json │ │ ├── management.json │ │ ├── term.json │ │ └── term_without_conditions.json │ └── prometheus │ └── prometheus.yml ├── odd-platform-specification ├── components.yaml └── openapi.yaml ├── odd-platform-ui ├── .eslintignore ├── .eslintrc.json ├── .gitignore ├── .husky │ ├── .gitignore │ ├── pre-commit │ └── prepare.sh ├── .nvmrc ├── .openapi-generator-ignore ├── .prettierrc ├── README.md ├── build.gradle ├── generate.sh ├── i18next-scanner.config.js ├── index.html ├── nginx │ └── default.conf.template ├── openapi-config.yaml ├── package.json ├── pnpm-lock.yaml ├── public │ ├── favicon.ico │ ├── imgs │ │ ├── airbyte.png │ │ ├── airflow.png │ │ ├── airflow2.png │ │ ├── athena.png │ │ ├── cassandra.png │ │ ├── ckan.png │ │ ├── clickhouse.png │ │ ├── cockroachdb.png │ │ ├── couchbase.png │ │ ├── cubejs.png │ │ ├── databricks.png │ │ ├── dbt.png │ │ ├── default.png │ │ ├── druid.png │ │ ├── duckdb.png │ │ ├── dynamodb.png │ │ ├── elasticsearch.png │ │ ├── feast.png │ │ ├── glue.png │ │ ├── great_expectations.png │ │ ├── hive.png │ │ ├── kafka.png │ │ ├── kinesis.png │ │ ├── kubeflow.png │ │ ├── mariadb.png │ │ ├── metabase.png │ │ ├── mongo.png │ │ ├── mssql.png │ │ ├── mysql.png │ │ ├── neo4j.png │ │ ├── odbc.png │ │ ├── oracle.png │ │ ├── postgresql.png │ │ ├── powerbi.png │ │ ├── presto.png │ │ ├── quicksight.png │ │ ├── redash.png │ │ ├── redshift.png │ │ ├── s3.png │ │ ├── sagemaker.png │ │ ├── scylladb.png │ │ ├── singlestore.png │ │ ├── snowflake.png │ │ ├── spark.png │ │ ├── sqlite.png │ │ ├── superset.png │ │ ├── tableau.png │ │ ├── tarantool.png │ │ ├── trino.png │ │ └── vertica.png │ ├── manifest.json │ └── robots.txt ├── src │ ├── components │ │ ├── Activity │ │ │ ├── Activity.tsx │ │ │ ├── ActivityResults │ │ │ │ ├── ActivityItem │ │ │ │ │ ├── ActivityItem.tsx │ │ │ │ │ └── ActivityItemStyles.ts │ │ │ │ ├── ActivityResults.tsx │ │ │ │ └── ActivityTabs │ │ │ │ │ └── ActivityTabs.tsx │ │ │ └── Filters │ │ │ │ ├── Filters.tsx │ │ │ │ └── FiltersStyles.ts │ │ ├── Alerts │ │ │ ├── Alerts.tsx │ │ │ ├── AlertsList │ │ │ │ ├── AlertItem │ │ │ │ │ ├── AlertItem.tsx │ │ │ │ │ └── AlertItemStyles.ts │ │ │ │ ├── AlertsList.tsx │ │ │ │ └── AlertsListStyles.ts │ │ │ ├── AlertsRoutes │ │ │ │ └── AlertsRoutes.tsx │ │ │ └── AlertsTabs │ │ │ │ └── AlertsTabs.tsx │ │ ├── App.tsx │ │ ├── DataEntityDetails │ │ │ ├── DataCollaboration │ │ │ │ ├── Channels │ │ │ │ │ ├── Channels.tsx │ │ │ │ │ └── ChannelsStyles.ts │ │ │ │ ├── CreateMessageForm │ │ │ │ │ └── CreateMessageForm.tsx │ │ │ │ ├── CurrentMessage │ │ │ │ │ ├── CurrentMessage.tsx │ │ │ │ │ ├── CurrentMessageStyles.ts │ │ │ │ │ ├── NoMessage │ │ │ │ │ │ └── NoMessage.tsx │ │ │ │ │ └── Thread │ │ │ │ │ │ ├── Thread.tsx │ │ │ │ │ │ └── ThreadContent │ │ │ │ │ │ ├── MainThreadMessage │ │ │ │ │ │ ├── MainThreadMessage.tsx │ │ │ │ │ │ └── MainThreadMessageStyles.ts │ │ │ │ │ │ ├── ThreadContent.tsx │ │ │ │ │ │ └── ThreadMessage │ │ │ │ │ │ ├── ThreadMessage.tsx │ │ │ │ │ │ ├── ThreadMessageSkeleton.tsx │ │ │ │ │ │ └── ThreadMessageStyles.ts │ │ │ │ ├── DataCollaboration.tsx │ │ │ │ ├── DataCollaborationStyles.ts │ │ │ │ └── MessagesList │ │ │ │ │ ├── Message │ │ │ │ │ ├── Message.tsx │ │ │ │ │ ├── MessageSkeleton.tsx │ │ │ │ │ ├── MessageStatus │ │ │ │ │ │ ├── MessageStatus.styles.ts │ │ │ │ │ │ └── MessageStatus.tsx │ │ │ │ │ └── MessageStyles.ts │ │ │ │ │ ├── MessagesList.tsx │ │ │ │ │ └── MessagesListStyles.ts │ │ │ ├── DataEntityActivity │ │ │ │ ├── ActivityResults │ │ │ │ │ ├── ActivityItem │ │ │ │ │ │ ├── ActivityItem.tsx │ │ │ │ │ │ └── ActivityItemStyles.ts │ │ │ │ │ └── ActivityResults.tsx │ │ │ │ ├── DataEntityActivity.tsx │ │ │ │ └── Filters │ │ │ │ │ ├── Filters.tsx │ │ │ │ │ └── FiltersStyles.ts │ │ │ ├── DataEntityAlerts │ │ │ │ ├── DataEntityAlertItem │ │ │ │ │ ├── DataEntityAlertItem.tsx │ │ │ │ │ ├── DataEntityAlertItemStyles.ts │ │ │ │ │ └── DataEntityAlertsSkeleton.tsx │ │ │ │ ├── DataEntityAlerts.tsx │ │ │ │ ├── DataEntityAlertsStyles.ts │ │ │ │ └── NotificationSettings │ │ │ │ │ ├── AlertTypeRange │ │ │ │ │ └── AlertTypeRange.tsx │ │ │ │ │ └── NotificationSettings.tsx │ │ │ ├── DataEntityDetails.tsx │ │ │ ├── DataEntityDetailsHeader │ │ │ │ └── DataEntityDetailsHeader.tsx │ │ │ ├── DataEntityDetailsRoutes │ │ │ │ └── DataEntityDetailsRoutes.tsx │ │ │ ├── DataEntityDetailsSkeleton │ │ │ │ └── DataEntityDetailsSkeleton.tsx │ │ │ ├── DataEntityDetailsStyles.ts │ │ │ ├── DataEntityDetailsTabs │ │ │ │ └── DataEntityDetailsTabs.tsx │ │ │ ├── DataEntityGroup │ │ │ │ ├── DataEntityGroupControls │ │ │ │ │ └── DataEntityGroupControls.tsx │ │ │ │ └── DataEntityGroupForm │ │ │ │ │ ├── DataEntityGroupForm.tsx │ │ │ │ │ ├── DataEntityGroupFormStyles.ts │ │ │ │ │ └── EntityItem │ │ │ │ │ ├── EntityItem.tsx │ │ │ │ │ └── EntityItemStyles.ts │ │ │ ├── DataEntityQueryExamples │ │ │ │ ├── AssignEntityQueryExampleForm.tsx │ │ │ │ └── DataEntityDetailsQueryExamples.tsx │ │ │ ├── DataEntityRelationships │ │ │ │ └── DataEntityRelationships.tsx │ │ │ ├── DatasetData │ │ │ │ ├── DatasetData.tsx │ │ │ │ ├── DatasetDataTable.tsx │ │ │ │ └── DatasetDataTable │ │ │ │ │ ├── DatasetDataTable.styles.ts │ │ │ │ │ ├── DatasetDataTableRowActions.tsx │ │ │ │ │ ├── DatasetDataTableRowCell.tsx │ │ │ │ │ ├── DatasetDataTableRowCell │ │ │ │ │ ├── DatasetDataTableRowCellBoolean.tsx │ │ │ │ │ ├── DatasetDataTableRowCellDate.tsx │ │ │ │ │ ├── DatasetDataTableRowCellNumber.tsx │ │ │ │ │ ├── DatasetDataTableRowCellString.tsx │ │ │ │ │ └── interfaces.ts │ │ │ │ │ ├── DatasetDataTableRowForm.tsx │ │ │ │ │ ├── hooks.tsx │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ └── utils.ts │ │ │ ├── DatasetStructure │ │ │ │ ├── DatasetStructure.tsx │ │ │ │ ├── DatasetStructureCompare │ │ │ │ │ ├── DatasetStructureCompare.tsx │ │ │ │ │ ├── DatasetStructureCompareHeader │ │ │ │ │ │ └── DatasetStructureCompareHeader.tsx │ │ │ │ │ ├── DatasetStructureCompareList │ │ │ │ │ │ ├── DatasetStructureCompareList.styles.ts │ │ │ │ │ │ ├── DatasetStructureCompareList.tsx │ │ │ │ │ │ └── DatasetStructureCompareListItem │ │ │ │ │ │ │ ├── DatasetStructureCompareListItem.styles.ts │ │ │ │ │ │ │ └── DatasetStructureCompareListItem.tsx │ │ │ │ │ └── lib │ │ │ │ │ │ ├── atoms.ts │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ └── interfaces.ts │ │ │ │ ├── DatasetStructureOverview │ │ │ │ │ ├── DatasetStructureOverview.tsx │ │ │ │ │ ├── DatasetStructureSkeleton │ │ │ │ │ │ └── DatasetStructureSkeleton.tsx │ │ │ │ │ ├── DatasetStructureView │ │ │ │ │ │ ├── DatasetFieldOverview │ │ │ │ │ │ │ ├── DatasetFieldDescription │ │ │ │ │ │ │ │ ├── DatasetFieldDescription.styles.ts │ │ │ │ │ │ │ │ ├── DatasetFieldDescription.tsx │ │ │ │ │ │ │ │ ├── DatasetFieldDescriptionEdit │ │ │ │ │ │ │ │ │ ├── DatasetFieldDescriptionEdit.styles.ts │ │ │ │ │ │ │ │ │ └── DatasetFieldDescriptionEdit.tsx │ │ │ │ │ │ │ │ └── DatasetFieldDescriptionPreview │ │ │ │ │ │ │ │ │ └── DatasetFieldDescriptionPreview.tsx │ │ │ │ │ │ │ ├── DatasetFieldEnumsForm │ │ │ │ │ │ │ │ ├── DatasetFieldEnumsForm.tsx │ │ │ │ │ │ │ │ └── DatasetFieldEnumsFormItem │ │ │ │ │ │ │ │ │ ├── DatasetFieldEnumsFormItem.styles.ts │ │ │ │ │ │ │ │ │ └── DatasetFieldEnumsFormItem.tsx │ │ │ │ │ │ │ ├── DatasetFieldHeader │ │ │ │ │ │ │ │ ├── DatasetFieldHeader.tsx │ │ │ │ │ │ │ │ └── DatasetFieldInternalNameForm │ │ │ │ │ │ │ │ │ └── DatasetFieldInternalNameForm.tsx │ │ │ │ │ │ │ ├── DatasetFieldMetrics │ │ │ │ │ │ │ │ └── DatasetFieldMetrics.tsx │ │ │ │ │ │ │ ├── DatasetFieldOverview.styles.ts │ │ │ │ │ │ │ ├── DatasetFieldOverview.tsx │ │ │ │ │ │ │ ├── DatasetFieldOverviewEnums │ │ │ │ │ │ │ │ └── DatasetFieldOverviewEnums.tsx │ │ │ │ │ │ │ ├── DatasetFieldStats │ │ │ │ │ │ │ │ ├── DatasetField.styles.ts │ │ │ │ │ │ │ │ └── DatasetFieldStats.tsx │ │ │ │ │ │ │ ├── DatasetFieldTags │ │ │ │ │ │ │ │ ├── DatasetFieldTags.tsx │ │ │ │ │ │ │ │ ├── DatasetFieldTagsStyles.ts │ │ │ │ │ │ │ │ └── TagsEditForm │ │ │ │ │ │ │ │ │ ├── TagsEditForm.tsx │ │ │ │ │ │ │ │ │ ├── TagsEditFormAutocomplete │ │ │ │ │ │ │ │ │ └── TagsEditFormAutocomplete.tsx │ │ │ │ │ │ │ │ │ └── TagsEditFormStyles.ts │ │ │ │ │ │ │ └── DatasetFieldTerms │ │ │ │ │ │ │ │ ├── AssignFieldTermForm │ │ │ │ │ │ │ │ └── AssignFieldTermForm.tsx │ │ │ │ │ │ │ │ ├── DatasetFieldTerms.tsx │ │ │ │ │ │ │ │ └── TermItem │ │ │ │ │ │ │ │ └── TermItem.tsx │ │ │ │ │ │ ├── DatasetStructureHeader │ │ │ │ │ │ │ ├── DatasetStructureHeader.tsx │ │ │ │ │ │ │ └── DatasetStructureTypeCounts │ │ │ │ │ │ │ │ ├── DatasetStructureTypeCountLabel │ │ │ │ │ │ │ │ ├── DatasetStructureTypeCountLabel.tsx │ │ │ │ │ │ │ │ └── DatasetStructureTypeCountLabelStyles.ts │ │ │ │ │ │ │ │ └── DatasetStructureTypeCounts.tsx │ │ │ │ │ │ ├── DatasetStructureList │ │ │ │ │ │ │ ├── DatasetStructureItem │ │ │ │ │ │ │ │ ├── DatasetStructureItem.styles.ts │ │ │ │ │ │ │ │ └── DatasetStructureItem.tsx │ │ │ │ │ │ │ ├── DatasetStructureList.styles.ts │ │ │ │ │ │ │ └── DatasetStructureList.tsx │ │ │ │ │ │ ├── DatasetStructureView.styles.ts │ │ │ │ │ │ └── DatasetStructureView.tsx │ │ │ │ │ └── lib │ │ │ │ │ │ ├── DatasetStructureOverviewProvider.tsx │ │ │ │ │ │ ├── HydrateAtoms.tsx │ │ │ │ │ │ ├── atoms.ts │ │ │ │ │ │ └── useStructure.ts │ │ │ │ └── shared │ │ │ │ │ ├── KeyFieldLabel │ │ │ │ │ ├── KeyFieldLabel.tsx │ │ │ │ │ └── KeyFieldLabelStyles.ts │ │ │ │ │ ├── TypeFieldLabel │ │ │ │ │ ├── TypeFieldLabel.styles.ts │ │ │ │ │ └── TypeFieldLabel.tsx │ │ │ │ │ └── constants.ts │ │ │ ├── InternalNameFormDialog │ │ │ │ └── InternalNameFormDialog.tsx │ │ │ ├── Lineage │ │ │ │ ├── DEGLineage │ │ │ │ │ ├── DEGLineage.styles.ts │ │ │ │ │ ├── DEGLineage.tsx │ │ │ │ │ ├── DEGLineageLayouter │ │ │ │ │ │ └── DEGLineageLayouter.tsx │ │ │ │ │ ├── ZoomableDEGLineage │ │ │ │ │ │ ├── DEGLinegeGraph │ │ │ │ │ │ │ ├── DEGLineageGraph.tsx │ │ │ │ │ │ │ ├── EdgesRenderer │ │ │ │ │ │ │ │ ├── EdgesRenderer.styles.ts │ │ │ │ │ │ │ │ └── EdgesRenderer.tsx │ │ │ │ │ │ │ └── NodesRenderer │ │ │ │ │ │ │ │ └── NodesRenderer.tsx │ │ │ │ │ │ ├── ZoomableDEGLineage.styles.ts │ │ │ │ │ │ └── ZoomableDEGLineage.tsx │ │ │ │ │ ├── components │ │ │ │ │ │ ├── DEGLineageControls │ │ │ │ │ │ │ ├── DEGLineageControls.styles.ts │ │ │ │ │ │ │ └── DEGLineageControls.tsx │ │ │ │ │ │ ├── Edge │ │ │ │ │ │ │ ├── Edge.tsx │ │ │ │ │ │ │ └── helpers.ts │ │ │ │ │ │ └── Node │ │ │ │ │ │ │ ├── Node.styles.ts │ │ │ │ │ │ │ └── Node.tsx │ │ │ │ │ └── lib │ │ │ │ │ │ ├── DEGLineageAtomProvider.tsx │ │ │ │ │ │ ├── atoms.ts │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── hooks │ │ │ │ │ │ ├── useDEGLineage.ts │ │ │ │ │ │ └── useDEGZoom.ts │ │ │ │ │ │ ├── interfaces.ts │ │ │ │ │ │ └── layoutDEGLineage.ts │ │ │ │ ├── HierarchyLineage │ │ │ │ │ ├── HierarchyLineage.styles.ts │ │ │ │ │ ├── HierarchyLineage.tsx │ │ │ │ │ ├── ZoomableLineage │ │ │ │ │ │ ├── LineageControls │ │ │ │ │ │ │ ├── LineageControls.tsx │ │ │ │ │ │ │ └── LineageControlsStyles.ts │ │ │ │ │ │ ├── LineageGraph │ │ │ │ │ │ │ ├── CrossLink │ │ │ │ │ │ │ │ └── CrossLink.tsx │ │ │ │ │ │ │ ├── LineageGraph.tsx │ │ │ │ │ │ │ ├── Link │ │ │ │ │ │ │ │ ├── Link.tsx │ │ │ │ │ │ │ │ └── LinkStyles.ts │ │ │ │ │ │ │ └── Node │ │ │ │ │ │ │ │ ├── Classes │ │ │ │ │ │ │ │ ├── Classes.tsx │ │ │ │ │ │ │ │ └── ClassesStyles.ts │ │ │ │ │ │ │ │ ├── HiddenDependencies │ │ │ │ │ │ │ │ ├── HiddenDependencies.tsx │ │ │ │ │ │ │ │ └── HiddenDependenciesStyles.ts │ │ │ │ │ │ │ │ ├── Info │ │ │ │ │ │ │ │ ├── GroupedEntitiesListModal │ │ │ │ │ │ │ │ │ ├── GroupedEntitiesListModal.tsx │ │ │ │ │ │ │ │ │ └── GroupedEntitiesListModalStyles.ts │ │ │ │ │ │ │ │ ├── Info.tsx │ │ │ │ │ │ │ │ ├── InfoStyles.ts │ │ │ │ │ │ │ │ └── ItemsButton │ │ │ │ │ │ │ │ │ └── ItemsButton.tsx │ │ │ │ │ │ │ │ ├── LoadMoreButton │ │ │ │ │ │ │ │ ├── LoadMoreButton.tsx │ │ │ │ │ │ │ │ └── LoadMoreButtonStyles.ts │ │ │ │ │ │ │ │ ├── Node.tsx │ │ │ │ │ │ │ │ ├── NodeStyles.ts │ │ │ │ │ │ │ │ └── NodeTitle │ │ │ │ │ │ │ │ ├── NodeTitle.tsx │ │ │ │ │ │ │ │ └── NodeTitleStyles.ts │ │ │ │ │ │ ├── ZoomableLineage.tsx │ │ │ │ │ │ └── ZoomableLineageStyles.ts │ │ │ │ │ └── lineageLib │ │ │ │ │ │ ├── LineageContext │ │ │ │ │ │ ├── LineageContext.ts │ │ │ │ │ │ └── LineageProvider.tsx │ │ │ │ │ │ ├── constants.ts │ │ │ │ │ │ ├── generateGraph.ts │ │ │ │ │ │ ├── generateNodeSize.ts │ │ │ │ │ │ ├── helpers.ts │ │ │ │ │ │ └── interfaces.ts │ │ │ │ └── Lineage.tsx │ │ │ ├── LinkedItemsList │ │ │ │ ├── LinkedItem │ │ │ │ │ ├── LinkedItem.tsx │ │ │ │ │ └── LinkedItemStyles.ts │ │ │ │ ├── LinkedItemsList.tsx │ │ │ │ ├── LinkedItemsListStyles.ts │ │ │ │ └── LinkedListSkeleton │ │ │ │ │ ├── LinkedListSkeleton.tsx │ │ │ │ │ └── LinkedListSkeletonStyles.ts │ │ │ ├── Metadata │ │ │ │ ├── MetadataCreateForm │ │ │ │ │ ├── MetadataCreateForm.tsx │ │ │ │ │ └── MetadataCreateFormItem │ │ │ │ │ │ └── MetadataCreateFormItem.tsx │ │ │ │ └── MetadataValueEditor │ │ │ │ │ └── MetadataValueEditor.tsx │ │ │ ├── Overview │ │ │ │ ├── Overview.tsx │ │ │ │ ├── OverviewAttachments │ │ │ │ │ ├── AttachmentItem │ │ │ │ │ │ ├── AttachmentItem.styles.ts │ │ │ │ │ │ ├── FileAttachment.tsx │ │ │ │ │ │ └── LinkAttachment.tsx │ │ │ │ │ ├── AttachmentsHeader │ │ │ │ │ │ ├── AttachmentsHeader.styles.ts │ │ │ │ │ │ └── AttachmentsHeader.tsx │ │ │ │ │ ├── AttachmentsList │ │ │ │ │ │ ├── AttachmentsList.styles.ts │ │ │ │ │ │ └── AttachmentsList.tsx │ │ │ │ │ ├── EditLinkForm │ │ │ │ │ │ └── EditLinkForm.tsx │ │ │ │ │ ├── OverviewAttachments.styles.ts │ │ │ │ │ ├── OverviewAttachments.tsx │ │ │ │ │ ├── SaveFilesForm │ │ │ │ │ │ ├── FileItem │ │ │ │ │ │ │ ├── FileItem.styles.ts │ │ │ │ │ │ │ └── FileItem.tsx │ │ │ │ │ │ └── SaveFilesForm.tsx │ │ │ │ │ └── SaveLinksForm │ │ │ │ │ │ ├── LinkItem │ │ │ │ │ │ └── LinkItem.tsx │ │ │ │ │ │ └── SaveLinksForm.tsx │ │ │ │ ├── OverviewDataQualityReport │ │ │ │ │ ├── OverviewDQSLAReport │ │ │ │ │ │ ├── OverviewDQSLAReport.tsx │ │ │ │ │ │ ├── OverviewDQSLAReportSkeleton │ │ │ │ │ │ │ └── OverviewDQSLAReportSkeleton.tsx │ │ │ │ │ │ └── OverviewDQSLAReportStyles.ts │ │ │ │ │ └── OverviewDQTestReport │ │ │ │ │ │ ├── OverviewDQReportSkeleton │ │ │ │ │ │ ├── OverviewDQReportSkeleton.tsx │ │ │ │ │ │ └── OverviewDQReportSkeletonStyles.ts │ │ │ │ │ │ ├── OverviewDQTestReport.tsx │ │ │ │ │ │ └── OverviewDQTestReportStyles.ts │ │ │ │ ├── OverviewDescription │ │ │ │ │ ├── ExternalDescription │ │ │ │ │ │ ├── ExternalDescription.styles.ts │ │ │ │ │ │ └── ExternalDescription.tsx │ │ │ │ │ ├── InternalDescription │ │ │ │ │ │ ├── InternalDescription.tsx │ │ │ │ │ │ ├── InternalDescriptionEdit │ │ │ │ │ │ │ ├── InternalDescriptionEdit.styles.ts │ │ │ │ │ │ │ └── InternalDescriptionEdit.tsx │ │ │ │ │ │ ├── InternalDescriptionHeader │ │ │ │ │ │ │ ├── InternalDescriptionHeader.styles.ts │ │ │ │ │ │ │ └── InternalDescriptionHeader.tsx │ │ │ │ │ │ └── InternalDescriptionPreview │ │ │ │ │ │ │ └── InternalDescriptionPreview.tsx │ │ │ │ │ ├── OverviewDescription.styles.ts │ │ │ │ │ └── OverviewDescription.tsx │ │ │ │ ├── OverviewExpectations │ │ │ │ │ ├── OverviewExpectations.tsx │ │ │ │ │ └── OverviewExpectationsStyles.ts │ │ │ │ ├── OverviewGeneral │ │ │ │ │ ├── OverviewGeneral.tsx │ │ │ │ │ ├── OverviewGeneralStyles.ts │ │ │ │ │ └── OwnersSection │ │ │ │ │ │ ├── OwnersSection.tsx │ │ │ │ │ │ ├── OwnersSectionStyles.ts │ │ │ │ │ │ ├── OwnershipDeleteForm │ │ │ │ │ │ └── OwnershipDeleteForm.tsx │ │ │ │ │ │ └── OwnershipForm │ │ │ │ │ │ └── OwnershipForm.tsx │ │ │ │ ├── OverviewGroups │ │ │ │ │ ├── AddDataEntityToGroupForm │ │ │ │ │ │ └── AddDataEntityToGroupForm.tsx │ │ │ │ │ ├── GroupItem │ │ │ │ │ │ ├── GroupItem.tsx │ │ │ │ │ │ └── GroupItemStyles.ts │ │ │ │ │ ├── OverviewGroups.tsx │ │ │ │ │ └── OverviewGroupsStyles.ts │ │ │ │ ├── OverviewMetadata │ │ │ │ │ ├── MetadataItem │ │ │ │ │ │ ├── MetadataItem.tsx │ │ │ │ │ │ └── MetadataItemStyles.ts │ │ │ │ │ ├── OverviewMetadata.tsx │ │ │ │ │ └── OverviewMetadataStyles.ts │ │ │ │ ├── OverviewMetrics │ │ │ │ │ ├── OverviewMetrics.tsx │ │ │ │ │ └── OverviewMetricsStyles.ts │ │ │ │ ├── OverviewSkeleton │ │ │ │ │ ├── OverviewSkeleton.tsx │ │ │ │ │ └── OverviewSkeletonStyles.ts │ │ │ │ ├── OverviewStats │ │ │ │ │ ├── OverviewDataConsumerStats │ │ │ │ │ │ └── OverviewDataConsumerStats.tsx │ │ │ │ │ ├── OverviewDataInputStats │ │ │ │ │ │ └── OverviewDataInputStats.tsx │ │ │ │ │ ├── OverviewDatasetStats │ │ │ │ │ │ └── OverviewDatasetStats.tsx │ │ │ │ │ ├── OverviewEntityGroupItems │ │ │ │ │ │ ├── EntityGroupItem │ │ │ │ │ │ │ └── EntityGroupItem.tsx │ │ │ │ │ │ ├── OverviewEntityGroupItems.styles.ts │ │ │ │ │ │ └── OverviewEntityGroupItems.tsx │ │ │ │ │ ├── OverviewEntityGroupStats │ │ │ │ │ │ └── OverviewEntityGroupStats.tsx │ │ │ │ │ ├── OverviewQualityTestStats │ │ │ │ │ │ ├── OverviewQualityTestStats.tsx │ │ │ │ │ │ └── OverviewQualityTestStatsStyles.ts │ │ │ │ │ ├── OverviewRelationshipStats │ │ │ │ │ │ ├── OverviewRelationshipStats.tsx │ │ │ │ │ │ ├── OverviewRelationshipStatsStyles.ts │ │ │ │ │ │ ├── OverviewRelationshipType │ │ │ │ │ │ │ ├── OverviewEntityRelationship.tsx │ │ │ │ │ │ │ └── OverviewGraphRelationship.tsx │ │ │ │ │ │ └── RelationshipKey.tsx │ │ │ │ │ ├── OverviewStats.tsx │ │ │ │ │ └── OverviewTransformerStats │ │ │ │ │ │ ├── OverviewTransformerStats.tsx │ │ │ │ │ │ └── OverviewTransformerStatsStyles.ts │ │ │ │ ├── OverviewStyles.ts │ │ │ │ ├── OverviewTags │ │ │ │ │ ├── OverviewTags.tsx │ │ │ │ │ ├── OverviewTagsStyles.ts │ │ │ │ │ └── TagsEditForm │ │ │ │ │ │ ├── TagsEditForm.tsx │ │ │ │ │ │ ├── TagsEditFormAutocomplete │ │ │ │ │ │ └── TagsEditFormAutocomplete.tsx │ │ │ │ │ │ └── TagsEditFormStyles.ts │ │ │ │ └── OverviewTerms │ │ │ │ │ ├── AssignEntityTermForm │ │ │ │ │ └── AssignEntityTermForm.tsx │ │ │ │ │ ├── OverviewTerms.tsx │ │ │ │ │ ├── OverviewTermsStyles.ts │ │ │ │ │ └── TermItem │ │ │ │ │ ├── TermItem.styles.ts │ │ │ │ │ └── TermItem.tsx │ │ │ ├── QualityTestRunsHistory │ │ │ │ ├── TestRunItem │ │ │ │ │ ├── TestRunItem.tsx │ │ │ │ │ └── TestRunItemStyles.ts │ │ │ │ ├── TestRunSkeletonItem │ │ │ │ │ └── TestRunSkeletonItem.tsx │ │ │ │ ├── TestRunStatusReasonModal │ │ │ │ │ ├── TestRunStatusReasonModal.tsx │ │ │ │ │ └── TestRunStatusReasonModalStyles.ts │ │ │ │ ├── TestRunsHistory.tsx │ │ │ │ └── TestRunsHistoryStyles.ts │ │ │ └── TestReport │ │ │ │ ├── TestReport.tsx │ │ │ │ ├── TestReportDetails │ │ │ │ ├── TestReportDetails.tsx │ │ │ │ ├── TestReportDetailsHistory │ │ │ │ │ ├── TestReportDetailsHistory.tsx │ │ │ │ │ ├── TestReportDetailsHistoryItemSkeleton │ │ │ │ │ │ └── TestReportDetailsHistoryItemSkeleton.tsx │ │ │ │ │ └── TestReportDetailsHistoryStyles.ts │ │ │ │ └── TestReportDetailsOverview │ │ │ │ │ ├── TestReportDetailsOverview.tsx │ │ │ │ │ ├── TestReportDetailsOverviewParametersModal │ │ │ │ │ └── TestReportDetailsOverviewParametersModal.tsx │ │ │ │ │ ├── TestReportDetailsOverviewSkeleton │ │ │ │ │ └── TestReportDetailsOverviewSkeleton.tsx │ │ │ │ │ └── TestReportDetailsOverviewStyles.ts │ │ │ │ ├── TestReportItem │ │ │ │ ├── TestItem │ │ │ │ │ ├── TestItem.tsx │ │ │ │ │ └── TestitemStyles.ts │ │ │ │ ├── TestReportItem.tsx │ │ │ │ ├── TestReportItemSkeleton │ │ │ │ │ └── TestReportItemSkeleton.tsx │ │ │ │ └── TestReportItemStyles.ts │ │ │ │ ├── TestReportSkeleton │ │ │ │ └── TestReportSkeleton.tsx │ │ │ │ └── TestReportStyles.ts │ │ ├── DataModelling │ │ │ ├── DataModelling.tsx │ │ │ ├── DataModellingRoutes.tsx │ │ │ ├── DataModellingTabs.tsx │ │ │ ├── QueryExampleDetails │ │ │ │ ├── QuertExampleDetailsLinkedEntitiesItem.tsx │ │ │ │ ├── QuertExampleDetailsLinkedTermsItem.tsx │ │ │ │ ├── QueryExampleDetailsContainer.tsx │ │ │ │ ├── QueryExampleDetailsContainerActions.tsx │ │ │ │ ├── QueryExampleDetailsLinkedEntities.tsx │ │ │ │ ├── QueryExampleDetailsLinkedTerms.tsx │ │ │ │ ├── QueryExampleDetailsOverview.tsx │ │ │ │ └── QueryExampleDetailsTabs.tsx │ │ │ ├── QueryExampleForm │ │ │ │ └── QueryExampleForm.tsx │ │ │ ├── QueryExampleSearchResults │ │ │ │ ├── QueryExampleSearchResultsSkeletion.tsx │ │ │ │ └── QueryExamplesList.tsx │ │ │ ├── QueryExamples.tsx │ │ │ ├── Relationships.tsx │ │ │ └── Relationships │ │ │ │ ├── RelationshipsListItem.tsx │ │ │ │ ├── RelationshipsSearchInput.tsx │ │ │ │ ├── RelationshipsSkeleton.tsx │ │ │ │ ├── RelationshipsTabs.tsx │ │ │ │ └── RelationshipsTitle.tsx │ │ ├── DataQuality │ │ │ ├── DataQuality.styles.ts │ │ │ ├── DataQuality.tsx │ │ │ ├── DataQualityContent.tsx │ │ │ ├── DataQualityFilters │ │ │ │ ├── DataQualityFilters.tsx │ │ │ │ ├── DataQualityFiltersStyles.ts │ │ │ │ ├── FilterItem │ │ │ │ │ ├── DatasourceFilter.tsx │ │ │ │ │ ├── MultipleFilterItem │ │ │ │ │ │ ├── MultipleFilterItem.tsx │ │ │ │ │ │ ├── MultipleFilterItemAutocomplete │ │ │ │ │ │ │ ├── MultipleFilterItemAutocomplete.tsx │ │ │ │ │ │ │ └── MultipleFilterItemAutocompleteStyles.ts │ │ │ │ │ │ └── SelectedFilterOption │ │ │ │ │ │ │ ├── SelectedFilterOption.tsx │ │ │ │ │ │ │ └── SelectedFilterOptionStyles.ts │ │ │ │ │ ├── NamespaceFilter.tsx │ │ │ │ │ ├── OwnerFIlter.tsx │ │ │ │ │ ├── TagFilter.tsx │ │ │ │ │ └── TitleFilter.tsx │ │ │ │ └── hooks │ │ │ │ │ └── index.ts │ │ │ ├── DataQualityStore │ │ │ │ ├── DataQualityProvider.tsx │ │ │ │ └── DataQualityStore.ts │ │ │ ├── TestResults │ │ │ │ ├── TestCategoryResults.styles.ts │ │ │ │ └── TestCategoryResults.tsx │ │ │ └── interfaces.ts │ │ ├── Directory │ │ │ ├── DataSourceList │ │ │ │ ├── DataSourceList.tsx │ │ │ │ └── DataSourceTable │ │ │ │ │ ├── Table.tsx │ │ │ │ │ └── interfaces.ts │ │ │ ├── Directory │ │ │ │ ├── Directory.tsx │ │ │ │ └── DirectoryItem │ │ │ │ │ ├── DirectoryItem.styles.ts │ │ │ │ │ └── DirectoryItem.tsx │ │ │ ├── DirectoryBreadCrumbs │ │ │ │ └── DirectoryBreadCrumbs.tsx │ │ │ ├── DirectoryRoutes.tsx │ │ │ ├── Entities │ │ │ │ ├── Entities.tsx │ │ │ │ ├── EntitiesList │ │ │ │ │ ├── EntitiesList.tsx │ │ │ │ │ ├── EntityItem │ │ │ │ │ │ └── EntityItem.tsx │ │ │ │ │ └── TableHeader │ │ │ │ │ │ └── TableHeader.tsx │ │ │ │ └── EntitiesTabs │ │ │ │ │ └── EntitiesTabs.tsx │ │ │ └── shared │ │ │ │ └── styles.ts │ │ ├── Management │ │ │ ├── CollectorsList │ │ │ │ ├── CollectorForm │ │ │ │ │ └── CollectorForm.tsx │ │ │ │ ├── CollectorItem │ │ │ │ │ ├── CollectorItem.tsx │ │ │ │ │ ├── CollectorItemStyles.ts │ │ │ │ │ └── CollectorItemToken │ │ │ │ │ │ ├── CollectorItemToken.tsx │ │ │ │ │ │ └── CollectorItemTokenStyles.ts │ │ │ │ ├── CollectorSkeletonItem │ │ │ │ │ └── CollectorSkeletonItem.tsx │ │ │ │ └── CollectorsList.tsx │ │ │ ├── DataSourcesList │ │ │ │ ├── DataSourceForm │ │ │ │ │ └── DataSourceForm.tsx │ │ │ │ ├── DataSourceItem │ │ │ │ │ ├── DataSourceItem.tsx │ │ │ │ │ ├── DataSourceItemStyles.ts │ │ │ │ │ └── DataSourceItemToken │ │ │ │ │ │ ├── DataSourceItemToken.tsx │ │ │ │ │ │ └── DataSourceItemTokenStyles.ts │ │ │ │ ├── DataSourceSkeletonItem │ │ │ │ │ └── DataSourceSkeletonItem.tsx │ │ │ │ └── DataSourcesList.tsx │ │ │ ├── Integrations │ │ │ │ ├── Integration │ │ │ │ │ ├── Integration.tsx │ │ │ │ │ ├── IntegrationContent │ │ │ │ │ │ ├── IntegrationCodeSnippet │ │ │ │ │ │ │ └── IntegrationCodeSnippet.tsx │ │ │ │ │ │ ├── IntegrationCodeSnippetWithForm │ │ │ │ │ │ │ └── IntegrationCodeSnippetWithForm.tsx │ │ │ │ │ │ └── IntegrationContent.tsx │ │ │ │ │ ├── IntegrationHeader │ │ │ │ │ │ └── IntegrationHeader.tsx │ │ │ │ │ ├── IntegrationRoutes │ │ │ │ │ │ └── IntegrationRoutes.tsx │ │ │ │ │ └── IntegrationTabs │ │ │ │ │ │ └── IntegrationTabs.tsx │ │ │ │ ├── IntegrationPreviewList │ │ │ │ │ ├── IntegrationPreviewItem │ │ │ │ │ │ ├── IntegrationPreviewItem.styles.ts │ │ │ │ │ │ └── IntegrationPreviewItem.tsx │ │ │ │ │ └── IntegrationPreviewList.tsx │ │ │ │ └── Integrations.tsx │ │ │ ├── Management.tsx │ │ │ ├── ManagementRoutes │ │ │ │ └── ManagementRoutes.tsx │ │ │ ├── ManagementSkeletonItem │ │ │ │ └── ManagementSkeletonItem.tsx │ │ │ ├── ManagementStyles.ts │ │ │ ├── ManagementTabs │ │ │ │ └── ManagementTabs.tsx │ │ │ ├── NamespaceList │ │ │ │ ├── EditableNamespaceItem │ │ │ │ │ ├── EditableNamespaceItem.tsx │ │ │ │ │ └── EditableNamespaceItemStyles.ts │ │ │ │ ├── NamespaceForm │ │ │ │ │ └── NamespaceForm.tsx │ │ │ │ ├── NamespaceList.tsx │ │ │ │ └── NamespaceListSkeleton │ │ │ │ │ └── NamespaceListSkeleton.tsx │ │ │ ├── OwnerAssociations │ │ │ │ ├── OwnerAssociations.tsx │ │ │ │ ├── OwnerAssociationsHeader │ │ │ │ │ ├── OwnerAssociationForm │ │ │ │ │ │ └── OwnerAssociationForm.tsx │ │ │ │ │ ├── OwnerAssociationsHeader.tsx │ │ │ │ │ └── OwnerAssociationsHeaderStyles.ts │ │ │ │ ├── OwnerAssociationsList │ │ │ │ │ ├── OwnerAssociationsActive │ │ │ │ │ │ ├── ActiveAssociationRequest │ │ │ │ │ │ │ └── ActiveAssociationRequest.tsx │ │ │ │ │ │ └── OwnerAssociationsActive.tsx │ │ │ │ │ ├── OwnerAssociationsNew │ │ │ │ │ │ ├── NewAssociationRequest │ │ │ │ │ │ │ └── NewAssociationRequest.tsx │ │ │ │ │ │ └── OwnerAssociationsNew.tsx │ │ │ │ │ ├── OwnerAssociationsResolved │ │ │ │ │ │ ├── OwnerAssociationsResolved.tsx │ │ │ │ │ │ └── ResolvedAssociationRequest │ │ │ │ │ │ │ ├── RequestStatus │ │ │ │ │ │ │ ├── RequestStatus.tsx │ │ │ │ │ │ │ └── RequestStatusStyles.ts │ │ │ │ │ │ │ └── ResolvedAssociationRequest.tsx │ │ │ │ │ └── OwnerAssociationsSharedStyles.ts │ │ │ │ ├── OwnerAssociationsStore │ │ │ │ │ ├── OwnerAssociationsAtoms.ts │ │ │ │ │ └── OwnerAssociationsProvider.tsx │ │ │ │ └── OwnerAssociationsTabs │ │ │ │ │ └── OwnerAssociationsTabs.tsx │ │ │ ├── OwnersList │ │ │ │ ├── EditableOwnerItem │ │ │ │ │ ├── EditableOwnerItem.tsx │ │ │ │ │ └── EditableOwnerItemStyles.ts │ │ │ │ ├── OwnerForm │ │ │ │ │ └── OwnerForm.tsx │ │ │ │ ├── OwnersList.tsx │ │ │ │ └── OwnersSkeletonItem │ │ │ │ │ └── OwnersSkeletonItem.tsx │ │ │ ├── PolicyList │ │ │ │ ├── PolicyDetails │ │ │ │ │ ├── PolicyDetails.tsx │ │ │ │ │ └── PolicyForm │ │ │ │ │ │ └── PolicyForm.tsx │ │ │ │ ├── PolicyItem │ │ │ │ │ ├── PolicyItem.tsx │ │ │ │ │ └── PolicyItemStyles.ts │ │ │ │ ├── PolicyList.tsx │ │ │ │ ├── PolicyListSkeleton │ │ │ │ │ └── PolicyListSkeleton.tsx │ │ │ │ └── PolicyListStyles.ts │ │ │ ├── RolesList │ │ │ │ ├── RoleForm │ │ │ │ │ └── RoleForm.tsx │ │ │ │ ├── RoleItem │ │ │ │ │ ├── RoleItem.tsx │ │ │ │ │ └── RoleItemStyles.ts │ │ │ │ ├── RoleSkeletonItem │ │ │ │ │ └── RoleSkeletonItem.tsx │ │ │ │ ├── RolesList.tsx │ │ │ │ └── RolesListStyles.ts │ │ │ └── TagsList │ │ │ │ ├── EditableTagItem │ │ │ │ ├── EditableTagItem.tsx │ │ │ │ └── EditableTagItemStyles.ts │ │ │ │ ├── TagCreateForm │ │ │ │ ├── TagCreateForm.tsx │ │ │ │ └── TagCreateFormItem │ │ │ │ │ ├── TagCreateFormItem.tsx │ │ │ │ │ └── TagCreateFormItemStyles.ts │ │ │ │ ├── TagEditForm │ │ │ │ └── TagEditForm.tsx │ │ │ │ ├── TagsList.tsx │ │ │ │ └── TagsSkeletonItem │ │ │ │ └── TagsSkeletonItem.tsx │ │ ├── MasterData │ │ │ ├── LookupTableForm.tsx │ │ │ ├── LookupTables.tsx │ │ │ └── LookupTables │ │ │ │ ├── LookupTablesList.tsx │ │ │ │ ├── LookupTablesListItem.tsx │ │ │ │ └── LookupTablesSkeleton.tsx │ │ ├── Overview │ │ │ ├── DataEntitiesUsageInfo │ │ │ │ ├── DataEntitiesUsageInfo.tsx │ │ │ │ ├── DataEntityUsageInfoView │ │ │ │ │ ├── DataEntitiesUsageInfoView.styles.ts │ │ │ │ │ ├── DataEntitiesUsageInfoView.tsx │ │ │ │ │ ├── DataEntityUsageInfoCard │ │ │ │ │ │ ├── DataEntitiesUsageInfoCard.styles.ts │ │ │ │ │ │ ├── DataEntitiesUsageInfoCard.tsx │ │ │ │ │ │ └── __tests__ │ │ │ │ │ │ │ └── DataEntitiesUsageInfoCard.test.tsx │ │ │ │ │ └── __tests__ │ │ │ │ │ │ └── DataEntitiesUsageInfoView.test.tsx │ │ │ │ └── __tests__ │ │ │ │ │ └── DataEntitiesUsageInfo.test.tsx │ │ │ ├── Directory │ │ │ │ ├── Directory.tsx │ │ │ │ └── DirectoryItem │ │ │ │ │ └── DirectoryItem.tsx │ │ │ ├── Domains │ │ │ │ ├── DomainItem │ │ │ │ │ └── DomainItem.tsx │ │ │ │ └── Domains.tsx │ │ │ ├── Overview.tsx │ │ │ ├── OverviewSkeleton │ │ │ │ └── OverviewSkeleton.tsx │ │ │ ├── OverviewStyles.ts │ │ │ ├── OwnerAssociation │ │ │ │ ├── OwnerAssociation.tsx │ │ │ │ ├── OwnerAssociationForm │ │ │ │ │ ├── OwnerAssociationForm.tsx │ │ │ │ │ └── OwnerAssociationFormStyles.ts │ │ │ │ ├── OwnerAssociationStyles.ts │ │ │ │ └── OwnerEntitiesList │ │ │ │ │ ├── DataEntityList │ │ │ │ │ ├── DataEntityList.tsx │ │ │ │ │ └── DataEntityListStyles.ts │ │ │ │ │ ├── OwnerEntitiesList.tsx │ │ │ │ │ ├── OwnerEntitiesListSkeleton │ │ │ │ │ └── OwnerEntitiesListSkeleton.tsx │ │ │ │ │ └── OwnerEntitiesListStyles.ts │ │ │ ├── TopTagsList │ │ │ │ └── TopTagsList.tsx │ │ │ └── shared │ │ │ │ └── ItemsList.styles.ts │ │ ├── Search │ │ │ ├── Filters │ │ │ │ ├── FilterItem │ │ │ │ │ ├── MultipleFilterItem │ │ │ │ │ │ ├── MultipleFilterItem.tsx │ │ │ │ │ │ └── MultipleFilterItemAutocomplete │ │ │ │ │ │ │ ├── MultipleFilterItemAutocomplete.tsx │ │ │ │ │ │ │ └── MultipleFilterItemAutocompleteStyles.ts │ │ │ │ │ ├── SelectedFilterOption │ │ │ │ │ │ ├── SelectedFilterOption.tsx │ │ │ │ │ │ └── SelectedFilterOptionStyles.ts │ │ │ │ │ └── SingleFilterItem │ │ │ │ │ │ └── SingleFilterItem.tsx │ │ │ │ ├── Filters.tsx │ │ │ │ └── FiltersStyles.ts │ │ │ ├── Results │ │ │ │ ├── ResultItem │ │ │ │ │ ├── ResultItem.tsx │ │ │ │ │ ├── ResultItemStyles.ts │ │ │ │ │ └── SearchHighlights │ │ │ │ │ │ ├── SearchHighlights.tsx │ │ │ │ │ │ └── SearchHighlightsStyles.ts │ │ │ │ ├── Results.styles.ts │ │ │ │ ├── Results.tsx │ │ │ │ ├── SearchResultsSkeleton │ │ │ │ │ └── SearchResultsSkeleton.tsx │ │ │ │ ├── SearchResultsTabs │ │ │ │ │ ├── SearchResultsTabs.tsx │ │ │ │ │ └── SearchTabsSkeleton │ │ │ │ │ │ └── SearchTabsSkeleton.tsx │ │ │ │ └── TableHeader │ │ │ │ │ └── TableHeader.tsx │ │ │ └── Search.tsx │ │ ├── Terms │ │ │ ├── TermDetails │ │ │ │ ├── Overview │ │ │ │ │ ├── Overview.tsx │ │ │ │ │ ├── OverviewGeneral │ │ │ │ │ │ ├── OverviewGeneral.tsx │ │ │ │ │ │ └── OverviewGeneralStyles.ts │ │ │ │ │ ├── OverviewSkeleton │ │ │ │ │ │ ├── OverviewSkeleton.tsx │ │ │ │ │ │ └── OverviewSkeletonStyles.ts │ │ │ │ │ ├── OverviewStyles.ts │ │ │ │ │ ├── OverviewTags │ │ │ │ │ │ ├── OverviewTags.tsx │ │ │ │ │ │ ├── OverviewTagsStyles.ts │ │ │ │ │ │ └── TagsEditForm │ │ │ │ │ │ │ ├── TagsEditForm.tsx │ │ │ │ │ │ │ └── TagsEditFormStyles.ts │ │ │ │ │ ├── TermDefinition │ │ │ │ │ │ ├── TermDefinition.styles.ts │ │ │ │ │ │ └── TermDefinition.tsx │ │ │ │ │ ├── TermLinkedTerms │ │ │ │ │ │ ├── LinkedTermTermForm │ │ │ │ │ │ │ └── LinkedTermTermForm.tsx │ │ │ │ │ │ ├── TermItem │ │ │ │ │ │ │ └── TermItem.tsx │ │ │ │ │ │ └── TermLinkedTerms.tsx │ │ │ │ │ └── TermOverview.styles.ts │ │ │ │ ├── Ownership │ │ │ │ │ └── OwnershipForm.tsx │ │ │ │ ├── TermDetails.tsx │ │ │ │ ├── TermDetailsHeader │ │ │ │ │ └── TermDetailsHeader.tsx │ │ │ │ ├── TermDetailsRoutes │ │ │ │ │ └── TermDetailsRoutes.tsx │ │ │ │ ├── TermDetailsSkeleton │ │ │ │ │ └── TermDetailsSkeleton.tsx │ │ │ │ ├── TermDetailsStyles.ts │ │ │ │ ├── TermDetailsTabs │ │ │ │ │ └── TermDetailsTabs.tsx │ │ │ │ ├── TermLinkedColumnsList │ │ │ │ │ ├── LinkedColumn │ │ │ │ │ │ ├── LinkedColumn.tsx │ │ │ │ │ │ └── LinkedColumnStyles.ts │ │ │ │ │ ├── LinkedColumnsList.tsx │ │ │ │ │ ├── LinkedColumnsListSkeleton │ │ │ │ │ │ ├── LinkedColumnsListSkeleton.tsx │ │ │ │ │ │ └── LinkedColumnsListSkeletonStyles.ts │ │ │ │ │ └── LinkedColumnsListStyles.ts │ │ │ │ ├── TermLinkedEntitiesList │ │ │ │ │ ├── LinkedEntitiesList.tsx │ │ │ │ │ ├── LinkedEntitiesListSkeleton │ │ │ │ │ │ ├── LinkedEntitiesListSkeleton.tsx │ │ │ │ │ │ └── LinkedEntitiesListSkeletonStyles.ts │ │ │ │ │ ├── LinkedEntitiesListStyles.ts │ │ │ │ │ └── LinkedEntity │ │ │ │ │ │ ├── LinkedEntity.tsx │ │ │ │ │ │ └── LinkedEntityStyles.ts │ │ │ │ ├── TermLinkedTermsList │ │ │ │ │ ├── LinkedTerm │ │ │ │ │ │ ├── LinkedTerm.tsx │ │ │ │ │ │ └── LinkedTermStyles.ts │ │ │ │ │ ├── LinkedTermsList.tsx │ │ │ │ │ ├── LinkedTermsListSkeleton │ │ │ │ │ │ ├── LinkedTermsListSkeleton.tsx │ │ │ │ │ │ └── LinkedTermsListSkeletonStyles.ts │ │ │ │ │ └── LinkedTermsListStyles.ts │ │ │ │ └── TermQueryExamples │ │ │ │ │ ├── AssignTermQueryExampleForm.tsx │ │ │ │ │ └── TermQueryExamples.tsx │ │ │ └── TermSearch │ │ │ │ ├── TermForm │ │ │ │ └── TermsForm.tsx │ │ │ │ ├── TermSearch.tsx │ │ │ │ ├── TermSearchFilters │ │ │ │ ├── TermSearchFilterItem │ │ │ │ │ ├── MultipleFilterItem │ │ │ │ │ │ ├── MultipleFilterItem.tsx │ │ │ │ │ │ ├── MultipleFilterItemAutocomplete │ │ │ │ │ │ │ ├── MultipleFilterItemAutocomplete.tsx │ │ │ │ │ │ │ └── MultipleFilterItemAutocompleteStyles.ts │ │ │ │ │ │ └── SelectedFilterOption │ │ │ │ │ │ │ ├── SelectedFilterOption.tsx │ │ │ │ │ │ │ └── SelectedFilterOptionStyles.ts │ │ │ │ │ └── SingleFilterItem │ │ │ │ │ │ └── SingleFilterItem.tsx │ │ │ │ ├── TermSearchFilters.tsx │ │ │ │ └── TermSearchFiltersStyles.ts │ │ │ │ ├── TermSearchHeader │ │ │ │ └── TermSearchHeader.tsx │ │ │ │ ├── TermSearchInput │ │ │ │ └── TermSearchInput.tsx │ │ │ │ └── TermSearchResults │ │ │ │ ├── TermSearchResultItem │ │ │ │ ├── TermSearchResultItem.tsx │ │ │ │ └── TermSearchResultItemStyles.ts │ │ │ │ ├── TermSearchResults.tsx │ │ │ │ ├── TermSearchResultsSkeleton │ │ │ │ ├── TermSearchResultsSkeleton.tsx │ │ │ │ └── TermSearchResultsSkeletonStyles.ts │ │ │ │ └── TermSearchResultsStyles.ts │ │ └── shared │ │ │ ├── contexts │ │ │ ├── Permission │ │ │ │ ├── PermissionContext.ts │ │ │ │ ├── PermissionProvider.tsx │ │ │ │ ├── WithPermissions.tsx │ │ │ │ └── WithPermissionsProvider.tsx │ │ │ └── index.ts │ │ │ ├── elements │ │ │ ├── Activity │ │ │ │ ├── ActivityFields │ │ │ │ │ ├── ActivityFieldHeader │ │ │ │ │ │ ├── ActivityFieldHeader.tsx │ │ │ │ │ │ └── ActivityFieldHeaderStyles.ts │ │ │ │ │ ├── ActivityFieldState │ │ │ │ │ │ ├── ActivityFieldState.tsx │ │ │ │ │ │ └── ActivityFieldStateStyles.ts │ │ │ │ │ ├── AlertActivityField │ │ │ │ │ │ └── AlertActivityField.tsx │ │ │ │ │ ├── ArrayActivityField │ │ │ │ │ │ ├── ArrayActivityField.tsx │ │ │ │ │ │ └── ArrayActivityFieldStyles.ts │ │ │ │ │ ├── CustomGroupActivityField │ │ │ │ │ │ └── CustomGroupActivityField.tsx │ │ │ │ │ ├── DatasetTermActivityField │ │ │ │ │ │ ├── DatasetTermActivityField.styles.ts │ │ │ │ │ │ └── DatasetTermActivityField.tsx │ │ │ │ │ ├── EntityStatusActivityField │ │ │ │ │ │ └── EntityStatusActivityField.tsx │ │ │ │ │ ├── EnumsActivityField │ │ │ │ │ │ ├── EnumsActivityField.tsx │ │ │ │ │ │ └── EnumsActivityFieldStyles.ts │ │ │ │ │ ├── OwnerActivityField │ │ │ │ │ │ ├── OwnerActivityField.tsx │ │ │ │ │ │ └── OwnerWithTitle │ │ │ │ │ │ │ ├── OwnerWithTitle.tsx │ │ │ │ │ │ │ └── OwnerWithTitleStyles.ts │ │ │ │ │ ├── StringActivityField │ │ │ │ │ │ └── StringActivityField.tsx │ │ │ │ │ └── TermActivityField │ │ │ │ │ │ ├── TermActivityField.styles.ts │ │ │ │ │ │ └── TermActivityField.tsx │ │ │ │ ├── ActivityFilterItems │ │ │ │ │ ├── CalendarFilter │ │ │ │ │ │ └── CalendarFilter.tsx │ │ │ │ │ ├── MultipleFilter │ │ │ │ │ │ ├── MultipleFilter.tsx │ │ │ │ │ │ ├── MultipleFilterAutocomplete │ │ │ │ │ │ │ ├── MultipleFilterAutocomplete.tsx │ │ │ │ │ │ │ └── MultipleFilterAutocompleteStyles.ts │ │ │ │ │ │ └── SelectedFilterOption │ │ │ │ │ │ │ ├── SelectedFilterOption.tsx │ │ │ │ │ │ │ └── SelectedFilterOptionStyles.ts │ │ │ │ │ └── SingleFilter │ │ │ │ │ │ └── SingleFilter.tsx │ │ │ │ ├── ActivityResultsItemSkeleton │ │ │ │ │ └── ActivityResultsItemSkeleton.tsx │ │ │ │ ├── ActivityResultsList │ │ │ │ │ ├── ActivityResultsList.tsx │ │ │ │ │ └── ActivityResultsListStyles.ts │ │ │ │ ├── common.ts │ │ │ │ └── index.ts │ │ │ ├── AlertIcon │ │ │ │ └── AlertIcon.tsx │ │ │ ├── AlertStatusItem │ │ │ │ ├── AlertStatusItem.tsx │ │ │ │ └── AlertStatusItemStyles.ts │ │ │ ├── AppAvatar │ │ │ │ ├── AppAvatar.tsx │ │ │ │ └── AppAvatarStyles.ts │ │ │ ├── AppCircularProgress │ │ │ │ ├── AppCircularProgress.tsx │ │ │ │ ├── AppCircularProgressStyles.ts │ │ │ │ └── interfaces.ts │ │ │ ├── AppDatePicker │ │ │ │ └── AppDatePicker.tsx │ │ │ ├── AppDateRangePicker │ │ │ │ ├── AppDateRangePicker.tsx │ │ │ │ ├── AppDateRangePickerFooter │ │ │ │ │ └── AppDateRangePickerFooter.tsx │ │ │ │ ├── AppDateRangePickerStyles.ts │ │ │ │ └── overrides.css │ │ │ ├── AppDateTimePicker │ │ │ │ ├── AppDateTimePicker.tsx │ │ │ │ └── style.overrides.ts │ │ │ ├── AppErrorBlock │ │ │ │ └── AppErrorBlock.tsx │ │ │ ├── AppErrorPage │ │ │ │ └── AppErrorPage.tsx │ │ │ ├── AppJSONEditor │ │ │ │ ├── AppJSONEditor.tsx │ │ │ │ └── AppJSONEditorStyles.css │ │ │ ├── AppLoadingPage │ │ │ │ ├── AppLoadingPage.tsx │ │ │ │ └── AppLoadingPageStyles.ts │ │ │ ├── AppMenu │ │ │ │ ├── AppMenu.tsx │ │ │ │ └── AppMenuStyles.ts │ │ │ ├── AppMenuItem │ │ │ │ ├── AppMenuItem.tsx │ │ │ │ └── AppMenuItemStyles.ts │ │ │ ├── AppPaper │ │ │ │ ├── AppPaper.tsx │ │ │ │ └── AppPaperStyles.tsx │ │ │ ├── AppPopover │ │ │ │ ├── AppPopover.tsx │ │ │ │ └── AppPopoverStyles.ts │ │ │ ├── AppRadio │ │ │ │ ├── AppRadio.tsx │ │ │ │ └── AppRadioStyles.ts │ │ │ ├── AppSelect │ │ │ │ ├── AppSelect.tsx │ │ │ │ └── AppSelectStyles.ts │ │ │ ├── AppSuspenseWrapper │ │ │ │ └── AppSuspenseWrapper.tsx │ │ │ ├── AppSwitch │ │ │ │ ├── AppSwitch.tsx │ │ │ │ └── AppSwitchStyles.ts │ │ │ ├── AppTabs │ │ │ │ ├── AppTab │ │ │ │ │ ├── AppLinkTab.tsx │ │ │ │ │ ├── AppTab.tsx │ │ │ │ │ └── TabStyles.ts │ │ │ │ ├── AppTabLabel │ │ │ │ │ ├── AppTabLabel.tsx │ │ │ │ │ └── AppTabLabelStyles.ts │ │ │ │ ├── AppTabs.tsx │ │ │ │ ├── AppTabsStyles.ts │ │ │ │ ├── interfaces.ts │ │ │ │ └── useSetSelectedTab.ts │ │ │ ├── AppToast │ │ │ │ ├── AppToast.tsx │ │ │ │ └── AppToastStyles.ts │ │ │ ├── AppToolbar │ │ │ │ ├── AppInfoMenu │ │ │ │ │ ├── AppInfoMenu.tsx │ │ │ │ │ └── AppInfoMenuStyles.ts │ │ │ │ ├── AppToolbar.tsx │ │ │ │ ├── AppToolbarStyles.ts │ │ │ │ ├── SelectLanguage │ │ │ │ │ └── SelectLanguage.tsx │ │ │ │ └── ToolbarTabs │ │ │ │ │ └── ToolbarTabs.tsx │ │ │ ├── AppTooltip │ │ │ │ ├── AppTooltip.tsx │ │ │ │ └── AppTooltipStyles.tsx │ │ │ ├── Autocomplete │ │ │ │ ├── DataEntityChannelsAutocomplete │ │ │ │ │ └── DataEntityChannelsAutocomplete.tsx │ │ │ │ ├── NamespaceAutocomplete │ │ │ │ │ └── NamespaceAutocomplete.tsx │ │ │ │ ├── OwnerAutocomplete │ │ │ │ │ └── OwnerAutocomplete.tsx │ │ │ │ ├── OwnerIdAutocomplete │ │ │ │ │ └── OwnerIdAutocomplete.tsx │ │ │ │ ├── OwnerTitleAutocomplete │ │ │ │ │ └── OwnerTitleAutocomplete.tsx │ │ │ │ ├── PolicyAutocomplete │ │ │ │ │ └── PolicyAutocomplete.tsx │ │ │ │ ├── ProviderAutocomplete │ │ │ │ │ └── ProviderAutocomplete.tsx │ │ │ │ ├── RoleAutocomplete │ │ │ │ │ └── RoleAutocomplete.tsx │ │ │ │ ├── SearchSuggestionsAutocomplete │ │ │ │ │ └── SearchSuggestionsAutocomplete.tsx │ │ │ │ ├── SlackChannelsAutocomplete │ │ │ │ │ └── SlackChannelsAutocomplete.tsx │ │ │ │ └── TermsAutocomplete │ │ │ │ │ └── TermsAutocomplete.tsx │ │ │ ├── AutocompleteSuggestion │ │ │ │ ├── AutocompleteSuggestion.tsx │ │ │ │ └── AutocompleteSuggestionStyles.ts │ │ │ ├── BooleanFormatted │ │ │ │ ├── BooleanFormatted.tsx │ │ │ │ └── __tests__ │ │ │ │ │ └── BooleanFormatted.test.tsx │ │ │ ├── BreadCrumbs │ │ │ │ ├── BreadCrumbs.styles.ts │ │ │ │ └── BreadCrumbs.tsx │ │ │ ├── Button │ │ │ │ ├── Button.styles.ts │ │ │ │ ├── Button.tsx │ │ │ │ ├── helpers.ts │ │ │ │ └── interfaces.ts │ │ │ ├── Cell │ │ │ │ └── OwnerRoleCell │ │ │ │ │ └── OwnerRoleCell.tsx │ │ │ ├── Checkbox │ │ │ │ ├── Checkbox.styles.ts │ │ │ │ └── Checkbox.tsx │ │ │ ├── CollapsibleInfoContainer │ │ │ │ ├── CollapsibleInfoContainer.styles.ts │ │ │ │ └── CollapsibleInfoContainer.tsx │ │ │ ├── ConfirmationDialog │ │ │ │ ├── ConfirmationDialog.tsx │ │ │ │ └── ConfirmationDialogStyles.ts │ │ │ ├── CopyButton │ │ │ │ └── CopyButton.tsx │ │ │ ├── DataEntityDetailsPreview │ │ │ │ ├── DataEntityDetailsPreview.styles.ts │ │ │ │ └── DataEntityDetailsPreview.tsx │ │ │ ├── DatasourceLogo │ │ │ │ ├── DatasourceLogo.tsx │ │ │ │ └── helpers.ts │ │ │ ├── DialogWrapper │ │ │ │ ├── DialogWrapper.tsx │ │ │ │ └── DialogWrapperStyles.ts │ │ │ ├── DonutChart │ │ │ │ └── DonutChart.tsx │ │ │ ├── EmptyContentPlaceholder │ │ │ │ └── EmptyContentPlaceholder.tsx │ │ │ ├── EntitiesListModal │ │ │ │ ├── EntitiesListModal.tsx │ │ │ │ └── EntitiesListModalStyles.ts │ │ │ ├── EntityClassItem │ │ │ │ ├── EntityClassItem.styles.ts │ │ │ │ ├── EntityClassItem.tsx │ │ │ │ ├── EntityClassItemStyles.ts │ │ │ │ └── __tests__ │ │ │ │ │ └── EntityClassItem.test.tsx │ │ │ ├── EntityStatus │ │ │ │ ├── DefaultEntityStatus │ │ │ │ │ └── DefaultEntityStatus.tsx │ │ │ │ ├── EntityStatus.styles.ts │ │ │ │ ├── EntityStatus.tsx │ │ │ │ ├── SelectableEntityStatus │ │ │ │ │ └── SelectableEntityStatus.tsx │ │ │ │ └── StatusSettingsForm │ │ │ │ │ ├── Option │ │ │ │ │ ├── Option.styles.ts │ │ │ │ │ └── Option.tsx │ │ │ │ │ └── StatusSettingsForm.tsx │ │ │ ├── EntityTypeItem │ │ │ │ ├── EntityTypeItem.tsx │ │ │ │ └── EntityTypeItemStyles.ts │ │ │ ├── FileInput │ │ │ │ ├── FileInput.styles.ts │ │ │ │ └── FileInput.tsx │ │ │ ├── IconicInfoBadge │ │ │ │ ├── IconicInfoBadge.styles.ts │ │ │ │ └── IconicInfoBadge.tsx │ │ │ ├── InfoItem │ │ │ │ └── InfoItem.tsx │ │ │ ├── Input │ │ │ │ ├── Input.styles.ts │ │ │ │ ├── Input.tsx │ │ │ │ └── interfaces.ts │ │ │ ├── LabelItem │ │ │ │ ├── LabelItem.tsx │ │ │ │ └── LabelItemStyles.ts │ │ │ ├── LabeledInfoItem │ │ │ │ ├── LabeledInfoItem.tsx │ │ │ │ └── LabeledInfoItemStyles.ts │ │ │ ├── ListLayout │ │ │ │ ├── ListLayout.styles.ts │ │ │ │ └── ListLayout.tsx │ │ │ ├── MainSearchInput │ │ │ │ └── MainSearchInput.tsx │ │ │ ├── Markdown │ │ │ │ ├── Markdown.styles.ts │ │ │ │ └── Markdown.tsx │ │ │ ├── MetadataItem │ │ │ │ └── MetadataItem.tsx │ │ │ ├── MetadataStale │ │ │ │ └── MetadataStale.tsx │ │ │ ├── MetricFamily │ │ │ │ └── MetricFamily.tsx │ │ │ ├── NumberFormatted │ │ │ │ ├── NumberFormatted.tsx │ │ │ │ └── __tests__ │ │ │ │ │ └── NumberFormatted.test.tsx │ │ │ ├── QueryExamples │ │ │ │ ├── QueryExamplesAutocomplete.tsx │ │ │ │ ├── QueryExamplesListHeader.tsx │ │ │ │ ├── QueryExamplesListItem.tsx │ │ │ │ ├── QueryExamplesSkeleton.tsx │ │ │ │ ├── QueryExamplesTermUnlinkButton.tsx │ │ │ │ └── QueryExamplesUnlinkButton.tsx │ │ │ ├── Relationships │ │ │ │ ├── RelationshipDatasetInfo.tsx │ │ │ │ ├── RelationshipIcon.tsx │ │ │ │ ├── RelationshipListHeader.tsx │ │ │ │ ├── RelationshipListItem.tsx │ │ │ │ ├── RelationshipSkeleton.tsx │ │ │ │ └── RelationshipTypes │ │ │ │ │ ├── EntityRelationship.tsx │ │ │ │ │ └── GraphRelationship.tsx │ │ │ ├── RestrictedRoute │ │ │ │ └── RestrictedRoute.tsx │ │ │ ├── SearchInput │ │ │ │ └── SearchInput.tsx │ │ │ ├── SkeletonWrapper │ │ │ │ └── SkeletonWrapper.tsx │ │ │ ├── StyledComponents │ │ │ │ ├── PageWithLeftSidebar.ts │ │ │ │ ├── ScrollableContainer.ts │ │ │ │ └── Table.ts │ │ │ ├── TagItem │ │ │ │ ├── TagItem.tsx │ │ │ │ └── TagItemStyles.ts │ │ │ ├── TestRunStatusIcon │ │ │ │ ├── TestRunStatusIcon.tsx │ │ │ │ └── TestRunStatusIconStyles.ts │ │ │ ├── TestRunStatusItem │ │ │ │ ├── TestRunStatusItem.tsx │ │ │ │ └── TestRunStatusItemStyles.ts │ │ │ ├── TestRunStatusReasonModal │ │ │ │ └── TestRunStatusReasonModal.tsx │ │ │ ├── TextFormatted │ │ │ │ ├── TextFormatted.tsx │ │ │ │ └── __tests__ │ │ │ │ │ └── TextFormatted.test.tsx │ │ │ ├── TruncatedCell │ │ │ │ ├── TruncatedCell.tsx │ │ │ │ ├── TruncatedCellMenu │ │ │ │ │ └── TruncatedCellMenu.tsx │ │ │ │ └── TruncatedCellStyles.ts │ │ │ ├── TruncatedList │ │ │ │ └── TruncatedList.tsx │ │ │ ├── TruncatedSVGText │ │ │ │ └── TruncatedSVGText.tsx │ │ │ ├── WithFeature │ │ │ │ └── WithFeature.tsx │ │ │ ├── forms │ │ │ │ ├── AssignTermForm.tsx │ │ │ │ └── ColumnForm.tsx │ │ │ └── index.ts │ │ │ ├── icons │ │ │ ├── AcceptIcon.tsx │ │ │ ├── ActivityCreatedIcon.tsx │ │ │ ├── ActivityDeletedIcon.tsx │ │ │ ├── ActivityUpdatedIcon.tsx │ │ │ ├── AddIcon.tsx │ │ │ ├── AlertAnomalyIcon.tsx │ │ │ ├── AlertDQTestIcon.tsx │ │ │ ├── AlertIcon.tsx │ │ │ ├── AlertJobIcon.tsx │ │ │ ├── AlertSchemaIcon.tsx │ │ │ ├── AppSvgIcon.tsx │ │ │ ├── CalendarIcon.tsx │ │ │ ├── CatalogIcon.tsx │ │ │ ├── ChevronIcon.tsx │ │ │ ├── ClearIcon.tsx │ │ │ ├── CloseIcon.tsx │ │ │ ├── ColumnsIcon.tsx │ │ │ ├── CopyIcon.tsx │ │ │ ├── DeleteIcon.tsx │ │ │ ├── DocumentIcon.tsx │ │ │ ├── DownstreamArrow.tsx │ │ │ ├── DownstreamIcon.tsx │ │ │ ├── DropdownIcon.tsx │ │ │ ├── EditIcon.tsx │ │ │ ├── EmptyIcon.tsx │ │ │ ├── FeedbackIcon.tsx │ │ │ ├── FolderIcon.tsx │ │ │ ├── GearIcon.tsx │ │ │ ├── GitBookIcon.tsx │ │ │ ├── GitHubIcon.tsx │ │ │ ├── ImageIcon.tsx │ │ │ ├── InfoIcon.tsx │ │ │ ├── InformationIcon.tsx │ │ │ ├── IntegratedIcon.tsx │ │ │ ├── KebabIcon.tsx │ │ │ ├── LinkIcon.tsx │ │ │ ├── LinkedTermIcon.tsx │ │ │ ├── LockIcon.tsx │ │ │ ├── MinusIcon.tsx │ │ │ ├── MoreIcon.tsx │ │ │ ├── NoDataIcon.tsx │ │ │ ├── PlusIcon.tsx │ │ │ ├── PreviewIcon.tsx │ │ │ ├── QuestionIcon.tsx │ │ │ ├── RecursiveIcon.tsx │ │ │ ├── RejectIcon.tsx │ │ │ ├── RowsIcon.tsx │ │ │ ├── SearchIcon.tsx │ │ │ ├── SlackIcon.tsx │ │ │ ├── StaleIcon.tsx │ │ │ ├── StarIcon.tsx │ │ │ ├── StrokedInfoIcon.tsx │ │ │ ├── SuccessIcon.tsx │ │ │ ├── SystemIcon.tsx │ │ │ ├── TargetIcon.tsx │ │ │ ├── TimeGapIcon.tsx │ │ │ ├── TriangularUnionIcon.tsx │ │ │ ├── UnlinkIcon.tsx │ │ │ ├── UpstreamArrow.tsx │ │ │ ├── UpstreamIcon.tsx │ │ │ ├── UserIcon.tsx │ │ │ ├── UserSyncIcon.tsx │ │ │ ├── WaitIcon.tsx │ │ │ └── index.ts │ │ │ └── styled-components │ │ │ ├── asterisk.ts │ │ │ ├── container.ts │ │ │ ├── index.ts │ │ │ ├── layout.ts │ │ │ ├── scrollable-container.ts │ │ │ └── section.ts │ ├── index.tsx │ ├── lib │ │ ├── api.ts │ │ ├── constants.ts │ │ ├── errorHandling.tsx │ │ ├── genericContext.ts │ │ ├── helpers.ts │ │ ├── hooks │ │ │ ├── api │ │ │ │ ├── appInfo.ts │ │ │ │ ├── dataEntity.ts │ │ │ │ ├── dataEntityAttachments │ │ │ │ │ ├── dataEntityFiles.ts │ │ │ │ │ └── dataEntityLinks.ts │ │ │ │ ├── dataModelling │ │ │ │ │ ├── queryExamples.ts │ │ │ │ │ ├── relatioships.ts │ │ │ │ │ └── searchQueryExamples.ts │ │ │ │ ├── dataQuality.ts │ │ │ │ ├── datasetApi │ │ │ │ │ ├── datasetApi.ts │ │ │ │ │ └── helpers.ts │ │ │ │ ├── datasetField.ts │ │ │ │ ├── datasource.ts │ │ │ │ ├── directory.ts │ │ │ │ ├── index.ts │ │ │ │ ├── integration.ts │ │ │ │ ├── masterData │ │ │ │ │ ├── lookupTableDefinitions.ts │ │ │ │ │ ├── lookupTableRows.ts │ │ │ │ │ ├── lookupTables.ts │ │ │ │ │ ├── referenceData.ts │ │ │ │ │ └── referenceDataSearch.ts │ │ │ │ ├── namespace.ts │ │ │ │ ├── owner.ts │ │ │ │ ├── ownerAssociationRequest.ts │ │ │ │ ├── permissions.ts │ │ │ │ ├── tag.ts │ │ │ │ ├── tags.ts │ │ │ │ ├── terms.ts │ │ │ │ ├── title.ts │ │ │ │ └── utils.ts │ │ │ ├── index.ts │ │ │ ├── useActivityHeaderIcon.tsx │ │ │ ├── useAppDateTime.ts │ │ │ ├── useCollapse.ts │ │ │ ├── useCreateQueryExampleSearch.ts │ │ │ ├── useCreateSearch.ts │ │ │ ├── useLocalStorage.ts │ │ │ ├── usePermissions.ts │ │ │ ├── usePrevious.ts │ │ │ ├── useQueryParams.ts │ │ │ ├── useScrollBarWidth.ts │ │ │ └── useTermWiki.ts │ │ ├── interfaces │ │ │ ├── dataEntity.ts │ │ │ ├── directory.ts │ │ │ ├── index.ts │ │ │ ├── integration.ts │ │ │ └── shared.ts │ │ └── tests │ │ │ ├── mocks │ │ │ ├── dataEntityMocks.ts │ │ │ └── index.ts │ │ │ └── testHelpers.tsx │ ├── locales │ │ ├── i18n.ts │ │ └── translations │ │ │ ├── ch.json │ │ │ ├── en.json │ │ │ ├── es.json │ │ │ ├── fr.json │ │ │ ├── hy.json │ │ │ └── ua.json │ ├── redux │ │ ├── actions │ │ │ ├── activity.actions.ts │ │ │ ├── alert.actions.ts │ │ │ ├── appInfo.actions.ts │ │ │ ├── collector.actions.ts │ │ │ ├── dataCollaboration.actions.ts │ │ │ ├── dataEntityRun.actions.ts │ │ │ ├── dataQualityTest.actions.ts │ │ │ ├── dataentity.actions.ts │ │ │ ├── dataentityLineage.actions.ts │ │ │ ├── dataentityLinkedList.actions.ts │ │ │ ├── dataentitySearch.actions.ts │ │ │ ├── datasetStructure.actions.ts │ │ │ ├── datasource.actions.ts │ │ │ ├── index.ts │ │ │ ├── metadata.actions.ts │ │ │ ├── namespace.actions.ts │ │ │ ├── owners.actions.ts │ │ │ ├── policy.actions.ts │ │ │ ├── profile.actions.ts │ │ │ ├── roles.actions.ts │ │ │ ├── tags.actions.ts │ │ │ ├── termLinkedList.actions.ts │ │ │ ├── termSearch.actions.ts │ │ │ └── terms.actions.ts │ │ ├── interfaces │ │ │ ├── activities.ts │ │ │ ├── alerts.ts │ │ │ ├── common.ts │ │ │ ├── dataCollaboration.ts │ │ │ ├── dataEntitySearch.ts │ │ │ ├── dataQualityTest.ts │ │ │ ├── dataentities.ts │ │ │ ├── dataentityLineage.ts │ │ │ ├── datasetStructure.ts │ │ │ ├── graph.ts │ │ │ ├── index.ts │ │ │ ├── loader.ts │ │ │ ├── state.ts │ │ │ └── termSearch.ts │ │ ├── lib │ │ │ ├── handleResponseThunk.ts │ │ │ ├── helpers.ts │ │ │ ├── hooks.ts │ │ │ └── unauthenticatedMiddleware.ts │ │ ├── selectors │ │ │ ├── activities.selectors.ts │ │ │ ├── alert.selectors.ts │ │ │ ├── appInfo.selectors.ts │ │ │ ├── collectors.selectors.ts │ │ │ ├── dataCollaboration.selectors.ts │ │ │ ├── dataEntityRun.selector.ts │ │ │ ├── dataQualityTest.selectors.ts │ │ │ ├── dataentity.selectors.ts │ │ │ ├── dataentityLineage.selectors.ts │ │ │ ├── dataentityLinkedList.selectors.ts │ │ │ ├── dataentitySearch.selectors.ts │ │ │ ├── datasetStructure.selectors.ts │ │ │ ├── datasources.selectors.ts │ │ │ ├── index.ts │ │ │ ├── loader-selectors.ts │ │ │ ├── mainContentLoader.selectors.ts │ │ │ ├── metadata.selectors.ts │ │ │ ├── namespace.selectors.ts │ │ │ ├── owners.selectors.ts │ │ │ ├── policies.selectors.ts │ │ │ ├── profile.selectors.ts │ │ │ ├── roles.selectors.ts │ │ │ ├── tags.selectors.ts │ │ │ ├── termLinkedList.selectors.ts │ │ │ ├── termSearch.selectors.ts │ │ │ └── terms.selectors.ts │ │ ├── slices │ │ │ ├── activity.slice.ts │ │ │ ├── alerts.slice.ts │ │ │ ├── appInfo.slice.ts │ │ │ ├── collectors.slice.ts │ │ │ ├── dataCollaboration.slice.ts │ │ │ ├── dataEntityGroupLinkedList.slice.ts │ │ │ ├── dataEntityLineage │ │ │ │ ├── dataEntityLineage.slice.ts │ │ │ │ └── dataEntityLineageHelpers.ts │ │ │ ├── dataEntityRuns.slice.ts │ │ │ ├── dataEntitySearch.slice.ts │ │ │ ├── dataQualityTest.slice.ts │ │ │ ├── dataentities.slice.ts │ │ │ ├── datasetStructure.slice.ts │ │ │ ├── datasources.slice.ts │ │ │ ├── index.ts │ │ │ ├── loader.slice.ts │ │ │ ├── metadata.slice.ts │ │ │ ├── namespace.slice.ts │ │ │ ├── owners.slice.ts │ │ │ ├── policy.slice.ts │ │ │ ├── profile.slice.ts │ │ │ ├── roles.slice.ts │ │ │ ├── tags.slice.ts │ │ │ ├── termLinkedList.slice.ts │ │ │ ├── termSearch.slice.ts │ │ │ └── terms.slice.ts │ │ ├── store │ │ │ └── index.ts │ │ └── thunks │ │ │ ├── activity.thunks.ts │ │ │ ├── alerts.thunks.ts │ │ │ ├── appInfo.thunks.ts │ │ │ ├── collectors.thunks.ts │ │ │ ├── dataCollaboration.thunks.ts │ │ │ ├── dataEntityRun.thunk.ts │ │ │ ├── dataQualityTest.thunks.ts │ │ │ ├── dataentities.thunks.ts │ │ │ ├── dataentitiesSearch.thunks.ts │ │ │ ├── dataentityLineage.thunks.ts │ │ │ ├── dataentityLinkedList.thunks.ts │ │ │ ├── datasetStructure.thunks.ts │ │ │ ├── datasources.thunks.ts │ │ │ ├── index.ts │ │ │ ├── metadata.thunks.ts │ │ │ ├── namespace.thunks.ts │ │ │ ├── owners.thunks.ts │ │ │ ├── permissions.thunks.ts │ │ │ ├── policy.thunks.ts │ │ │ ├── profile.thunks.ts │ │ │ ├── roles.thunks.ts │ │ │ ├── tags.thunks.ts │ │ │ ├── termLinkedList.thunks.ts │ │ │ ├── termSearch.thunks.ts │ │ │ └── terms.thunks.ts │ ├── routes │ │ ├── activityRoutes.ts │ │ ├── alertsRoutes.ts │ │ ├── dataEntitiesRoutes.ts │ │ ├── dataModelling │ │ │ ├── dataModelling.ts │ │ │ ├── index.ts │ │ │ ├── queryExamplesRoutes.ts │ │ │ └── relationshipsRoutes.ts │ │ ├── dataQualityRoutes.ts │ │ ├── directoryRoutes.ts │ │ ├── index.ts │ │ ├── managementRoutes.ts │ │ ├── masterDataRoutes.ts │ │ ├── searchRoutes.ts │ │ └── termsRoutes.ts │ ├── setupTests.ts │ ├── theme │ │ ├── breakpoints.ts │ │ ├── interfaces.ts │ │ ├── mui.theme.ts │ │ ├── overrides.ts │ │ ├── palette.ts │ │ ├── shadows.ts │ │ └── typography.ts │ └── vite-env.d.ts ├── tsconfig.json └── vite.config.ts ├── settings.gradle └── tests ├── .eslintignore ├── .eslintrc.js ├── .husky ├── .gitignore └── pre-commit ├── .nvmrc ├── .prettierignore ├── .prettierrc.json ├── .vscode └── settings.json ├── README.md ├── api ├── api-base.ts ├── app-service.ts ├── auth.ts ├── helpers │ └── api-status-check.ts ├── interfaces │ └── my-profile.ts ├── login-service.ts └── pilot.ts ├── common-utilities ├── array-utils.ts ├── common-utils.ts ├── error-handler.ts ├── interfaces │ └── shared.ts ├── load-document.ts └── object-util.ts ├── config ├── configuration.ts ├── custom.d.ts ├── environments.json ├── test-base.ts ├── test-name-utils.ts └── users.json ├── docker ├── .env ├── docker-compose.yaml ├── injector │ ├── datasources │ │ └── datasources.json │ └── samples │ │ ├── 01_etl_aqa.json │ │ ├── 02_oracle_fl_aqa.json │ │ ├── 03_oracle_ingestion_aqa.json │ │ └── 04_airflow_ingestion_aqa.json └── up-platform.sh ├── envs └── .env ├── features ├── activity │ └── activity.spec.ts ├── filters │ └── filters.spec.ts ├── owners │ └── add-owner.spec.ts ├── search │ ├── search.spec.ts │ └── search_in_data_entity.spec.ts └── tags │ ├── add-tag.spec.ts │ ├── change-tag.spec.ts │ └── delete-tag.spec.ts ├── hooks └── global-setup.ts ├── package-lock.json ├── package.json ├── playwright.config.ts ├── tsconfig.eslint.json ├── tsconfig.json └── ui ├── elements ├── button.ts ├── checkbox.ts ├── context-menu.ts ├── custom-element.ts ├── dropdown.ts ├── file-chooser.ts ├── input-field.ts ├── list.ts ├── radio.ts ├── table.ts ├── text-box.ts └── toggle.ts ├── pages ├── activity │ └── activity.page.ts ├── base-page.ts ├── catalog │ └── catalog.page.ts ├── data_entity │ ├── data_entity.page.ts │ ├── overview.page.ts │ └── structure.ts ├── index.ts ├── login-page.ts ├── main │ └── main-page.ts ├── management │ ├── collectors-page.ts │ ├── datasources-page.ts │ ├── labels-page.ts │ ├── management-page.ts │ ├── namespaces-page.ts │ ├── owners-page.ts │ └── tags-page.ts ├── modals │ ├── add-owner-modal.ts │ ├── add-tag-modal.ts │ ├── base-modal.ts │ ├── delete-tag-modal.ts │ ├── edit-tag-modal.ts │ └── index.ts └── shared │ └── top-panel.ts ├── steps ├── base-step.ts ├── go-to-steps.ts ├── index.ts └── login.ts └── utils └── common-utils.ts /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @opendatadiscovery/maintainers 2 | 3 | # BACKEND 4 | /*.gradle @opendatadiscovery/backend 5 | 6 | /odd-platform-api-contract/ @opendatadiscovery/backend 7 | /odd-platform-api/ @opendatadiscovery/backend 8 | /odd-platform-specification/ @opendatadiscovery/backend 9 | 10 | /dev/ @opendatadiscovery/backend 11 | 12 | # FRONTEND 13 | /odd-platform-ui/ @opendatadiscovery/frontend 14 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/config.yml: -------------------------------------------------------------------------------- 1 | blank_issues_enabled: false 2 | contact_links: 3 | - name: Official documentation 4 | url: https://docs.opendatadiscovery.org 5 | about: Before reaching out for support, please refer to our documentation. 6 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | **What changes did you make?** (Give an overview) 2 | 3 | **Is there anything you'd like reviewers to focus on?** 4 | 5 | **How to test** -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | build/ 2 | out/ 3 | target/ 4 | venv/ 5 | .idea 6 | Thumbs.db 7 | .DS_Store 8 | .gradle 9 | .fleet 10 | *.iml 11 | *.ipr 12 | *.iws 13 | .project 14 | .settings 15 | .classpath 16 | *.code-workspace 17 | __pycache__/ 18 | *.py[cod] 19 | *$py.class 20 | node_modules/ 21 | /tests/test-results/ 22 | /tests/playwright-report/ 23 | /tests/dist/ 24 | /playwright/.cache/ 25 | .tool-versions 26 | .vscode -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | .idea 2 | dist 3 | envs 4 | node_modules 5 | reports 6 | **/generated/**/*.ts 7 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 120, 3 | "tabWidth": 2, 4 | "useTabs": false, 5 | "semi": true, 6 | "singleQuote": true, 7 | "quoteProps": "as-needed", 8 | "jsxSingleQuote": false, 9 | "trailingComma": "all", 10 | "bracketSpacing": true, 11 | "jsxBracketSameLine": true, 12 | "arrowParens": "avoid", 13 | "endOfLine": "auto" 14 | } -------------------------------------------------------------------------------- /buildSrc/build.gradle: -------------------------------------------------------------------------------- 1 | plugins { 2 | id 'groovy-gradle-plugin' 3 | } 4 | 5 | repositories { 6 | mavenCentral() 7 | } 8 | 9 | dependencies { 10 | implementation libs.bundles.jooq.codegen 11 | } 12 | 13 | gradlePlugin { 14 | plugins { 15 | GeneratorPlugin { 16 | id = "org.opendatadiscovery.internal.plugin.jooq-generate" 17 | implementationClass = "org.opendatadiscovery.internal.plugin.JooqGeneratePlugin" 18 | } 19 | } 20 | } -------------------------------------------------------------------------------- /buildSrc/settings.gradle: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | versionCatalogs { 3 | create("libs") { 4 | from(files("../gradle/libs.versions.toml")) 5 | } 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /buildSrc/src/main/groovy/org/opendatadiscovery/internal/plugin/Constants.groovy: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.internal.plugin 2 | 3 | class Constants { 4 | static final String EXTENSION_NAME = "jooqGenerate" 5 | static final String TASK_NAME = "jooqDockerGenerate" 6 | static final String CONFIGURATION_NAME = "jooqGenerationContainer" 7 | } 8 | -------------------------------------------------------------------------------- /config/checkstyle/suppressions.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docker/.env: -------------------------------------------------------------------------------- 1 | POSTGRES_USER=odd-platform 2 | POSTGRES_PASSWORD=odd-platform-password 3 | POSTGRES_DATABASE=odd-platform 4 | 5 | PLATFORM_HOST_URL=http://odd-platform:8080 6 | 7 | SAMPLE_POSTGRES_USER=sample_odd_platform 8 | SAMPLE_POSTGRES_PASSWORD=sample_odd_platform_password 9 | SAMPLE_POSTGRES_DATABASE=sample_odd_platform -------------------------------------------------------------------------------- /docker/config/collector_config.yaml: -------------------------------------------------------------------------------- 1 | 2 | default_pulling_interval: 1 3 | token: "" 4 | plugins: 5 | - type: postgresql 6 | name: postgresql-step2-test 7 | host: !ENV ${SAMPLE_POSTGRES_HOST} 8 | port: 5432 9 | database: !ENV ${SAMPLE_POSTGRES_DATABASE} 10 | user: !ENV ${SAMPLE_POSTGRES_USER} 11 | password: !ENV ${SAMPLE_POSTGRES_PASSWORD} -------------------------------------------------------------------------------- /docker/examples/.env: -------------------------------------------------------------------------------- 1 | POSTGRES_USER=odd-platform 2 | POSTGRES_PASSWORD=odd-platform-password 3 | POSTGRES_DATABASE=odd-platform 4 | -------------------------------------------------------------------------------- /docker/examples/config/alert_rules.yaml: -------------------------------------------------------------------------------- 1 | groups: 2 | - name: test.alert 3 | rules: 4 | - alert: TestAlert 5 | expr: oddplatform_dataset_field_max_length > 0 -------------------------------------------------------------------------------- /docker/examples/config/alertmanager.yaml: -------------------------------------------------------------------------------- 1 | route: 2 | group_by: [ 'job' ] 3 | group_wait: 1s 4 | group_interval: 5m 5 | repeat_interval: 12h 6 | receiver: webhook 7 | routes: 8 | - receiver: webhook 9 | continue: true 10 | receivers: 11 | - name: webhook 12 | webhook_configs: 13 | - url: 'http://odd-platform:8080/ingestion/alert/alertmanager' -------------------------------------------------------------------------------- /docker/examples/config/otel_collector.yaml: -------------------------------------------------------------------------------- 1 | receivers: 2 | otlp: 3 | protocols: 4 | grpc: 5 | 6 | exporters: 7 | logging: 8 | loglevel: debug 9 | prometheusremotewrite: 10 | endpoint: "${PRW_ENDPOINT}" 11 | insecure: true 12 | 13 | extensions: 14 | zpages: 15 | endpoint: 0.0.0.0:55679 16 | 17 | service: 18 | extensions: [ zpages ] 19 | pipelines: 20 | metrics: 21 | receivers: [ otlp ] 22 | exporters: [ prometheusremotewrite ] -------------------------------------------------------------------------------- /docker/examples/config/prometheus.yaml: -------------------------------------------------------------------------------- 1 | global: 2 | scrape_interval: 15s 3 | evaluation_interval: 15s 4 | 5 | rule_files: 6 | - /etc/prometheus/alert_rules.yaml 7 | alerting: 8 | alertmanagers: 9 | - static_configs: 10 | - targets: 11 | - 'alertmanager:9093' 12 | 13 | scrape_configs: [ ] -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | org.gradle.parallel=true -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /images/amazon-athena-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/amazon-athena-logo.png -------------------------------------------------------------------------------- /images/amazon-glue-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/amazon-glue-logo.jpg -------------------------------------------------------------------------------- /images/amazon-redshift-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/amazon-redshift-logo.jpg -------------------------------------------------------------------------------- /images/amazon-sagemaker-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/amazon-sagemaker-logo.jpg -------------------------------------------------------------------------------- /images/apache-airflow-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/apache-airflow-logo.jpg -------------------------------------------------------------------------------- /images/apache-kafka-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/apache-kafka-logo.jpg -------------------------------------------------------------------------------- /images/apache-spark-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/apache-spark-logo.png -------------------------------------------------------------------------------- /images/bigquery-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/bigquery-logo.png -------------------------------------------------------------------------------- /images/cassandra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/cassandra.png -------------------------------------------------------------------------------- /images/clickhouse-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/clickhouse-logo.png -------------------------------------------------------------------------------- /images/dbt-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/dbt-logo.jpg -------------------------------------------------------------------------------- /images/dvc-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/dvc-logo.jpg -------------------------------------------------------------------------------- /images/dynamodb-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/dynamodb-logo.png -------------------------------------------------------------------------------- /images/elasticsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/elasticsearch.png -------------------------------------------------------------------------------- /images/feast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/feast.png -------------------------------------------------------------------------------- /images/great-expectations-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/great-expectations-logo.jpg -------------------------------------------------------------------------------- /images/hive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/hive.png -------------------------------------------------------------------------------- /images/kinesis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/kinesis.png -------------------------------------------------------------------------------- /images/kubeflow-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/kubeflow-logo.jpg -------------------------------------------------------------------------------- /images/mongodb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/mongodb.png -------------------------------------------------------------------------------- /images/mssql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/mssql.png -------------------------------------------------------------------------------- /images/mysql-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/mysql-logo.jpg -------------------------------------------------------------------------------- /images/neo4j.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/neo4j.png -------------------------------------------------------------------------------- /images/odbc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/odbc.png -------------------------------------------------------------------------------- /images/odd-data-catalog-ui.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/odd-data-catalog-ui.jpg -------------------------------------------------------------------------------- /images/open-data-discovery-platform-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/open-data-discovery-platform-logo.png -------------------------------------------------------------------------------- /images/open-data-discovery-platform-odd-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/open-data-discovery-platform-odd-logo.png -------------------------------------------------------------------------------- /images/oracle-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/oracle-logo.jpg -------------------------------------------------------------------------------- /images/postgresql-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/postgresql-logo.jpg -------------------------------------------------------------------------------- /images/quicksight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/quicksight.png -------------------------------------------------------------------------------- /images/s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/s3.png -------------------------------------------------------------------------------- /images/sagemaker-featurestore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/sagemaker-featurestore.png -------------------------------------------------------------------------------- /images/sagemaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/sagemaker.png -------------------------------------------------------------------------------- /images/snowflake-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/snowflake-logo.jpg -------------------------------------------------------------------------------- /images/sqs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/sqs.png -------------------------------------------------------------------------------- /images/tableau-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/tableau-logo.png -------------------------------------------------------------------------------- /images/tarantool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/tarantool.png -------------------------------------------------------------------------------- /images/trino-og.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/images/trino-og.png -------------------------------------------------------------------------------- /injector/start.sh: -------------------------------------------------------------------------------- 1 | pip install requests 2 | python ./injector/inject.py -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/auth/Provider.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.auth; 2 | 3 | public enum Provider { 4 | COGNITO, GITHUB, GOOGLE, ODD_IAM, AZURE 5 | } 6 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/auth/manager/AuthorizationManagerType.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.auth.manager; 2 | 3 | public enum AuthorizationManagerType { 4 | NO_CONTEXT, 5 | DATA_ENTITY, 6 | DATASET_FIELD, 7 | TERM, 8 | QUERY_EXAMPLE, 9 | LOOKUP_TABLE, 10 | LOOKUP_TABLE_DEFINITION, 11 | LOOKUP_TABLE_DATA, 12 | ALERT, 13 | DEG 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/auth/session/SessionConstants.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.auth.session; 2 | 3 | public class SessionConstants { 4 | public static String COLLECTOR_ID_SESSION_KEY = "collectorId"; 5 | } 6 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/auth/util/SecurityRule.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.auth.util; 2 | 3 | import org.opendatadiscovery.oddplatform.auth.manager.AuthorizationManagerType; 4 | import org.opendatadiscovery.oddplatform.dto.policy.PolicyPermissionDto; 5 | import org.springframework.security.web.server.util.matcher.ServerWebExchangeMatcher; 6 | 7 | public record SecurityRule(AuthorizationManagerType type, ServerWebExchangeMatcher matcher, 8 | PolicyPermissionDto permission) { 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/config/AdditionalLinkConfiguration.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.config; 2 | 3 | import org.opendatadiscovery.oddplatform.config.properties.AdditionalLinkProperties; 4 | import org.springframework.boot.context.properties.EnableConfigurationProperties; 5 | import org.springframework.context.annotation.Configuration; 6 | 7 | @Configuration 8 | @EnableConfigurationProperties(AdditionalLinkProperties.class) 9 | public class AdditionalLinkConfiguration { 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/config/properties/AdditionalLinkProperties.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.config.properties; 2 | 3 | import java.util.List; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | 6 | @ConfigurationProperties("odd") 7 | public record AdditionalLinkProperties(List links) { 8 | public record Link(String title, String url) { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/config/properties/GenAIProperties.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.config.properties; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | 6 | @ConfigurationProperties("genai") 7 | @Data 8 | public class GenAIProperties { 9 | private boolean enabled; 10 | private String url; 11 | private int requestTimeout; 12 | } 13 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/config/properties/MetricExporterProperties.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.config.properties; 2 | 3 | import java.net.URI; 4 | import lombok.Data; 5 | import org.springframework.boot.context.properties.ConfigurationProperties; 6 | 7 | @ConfigurationProperties("metrics.export") 8 | @Data 9 | public class MetricExporterProperties { 10 | private URI otlpEndpoint; 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageChannelDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | import lombok.Builder; 4 | 5 | @Builder 6 | public record MessageChannelDto(String id, String name) { 7 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageEventDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MessagePojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MessageProviderEventPojo; 5 | 6 | public record MessageEventDto(MessageProviderEventPojo event, MessagePojo parentMessage) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageEventPayload.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | import lombok.Builder; 4 | 5 | @Builder 6 | public record MessageEventPayload(String messageId, String messageText, String messageAuthor) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageEventRequest.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | import lombok.Builder; 4 | 5 | @Builder 6 | public record MessageEventRequest(Object event, 7 | MessageProviderDto provider, 8 | MessageEventActionDto action) { 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageEventStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | import lombok.Getter; 4 | 5 | public enum MessageEventStateDto { 6 | PENDING(1), 7 | PROCESSING_FAILED(2); 8 | @Getter 9 | private final short code; 10 | 11 | MessageEventStateDto(final int code) { 12 | this.code = ((short) code); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageProviderDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | public enum MessageProviderDto { 4 | SLACK 5 | } 6 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageProviderIdentity.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | import lombok.Builder; 4 | 5 | @Builder 6 | public record MessageProviderIdentity(String providerMessageChannel, 7 | String providerMessageId, 8 | MessageProviderDto messageProvider) { 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/dto/MessageUserDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.dto; 2 | 3 | import lombok.Builder; 4 | 5 | @Builder 6 | public record MessageUserDto(String id, String name, String userAvatar) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/exception/DataCollaborationMessageSenderException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.exception; 2 | 3 | public class DataCollaborationMessageSenderException extends RuntimeException { 4 | public DataCollaborationMessageSenderException(final Throwable cause) { 5 | super(cause); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/exception/SlackAPIException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.exception; 2 | 3 | public class SlackAPIException extends RuntimeException { 4 | public SlackAPIException(final String message) { 5 | super(message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/service/MessageProviderClientFactory.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.service; 2 | 3 | import org.opendatadiscovery.oddplatform.datacollaboration.dto.MessageProviderDto; 4 | 5 | public interface MessageProviderClientFactory { 6 | MessageProviderClient getOrFail(final MessageProviderDto messageProvider); 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/datacollaboration/service/MessageProviderEventHandlerFactory.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.datacollaboration.service; 2 | 3 | import org.opendatadiscovery.oddplatform.datacollaboration.dto.MessageProviderDto; 4 | 5 | public interface MessageProviderEventHandlerFactory { 6 | MessageProviderEventHandler getOrFail(final MessageProviderDto messageProvider); 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/AssociatedOwnerDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.OwnerPojo; 4 | 5 | public record AssociatedOwnerDto(String username, 6 | OwnerPojo owner, 7 | OwnerAssociationRequestDto lastRequestDto) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/CollectorDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.CollectorPojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.NamespacePojo; 5 | 6 | public record CollectorDto(CollectorPojo collectorPojo, NamespacePojo namespace, TokenDto tokenDto) { 7 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataEntityDomainInfoDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DataEntityPojo; 4 | 5 | public record DataEntityDomainInfoDto(DataEntityPojo domain, long childrenCount) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataEntityDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DataEntityPojo; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | @Builder 13 | public class DataEntityDto { 14 | protected DataEntityPojo dataEntity; 15 | protected boolean hasAlerts; 16 | } 17 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataEntityFilledField.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | public enum DataEntityFilledField { 4 | INTERNAL_NAME, 5 | INTERNAL_DESCRIPTION, 6 | INTERNAL_METADATA, 7 | OWNERS, 8 | CUSTOM_GROUP, 9 | INTERNAL_TAGS, 10 | TERMS, 11 | DATASET_FIELD_DESCRIPTION, 12 | DATASET_FIELD_TAGS, 13 | DATASET_FIELD_ENUMS, 14 | DATASET_FIELD_TERMS, 15 | DATASET_FIELD_INTERNAL_NAME, 16 | MANUALLY_CREATED 17 | } 18 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataEntityGroupItemDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | public record DataEntityGroupItemDto(String oddrn, boolean isUpperGroup) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataEntityHighlightDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | public class DataEntityHighlightDto { 4 | private String externalName; 5 | private String internalName; 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataEntitySpecificAttributesDelta.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import java.util.Set; 4 | 5 | public record DataEntitySpecificAttributesDelta(String oddrn, 6 | Set entityClasses, 7 | String oldAttrsJson, 8 | String newAttrsJson) { 9 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataEntityTotalDelta.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import java.util.Map; 4 | 5 | public record DataEntityTotalDelta(Long totalDelta, 6 | Map> entityDelta) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DataSourceDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DataSourcePojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.NamespacePojo; 5 | 6 | public record DataSourceDto(DataSourcePojo dataSource, NamespacePojo namespace, TokenDto token) { 7 | public DataSourceDto(final DataSourcePojo dataSource, final TokenDto token) { 8 | this(dataSource, null, token); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DatasetFieldWithTagsDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import java.util.Set; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DatasetFieldPojo; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TagPojo; 6 | 7 | public record DatasetFieldWithTagsDto(DatasetFieldPojo datasetFieldPojo, Set tags) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/DatasetStructureDelta.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import java.util.List; 4 | import lombok.Data; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DatasetFieldPojo; 6 | 7 | @Data 8 | public class DatasetStructureDelta { 9 | private final List penultimate; 10 | private final List latest; 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/EnumValueDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import java.util.List; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.EnumValuePojo; 5 | 6 | public record EnumValueDto(String fieldOddrn, long fieldId, List enumValues) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/FileDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.springframework.core.io.Resource; 4 | 5 | public record FileDto(Resource resource, String fileName) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/LookupTableColumnDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.LookupTablesDefinitionsPojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.LookupTablesPojo; 5 | 6 | public record LookupTableColumnDto(LookupTablesPojo tablesPojo, 7 | LookupTablesDefinitionsPojo columnPojo) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/MessageDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import lombok.Builder; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MessagePojo; 5 | 6 | @Builder 7 | public record MessageDto(MessagePojo message, long childrenMessagesCount) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/OwnerAssociationRequestActivityDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.OwnerAssociationRequestActivityPojo; 4 | 5 | public record OwnerAssociationRequestActivityDto(OwnerAssociationRequestActivityPojo activityPojo, 6 | OwnerAssociationRequestDto associationRequestDto) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/OwnerAssociationRequestActivityType.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | public enum OwnerAssociationRequestActivityType { 4 | REQUEST_CREATED, 5 | REQUEST_DECLINED, 6 | REQUEST_APPROVED, 7 | REQUEST_MANUALLY_APPROVED, 8 | REQUEST_MANUALLY_DECLINED 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/OwnershipPair.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public record OwnershipPair(@JsonProperty("owner_name") String ownerName, 6 | @JsonProperty("title_name") String titleName) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/ReferenceTableDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | import lombok.Setter; 6 | import org.opendatadiscovery.oddplatform.model.tables.pojos.NamespacePojo; 7 | 8 | @Getter 9 | @Setter 10 | @Builder 11 | public class ReferenceTableDto { 12 | private String name; 13 | private String tableName; 14 | private String tableDescription; 15 | private NamespacePojo namespacePojo; 16 | } 17 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/RelationshipTypeDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | public enum RelationshipTypeDto { 4 | ERD, 5 | GRAPH 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/RoleDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import java.util.Collection; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.PolicyPojo; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.RolePojo; 6 | 7 | public record RoleDto(RolePojo pojo, Collection policies) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/SLA.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | public enum SLA { 4 | RED, 5 | YELLOW, 6 | GREEN 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/SearchFilterDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @AllArgsConstructor 10 | @NoArgsConstructor 11 | @Builder 12 | public class SearchFilterDto { 13 | private long entityId; 14 | private String entityName; 15 | private boolean selected; 16 | private FacetType type; 17 | } 18 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/SearchFilterId.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | 7 | @Data 8 | @Builder 9 | @AllArgsConstructor 10 | public class SearchFilterId { 11 | private final long entityId; 12 | private final String name; 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/TagDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TagPojo; 4 | 5 | public record TagDto(TagPojo tagPojo, Long usedCount, Boolean external) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/TagOrigin.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | public enum TagOrigin { 4 | INTERNAL, 5 | EXTERNAL, 6 | EXTERNAL_STATISTICS 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/TestStatusWithSeverityDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.DataQualityTestSeverity; 4 | import org.opendatadiscovery.oddplatform.ingestion.contract.model.QualityRunStatus; 5 | 6 | public record TestStatusWithSeverityDto(QualityRunStatus status, 7 | DataQualityTestSeverity severity) { 8 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/TokenDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TokenPojo; 4 | 5 | public record TokenDto(TokenPojo tokenPojo, boolean showToken) { 6 | public TokenDto(final TokenPojo pojo) { 7 | this(pojo, false); 8 | } 9 | 10 | public static TokenDto visibleToken(final TokenPojo token) { 11 | return new TokenDto(token, true); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/ActivityContextInfo.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Builder 7 | @Getter 8 | public class ActivityContextInfo { 9 | private final Long dataEntityId; 10 | private final String oldState; 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/ActivityCreateEvent.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | 6 | @Builder 7 | @Getter 8 | public class ActivityCreateEvent { 9 | private long dataEntityId; 10 | private ActivityEventTypeDto eventType; 11 | private String oldState; 12 | private String newState; 13 | private boolean systemEvent; 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/ActivityDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.ActivityPojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DataEntityPojo; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.OwnerPojo; 6 | 7 | public record ActivityDto(ActivityPojo activity, OwnerPojo user, DataEntityPojo dataEntity) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/AlertStatusUpdatedActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.alert.AlertStatusEnum; 4 | import org.opendatadiscovery.oddplatform.dto.alert.AlertTypeEnum; 5 | 6 | public record AlertStatusUpdatedActivityStateDto(AlertStatusEnum status, AlertTypeEnum type) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/BusinessNameActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public record BusinessNameActivityStateDto(@JsonProperty("internal_name") String internalName) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/DataEntityStatusUpdatedDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | import java.time.LocalDateTime; 5 | 6 | public record DataEntityStatusUpdatedDto(String status, 7 | @JsonProperty("status_switch_time") LocalDateTime statusSwitchTime) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/DatasetFieldEnumValuesActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | public record DatasetFieldEnumValuesActivityStateDto(Long id, String name) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/DatasetFieldTagActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | public record DatasetFieldTagActivityStateDto(Long id, String name) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/DatasetFieldTermsActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import java.util.List; 4 | import org.jooq.JSONB; 5 | 6 | public record DatasetFieldTermsActivityStateDto(Long id, String name, JSONB type, 7 | List terms) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/DatasetFieldValuesActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | import java.util.List; 5 | import org.jooq.JSONB; 6 | 7 | public record DatasetFieldValuesActivityStateDto( 8 | Long id, 9 | String name, 10 | JSONB type, 11 | String description, 12 | @JsonProperty("enum_values") List enumValues) { 13 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/DescriptionActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | public record DescriptionActivityStateDto(String description) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/OwnershipActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public record OwnershipActivityStateDto(@JsonProperty("owner_name") String ownerName, 6 | @JsonProperty("title_name") String titleName) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/TagActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | public record TagActivityStateDto(Long id, String name, Boolean important) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/activity/TermActivityStateDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.activity; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public record TermActivityStateDto(@JsonProperty("term_id") Long termId, String term, String namespace, 6 | @JsonProperty("is_description_link") Boolean isDescriptionLink) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/alert/ExternalAlert.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.alert; 2 | 3 | import java.net.URI; 4 | import java.time.LocalDateTime; 5 | import java.util.Map; 6 | import lombok.Data; 7 | import lombok.NoArgsConstructor; 8 | 9 | @Data 10 | @NoArgsConstructor 11 | public class ExternalAlert { 12 | private Map labels; 13 | private URI generatorURL; 14 | private LocalDateTime startsAt; 15 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/attributes/LinkedUrlAttribute.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.attributes; 2 | 3 | public record LinkedUrlAttribute(String name, String url) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/dataset/DatasetVersionFields.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.dataset; 2 | 3 | import java.util.Set; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DatasetFieldPojo; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DatasetVersionPojo; 6 | 7 | public record DatasetVersionFields(DatasetVersionPojo versionPojo, Set fields) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/lineage/DataEntityGroupLineageDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.lineage; 2 | 3 | import java.util.List; 4 | 5 | public record DataEntityGroupLineageDto(List lineageItems) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/lineage/LineageNodeDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.lineage; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.DataEntityDimensionsDto; 4 | 5 | public record LineageNodeDto(DataEntityDimensionsDto entity, Integer childrenCount, Integer parentsCount) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/lineage/LineageStreamKind.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.lineage; 2 | 3 | public enum LineageStreamKind { 4 | UPSTREAM, 5 | DOWNSTREAM 6 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metadata/DatasetFieldMetadataDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metadata; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.DatasetFieldMetadataValuePojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetadataFieldPojo; 5 | 6 | public record DatasetFieldMetadataDto(MetadataFieldPojo metadataField, DatasetFieldMetadataValuePojo value) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metadata/MetadataBinding.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metadata; 2 | 3 | public record MetadataBinding(long entityId, long metadataFieldId) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metadata/MetadataDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metadata; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetadataFieldPojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetadataFieldValuePojo; 5 | 6 | public record MetadataDto(MetadataFieldPojo metadataField, MetadataFieldValuePojo metadataFieldValue) { } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metadata/MetadataInfo.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metadata; 2 | 3 | public record MetadataInfo(MetadataKey key, Long referenceId, Object value) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metadata/MetadataOrigin.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metadata; 2 | 3 | public enum MetadataOrigin { 4 | INTERNAL, 5 | EXTERNAL 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metadata/MetadataTypeEnum.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metadata; 2 | 3 | public enum MetadataTypeEnum { 4 | INTEGER, 5 | FLOAT, 6 | ARRAY, 7 | STRING, 8 | BOOLEAN, 9 | DATETIME, 10 | JSON, 11 | UNKNOWN 12 | } 13 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metric/ExternalMetricLastValueDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metric; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.ExternalMetricLastValuePojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetricFamilyPojo; 5 | 6 | public record ExternalMetricLastValueDto(ExternalMetricLastValuePojo pojo, 7 | MetricFamilyPojo familyPojo) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metric/MetricLabelValueDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metric; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetricLabelPojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetricLabelValuePojo; 5 | 6 | public record MetricLabelValueDto(MetricLabelValuePojo labelValue, MetricLabelPojo label) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metric/MetricSeriesDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metric; 2 | 3 | import java.util.List; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetricPointPojo; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetricSeriesPojo; 6 | 7 | public record MetricSeriesDto(MetricSeriesPojo series, 8 | List points) { 9 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metric/MetricSeriesValueType.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metric; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @RequiredArgsConstructor 7 | @Getter 8 | public enum MetricSeriesValueType { 9 | VALUE(1, ""), 10 | COUNT(2, "_count"), 11 | SUM(3, "_sum"), 12 | CREATED(4, "_created"), 13 | BUCKET(5, "_bucket"), 14 | QUANTILE(6, "_quantile"); 15 | 16 | private final int code; 17 | private final String suffix; 18 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metric/prometheus/PrometheusData.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metric.prometheus; 2 | 3 | import java.util.List; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | @Data 8 | @NoArgsConstructor 9 | public class PrometheusData { 10 | private String resultType; 11 | private List result; 12 | } 13 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metric/prometheus/PrometheusMetric.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metric.prometheus; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | @Data 9 | @NoArgsConstructor 10 | public class PrometheusMetric { 11 | private Map metric; 12 | private List value; 13 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/metric/prometheus/PrometheusResponse.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.metric.prometheus; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | 6 | @Data 7 | @NoArgsConstructor 8 | public class PrometheusResponse { 9 | private String status; 10 | private PrometheusData data; 11 | private String errorType; 12 | private String error; 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/policy/PolicyDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.policy; 2 | 3 | import java.util.List; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class PolicyDto { 8 | private List statements; 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/policy/PolicyResourceDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.policy; 2 | 3 | import lombok.Data; 4 | 5 | @Data 6 | public class PolicyResourceDto { 7 | private PolicyTypeDto type; 8 | private PolicyConditionDto conditions; 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/policy/PolicyStatementDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.policy; 2 | 3 | import java.util.List; 4 | import lombok.Data; 5 | 6 | @Data 7 | public class PolicyStatementDto { 8 | private PolicyResourceDto resource; 9 | private List permissions; 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/policy/PolicyTypeDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.policy; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @RequiredArgsConstructor 7 | @Getter 8 | public enum PolicyTypeDto { 9 | DATA_ENTITY(true), 10 | TERM(true), 11 | QUERY_EXAMPLE(true), 12 | MANAGEMENT(false); 13 | 14 | private final boolean hasContext; 15 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/policy/QueryExamplePolicyResolverContext.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.policy; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.QueryExampleDto; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.OwnerPojo; 5 | 6 | public record QueryExamplePolicyResolverContext(QueryExampleDto detailsDto, OwnerPojo currentOwner) { 7 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/policy/TermPolicyResolverContext.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.policy; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.term.TermDetailsDto; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.OwnerPojo; 5 | 6 | public record TermPolicyResolverContext(TermDetailsDto detailsDto, OwnerPojo currentOwner) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/security/UserDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.security; 2 | 3 | public record UserDto(String username, String provider) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/security/UserProviderRole.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.security; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Getter 7 | @RequiredArgsConstructor 8 | public enum UserProviderRole { 9 | ADMIN("Administrator"), 10 | USER("User"); 11 | 12 | private final String value; 13 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/term/DescriptionParsedTerms.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.term; 2 | 3 | import java.util.List; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TermPojo; 5 | 6 | public record DescriptionParsedTerms(List foundTerms, List unknownTerms) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/term/LinkedTermDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.term; 2 | 3 | public record LinkedTermDto(TermRefDto term, boolean isDescriptionLink) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/term/TermBaseInfoDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.term; 2 | 3 | public record TermBaseInfoDto(String namespaceName, String name) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/term/TermOwnershipDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.term; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.OwnerPojo; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TermOwnershipPojo; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TitlePojo; 6 | 7 | public record TermOwnershipDto(TermOwnershipPojo pojo, OwnerPojo owner, TitlePojo title) { 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/dto/term/TermRefDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.dto.term; 2 | 3 | import lombok.Builder; 4 | import lombok.Getter; 5 | import org.opendatadiscovery.oddplatform.model.tables.pojos.NamespacePojo; 6 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TermPojo; 7 | 8 | @Builder 9 | @Getter 10 | public class TermRefDto { 11 | private final TermPojo term; 12 | private final NamespacePojo namespace; 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/BadUserRequestException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | public class BadUserRequestException extends ExceptionWithErrorCode { 4 | public BadUserRequestException(final String message, final Object... args) { 5 | super(ErrorCode.BAD_REQUEST, String.format(message, args)); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/CascadeDeleteException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | public class CascadeDeleteException extends ExceptionWithErrorCode { 4 | public CascadeDeleteException(final String message) { 5 | super(ErrorCode.CASCADE_DELETE, message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/DatabaseException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | public class DatabaseException extends ExceptionWithErrorCode { 4 | public DatabaseException() { 5 | super(ErrorCode.DATABASE_EXCEPTION, "Unexpected database exception"); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/ExceptionWithErrorCode.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | import lombok.Getter; 4 | 5 | @Getter 6 | public class ExceptionWithErrorCode extends RuntimeException { 7 | protected final ErrorCode code; 8 | 9 | public ExceptionWithErrorCode(final ErrorCode errorCode, final String message) { 10 | super(message); 11 | this.code = errorCode; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/GenAIException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | public class GenAIException extends ExceptionWithErrorCode { 4 | 5 | public GenAIException(final String message) { 6 | super(ErrorCode.SERVER_EXCEPTION, message); 7 | } 8 | 9 | public GenAIException(final Throwable e) { 10 | super(ErrorCode.SERVER_EXCEPTION, e.getMessage()); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/MinioException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | public class MinioException extends RuntimeException { 4 | 5 | public MinioException(final Throwable cause) { 6 | super(cause); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/PrometheusException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | public class PrometheusException extends RuntimeException { 4 | 5 | public PrometheusException(final Throwable e) { 6 | super(e); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/exception/UniqueConstraintException.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.exception; 2 | 3 | public class UniqueConstraintException extends ExceptionWithErrorCode { 4 | public UniqueConstraintException(final String message) { 5 | super(ErrorCode.UNIQUE_CONSTRAINT, message); 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/housekeeping/config/HousekeepingTTLProperties.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.housekeeping.config; 2 | 3 | import lombok.Data; 4 | import org.springframework.boot.context.properties.ConfigurationProperties; 5 | 6 | @ConfigurationProperties("housekeeping.ttl") 7 | @Data 8 | public class HousekeepingTTLProperties { 9 | private int resolvedAlertsDays; 10 | private int searchFacetsDays; 11 | private int dataEntityDeleteDays; 12 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/housekeeping/job/HousekeepingJob.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.housekeeping.job; 2 | 3 | import java.sql.Connection; 4 | 5 | public interface HousekeepingJob { 6 | void doHousekeeping(final Connection connection); 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/integration/dto/IntegrationCodeSnippetArgumentDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.integration.dto; 2 | 3 | public record IntegrationCodeSnippetArgumentDto(String parameter, 4 | String name, 5 | IntegrationCodeSnippetArgumentTypeEnum type, 6 | Boolean isStatic) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/integration/dto/IntegrationCodeSnippetArgumentTypeEnum.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.integration.dto; 2 | 3 | public enum IntegrationCodeSnippetArgumentTypeEnum { 4 | INTEGER, 5 | STRING, 6 | BOOLEAN, 7 | FLOAT 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/integration/dto/IntegrationCodeSnippetDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.integration.dto; 2 | 3 | import java.util.List; 4 | 5 | public record IntegrationCodeSnippetDto(String template, List arguments) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/integration/dto/IntegrationContentBlockDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.integration.dto; 2 | 3 | import java.util.List; 4 | 5 | public record IntegrationContentBlockDto(String title, String content, List codeSnippets) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/integration/dto/IntegrationPreviewDto.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.integration.dto; 2 | 3 | public record IntegrationPreviewDto(String id, String name, String description) { 4 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/integration/service/IntegrationService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.integration.service; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.Integration; 4 | import org.opendatadiscovery.oddplatform.api.contract.model.IntegrationPreviewList; 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface IntegrationService { 8 | Mono get(final String id); 9 | 10 | Mono listPreviews(); 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/DatasetFieldListMapper.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.mapper; 2 | 3 | import java.util.List; 4 | import org.opendatadiscovery.oddplatform.api.contract.model.DatasetFieldList; 5 | import org.opendatadiscovery.oddplatform.dto.DatasetFieldTermsDto; 6 | 7 | public interface DatasetFieldListMapper { 8 | DatasetFieldList mapPojos(List item); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/MapperConfig.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.mapper; 2 | 3 | import org.mapstruct.InjectionStrategy; 4 | import org.mapstruct.MappingConstants; 5 | import org.mapstruct.ReportingPolicy; 6 | 7 | @org.mapstruct.MapperConfig( 8 | componentModel = MappingConstants.ComponentModel.SPRING, 9 | unmappedTargetPolicy = ReportingPolicy.IGNORE, 10 | injectionStrategy = InjectionStrategy.CONSTRUCTOR 11 | ) 12 | public interface MapperConfig { 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/ingestion/DatasetERDRelationIngestionMapper.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.mapper.ingestion; 2 | 3 | import org.opendatadiscovery.oddplatform.ingestion.contract.model.ERDRelationship; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.ErdRelationshipDetailsPojo; 5 | 6 | public interface DatasetERDRelationIngestionMapper { 7 | ErdRelationshipDetailsPojo mapERDRelation(ERDRelationship field); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/mapper/ingestion/DatasetGraphRelationIngestionMapper.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.mapper.ingestion; 2 | 3 | import org.opendatadiscovery.oddplatform.ingestion.contract.model.GraphRelationship; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.GraphRelationshipPojo; 5 | 6 | public interface DatasetGraphRelationIngestionMapper { 7 | GraphRelationshipPojo mapGraphRelation(final GraphRelationship field); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/notification/dto/NotificationMessage.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.notification.dto; 2 | 3 | public abstract class NotificationMessage { 4 | } 5 | 6 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/notification/processor/PostgresWALMessageProcessor.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.notification.processor; 2 | 3 | import org.opendatadiscovery.oddplatform.notification.dto.DecodedWALMessage; 4 | 5 | public interface PostgresWALMessageProcessor { 6 | void process(final DecodedWALMessage message) throws InterruptedException; 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/notification/processor/message/MrkdwnUtils.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.notification.processor.message; 2 | 3 | import lombok.experimental.UtilityClass; 4 | 5 | @UtilityClass 6 | public class MrkdwnUtils { 7 | public static String bold(final String text) { 8 | return String.format("*%s*", text); 9 | } 10 | 11 | public static String buildLink(final String text, final String url) { 12 | return String.format("<%s|%s>", url, text); 13 | } 14 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/notification/sender/NotificationSender.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.notification.sender; 2 | 3 | import org.opendatadiscovery.oddplatform.notification.dto.NotificationMessage; 4 | import org.opendatadiscovery.oddplatform.notification.exception.NotificationSenderException; 5 | 6 | public interface NotificationSender { 7 | void send(final T message) throws InterruptedException, NotificationSenderException; 8 | 9 | String receiverId(); 10 | } -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/notification/translator/NotificationMessageTranslator.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.notification.translator; 2 | 3 | import org.opendatadiscovery.oddplatform.notification.dto.DecodedWALMessage; 4 | import org.opendatadiscovery.oddplatform.notification.dto.NotificationMessage; 5 | 6 | public interface NotificationMessageTranslator { 7 | T translate(final DecodedWALMessage message); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/partition/manager/TablePartition.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.partition.manager; 2 | 3 | import java.time.LocalDate; 4 | 5 | public record TablePartition(LocalDate beginDate, LocalDate endDate) { 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/metric/MetricEntityRepository.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.metric; 2 | 3 | import java.util.Set; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetricEntityPojo; 5 | import reactor.core.publisher.Flux; 6 | 7 | public interface MetricEntityRepository { 8 | Flux registerMetricEntityOddrns(final Set oddrns); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/metric/MetricLabelRepository.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.metric; 2 | 3 | import java.util.List; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.MetricLabelPojo; 5 | import reactor.core.publisher.Flux; 6 | 7 | public interface MetricLabelRepository { 8 | Flux getOrCreateMetricLabels(final List metricLabels); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/LinkRepository.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.reactive; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.LinkPojo; 4 | import reactor.core.publisher.Flux; 5 | 6 | public interface LinkRepository extends ReactiveCRUDRepository { 7 | Flux getDataEntityLinks(final long dataEntityId); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveNamespaceRepository.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.reactive; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.NamespacePojo; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface ReactiveNamespaceRepository extends ReactiveCRUDRepository { 7 | Mono getByName(final String name); 8 | 9 | Mono createByName(final String name); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactivePolicyRepository.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.reactive; 2 | 3 | import java.util.List; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.PolicyPojo; 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface ReactivePolicyRepository extends ReactiveCRUDRepository { 8 | Mono> getRolesPolicies(final List roleIds); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveTitleRepository.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.reactive; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TitlePojo; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface ReactiveTitleRepository extends ReactiveCRUDRepository { 7 | 8 | Mono getByName(final String name); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/reactive/ReactiveTokenRepository.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.reactive; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.TokenDto; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TokenPojo; 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface ReactiveTokenRepository { 8 | Mono create(final TokenPojo tokenPojo); 9 | 10 | Mono updateToken(final TokenPojo tokenPojo); 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/util/FTSEntity.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.util; 2 | 3 | public enum FTSEntity { 4 | DATA_ENTITY, 5 | TERM, 6 | QUERY_EXAMPLE, 7 | LOOKUP_TABLES 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/repository/util/OrderByField.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.repository.util; 2 | 3 | import org.jooq.Field; 4 | import org.jooq.SortOrder; 5 | 6 | public record OrderByField(Field orderField, SortOrder sortOrder) { 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/AlertHaltConfigService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.DataEntityAlertConfig; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface AlertHaltConfigService { 7 | Mono getAlertHaltConfig(final long dataEntityId); 8 | 9 | Mono saveAlertHaltConfig(final long dataEntityId, final DataEntityAlertConfig config); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataEntityRelationsService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import java.util.List; 4 | import org.opendatadiscovery.oddplatform.dto.lineage.LineageStreamKind; 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface DataEntityRelationsService { 8 | Mono> getDependentDataEntityOddrns(final LineageStreamKind streamKind); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/DataSourceIngestionService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.ingestion.contract.model.DataSource; 4 | import org.opendatadiscovery.oddplatform.ingestion.contract.model.DataSourceList; 5 | import reactor.core.publisher.Flux; 6 | 7 | public interface DataSourceIngestionService { 8 | Flux createDataSources(final long collectorId, final DataSourceList dataSourceList); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/IdentityService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.AssociatedOwner; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface IdentityService { 7 | Mono whoami(); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/MetricReader.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.MetricSet; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface MetricReader { 7 | Mono getLatestMetricsForOddrn(final String oddrn); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/MetricService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.MetricSet; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface MetricService { 7 | Mono getLatestMetricsForDataEntity(final long dataEntityId); 8 | 9 | Mono getLatestMetricsForDatasetField(final long datasetFieldId); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/SLAResourceResolver.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.SLA; 4 | import org.springframework.core.io.Resource; 5 | 6 | public interface SLAResourceResolver { 7 | Resource resolve(final SLA sla); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/TitleService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.TitleList; 4 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TitlePojo; 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface TitleService { 8 | Mono getOrCreate(final String name); 9 | 10 | Mono list(final int page, final int size, final String query); 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/TokenGenerator.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service; 2 | 3 | import org.opendatadiscovery.oddplatform.model.tables.pojos.TokenPojo; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface TokenGenerator { 7 | Mono generateToken(); 8 | 9 | Mono regenerateToken(final TokenPojo tokenPojo); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/activity/ActivityParameter.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.activity; 2 | 3 | import java.lang.annotation.ElementType; 4 | import java.lang.annotation.Retention; 5 | import java.lang.annotation.RetentionPolicy; 6 | import java.lang.annotation.Target; 7 | 8 | @Target({ElementType.PARAMETER}) 9 | @Retention(RetentionPolicy.RUNTIME) 10 | public @interface ActivityParameter { 11 | 12 | String value() default ""; 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/attachment/FilePathConstructor.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.attachment; 2 | 3 | import java.nio.file.Path; 4 | 5 | public interface FilePathConstructor { 6 | Path getFileDirectory(final long dataEntityId); 7 | 8 | String getFilePath(final String fileName, final long dataEntityId); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/genai/GenAIService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.genai; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.GenAIRequest; 4 | import org.opendatadiscovery.oddplatform.api.contract.model.GenAIResponse; 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface GenAIService { 8 | Mono getResponseFromGenAI(final GenAIRequest item); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/ingestion/DatasetFieldMetadataIngestionService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.ingestion; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.ingestion.IngestionRequest; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface DatasetFieldMetadataIngestionService { 7 | Mono ingestMetadata(final IngestionRequest dataStructure); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/ingestion/EnumValuesIngestionService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.ingestion; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.ingestion.IngestionRequest; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface EnumValuesIngestionService { 7 | Mono ingestEnumValues(final IngestionRequest request); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/ingestion/alert/AlertBISCandidate.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.ingestion.alert; 2 | 3 | public record AlertBISCandidate(String dataEntityOddrn, String description) { 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/ingestion/metric/IngestionMetricsService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.ingestion.metric; 2 | 3 | import org.opendatadiscovery.oddplatform.ingestion.contract.model.MetricSetList; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface IngestionMetricsService { 7 | Mono ingestMetrics(final MetricSetList metricSetList); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/ingestion/processor/IngestionProcessingPhase.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.ingestion.processor; 2 | 3 | import lombok.Getter; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @RequiredArgsConstructor 7 | public enum IngestionProcessingPhase { 8 | INITIAL(1), 9 | MAIN(2), 10 | FINALIZING(3); 11 | 12 | @Getter 13 | private final int order; 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/metric/OTLPMetricService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.metric; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.ingestion.IngestionRequest; 4 | import reactor.core.publisher.Mono; 5 | 6 | public interface OTLPMetricService { 7 | Mono exportMetrics(final IngestionRequest dataStructure); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/permission/extractor/ContextualPermissionExtractor.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.permission.extractor; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.Permission; 4 | import reactor.core.publisher.Flux; 5 | 6 | public interface ContextualPermissionExtractor extends PermissionExtractor { 7 | Flux getContextualResourcePermissions(final long resourceId); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/permission/extractor/NoContextPermissionExtractor.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.permission.extractor; 2 | 3 | import org.opendatadiscovery.oddplatform.api.contract.model.Permission; 4 | import reactor.core.publisher.Flux; 5 | 6 | public interface NoContextPermissionExtractor extends PermissionExtractor { 7 | Flux getNonContextualPermissions(); 8 | } 9 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/permission/extractor/PermissionExtractor.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.permission.extractor; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.policy.PolicyTypeDto; 4 | 5 | public interface PermissionExtractor { 6 | PolicyTypeDto getResourceType(); 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/policy/comparer/Comparer.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.policy.comparer; 2 | 3 | public interface Comparer { 4 | boolean match(final String value, final T context); 5 | 6 | boolean equals(final String value, final T context); 7 | 8 | boolean is(final T context); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/policy/resolver/ConditionResolver.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.policy.resolver; 2 | 3 | import org.opendatadiscovery.oddplatform.dto.policy.PolicyConditionDto; 4 | 5 | public interface ConditionResolver { 6 | boolean resolve(final PolicyConditionDto condition, final T context); 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/service/search/DataEntityHighlightService.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.service.search; 2 | 3 | import java.util.UUID; 4 | import org.opendatadiscovery.oddplatform.api.contract.model.DataEntitySearchHighlight; 5 | import reactor.core.publisher.Mono; 6 | 7 | public interface DataEntityHighlightService { 8 | Mono highlightDataEntity(final UUID searchId, final long dataEntityId); 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/utils/MappingUtils.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.utils; 2 | 3 | import java.util.function.Function; 4 | 5 | public class MappingUtils { 6 | public static S extractFieldFromNullableObject(final T object, final Function mapper) { 7 | if (object == null) { 8 | return null; 9 | } 10 | return mapper.apply(object); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/utils/OperationUtils.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.utils; 2 | 3 | import java.util.Collection; 4 | 5 | public final class OperationUtils { 6 | 7 | public static boolean containsIgnoreCase(final Collection collection, 8 | final String element) { 9 | return collection.stream().anyMatch(element::equalsIgnoreCase); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/utils/Page.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.utils; 2 | 3 | import java.util.List; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.RequiredArgsConstructor; 7 | 8 | @Data 9 | @RequiredArgsConstructor 10 | @Builder 11 | public class Page { 12 | private final List data; 13 | private final long total; 14 | private final boolean hasNext; 15 | } 16 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/utils/Pair.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.utils; 2 | 3 | import lombok.Data; 4 | import lombok.RequiredArgsConstructor; 5 | 6 | @Data 7 | @RequiredArgsConstructor 8 | public final class Pair { 9 | private final L left; 10 | private final R right; 11 | 12 | public static Pair of(final L left, final R right) { 13 | return new Pair<>(left, right); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/java/org/opendatadiscovery/oddplatform/utils/lookup/validators/LookupTypesValidator.java: -------------------------------------------------------------------------------- 1 | package org.opendatadiscovery.oddplatform.utils.lookup.validators; 2 | 3 | import org.jooq.DataType; 4 | 5 | public interface LookupTypesValidator { 6 | 7 | String ERROR_MESSAGE = "Provided value %s does not belongs to %s"; 8 | 9 | DataType getDataTypeWithDefaultValue(final String defaultValue, final String columnName); 10 | 11 | Object getValue(final String value, final String columnName); 12 | } 13 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/bootstrap.yml: -------------------------------------------------------------------------------- 1 | aws: 2 | paramstore: 3 | prefix: /odd 4 | enabled: false 5 | profileSeparator: "_" 6 | name: platform_config 7 | secretsmanager: 8 | enabled: false -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_10__add_counters.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE data_entity 2 | ADD COLUMN IF NOT EXISTS view_count bigint DEFAULT 0; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_11__add_namespace_support.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE data_source 2 | ADD COLUMN namespace_id BIGINT REFERENCES namespace (id); 3 | 4 | ALTER TABLE data_entity 5 | DROP COLUMN namespace_id; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_13__add_alert_messenger_oddrn.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE alert 2 | ADD COLUMN messenger_entity_oddrn varchar(255) -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_15__drop_dataset_revisions.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE dataset_revision; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_16__add_datasetfield_oddrn_index.sql: -------------------------------------------------------------------------------- 1 | CREATE INDEX dataset_field_oddrn_index ON dataset_field (oddrn); -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_18__pull_push_data_sources.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE data_source 2 | DROP CONSTRAINT data_source_name_key, 3 | DROP CONSTRAINT data_source_oddrn_key, 4 | ALTER COLUMN active SET NOT NULL, 5 | ALTER COLUMN active SET DEFAULT false; 6 | 7 | UPDATE data_source 8 | SET connection_url = NULL 9 | WHERE active = false; 10 | 11 | UPDATE data_source 12 | SET oddrn = '//oddplatform/datasources/' || data_source.id 13 | WHERE active = true; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_19__add_microservice_subtype.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO data_entity_subtype (name) VALUES ('MICROSERVICE'); 2 | 3 | INSERT INTO type_subtype_relation (type_id, subtype_id) 4 | VALUES (2, 13) -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_20__api_call_support.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO data_entity_subtype (name) 2 | VALUES ('API_CALL'); 3 | 4 | INSERT INTO type_subtype_relation (type_id, subtype_id) 5 | VALUES ( 6 | (SELECT id FROM data_entity_type WHERE name = 'DATA_INPUT'), 7 | (SELECT id FROM data_entity_subtype WHERE name = 'API_CALL') 8 | ) -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_27__add_status_updated_by_to_alerts.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE alert 2 | ADD COLUMN IF NOT EXISTS status_updated_by varchar; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_2__add_lineage.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS lineage 2 | ( 3 | parent_oddrn varchar(512), 4 | child_oddrn varchar(512), 5 | 6 | CONSTRAINT lineage_pk PRIMARY KEY (parent_oddrn, child_oddrn) 7 | ); 8 | 9 | ALTER TABLE data_entity 10 | ADD hollow BOOLEAN NOT NULL DEFAULT FALSE; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_30__rename_type_and_subtype.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE data_entity 2 | RENAME COLUMN subtype_id TO type_id; 3 | ALTER TABLE data_entity 4 | RENAME COLUMN type_ids TO entity_class_ids; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_32__remove_oddrn_from_collector.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE collector 2 | DROP COLUMN IF EXISTS oddrn; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_33__add_token_constraints.sql: -------------------------------------------------------------------------------- 1 | CREATE UNIQUE INDEX IF NOT EXISTS collector_token_unique ON collector (token_id) WHERE deleted_at IS NULL; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_34__add_collector_to_data_source.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE data_source 2 | ADD COLUMN IF NOT EXISTS collector_id BIGINT REFERENCES collector (id); -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_37__update_view_count.sql: -------------------------------------------------------------------------------- 1 | UPDATE data_entity 2 | SET view_count = 0 3 | WHERE view_count IS NULL; 4 | 5 | ALTER TABLE data_entity 6 | ALTER COLUMN view_count SET NOT NULL; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_38__add_deleted_at_to_label.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE label 2 | ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL; 3 | 4 | ALTER TABLE label 5 | DROP CONSTRAINT IF EXISTS label_name_key; 6 | 7 | UPDATE label 8 | SET deleted_at = NOW() 9 | WHERE deleted_at IS NULL 10 | AND is_deleted = true; 11 | 12 | CREATE UNIQUE INDEX IF NOT EXISTS label_unique ON label (name) WHERE deleted_at IS NULL; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_40__add_deleted_at_enum_value.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE enum_value 2 | ADD COLUMN IF NOT EXISTS deleted_at TIMESTAMP WITHOUT TIME ZONE DEFAULT NULL; 3 | 4 | UPDATE enum_value 5 | SET deleted_at = NOW() 6 | WHERE deleted_at IS NULL 7 | AND is_deleted = true; 8 | 9 | ALTER TABLE enum_value 10 | DROP CONSTRAINT IF EXISTS enum_value_name_dataset_field_id_key; 11 | 12 | CREATE UNIQUE INDEX IF NOT EXISTS enum_value_unique ON enum_value (name, dataset_field_id) WHERE deleted_at IS NULL; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_42__additional_indexes_to_dq_test_tables.sql: -------------------------------------------------------------------------------- 1 | CREATE INDEX IF NOT EXISTS data_entity_task_run_data_entity_oddrn_idx 2 | ON data_entity_task_run (data_entity_oddrn); 3 | 4 | CREATE INDEX IF NOT EXISTS data_entity_task_run_end_time_idx 5 | ON data_entity_task_run (end_time); 6 | 7 | UPDATE data_entity_task_run 8 | SET status = 'RUNNING' 9 | WHERE status IS NULL 10 | OR status = ''; 11 | 12 | ALTER TABLE data_entity_task_run 13 | ALTER COLUMN status SET NOT NULL; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_44__dataqatest_severity.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS data_quality_test_severity 2 | ( 3 | data_quality_test_id BIGINT REFERENCES data_entity(id), 4 | dataset_id BIGINT REFERENCES data_entity(id), 5 | severity VARCHAR(8), 6 | 7 | CONSTRAINT data_quality_test_severity_pk PRIMARY KEY (data_quality_test_id, dataset_id) 8 | ); -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_46__primary_and_sort_key_for_dataset_field.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE dataset_field 2 | ADD COLUMN is_primary_key BOOLEAN NOT NULL DEFAULT FALSE, 3 | ADD COLUMN is_sort_key BOOLEAN NOT NULL DEFAULT FALSE; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_47__add_tag_external_attribute.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE tag_to_data_entity 2 | ADD COLUMN IF NOT EXISTS external BOOLEAN NOT NULL DEFAULT FALSE; 3 | 4 | ALTER TABLE label_to_dataset_field 5 | ADD COLUMN IF NOT EXISTS external BOOLEAN NOT NULL DEFAULT FALSE; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_4__add_user_owner_mapping.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE IF NOT EXISTS user_owner_mapping 2 | ( 3 | owner_id bigint UNIQUE, 4 | oidc_username varchar(512) UNIQUE, 5 | 6 | CONSTRAINT user_owner_mapping_fk_owner FOREIGN KEY (owner_id) REFERENCES owner (id) 7 | ) -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_50__rename_data_qa_severity.sql: -------------------------------------------------------------------------------- 1 | UPDATE data_quality_test_severity 2 | SET severity = CASE 3 | WHEN severity = 'MAJOR' THEN 'CRITICAL' 4 | WHEN severity = 'AVERAGE' THEN 'MAJOR' 5 | END 6 | WHERE severity IN ('AVERAGE', 'MAJOR'); -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_54__external_statistics_labels.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE label_to_dataset_field 2 | ADD COLUMN origin VARCHAR(32) NULL; 3 | 4 | UPDATE label_to_dataset_field 5 | SET origin = ( 6 | CASE 7 | WHEN external = true THEN 'EXTERNAL' 8 | ELSE 'INTERNAL' END 9 | ); 10 | 11 | ALTER TABLE label_to_dataset_field 12 | ALTER COLUMN origin SET NOT NULL, 13 | ALTER COLUMN origin SET DEFAULT 'INTERNAL', 14 | DROP COLUMN external; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_57__change_tag_unique_constraint_semantics.sql: -------------------------------------------------------------------------------- 1 | DROP INDEX tag_name_unique; 2 | 3 | CREATE UNIQUE INDEX IF NOT EXISTS tag_name_unique ON tag (name) WHERE IS_DELETED = False; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_58__rename_constraints.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE title RENAME CONSTRAINT role_pkey TO title_pkey; 2 | 3 | DROP INDEX IF EXISTS role_name_unique; 4 | 5 | CREATE UNIQUE INDEX IF NOT EXISTS title_name_unique ON title (name) WHERE title.is_deleted IS FALSE; 6 | 7 | ALTER TABLE role RENAME CONSTRAINT role_pkey1 TO role_pkey; 8 | 9 | CREATE UNIQUE INDEX IF NOT EXISTS role_name_unique ON role (name) WHERE role.is_deleted IS FALSE; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_5__add_job_run.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO data_entity_subtype (name) VALUES ('JOB_RUN'); 2 | 3 | INSERT INTO type_subtype_relation (type_id, subtype_id) 4 | VALUES (3, 12), (5, 12) -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_63__add_try_count_to_message.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE IF EXISTS message 2 | ADD COLUMN IF NOT EXISTS try_send_count smallint NULL; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_65__rename_tag_activity_type.sql: -------------------------------------------------------------------------------- 1 | UPDATE activity set event_type = 'TAG_ASSIGNMENT_UPDATED' where event_type = 'TAGS_ASSOCIATION_UPDATED'; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_68__clear_dataset_version_hash.sql: -------------------------------------------------------------------------------- 1 | UPDATE dataset_version 2 | SET version_hash = NULL 3 | WHERE (dataset_oddrn, version) IN 4 | (SELECT dataset_oddrn, max(version) AS "max" 5 | FROM dataset_version 6 | GROUP BY dataset_oddrn); -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_6__add_dataqa_flow.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE data_entity_task_run 2 | ADD COLUMN IF NOT EXISTS data_entity_oddrn varchar(255), 3 | ADD COLUMN IF NOT EXISTS name varchar(255), 4 | DROP COLUMN IF EXISTS data_entity_id; 5 | 6 | CREATE TABLE IF NOT EXISTS data_quality_test_relations ( 7 | dataset_oddrn varchar(255), 8 | data_quality_test_oddrn varchar(255), 9 | 10 | CONSTRAINT data_quality_test_relations_pk PRIMARY KEY (dataset_oddrn, data_quality_test_oddrn) 11 | ); -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_70__introduce_external_enum_values.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE enum_value 2 | ADD COLUMN origin SMALLINT, 3 | ADD COLUMN internal_description VARCHAR, 4 | ADD COLUMN external_description VARCHAR; 5 | 6 | UPDATE enum_value 7 | SET origin = 1, 8 | internal_description = description; 9 | 10 | ALTER TABLE enum_value 11 | ALTER COLUMN origin SET NOT NULL, 12 | DROP COLUMN description; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_72__dataset_field_reference_type.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE dataset_field 2 | ADD COLUMN reference_oddrn VARCHAR -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_83__added_category_field_to_dataset_expectation.sql: -------------------------------------------------------------------------------- 1 | UPDATE data_entity 2 | SET specific_attributes = jsonb_set( 3 | specific_attributes, 4 | '{DATA_QUALITY_TEST,expectation,category}', 5 | '"ASSERTION"', 6 | true 7 | ) 8 | WHERE type_id = 5 9 | and specific_attributes->'DATA_QUALITY_TEST'->'expectation' is not null; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_85__remove_length_constraint_for_description.sql: -------------------------------------------------------------------------------- 1 | ALTER TABLE dataset_field 2 | ALTER COLUMN internal_description TYPE varchar; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_88__add_query_example_policy.sql: -------------------------------------------------------------------------------- 1 | UPDATE policy 2 | SET policy = 3 | jsonb_pretty( 4 | regexp_replace( 5 | policy, 6 | '"statements": \[', 7 | '"statements": [{' || '"resource": {"type": "QUERY_EXAMPLE"}, "permissions": ["ALL"]},', 8 | 'g' 9 | )::jsonb 10 | ) 11 | WHERE name = 'Administrator'; -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/db/migration/V0_0_8__change_topic_subtype_name.sql: -------------------------------------------------------------------------------- 1 | update data_entity_subtype set name='KAFKA_TOPIC' where name='TOPIC' 2 | -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/sla/sla_green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/sla/sla_green.png -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/sla/sla_red.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/sla/sla_red.png -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/sla/sla_yellow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/sla/sla_yellow.png -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/static/img/cognito.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/static/img/cognito.png -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/static/img/github.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/static/img/github.png -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/static/img/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/static/img/google.png -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/static/img/keycloak.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/static/img/keycloak.png -------------------------------------------------------------------------------- /odd-platform-api/src/main/resources/static/img/okta.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-api/src/main/resources/static/img/okta.png -------------------------------------------------------------------------------- /odd-platform-api/src/test/resources/policy/invalid/additional_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "statements": [ 3 | { 4 | "resource": { 5 | "type": "MANAGEMENT" 6 | }, 7 | "permissions": [ 8 | "TAG_CREATE" 9 | ] 10 | } 11 | ], 12 | "invalid": [] 13 | } -------------------------------------------------------------------------------- /odd-platform-api/src/test/resources/policy/invalid/empty_policy.json: -------------------------------------------------------------------------------- 1 | {} -------------------------------------------------------------------------------- /odd-platform-api/src/test/resources/policy/invalid/management_invalid_permissions.json: -------------------------------------------------------------------------------- 1 | { 2 | "statements": [ 3 | { 4 | "resource": { 5 | "type": "MANAGEMENT" 6 | }, 7 | "permissions": [ 8 | "TERM_UPDATE", 9 | "TERM_CREATE" 10 | ] 11 | } 12 | ] 13 | } -------------------------------------------------------------------------------- /odd-platform-api/src/test/resources/policy/invalid/missed_permissions.json: -------------------------------------------------------------------------------- 1 | { 2 | "statements": [ 3 | { 4 | "resource": { 5 | "type": "MANAGEMENT" 6 | } 7 | } 8 | ] 9 | } -------------------------------------------------------------------------------- /odd-platform-api/src/test/resources/policy/invalid/missed_resource.json: -------------------------------------------------------------------------------- 1 | { 2 | "statements": [ 3 | { 4 | "permissions": [ 5 | "TAG_CREATE" 6 | ] 7 | } 8 | ] 9 | } -------------------------------------------------------------------------------- /odd-platform-api/src/test/resources/policy/valid/data_entity_without_conditions.json: -------------------------------------------------------------------------------- 1 | { 2 | "statements": [ 3 | { 4 | "resource": { 5 | "type": "DATA_ENTITY" 6 | }, 7 | "permissions": [ 8 | "ALL" 9 | ] 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /odd-platform-api/src/test/resources/policy/valid/term_without_conditions.json: -------------------------------------------------------------------------------- 1 | { 2 | "statements": [ 3 | { 4 | "resource": { 5 | "type": "TERM" 6 | }, 7 | "permissions": [ 8 | "ALL" 9 | ] 10 | } 11 | ] 12 | } -------------------------------------------------------------------------------- /odd-platform-ui/.eslintignore: -------------------------------------------------------------------------------- 1 | /src/generated-sources/** 2 | node_modules 3 | build 4 | *.css -------------------------------------------------------------------------------- /odd-platform-ui/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /node 6 | /.pnp 7 | .pnp.js 8 | 9 | # testing 10 | /coverage 11 | 12 | # production 13 | /build 14 | 15 | # misc 16 | .DS_Store 17 | .env.local 18 | .env.development.local 19 | .env.test.local 20 | .env.production.local 21 | 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | .eslintcache 27 | 28 | # Generated sources 29 | src/generated-sources 30 | 31 | /tmp 32 | 33 | # env 34 | .env -------------------------------------------------------------------------------- /odd-platform-ui/.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ -------------------------------------------------------------------------------- /odd-platform-ui/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | 5 | if git diff --cached --name-only | grep --quiet "odd-platform-ui" 6 | then 7 | cd odd-platform-ui && npm run pre-commit 8 | else 9 | echo "Skipping frontend tests" 10 | exit 0 11 | fi 12 | -------------------------------------------------------------------------------- /odd-platform-ui/.husky/prepare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | [ -n "$CI" ] && exit 0 4 | 5 | cd .. && npx husky install odd-platform-ui/.husky -------------------------------------------------------------------------------- /odd-platform-ui/.nvmrc: -------------------------------------------------------------------------------- 1 | v18.18.2 2 | -------------------------------------------------------------------------------- /odd-platform-ui/.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "es5", 4 | "printWidth": 90, 5 | "arrowParens": "avoid", 6 | "endOfLine": "auto", 7 | "semi": true, 8 | "tabWidth": 2, 9 | "bracketSpacing": true, 10 | "jsxSingleQuote": true 11 | } 12 | -------------------------------------------------------------------------------- /odd-platform-ui/generate.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | GENERATOR_IMAGE="openapitools/openapi-generator-cli:v7.2.0" 4 | CONFIG_PATH="odd-platform-ui/openapi-config.yaml" 5 | WORKDIR="//mnt" # Using double-slash for compatibility with Windows 6 | HOST_DIRECTORY=/$(pwd)/.. 7 | 8 | docker run -v "$HOST_DIRECTORY:$WORKDIR" -w "$WORKDIR" --rm "$GENERATOR_IMAGE" generate -c "$CONFIG_PATH" 9 | -------------------------------------------------------------------------------- /odd-platform-ui/openapi-config.yaml: -------------------------------------------------------------------------------- 1 | generatorName: typescript-fetch 2 | inputSpec: ./odd-platform-specification/openapi.yaml 3 | outputDir: odd-platform-ui/src/generated-sources 4 | additionalProperties: 5 | supportsES6: true 6 | typescriptThreePlus: true 7 | prefixParameterInterfaces: true 8 | enumPropertyNaming: original -------------------------------------------------------------------------------- /odd-platform-ui/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/favicon.ico -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/airbyte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/airbyte.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/airflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/airflow.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/airflow2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/airflow2.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/athena.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/athena.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/cassandra.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/cassandra.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/ckan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/ckan.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/clickhouse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/clickhouse.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/cockroachdb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/cockroachdb.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/couchbase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/couchbase.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/cubejs.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/cubejs.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/databricks.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/databricks.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/dbt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/dbt.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/default.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/default.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/druid.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/druid.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/duckdb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/duckdb.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/dynamodb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/dynamodb.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/elasticsearch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/elasticsearch.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/feast.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/feast.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/glue.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/glue.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/great_expectations.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/great_expectations.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/hive.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/hive.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/kafka.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/kafka.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/kinesis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/kinesis.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/kubeflow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/kubeflow.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/mariadb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/mariadb.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/metabase.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/metabase.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/mongo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/mongo.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/mssql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/mssql.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/mysql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/mysql.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/neo4j.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/neo4j.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/odbc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/odbc.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/oracle.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/oracle.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/postgresql.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/postgresql.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/powerbi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/powerbi.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/presto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/presto.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/quicksight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/quicksight.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/redash.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/redash.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/redshift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/redshift.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/s3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/s3.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/sagemaker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/sagemaker.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/scylladb.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/scylladb.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/singlestore.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/singlestore.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/snowflake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/snowflake.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/spark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/spark.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/sqlite.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/sqlite.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/superset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/superset.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/tableau.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/tableau.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/tarantool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/tarantool.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/trino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/trino.png -------------------------------------------------------------------------------- /odd-platform-ui/public/imgs/vertica.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/public/imgs/vertica.png -------------------------------------------------------------------------------- /odd-platform-ui/public/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "short_name": "Data Catalog", 3 | "name": "UI for Data Catalog", 4 | "icons": [ 5 | { 6 | "src": "favicon.ico", 7 | "sizes": "64x64 32x32 24x24 16x16", 8 | "type": "image/x-icon" 9 | } 10 | ], 11 | "start_url": ".", 12 | "display": "standalone", 13 | "theme_color": "#000000", 14 | "background_color": "#ffffff" 15 | } 16 | -------------------------------------------------------------------------------- /odd-platform-ui/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Activity/ActivityResults/ActivityItem/ActivityItemStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Grid } from '@mui/material'; 3 | 4 | export const Container = styled(Grid)(({ theme }) => ({ 5 | borderTop: '1px solid', 6 | borderTopColor: theme.palette.divider, 7 | padding: theme.spacing(2), 8 | flexDirection: 'column', 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Activity/Filters/FiltersStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { toolbarHeight } from 'lib/constants'; 3 | 4 | export const Container = styled('div')(({ theme }) => ({ 5 | padding: theme.spacing(2, 1, 1.5, 1), 6 | })); 7 | 8 | export const ListContainer = styled('div')(() => ({ 9 | height: `calc(100vh - 110px - ${toolbarHeight}px)`, 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataCollaboration/Channels/ChannelsStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Grid } from '@mui/material'; 3 | import { maxChannelsWidth } from 'lib/constants'; 4 | 5 | export const Container = styled(Grid)(({ theme }) => ({ 6 | flexWrap: 'nowrap', 7 | flexDirection: 'column', 8 | width: '100%', 9 | maxWidth: `${maxChannelsWidth}px`, 10 | position: 'absolute', 11 | left: 0, 12 | padding: theme.spacing(2, 2, 0, 0), 13 | })); 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataCollaboration/DataCollaborationStyles.ts: -------------------------------------------------------------------------------- 1 | import styled, { type CSSObject } from 'styled-components'; 2 | import { Grid } from '@mui/material'; 3 | 4 | export const Container = styled(Grid)( 5 | () => 6 | ({ 7 | position: 'relative', 8 | flexWrap: 'nowrap', 9 | }) as CSSObject 10 | ); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataEntityActivity/DataEntityActivity.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Grid } from '@mui/material'; 3 | import ActivityResults from './ActivityResults/ActivityResults'; 4 | import Filters from './Filters/Filters'; 5 | 6 | const DataEntityActivity: React.FC = () => ( 7 | 8 | 9 | 10 | 11 | ); 12 | 13 | export default DataEntityActivity; 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataEntityActivity/Filters/FiltersStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | import { activitySidebarWidth } from 'lib/constants'; 4 | 5 | export const Container = styled(Grid)(({ theme }) => ({ 6 | width: '100%', 7 | maxWidth: `${activitySidebarWidth}px`, 8 | marginRight: theme.spacing(4), 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataEntityDetailsStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { maxContentWidthWithoutSidebar } from 'lib/constants'; 3 | 4 | export const Container = styled('div')(({ theme }) => ({ 5 | margin: '0 auto', 6 | padding: theme.spacing(2), 7 | display: 'flex', 8 | flexDirection: 'column', 9 | [theme.breakpoints.up(maxContentWidthWithoutSidebar)]: { 10 | width: '100%', 11 | maxWidth: `${maxContentWidthWithoutSidebar}px`, 12 | }, 13 | })); 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataEntityGroup/DataEntityGroupControls/DataEntityGroupControls.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/src/components/DataEntityDetails/DataEntityGroup/DataEntityGroupControls/DataEntityGroupControls.tsx -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataEntityGroup/DataEntityGroupForm/DataEntityGroupFormStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | 4 | export const EntityItemsContainer = styled(Grid)(({ theme }) => ({ 5 | '& > *': { 6 | borderBottom: '1px solid', 7 | borderColor: theme.palette.divider, 8 | }, 9 | '& > *:last-child': { borderBottom: 'none' }, 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DataEntityGroup/DataEntityGroupForm/EntityItem/EntityItemStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | 4 | export const Container = styled(Grid)(({ theme }) => ({ 5 | flexWrap: 'nowrap', 6 | padding: theme.spacing(0.75, 0), 7 | paddingLeft: theme.spacing(1), 8 | justifyContent: 'space-between', 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetData/DatasetDataTable/DatasetDataTableRowCell/interfaces.ts: -------------------------------------------------------------------------------- 1 | export interface RowCellProps { 2 | isEditing: boolean; 3 | value: unknown; 4 | onChange: (value: unknown) => void; 5 | } 6 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetData/DatasetDataTable/interfaces.ts: -------------------------------------------------------------------------------- 1 | export type TableData = Record; 2 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetData/DatasetDataTable/utils.ts: -------------------------------------------------------------------------------- 1 | import type { LookupTableRowFormData } from 'generated-sources'; 2 | import type { TableData } from './interfaces'; 3 | 4 | export const buildTableRowData = (row: TableData): LookupTableRowFormData => ({ 5 | items: Object.entries(row).map(([k, v]) => ({ 6 | fieldId: Number(k), 7 | value: v as string, 8 | })), 9 | }); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureCompare/lib/atoms.ts: -------------------------------------------------------------------------------- 1 | import { atom } from 'jotai'; 2 | 3 | export const showOnlyChangesAtom = atom(false); 4 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureCompare/lib/constants.ts: -------------------------------------------------------------------------------- 1 | import type { StructureCompareQueryParams } from './interfaces'; 2 | 3 | export const defaultStructureCompareQuery: StructureCompareQueryParams = { 4 | firstVersionId: '', 5 | secondVersionId: '', 6 | }; 7 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureCompare/lib/interfaces.ts: -------------------------------------------------------------------------------- 1 | export type StructureCompareQueryParams = { 2 | firstVersionId: string; 3 | secondVersionId: string; 4 | }; 5 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldDescription/DatasetFieldDescription.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Tooltip = styled('div')(({ theme }) => ({ 4 | fontSize: '14px', 5 | padding: theme.spacing(1), 6 | maxWidth: '430px', 7 | border: '1px solid', 8 | borderRadius: '8px', 9 | borderColor: theme.palette.border.primary, 10 | boxShadow: theme.shadows[9], 11 | })); 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldDescription/DatasetFieldDescriptionEdit/DatasetFieldDescriptionEdit.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ActionsContainer = styled('div')(({ theme }) => ({ 4 | marginTop: theme.spacing(2), 5 | display: 'flex', 6 | alignItems: 'center', 7 | justifyContent: 'flex-start', 8 | })); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/DatasetStructureOverview/DatasetStructureView/DatasetFieldOverview/DatasetFieldTags/DatasetFieldTagsStyles.ts: -------------------------------------------------------------------------------- 1 | import styled, { type CSSObject } from 'styled-components'; 2 | import { Box } from '@mui/material'; 3 | 4 | export const TagsContainer = styled(Box)( 5 | () => 6 | ({ 7 | display: 'flex', 8 | alignItems: 'center', 9 | justifyContent: 'flex-start', 10 | flexWrap: 'wrap', 11 | }) as CSSObject 12 | ); 13 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/DatasetStructure/shared/constants.ts: -------------------------------------------------------------------------------- 1 | export const nestingFactor = 16; 2 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/ZoomableDEGLineage/DEGLinegeGraph/EdgesRenderer/EdgesRenderer.styles.ts: -------------------------------------------------------------------------------- 1 | import styled, { type CSSObject } from 'styled-components'; 2 | 3 | export const Container = styled('svg')( 4 | () => 5 | ({ 6 | overflow: 'visible', 7 | pointerEvents: 'none', 8 | zIndex: 0, 9 | position: 'absolute', 10 | width: '100%', 11 | height: '100%', 12 | top: 0, 13 | left: 0, 14 | }) as CSSObject 15 | ); 16 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/lib/DEGLineageAtomProvider.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Provider } from 'jotai'; 3 | 4 | const DEGLineageAtomProvider: React.FC = ({ children }) => ( 5 | {children} 6 | ); 7 | 8 | export default DEGLineageAtomProvider; 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Lineage/DEGLineage/lib/atoms.ts: -------------------------------------------------------------------------------- 1 | import { atom } from 'jotai'; 2 | import type { Node, Edge } from './interfaces'; 3 | import { LAYER_HEIGHT, LAYER_WIDTH } from './constants'; 4 | 5 | export const nodesAtom = atom([]); 6 | export const edgesAtom = atom([]); 7 | export const graphWidthAtom = atom(LAYER_WIDTH); 8 | export const graphHeightAtom = atom(LAYER_HEIGHT); 9 | export const isLayoutedAtom = atom(false); 10 | export const isFitClickedAtom = atom(false); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Link/LinkStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Path = styled('path')(({ theme }) => ({ 4 | fill: 'none', 5 | stroke: theme.palette.texts.hint, 6 | strokeWidth: 2, 7 | })); 8 | 9 | export const Arrow = styled('path')(({ theme }) => ({ 10 | fill: theme.palette.texts.hint, 11 | })); 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/LineageGraph/Node/HiddenDependencies/HiddenDependenciesStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Count = styled('text')(({ theme }) => ({ 4 | fill: theme.palette.texts.primary, 5 | fontSize: theme.typography.body2.fontSize, 6 | fontWeight: theme.typography.body2.fontWeight, 7 | lineHeight: theme.typography.body2.lineHeight, 8 | })); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Lineage/HierarchyLineage/ZoomableLineage/ZoomableLineageStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Container = styled('svg')<{ $isDragging: boolean }>(({ $isDragging }) => ({ 4 | cursor: $isDragging ? 'grabbing' : 'grab', 5 | })); 6 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/LinkedItemsList/LinkedListSkeleton/LinkedListSkeletonStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | import { colWidthStyles, type ColType } from '../LinkedItemsListStyles'; 4 | 5 | export const ColContainer = styled(Grid)<{ 6 | $colType: ColType; 7 | }>(({ $colType }) => ({ 8 | ...colWidthStyles.col, 9 | ...colWidthStyles[$colType], 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewAttachments/AttachmentsHeader/AttachmentsHeader.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Header = styled('div')(({ theme }) => ({ 4 | width: '100%', 5 | display: 'flex', 6 | alignItems: 'center', 7 | justifyContent: 'space-between', 8 | marginBottom: theme.spacing(1), 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDataQualityReport/OverviewDQTestReport/OverviewDQReportSkeleton/OverviewDQReportSkeletonStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | 4 | export const ReportSkeleton = styled(Grid)(() => ({ height: '28px' })); 5 | export const SkeletonStatItem = styled(Grid)(() => ({ height: '17px' })); 6 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDescription/ExternalDescription/ExternalDescription.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Container = styled('div')(({ theme }) => ({ 4 | paddingTop: theme.spacing(2), 5 | marginTop: theme.spacing(2), 6 | borderTop: `1px solid ${theme.palette.divider}`, 7 | })); 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDescription/InternalDescription/InternalDescriptionEdit/InternalDescriptionEdit.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const ActionsContainer = styled('div')(({ theme }) => ({ 4 | marginTop: theme.spacing(2), 5 | display: 'flex', 6 | alignItems: 'center', 7 | justifyContent: 'flex-start', 8 | })); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewDescription/OverviewDescription.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const CollapseControls = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | width: '100%', 6 | paddingTop: theme.spacing(2), 7 | borderTop: `1px solid ${theme.palette.divider}`, 8 | })); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewGeneral/OverviewGeneralStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const OddrnValue = styled('span')(({ theme }) => ({ 4 | display: 'block', 5 | width: '100%', 6 | whiteSpace: 'normal', 7 | borderRadius: '4px', 8 | padding: theme.spacing(1), 9 | backgroundColor: theme.palette.backgrounds.primary, 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewGroups/OverviewGroupsStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const GroupsCaptionContainer = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | alignItems: 'center', 6 | justifyContent: 'space-between', 7 | marginBottom: theme.spacing(2.25), 8 | })); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewSkeleton/OverviewSkeletonStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | 4 | export const LargeItem = styled(Grid)(() => ({ 5 | height: '34px', 6 | })); 7 | 8 | export const SmallItem = styled(Grid)(() => ({ 9 | height: '26px', 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStats/OverviewEntityGroupStats/OverviewEntityGroupStats.tsx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/opendatadiscovery/odd-platform/f363b2aebd8c362882fbd02dd04cf20fd64f7dfa/odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStats/OverviewEntityGroupStats/OverviewEntityGroupStats.tsx -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStats/OverviewTransformerStats/OverviewTransformerStatsStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Box } from '@mui/material'; 3 | 4 | export const StatIconContainer = styled(Box)(({ theme }) => ({ 5 | fontSize: theme.typography.h5.fontSize, 6 | color: theme.palette.texts.action, 7 | })); 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import AppPaper from 'components/shared/elements/AppPaper/AppPaper'; 3 | 4 | export const SectionContainer = styled(AppPaper)(({ theme }) => ({ 5 | '& > *': { padding: theme.spacing(1.5, 2) }, 6 | '& + &': { marginTop: theme.spacing(2) }, 7 | })); 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/Overview/OverviewTerms/OverviewTermsStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const TermsCaptionContainer = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | alignItems: 'center', 6 | justifyContent: 'space-between', 7 | marginBottom: theme.spacing(2.25), 8 | })); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataEntityDetails/QualityTestRunsHistory/TestRunStatusReasonModal/TestRunStatusReasonModalStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Grid } from '@mui/material'; 3 | 4 | export const StatsContainer = styled(Grid)(({ theme }) => ({ 5 | flexWrap: 'nowrap', 6 | borderBottom: '1px solid', 7 | borderBottomColor: theme.palette.divider, 8 | paddingBottom: theme.spacing(1), 9 | })); 10 | 11 | export const StatusReasonContainer = styled(Grid)(() => ({ 12 | maxHeight: '70vh', 13 | })); 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataQuality/DataQualityFilters/FilterItem/MultipleFilterItem/MultipleFilterItemAutocomplete/MultipleFilterItemAutocompleteStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const FilterCount = styled('span')(({ theme }) => ({ 4 | color: theme.palette.texts.hint, 5 | })); 6 | 7 | export const HighlightedTextPart = styled('span')<{ 8 | isHighlighted: boolean; 9 | }>(({ theme, isHighlighted }) => ({ 10 | backgroundColor: isHighlighted ? theme.palette.warning.light : 'none', 11 | })); 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataQuality/DataQualityStore/DataQualityProvider.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Provider } from 'jotai'; 3 | 4 | export const DataQualityAtomProvider: React.FC = ({ 5 | children, 6 | }) => {children}; 7 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/DataQuality/interfaces.ts: -------------------------------------------------------------------------------- 1 | import type { UseQueryResult } from '@tanstack/react-query'; 2 | 3 | export type FilterOption = { 4 | id: number; 5 | name: string; 6 | }; 7 | export type Response = { 8 | items: FilterOption[]; 9 | }; 10 | export type HookResult = UseQueryResult; 11 | export type Hook = ({ 12 | page, 13 | size, 14 | query, 15 | }: { 16 | page: number; 17 | size: number; 18 | query: string; 19 | }) => UseQueryResult; 20 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Directory/DataSourceList/DataSourceTable/interfaces.ts: -------------------------------------------------------------------------------- 1 | import type { CSSProperties } from 'react'; 2 | 3 | export interface Cell { 4 | fieldName: string; 5 | content: string; 6 | } 7 | 8 | export interface FlexCell extends Cell { 9 | flex: CSSProperties['flex']; 10 | } 11 | 12 | export interface RowCell { 13 | content: string; 14 | flex: CSSProperties['flex']; 15 | } 16 | 17 | export interface Row { 18 | id: number; 19 | cells: RowCell[]; 20 | } 21 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Management/OwnerAssociations/OwnerAssociationsHeader/OwnerAssociationsHeaderStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Grid } from '@mui/material'; 3 | 4 | export const Caption = styled(Grid)(() => ({ 5 | alignItems: 'center', 6 | justifyContent: 'space-between', 7 | })); 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Management/OwnerAssociations/OwnerAssociationsStore/OwnerAssociationsAtoms.ts: -------------------------------------------------------------------------------- 1 | import { atom } from 'jotai'; 2 | 3 | export const queryAtom = atom(''); 4 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Management/OwnerAssociations/OwnerAssociationsStore/OwnerAssociationsProvider.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { Provider } from 'jotai'; 3 | 4 | const OwnerAssociationsAtomProvider: React.FC = ({ 5 | children, 6 | }) => {children}; 7 | 8 | export default OwnerAssociationsAtomProvider; 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Management/TagsList/TagCreateForm/TagCreateFormItem/TagCreateFormItemStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | 4 | export const TagItemBtnsContainer = styled(Grid)(({ theme }) => ({ 5 | justifyContent: 'space-between', 6 | alignItems: 'center', 7 | paddingBottom: theme.spacing(1.5), 8 | borderBottom: '1px solid', 9 | borderBottomColor: theme.palette.backgrounds.primary, 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Overview/shared/ItemsList.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Container = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | flexDirection: 'column', 6 | alignItems: 'flex-start', 7 | marginTop: theme.spacing(5), 8 | })); 9 | 10 | export const ListContainer = styled('div')(({ theme }) => ({ 11 | display: 'flex', 12 | flexWrap: 'wrap', 13 | gap: '8px', 14 | marginTop: theme.spacing(1), 15 | })); 16 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Terms/TermDetails/Overview/OverviewSkeleton/OverviewSkeletonStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | 4 | export const LargeItem = styled(Grid)(() => ({ 5 | height: '34px', 6 | })); 7 | 8 | export const SmallItem = styled(Grid)(() => ({ 9 | height: '26px', 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Terms/TermDetails/Overview/OverviewTags/OverviewTagsStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const CaptionContainer = styled('div')(({ theme }) => ({ 4 | display: 'flex', 5 | alignItems: 'center', 6 | justifyContent: 'space-between', 7 | marginBottom: theme.spacing(2.25), 8 | })); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/Terms/TermSearch/TermSearchFilters/TermSearchFilterItem/MultipleFilterItem/MultipleFilterItemAutocomplete/MultipleFilterItemAutocompleteStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const FilterCount = styled('span')(({ theme }) => ({ 4 | color: theme.palette.texts.hint, 5 | })); 6 | 7 | export const HighlightedTextPart = styled('span')<{ 8 | isHighlighted: boolean; 9 | }>(({ theme, isHighlighted }) => ({ 10 | backgroundColor: isHighlighted ? theme.palette.warning.light : 'none', 11 | })); 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/contexts/index.ts: -------------------------------------------------------------------------------- 1 | export { default as WithPermissions } from './Permission/WithPermissions'; 2 | export { default as WithPermissionsProvider } from './Permission/WithPermissionsProvider'; 3 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/Activity/ActivityFields/ActivityFieldHeader/ActivityFieldHeaderStyles.ts: -------------------------------------------------------------------------------- 1 | import { Grid } from '@mui/material'; 2 | import styled from 'styled-components'; 3 | 4 | export const FieldHeader = styled(Grid)(({ theme }) => ({ 5 | flexWrap: 'nowrap', 6 | alignItems: 'center', 7 | marginTop: theme.spacing(0.75), 8 | '& > *': { marginRight: theme.spacing(0.25) }, 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppAvatar/AppAvatar.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { type AvatarProps } from '@mui/material'; 3 | import { StyledAvatar } from 'components/shared/elements/AppAvatar/AppAvatarStyles'; 4 | 5 | type AppAvatarProps = AvatarProps; 6 | 7 | const AppAvatar: React.FC = props => ; 8 | 9 | export default AppAvatar; 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppAvatar/AppAvatarStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Avatar, avatarClasses } from '@mui/material'; 3 | 4 | export const StyledAvatar = styled(Avatar)(({ theme }) => ({ 5 | [`&.${avatarClasses.root}`]: { 6 | width: '24px', 7 | height: '24px', 8 | 9 | [`&.${avatarClasses.rounded}`]: { 10 | borderRadius: theme.spacing(0.5), 11 | border: `1px solid ${theme.palette.border.primary}`, 12 | }, 13 | }, 14 | })); 15 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppCircularProgress/interfaces.ts: -------------------------------------------------------------------------------- 1 | export type Background = 'transparent' | 'blue'; 2 | export type ProgressBackground = 'light' | 'dark'; 3 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppLoadingPage/AppLoadingPage.tsx: -------------------------------------------------------------------------------- 1 | import React, { type FC } from 'react'; 2 | import AppCircularProgress from 'components/shared/elements/AppCircularProgress/AppCircularProgress'; 3 | import { Container } from 'components/shared/elements/AppLoadingPage/AppLoadingPageStyles'; 4 | 5 | const AppLoadingPage: FC = () => ( 6 | 7 | 8 | 9 | ); 10 | 11 | export default AppLoadingPage; 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppPaper/AppPaper.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { type PaperProps } from '@mui/material'; 3 | import * as S from 'components/shared/elements/AppPaper/AppPaperStyles'; 4 | 5 | const AppPaper: React.FC = React.forwardRef( 6 | ({ children, sx, ...props }, ref) => ( 7 | 8 | {children} 9 | 10 | ) 11 | ); 12 | export default AppPaper; 13 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppPaper/AppPaperStyles.tsx: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Paper, paperClasses } from '@mui/material'; 3 | 4 | export const AppPapper = styled(Paper)(({ theme }) => ({ 5 | border: ' 1px solid', 6 | borderColor: theme.palette.backgrounds.secondary, 7 | borderRadius: '8px', 8 | [`& .${paperClasses.elevation9}`]: { borderRadius: '8px' }, 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppTabs/interfaces.ts: -------------------------------------------------------------------------------- 1 | export type TabType = 'primary' | 'secondary' | 'secondarySmall' | 'menu'; 2 | export type HintType = 'primary' | 'secondary' | 'alert'; 3 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AppToast/AppToastStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Box } from '@mui/material'; 3 | import { type ToastType } from 'react-hot-toast'; 4 | 5 | export const Container = styled(Box)<{ $type: ToastType }>(({ theme, $type }) => ({ 6 | width: '320px', 7 | display: 'flex', 8 | flexWrap: 'nowrap', 9 | padding: theme.spacing(1), 10 | backgroundColor: theme.palette.toast[$type], 11 | borderRadius: theme.spacing(0.25), 12 | boxShadow: theme.shadows[8], 13 | })); 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/AutocompleteSuggestion/AutocompleteSuggestionStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const NoResultText = styled('span')(({ theme }) => ({ 4 | color: theme.palette.texts.secondary, 5 | })); 6 | 7 | export const CreateNewOptionText = styled('span')(({ theme }) => ({ 8 | color: theme.palette.texts.action, 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/BooleanFormatted/BooleanFormatted.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export interface BooleanFormattedProps { 4 | value: string | boolean | undefined; 5 | } 6 | 7 | const BooleanFormatted: React.FC = ({ value }) => ( 8 | <>{value === true || value === 'true' ? 'Yes' : 'No'} 9 | ); 10 | 11 | export default BooleanFormatted; 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/BreadCrumbs/BreadCrumbs.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Typography } from '@mui/material'; 3 | 4 | export const Container = styled('nav')(({ theme }) => ({ 5 | display: 'flex', 6 | flexWrap: 'nowrap', 7 | alignItems: 'center', 8 | marginBottom: theme.spacing(1), 9 | })); 10 | 11 | export const Active = styled(Typography)(({ theme }) => ({ 12 | '&:hover': { color: theme.palette.texts.info }, 13 | '&:active': { color: theme.palette.texts.primary }, 14 | })); 15 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/Button/helpers.ts: -------------------------------------------------------------------------------- 1 | import type { Button, ButtonColor, ButtonFont, ButtonSize } from './interfaces'; 2 | 3 | export const getButtonType = (color: ButtonColor, size: ButtonSize, icon?: boolean) => { 4 | if (icon) return `${color}-${size}-icon` as Button; 5 | 6 | return `${color}-${size}` as Button; 7 | }; 8 | 9 | export const getButtonFontType = (color: ButtonColor, size: ButtonSize) => 10 | `button-${color}-${size}` as ButtonFont; 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/Checkbox/Checkbox.tsx: -------------------------------------------------------------------------------- 1 | import React, { forwardRef } from 'react'; 2 | import { type CheckboxProps as MUICheckboxProps } from '@mui/material'; 3 | import { StyledCheckbox } from 'components/shared/elements/Checkbox/Checkbox.styles'; 4 | 5 | type CheckboxProps = Pick; 6 | 7 | const Checkbox = forwardRef((props, ref) => ( 8 | 9 | )); 10 | 11 | export default Checkbox; 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/ConfirmationDialog/ConfirmationDialogStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const Actions = styled('div')(() => ({ 4 | width: '100%', 5 | display: 'flex', 6 | justifyContent: 'flex-start', 7 | })); 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/EntityStatus/StatusSettingsForm/Option/Option.tsx: -------------------------------------------------------------------------------- 1 | import React, { type FC, type MouseEventHandler } from 'react'; 2 | import * as S from './Option.styles'; 3 | 4 | interface OptionProps { 5 | value: string; 6 | selected: boolean; 7 | onClick: MouseEventHandler; 8 | } 9 | 10 | const Option: FC = ({ value, selected, onClick }) => ( 11 | 12 | {value} 13 | 14 | ); 15 | 16 | export default Option; 17 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/EntityTypeItem/EntityTypeItemStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Typography } from '@mui/material'; 3 | 4 | export const Content = styled(Typography)(({ theme }) => ({ 5 | display: 'inline-flex', 6 | padding: theme.spacing(0.25, 0.5), 7 | borderRadius: '4px', 8 | backgroundColor: theme.palette.backgrounds.primary, 9 | whiteSpace: 'nowrap', 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/ListLayout/ListLayout.styles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { maxContentWidthWithoutSidebar } from 'lib/constants'; 3 | 4 | export const Container = styled('div')(({ theme }) => ({ 5 | margin: '0 auto', 6 | padding: theme.spacing(2), 7 | width: `${maxContentWidthWithoutSidebar}px`, 8 | [theme.breakpoints.down(maxContentWidthWithoutSidebar)]: { 9 | width: '100%', 10 | maxWidth: `${maxContentWidthWithoutSidebar}px`, 11 | }, 12 | })); 13 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/ListLayout/ListLayout.tsx: -------------------------------------------------------------------------------- 1 | import React, { type FC, type PropsWithChildren } from 'react'; 2 | import * as S from './ListLayout.styles'; 3 | 4 | const ListLayout: FC = ({ children }) => ( 5 | {children} 6 | ); 7 | 8 | export default ListLayout; 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/StyledComponents/ScrollableContainer.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { Grid } from '@mui/material'; 3 | import { toolbarHeight } from 'lib/constants'; 4 | 5 | export default styled(Grid)<{ $offsetY?: number }>(({ $offsetY = 130 }) => ({ 6 | display: 'flex', 7 | flexDirection: 'column', 8 | flexWrap: 'nowrap', 9 | height: `calc(100vh - ${toolbarHeight}px - ${$offsetY}px)`, 10 | overflow: 'auto', 11 | })); 12 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/TestRunStatusIcon/TestRunStatusIcon.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react'; 2 | import { type DataEntityRunStatus } from 'generated-sources'; 3 | import * as S from 'components/shared/elements/TestRunStatusIcon/TestRunStatusIconStyles'; 4 | 5 | export interface TestRunStatusIconProps { 6 | typeName: DataEntityRunStatus; 7 | } 8 | 9 | const TestRunStatusIcon: React.FC = ({ typeName }) => ( 10 | 11 | ); 12 | 13 | export default TestRunStatusIcon; 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/TestRunStatusIcon/TestRunStatusIconStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { type DataEntityRunStatus } from 'generated-sources'; 3 | 4 | export const Content = styled('div')<{ 5 | $typeName: DataEntityRunStatus; 6 | }>(({ theme, $typeName }) => ({ 7 | padding: theme.spacing(0.5), 8 | marginRight: theme.spacing(1), 9 | width: '8px', 10 | height: '8px', 11 | borderRadius: '50%', 12 | backgroundColor: theme.palette.runStatus[$typeName].color, 13 | })); 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/elements/TruncatedCell/TruncatedCellStyles.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | export const TruncatedList = styled('div')(({ theme }) => ({ 4 | width: '100%', 5 | display: 'flex !important', 6 | flexWrap: 'wrap', 7 | marginBottom: theme.spacing(0.5), 8 | '& > *': { margin: theme.spacing(0.25, 0.25) }, 9 | })); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/icons/AppSvgIcon.tsx: -------------------------------------------------------------------------------- 1 | import SvgIcon, { type SvgIconProps } from '@mui/material/SvgIcon'; 2 | import styled from 'styled-components'; 3 | 4 | const AppSvgIcon = styled(SvgIcon)(({ width, height }) => ({ 5 | width: width || '16px', 6 | height: height || '16px', 7 | })); 8 | 9 | export default AppSvgIcon; 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/styled-components/asterisk.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | 3 | const Asterisk = styled('span')(({ theme }) => ({ 4 | color: theme.palette.warning.main, 5 | })); 6 | 7 | export default Asterisk; 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/styled-components/container.ts: -------------------------------------------------------------------------------- 1 | import styled, { css, type CSSObject } from 'styled-components'; 2 | 3 | const Container = styled('div')<{ 4 | $flexDirection?: CSSObject['flexDirection']; 5 | }>( 6 | ({ theme, $flexDirection = 'row' }) => css` 7 | display: flex; 8 | flex-direction: ${$flexDirection}; 9 | gap: ${theme.spacing(2)}; 10 | ` 11 | ); 12 | 13 | export default Container; 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/styled-components/index.ts: -------------------------------------------------------------------------------- 1 | export { default as Asterisk } from './asterisk'; 2 | export { default as Container } from './container'; 3 | export { default as Section } from './section'; 4 | export { default as ScrollableContainer } from './scrollable-container'; 5 | export * from './layout'; 6 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/styled-components/scrollable-container.ts: -------------------------------------------------------------------------------- 1 | import styled from 'styled-components'; 2 | import { toolbarHeight } from 'lib/constants'; 3 | 4 | export default styled('div')<{ $offsetY?: number }>(({ $offsetY = 130 }) => ({ 5 | display: 'flex', 6 | flexDirection: 'column', 7 | flexWrap: 'nowrap', 8 | height: `calc(100vh - ${toolbarHeight}px - ${$offsetY}px)`, 9 | overflow: 'auto', 10 | })); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/components/shared/styled-components/section.ts: -------------------------------------------------------------------------------- 1 | import styled, { css, type CSSObject } from 'styled-components'; 2 | 3 | const Section = styled('section')<{ 4 | $flexDirection?: CSSObject['flexDirection']; 5 | $gap?: CSSObject['gap']; 6 | }>( 7 | ({ $flexDirection = 'row', $gap = '0.5rem' }) => css` 8 | display: flex; 9 | width: 100%; 10 | flex-direction: ${$flexDirection}; 11 | gap: ${$gap}; 12 | ` 13 | ); 14 | 15 | export default Section; 16 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/genericContext.ts: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | export const createGenericContext = () => { 4 | const genericContext = React.createContext(undefined); 5 | 6 | const useGenericContext = () => { 7 | const contextIsDefined = React.useContext(genericContext); 8 | if (!contextIsDefined) { 9 | throw new Error('useGenericContext must be used within a Provider'); 10 | } 11 | return contextIsDefined; 12 | }; 13 | 14 | return [useGenericContext, genericContext.Provider] as const; 15 | }; 16 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/appInfo.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import { appInfoApi, linksApi } from 'lib/api'; 3 | 4 | export function useAppInfo() { 5 | return useQuery({ 6 | queryKey: ['appInfo'], 7 | queryFn: () => appInfoApi.getAppInfo(), 8 | }); 9 | } 10 | 11 | export function useAppLinks() { 12 | return useQuery({ 13 | queryKey: ['appLinks'], 14 | queryFn: () => linksApi.getLinks(), 15 | select: data => data.items, 16 | }); 17 | } 18 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/datasource.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import type { DataSourceApiGetDataSourceListRequest } from 'generated-sources'; 3 | import { dataSourceApi } from 'lib/api'; 4 | 5 | export function useGetDataSourceList(params: DataSourceApiGetDataSourceListRequest) { 6 | return useQuery({ 7 | queryKey: ['dataSourceList', params], 8 | queryFn: async () => dataSourceApi.getDataSourceList(params), 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/namespace.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import type { NamespaceApiGetNamespaceListRequest } from 'generated-sources/apis/NamespaceApi'; 3 | import { namespaceApi } from 'lib/api'; 4 | 5 | export function useGetNamespaceList(params: NamespaceApiGetNamespaceListRequest) { 6 | return useQuery({ 7 | queryKey: ['namespaceList', params], 8 | queryFn: async () => namespaceApi.getNamespaceList(params), 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/owner.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import type { OwnerApiGetOwnerListRequest } from 'generated-sources'; 3 | import { ownerApi } from 'lib/api'; 4 | 5 | export function useGetOwnerList(params: OwnerApiGetOwnerListRequest) { 6 | return useQuery({ 7 | queryKey: ['ownerList', params], 8 | queryFn: async () => ownerApi.getOwnerList(params), 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/permissions.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import type { PermissionApiGetResourcePermissionsRequest } from 'generated-sources/apis/PermissionApi'; 3 | import { permissionApi } from 'lib/api'; 4 | 5 | export function useResourcePermissions( 6 | params: PermissionApiGetResourcePermissionsRequest 7 | ) { 8 | return useQuery({ 9 | queryKey: ['resourcePermissions', params], 10 | queryFn: async () => permissionApi.getResourcePermissions(params), 11 | }); 12 | } 13 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/tag.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import type { TagApiGetPopularTagListRequest } from 'generated-sources/apis/TagApi'; 3 | import { tagApi } from 'lib/api'; 4 | 5 | export function useGetTagList(params: TagApiGetPopularTagListRequest) { 6 | return useQuery({ 7 | queryKey: ['tagList', params], 8 | queryFn: async () => tagApi.getPopularTagList(params), 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/tags.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import { tagApi } from 'lib/api'; 3 | import type { TagApiGetPopularTagListRequest } from 'generated-sources'; 4 | 5 | export function useGetPopularTags(params: TagApiGetPopularTagListRequest) { 6 | return useQuery({ 7 | queryKey: ['popularTags'], 8 | queryFn: async () => { 9 | const { items } = await tagApi.getPopularTagList(params); 10 | 11 | return items; 12 | }, 13 | }); 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/api/title.ts: -------------------------------------------------------------------------------- 1 | import { useQuery } from '@tanstack/react-query'; 2 | import type { TitleApiGetTitleListRequest } from 'generated-sources/apis/TitleApi'; 3 | import { titleApi } from 'lib/api'; 4 | 5 | export function useGetTitleList(params: TitleApiGetTitleListRequest) { 6 | return useQuery({ 7 | queryKey: ['titleList', params], 8 | queryFn: async () => titleApi.getTitleList(params), 9 | }); 10 | } 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/hooks/usePrevious.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef } from 'react'; 2 | 3 | export default function usePrevious(value: T): T | undefined { 4 | const ref = useRef(); 5 | useEffect(() => { 6 | ref.current = value; 7 | }); 8 | return ref.current; 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/interfaces/dataEntity.ts: -------------------------------------------------------------------------------- 1 | import type { DataEntityGroupItemList as GeneratedDataEntityGroupList } from 'generated-sources'; 2 | import type { InfiniteQueryPageInfo } from './shared'; 3 | 4 | export interface DataEntityGroupList 5 | extends Omit { 6 | pageInfo: InfiniteQueryPageInfo; 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/interfaces/directory.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | DataSourceEntityList as GeneratedDataSourceEntityList, 3 | DataEntityList as GeneratedDataEntityList, 4 | } from 'generated-sources'; 5 | import type { InfiniteQueryPageInfo } from './shared'; 6 | 7 | interface DataEntityList extends Omit { 8 | pageInfo: InfiniteQueryPageInfo; 9 | } 10 | 11 | export interface DataSourceEntityList 12 | extends Omit { 13 | entities: DataEntityList; 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/interfaces/index.ts: -------------------------------------------------------------------------------- 1 | export * from './integration'; 2 | export * from './directory'; 3 | export * from './dataEntity'; 4 | export * from './shared'; 5 | -------------------------------------------------------------------------------- /odd-platform-ui/src/lib/tests/mocks/index.ts: -------------------------------------------------------------------------------- 1 | export * from 'lib/tests/mocks/dataEntityMocks'; 2 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/appInfo.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const appInfoActionPrefix = 'appInfo'; 4 | 5 | export const fetchActiveFeaturesActionType = createActionType( 6 | appInfoActionPrefix, 7 | 'fetchActiveFeatures' 8 | ); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/dataEntityRun.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const dataEntityRunTypePrefix = 'dataEntityRun'; 4 | 5 | export const fetchDataEntityRunsActionType = createActionType( 6 | dataEntityRunTypePrefix, 7 | 'fetchDataSetQualityTestRuns' 8 | ); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/dataentityLineage.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const dataEntityLineageActionTypePrefix = 'dataEntityLineage'; 4 | 5 | export const fetchDataEntityUpstreamLineageActionType = createActionType( 6 | dataEntityLineageActionTypePrefix, 7 | 'fetchDataEntityUpstreamLineage' 8 | ); 9 | 10 | export const fetchDataEntityDownstreamLineageActionType = createActionType( 11 | dataEntityLineageActionTypePrefix, 12 | 'fetchDataEntityDownstreamLineage' 13 | ); 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/dataentityLinkedList.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const dataEntityGroupLinkedListActionTypePrefix = 'dataEntityGroupLinkedList'; 4 | 5 | export const fetchDataEntityGroupLinkedListAction = createActionType( 6 | dataEntityGroupLinkedListActionTypePrefix, 7 | 'fetchDataEntityGroupLinkedList' 8 | ); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/profile.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const profileActionPrefix = 'profile'; 4 | export const fetchIdentityActionType = createActionType( 5 | profileActionPrefix, 6 | 'fetchIdentity' 7 | ); 8 | 9 | export const fetchResourcePermissionsActionType = createActionType( 10 | profileActionPrefix, 11 | 'fetchResourcePermissions' 12 | ); 13 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/roles.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const rolesActTypePrefix = 'roles'; 4 | 5 | export const fetchRolesActType = createActionType(rolesActTypePrefix, 'fetchRoles'); 6 | export const createRoleActType = createActionType(rolesActTypePrefix, 'createRole'); 7 | export const updateRoleActType = createActionType(rolesActTypePrefix, 'updateRole'); 8 | export const deleteRoleActType = createActionType(rolesActTypePrefix, 'deleteRole'); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/tags.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const tagsActTypePrefix = 'tags'; 4 | 5 | export const fetchTagsActType = createActionType(tagsActTypePrefix, 'fetchTags'); 6 | export const createTagsActType = createActionType(tagsActTypePrefix, 'createTags'); 7 | export const updateTagActType = createActionType(tagsActTypePrefix, 'updateTags'); 8 | export const deleteTagActType = createActionType(tagsActTypePrefix, 'deleteTag'); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/actions/termLinkedList.actions.ts: -------------------------------------------------------------------------------- 1 | import { createActionType } from 'redux/lib/helpers'; 2 | 3 | export const termLinkedListActionTypePrefix = 'termLinkedList'; 4 | 5 | export const fetchTermLinkedListAction = createActionType( 6 | termLinkedListActionTypePrefix, 7 | 'fetchTermLinkedList' 8 | ); 9 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/interfaces/activities.ts: -------------------------------------------------------------------------------- 1 | import type { Activity as GeneratedActivity } from 'generated-sources'; 2 | import type { SerializeDateToNumber } from 'redux/interfaces'; 3 | 4 | export type Activity = SerializeDateToNumber; 5 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/interfaces/dataCollaboration.ts: -------------------------------------------------------------------------------- 1 | import type { Message as GeneratedMessage } from 'generated-sources'; 2 | 3 | export interface Message extends Omit { 4 | createdAt: number; 5 | } 6 | 7 | export interface MessagesByDate { 8 | [date: string]: Message[]; 9 | } 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/interfaces/dataQualityTest.ts: -------------------------------------------------------------------------------- 1 | import { type DataQualityTest } from 'generated-sources'; 2 | 3 | export interface DataSetQualityTestsStatusCount { 4 | success: number; 5 | failed: number; 6 | broken: number; 7 | aborted: number; 8 | skipped: number; 9 | unknown: number; 10 | } 11 | 12 | export interface DatasetQualityTestList { 13 | [suiteName: string]: DataQualityTest[]; 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/interfaces/dataentities.ts: -------------------------------------------------------------------------------- 1 | import { 2 | type DataEntity as GeneratedDataEntity, 3 | type DataEntityDetails, 4 | } from 'generated-sources'; 5 | import type { SerializeDateToNumber } from 'redux/interfaces/common'; 6 | 7 | export type DataEntity = SerializeDateToNumber; 8 | 9 | export interface DataEntityDetailsState extends DataEntityDetails { 10 | unknownSourcesCount: number; 11 | unknownTargetsCount: number; 12 | unknownInputsCount: number; 13 | unknownOutputsCount: number; 14 | } 15 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/interfaces/loader.ts: -------------------------------------------------------------------------------- 1 | import type { ErrorResponse } from 'generated-sources'; 2 | 3 | export interface ErrorState { 4 | status: number; 5 | statusText: string; 6 | url: string; 7 | message: ErrorResponse['message']; 8 | } 9 | 10 | export type AsyncRequestStatus = 'initial' | 'pending' | 'fulfilled' | 'rejected'; 11 | 12 | export interface LoaderSliceState { 13 | statuses: { [key: string]: AsyncRequestStatus }; 14 | errors: { [key: string]: ErrorState | undefined }; 15 | } 16 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/lib/hooks.ts: -------------------------------------------------------------------------------- 1 | import { type TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux'; 2 | import type { AppDispatch, RootState } from 'redux/interfaces'; 3 | 4 | export const useAppDispatch = () => useDispatch(); 5 | export const useAppSelector: TypedUseSelectorHook = useSelector; 6 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/lib/unauthenticatedMiddleware.ts: -------------------------------------------------------------------------------- 1 | import { type Middleware } from '@reduxjs/toolkit'; 2 | 3 | export const unauthenticatedMiddleware: Middleware = () => next => action => { 4 | if (action.payload?.status === 401) { 5 | window.location.reload(); 6 | } 7 | 8 | return next(action); 9 | }; 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/selectors/appInfo.selectors.ts: -------------------------------------------------------------------------------- 1 | import { createSelector } from '@reduxjs/toolkit'; 2 | import type { AppInfoState, RootState } from 'redux/interfaces'; 3 | import { emptyArr } from 'lib/constants'; 4 | 5 | const appInfoState = ({ appInfo }: RootState): AppInfoState => appInfo; 6 | 7 | export const getActiveFeatures = createSelector( 8 | appInfoState, 9 | appInfo => appInfo.activeFeatures || emptyArr 10 | ); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/thunks/appInfo.thunks.ts: -------------------------------------------------------------------------------- 1 | import type { Feature } from 'generated-sources'; 2 | import * as actions from 'redux/actions'; 3 | import { handleResponseAsyncThunk } from 'redux/lib/handleResponseThunk'; 4 | import { featureApi } from 'lib/api'; 5 | 6 | export const fetchActiveFeatures = handleResponseAsyncThunk( 7 | actions.fetchActiveFeaturesActionType, 8 | async () => { 9 | const { items } = await featureApi.getActiveFeatures(); 10 | return items; 11 | }, 12 | {} 13 | ); 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/redux/thunks/profile.thunks.ts: -------------------------------------------------------------------------------- 1 | import type { AssociatedOwner } from 'generated-sources'; 2 | import * as actions from 'redux/actions'; 3 | import { handleResponseAsyncThunk } from 'redux/lib/handleResponseThunk'; 4 | import { identityApi } from 'lib/api'; 5 | 6 | export const fetchIdentity = handleResponseAsyncThunk( 7 | actions.fetchIdentityActionType, 8 | async () => await identityApi.whoami(), 9 | {} 10 | ); 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/activityRoutes.ts: -------------------------------------------------------------------------------- 1 | const BASE_PATH = '/activity'; 2 | 3 | export function activityPath(query?: string) { 4 | const queryStr = `?${query}`; 5 | return `${BASE_PATH}${query ? queryStr : ''}`; 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/alertsRoutes.ts: -------------------------------------------------------------------------------- 1 | const BASE_PATH = '/alerts'; 2 | const AlertsRoutes = { 3 | ALL_PATH: `all`, 4 | MY_PATH: `my`, 5 | DEPENDENTS_PATH: `dependents`, 6 | } as const; 7 | 8 | type AlertsRoutesType = typeof AlertsRoutes; 9 | 10 | export function alertsPath(path?: AlertsRoutesType[keyof AlertsRoutesType]) { 11 | if (!path) return BASE_PATH; 12 | return `${BASE_PATH}/${path}`; 13 | } 14 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/dataModelling/dataModelling.ts: -------------------------------------------------------------------------------- 1 | import { generatePath } from 'react-router-dom'; 2 | 3 | export const BASE_PATH = '/data-modelling'; 4 | 5 | export function dataModellingPath() { 6 | return generatePath(BASE_PATH); 7 | } 8 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/dataModelling/index.ts: -------------------------------------------------------------------------------- 1 | export * from './queryExamplesRoutes'; 2 | export * from './relationshipsRoutes'; 3 | export * from './dataModelling'; 4 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/dataModelling/relationshipsRoutes.ts: -------------------------------------------------------------------------------- 1 | import { generatePath } from 'react-router-dom'; 2 | import { BASE_PATH } from './dataModelling'; 3 | 4 | export function relationshipsPath() { 5 | return generatePath(`${BASE_PATH}/relationships`); 6 | } 7 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/dataQualityRoutes.ts: -------------------------------------------------------------------------------- 1 | export function dataQualityPath() { 2 | return '/data-quality'; 3 | } 4 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/index.ts: -------------------------------------------------------------------------------- 1 | export * from './alertsRoutes'; 2 | export * from './dataEntitiesRoutes'; 3 | export * from './dataQualityRoutes'; 4 | export * from './managementRoutes'; 5 | export * from './directoryRoutes'; 6 | export * from './searchRoutes'; 7 | export * from './activityRoutes'; 8 | export * from './termsRoutes'; 9 | export * from './masterDataRoutes'; 10 | export * from './dataModelling'; 11 | -------------------------------------------------------------------------------- /odd-platform-ui/src/routes/masterDataRoutes.ts: -------------------------------------------------------------------------------- 1 | const BASE_PATH = '/master-data'; 2 | export function lookupTablesPath() { 3 | return `${BASE_PATH}/lookup-tables`; 4 | } 5 | -------------------------------------------------------------------------------- /odd-platform-ui/src/setupTests.ts: -------------------------------------------------------------------------------- 1 | import { expect, afterEach } from 'vitest'; 2 | import { cleanup } from '@testing-library/react'; 3 | import matchers from '@testing-library/jest-dom/matchers'; 4 | 5 | expect.extend(matchers); 6 | 7 | afterEach(() => { 8 | cleanup(); 9 | }); 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/theme/breakpoints.ts: -------------------------------------------------------------------------------- 1 | export const breakpoints = { 2 | values: { 3 | xs: 480, 4 | sm: 1025, 5 | md: 1201, 6 | lg: 1441, 7 | xl: 1920, 8 | }, 9 | }; 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/theme/mui.theme.ts: -------------------------------------------------------------------------------- 1 | import { createTheme } from '@mui/material/styles'; 2 | import { breakpoints } from 'theme/breakpoints'; 3 | import { components } from 'theme/overrides'; 4 | import { palette } from 'theme/palette'; 5 | import { shadows } from 'theme/shadows'; 6 | import { typography } from 'theme/typography'; 7 | 8 | const theme = createTheme({ 9 | palette, 10 | breakpoints, 11 | typography, 12 | shadows, 13 | components, 14 | }); 15 | 16 | export default theme; 17 | -------------------------------------------------------------------------------- /odd-platform-ui/src/theme/shadows.ts: -------------------------------------------------------------------------------- 1 | import type { Shadows } from '@mui/material/styles/shadows'; 2 | 3 | export const shadows: Shadows = new Array(25).fill('none') as Shadows; 4 | shadows[1] = '0 2px 6px 0 rgba(70, 73, 77, 0.2)'; 5 | shadows[2] = '0 -2px 2px 0 rgba(0, 0, 0, 0.1)'; 6 | shadows[3] = '0 1px 6px 0 rgba(70, 73, 77, 0.1)'; 7 | shadows[6] = '0px 3px 6px 0px rgba(0, 0, 0, 0.12)'; 8 | shadows[8] = '0px 2px 6px rgb(0 0 0 / 10%)'; 9 | shadows[9] = '0px 3px 12px rgba(0, 0, 0, 0.12)'; 10 | -------------------------------------------------------------------------------- /odd-platform-ui/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | interface ImportMetaEnv { 4 | readonly VITE_API_URL: string; 5 | readonly VITE_DEV_PROXY: string; 6 | } 7 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'odd-platform' 2 | 3 | include 'odd-platform-api-contract', 'odd-platform-api', 'odd-platform-ui' 4 | -------------------------------------------------------------------------------- /tests/.eslintignore: -------------------------------------------------------------------------------- 1 | # Specify files you do not want to lint 2 | dist/ 3 | playwright-report/ -------------------------------------------------------------------------------- /tests/.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /tests/.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | cd ./tests && npx lint-staged 5 | -------------------------------------------------------------------------------- /tests/.nvmrc: -------------------------------------------------------------------------------- 1 | v18.9.0 2 | -------------------------------------------------------------------------------- /tests/.prettierignore: -------------------------------------------------------------------------------- 1 | # artifacts: 2 | build 3 | coverage 4 | playwright-report 5 | dist/ 6 | 7 | # markdown files 8 | *.md 9 | -------------------------------------------------------------------------------- /tests/.prettierrc.json: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /tests/api/app-service.ts: -------------------------------------------------------------------------------- 1 | import { MyProfile } from './interfaces/my-profile'; 2 | import pilot from './pilot'; 3 | 4 | export default class AppService { 5 | /** 6 | * Gets current user profile data 7 | */ 8 | static async getProfileData(): Promise { 9 | return (await pilot.get('user/my-profile')).data; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/api/auth.ts: -------------------------------------------------------------------------------- 1 | import APIBase from './api-base'; 2 | 3 | class Auth extends APIBase { 4 | constructor() { 5 | super('auth', 'v1/'); 6 | } 7 | } 8 | 9 | export default new Auth(); 10 | -------------------------------------------------------------------------------- /tests/api/pilot.ts: -------------------------------------------------------------------------------- 1 | import APIBase from './api-base'; 2 | 3 | class Pilot extends APIBase { 4 | constructor() { 5 | super('pilot', 'api/v2/'); 6 | 7 | this.axiosInstance.interceptors.request.use(config => { 8 | config.headers.common.Authorization = `Bearer ${APIBase.token}`; 9 | config.headers.common.referer = this.referer; 10 | 11 | return config; 12 | }); 13 | } 14 | } 15 | 16 | export default new Pilot(); 17 | -------------------------------------------------------------------------------- /tests/common-utilities/array-utils.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Gets a unique list of objects by key 3 | * 4 | * @param arr 5 | * @param key 6 | * @returns 7 | */ 8 | export function getUniqueListBy(arr: Record[], key: string) { 9 | return [...new Map(arr.map(item => [item[key], item])).values()]; 10 | } 11 | -------------------------------------------------------------------------------- /tests/config/custom.d.ts: -------------------------------------------------------------------------------- 1 | declare global { 2 | namespace NodeJS { 3 | interface Global { 4 | workerId: string; 5 | } 6 | } 7 | } 8 | 9 | export default global; 10 | -------------------------------------------------------------------------------- /tests/config/environments.json: -------------------------------------------------------------------------------- 1 | { 2 | "odd": { 3 | "main_test": "http://localhost:8080/login" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /tests/config/test-name-utils.ts: -------------------------------------------------------------------------------- 1 | export const titleWithoutTags = (title: string) => title.replace(/(@\w+)(?:\W\d+)*/gi, '').trim(); 2 | export const testName = (titlePath: string[]) => 3 | titlePath 4 | .filter(nonEmpty => nonEmpty.length > 0) 5 | .map(titleWithoutTags) 6 | .join(`_`) 7 | .replace(/[\s+_/\\.]/gi, '_') 8 | .toLowerCase(); 9 | -------------------------------------------------------------------------------- /tests/config/users.json: -------------------------------------------------------------------------------- 1 | { 2 | "odd": { 3 | "admin": { 4 | "username": "qaadmin@odd.com", 5 | "password": "Ten342@7geJ!" 6 | } 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tests/docker/.env: -------------------------------------------------------------------------------- 1 | POSTGRES_USER=odd-platform 2 | POSTGRES_PASSWORD=odd-platform-password 3 | POSTGRES_DATABASE=odd-platform 4 | 5 | PLATFORM_HOST_URL=http://odd-platform:8080 6 | 7 | SAMPLE_POSTGRES_USER=sample_odd_platform 8 | SAMPLE_POSTGRES_PASSWORD=sample_odd_platform_password 9 | SAMPLE_POSTGRES_DATABASE=sample_odd_platform -------------------------------------------------------------------------------- /tests/docker/up-platform.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # start platform 4 | echo "starting infra with ODD Platform with a metadata sample in it..." 5 | docker-compose -f ./docker/docker-compose.yaml up odd-platform-enricher 6 | 7 | echo "now you can open http://localhost:8080/management/datasources in your browser" 8 | echo "You should be able to see predefined data sources in the list" 9 | echo "Go to the Catalog section. You should be able to see metadata sample injected in the Platform" 10 | -------------------------------------------------------------------------------- /tests/envs/.env: -------------------------------------------------------------------------------- 1 | API_KEYS="{}" 2 | THIRD_PARTY_CREDENTIALS={} 3 | -------------------------------------------------------------------------------- /tests/tsconfig.eslint.json: -------------------------------------------------------------------------------- 1 | // Special typescript project file, used by ESLint only 2 | { 3 | "extends": "./tsconfig.json", 4 | "include": [ 5 | // these are the eslint-only inclusions 6 | ".eslintrc.js" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /tests/ui/elements/checkbox.ts: -------------------------------------------------------------------------------- 1 | import CustomElement from './custom-element'; 2 | 3 | export default class Checkbox extends CustomElement { 4 | /** 5 | * Clicks on the checkbox 6 | */ 7 | async click() { 8 | await this.waitForElementToBeVisible(); 9 | await this.customElement.click(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/ui/elements/file-chooser.ts: -------------------------------------------------------------------------------- 1 | import { FileData } from '../../common-utilities/interfaces/shared'; 2 | 3 | import Button from './button'; 4 | 5 | export default class FileChooser extends Button { 6 | /** 7 | * 8 | * @param root0 9 | * @param root0.filepath 10 | */ 11 | async uploadDocument({ filepath }: FileData) { 12 | const [fileChooser] = await Promise.all([ 13 | this.context.waitForEvent('filechooser'), 14 | this.customElement.click(), 15 | ]); 16 | 17 | await fileChooser.setFiles(filepath); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tests/ui/elements/radio.ts: -------------------------------------------------------------------------------- 1 | import CustomElement from './custom-element'; 2 | 3 | export default class Radio extends CustomElement { 4 | /** 5 | * Clicks on the toggle 6 | */ 7 | async click() { 8 | await this.waitForElementToBeVisible(); 9 | await this.customElement.click(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/ui/elements/toggle.ts: -------------------------------------------------------------------------------- 1 | import CustomElement from './custom-element'; 2 | 3 | export default class Toggle extends CustomElement { 4 | /** 5 | * Clicks on the toggle 6 | */ 7 | async click() { 8 | await this.waitForElementToBeVisible(); 9 | await this.customElement.click(); 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /tests/ui/pages/data_entity/data_entity.page.ts: -------------------------------------------------------------------------------- 1 | import BasePage from '../base-page'; 2 | 3 | type Tab = 'Overview' | 'History' | 'Alerts' | 'Activity'; 4 | 5 | const SELECTORS = { 6 | sharedNavigation: (tab: string) => `span:has-text("${tab}")`, 7 | }; 8 | 9 | export default class DataEntityPage extends BasePage { 10 | async clickTab(tabName: Tab) { 11 | await this.page.click(SELECTORS.sharedNavigation(tabName)); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /tests/ui/pages/management/collectors-page.ts: -------------------------------------------------------------------------------- 1 | import ManagementPage from './management-page'; 2 | 3 | const SELECTORS = {}; 4 | 5 | export default class CollectorsPage extends ManagementPage {} 6 | -------------------------------------------------------------------------------- /tests/ui/pages/management/datasources-page.ts: -------------------------------------------------------------------------------- 1 | import ManagementPage from './management-page'; 2 | 3 | const SELECTORS = {}; 4 | 5 | export default class DatasourcesPage extends ManagementPage {} 6 | -------------------------------------------------------------------------------- /tests/ui/pages/management/labels-page.ts: -------------------------------------------------------------------------------- 1 | import ManagementPage from './management-page'; 2 | 3 | const SELECTORS = {}; 4 | 5 | export default class LabelsPage extends ManagementPage {} 6 | -------------------------------------------------------------------------------- /tests/ui/pages/management/management-page.ts: -------------------------------------------------------------------------------- 1 | import Button from '../../elements/button'; 2 | import BasePage from '../base-page'; 3 | 4 | const SELECTORS = { 5 | owners: 'a:has-text("Owners")', 6 | tags: 'a:has-text("Tags")', 7 | }; 8 | 9 | export default class ManagementPage extends BasePage { 10 | get owners() { 11 | return new Button(this.page, SELECTORS.owners); 12 | } 13 | 14 | get tags() { 15 | return new Button(this.page, SELECTORS.tags); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /tests/ui/pages/management/namespaces-page.ts: -------------------------------------------------------------------------------- 1 | import ManagementPage from './management-page'; 2 | 3 | const SELECTORS = {}; 4 | 5 | export default class NamespacesPage extends ManagementPage {} 6 | -------------------------------------------------------------------------------- /tests/ui/steps/base-step.ts: -------------------------------------------------------------------------------- 1 | import { Page } from '@playwright/test'; 2 | 3 | import { Steps } from './index'; 4 | 5 | export type StepArgs = { 6 | page: Page; 7 | steps: Steps; 8 | }; 9 | 10 | export default abstract class BaseStep { 11 | constructor( 12 | args: StepArgs, 13 | protected readonly page = args.page, 14 | protected readonly pages = args.steps.pages, 15 | protected readonly steps = args.steps, 16 | ) {} 17 | } 18 | -------------------------------------------------------------------------------- /tests/ui/steps/go-to-steps.ts: -------------------------------------------------------------------------------- 1 | import BaseStep from './base-step'; 2 | 3 | /** 4 | * class for entrypoints to site - urls you can visit directly/routes you take often 5 | */ 6 | export default class GoToSteps extends BaseStep { 7 | /** 8 | * 9 | */ 10 | async catalog() { 11 | await this.pages.topPanel.clickTab('Catalog'); 12 | } 13 | 14 | /** 15 | * 16 | */ 17 | async management() { 18 | await this.pages.topPanel.clickTab('Management'); 19 | } 20 | } 21 | --------------------------------------------------------------------------------