diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIEndpointRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIEndpointRepository.java index 3d0f43fabaf..341fa1ca724 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIEndpointRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/APIEndpointRepository.java @@ -74,11 +74,13 @@ public class APIEndpointRepository extends EntityRepository { apiEndpoint.getApiCollection().getFullyQualifiedName(), apiEndpoint.getName())); if (apiEndpoint.getRequestSchema() != null) { setFieldFQN( - apiEndpoint.getFullyQualifiedName(), apiEndpoint.getRequestSchema().getSchemaFields()); + apiEndpoint.getFullyQualifiedName() + ".requestSchema", + apiEndpoint.getRequestSchema().getSchemaFields()); } if (apiEndpoint.getResponseSchema() != null) { setFieldFQN( - apiEndpoint.getFullyQualifiedName(), apiEndpoint.getResponseSchema().getSchemaFields()); + apiEndpoint.getFullyQualifiedName() + ".responseSchema", + apiEndpoint.getResponseSchema().getSchemaFields()); } } @@ -147,14 +149,14 @@ public class APIEndpointRepository extends EntityRepository { populateEntityFieldTags( entityType, apiEndpoint.getRequestSchema().getSchemaFields(), - apiEndpoint.getFullyQualifiedName(), + apiEndpoint.getFullyQualifiedName() + ".requestSchema", fields.contains(FIELD_TAGS)); } if (apiEndpoint.getResponseSchema() != null) { populateEntityFieldTags( entityType, apiEndpoint.getResponseSchema().getSchemaFields(), - apiEndpoint.getFullyQualifiedName(), + apiEndpoint.getFullyQualifiedName() + ".responseSchema", fields.contains(FIELD_TAGS)); } } @@ -242,7 +244,7 @@ public class APIEndpointRepository extends EntityRepository { // Add table level tags by adding tag to table relationship super.applyTags(apiEndpoint); if (apiEndpoint.getRequestSchema() != null) { - applyTags(apiEndpoint.getResponseSchema().getSchemaFields()); + applyTags(apiEndpoint.getRequestSchema().getSchemaFields()); } if (apiEndpoint.getResponseSchema() != null) { applyTags(apiEndpoint.getResponseSchema().getSchemaFields()); @@ -270,11 +272,18 @@ public class APIEndpointRepository extends EntityRepository { List allTags = new ArrayList<>(); APIEndpoint apiEndpoint = (APIEndpoint) entity; EntityUtil.mergeTags(allTags, apiEndpoint.getTags()); - List schemaFields = + List requestSchemaFields = + apiEndpoint.getRequestSchema() != null + ? apiEndpoint.getRequestSchema().getSchemaFields() + : null; + List responseSchemaFields = apiEndpoint.getResponseSchema() != null ? apiEndpoint.getResponseSchema().getSchemaFields() : null; - for (Field schemaField : listOrEmpty(schemaFields)) { + for (Field schemaField : listOrEmpty(responseSchemaFields)) { + EntityUtil.mergeTags(allTags, schemaField.getTags()); + } + for (Field schemaField : listOrEmpty(requestSchemaFields)) { EntityUtil.mergeTags(allTags, schemaField.getTags()); } return allTags; diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java index ff888efadff..370b7c329b4 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/search/SearchRepository.java @@ -389,9 +389,9 @@ public class SearchRepository { } else { parentMatch = new ImmutablePair<>(entityType + ".id", entityId); } - if (updates.getKey() != null && !updates.getKey().isEmpty()) { - searchClient.updateChildren( - indexMapping.getChildAliases(clusterAlias), parentMatch, updates); + List childAliases = indexMapping.getChildAliases(clusterAlias); + if (updates.getKey() != null && !updates.getKey().isEmpty() && !nullOrEmpty(childAliases)) { + searchClient.updateChildren(childAliases, parentMatch, updates); } } } diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/apis/APIEndpointResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/apis/APIEndpointResourceTest.java index dd6af7fb2ba..2f3e81bbd61 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/apis/APIEndpointResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/apis/APIEndpointResourceTest.java @@ -42,9 +42,11 @@ import org.openmetadata.schema.type.ChangeDescription; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Field; import org.openmetadata.schema.type.FieldDataType; +import org.openmetadata.schema.type.TagLabel; import org.openmetadata.service.Entity; import org.openmetadata.service.resources.EntityResourceTest; import org.openmetadata.service.util.FullyQualifiedName; +import org.openmetadata.service.util.JsonUtils; import org.openmetadata.service.util.ResultList; import org.openmetadata.service.util.TestUtils; @@ -155,6 +157,115 @@ public class APIEndpointResourceTest extends EntityResourceTest fields = endpoint.getResponseSchema().getSchemaFields(); + assertFields(api_response_fields, fields); + fields.get(0).getTags().add(PERSONAL_DATA_TAG_LABEL); + fields.get(0).getTags().add(PII_SENSITIVE_TAG_LABEL); + endpoint.getResponseSchema().setSchemaFields(fields); + patchEntity(endpoint.getId(), endpointJson, endpoint, ADMIN_AUTH_HEADERS); + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + fields = endpoint.getResponseSchema().getSchemaFields(); + List tags = fields.get(0).getTags(); + for (TagLabel tag : tags) { + assertTrue(tag.equals(PERSONAL_DATA_TAG_LABEL) || tag.equals(PII_SENSITIVE_TAG_LABEL)); + } + endpointJson = JsonUtils.pojoToJson(endpoint); + fields = endpoint.getResponseSchema().getSchemaFields(); + fields.get(0).getTags().remove(PERSONAL_DATA_TAG_LABEL); + endpoint.getResponseSchema().setSchemaFields(fields); + patchEntity(endpoint.getId(), endpointJson, endpoint, ADMIN_AUTH_HEADERS); + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + fields = endpoint.getResponseSchema().getSchemaFields(); + tags = fields.get(0).getTags(); + assertEquals(1, tags.size()); + for (TagLabel tag : tags) { + assertEquals(tag, PII_SENSITIVE_TAG_LABEL); + } + + // add 2 new tags + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + endpointJson = JsonUtils.pojoToJson(endpoint); + fields = endpoint.getResponseSchema().getSchemaFields(); + fields.get(0).getTags().add(PERSONAL_DATA_TAG_LABEL); + fields.get(0).getTags().add(USER_ADDRESS_TAG_LABEL); + patchEntity(endpoint.getId(), endpointJson, endpoint, ADMIN_AUTH_HEADERS); + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + fields = endpoint.getResponseSchema().getSchemaFields(); + tags = fields.get(0).getTags(); + assertEquals(3, tags.size()); + for (TagLabel tag : tags) { + assertTrue( + tag.equals(PERSONAL_DATA_TAG_LABEL) + || tag.equals(PII_SENSITIVE_TAG_LABEL) + || tag.equals(USER_ADDRESS_TAG_LABEL)); + } + + // remove 1 tag + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + endpointJson = JsonUtils.pojoToJson(endpoint); + fields = endpoint.getResponseSchema().getSchemaFields(); + fields.get(0).getTags().remove(PERSONAL_DATA_TAG_LABEL); + patchEntity(endpoint.getId(), endpointJson, endpoint, ADMIN_AUTH_HEADERS); + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + fields = endpoint.getResponseSchema().getSchemaFields(); + tags = fields.get(0).getTags(); + assertEquals(2, tags.size()); + for (TagLabel tag : tags) { + assertTrue(tag.equals(PII_SENSITIVE_TAG_LABEL) || tag.equals(USER_ADDRESS_TAG_LABEL)); + } + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + endpointJson = JsonUtils.pojoToJson(endpoint); + endpoint.setRequestSchema(RESPONSE_SCHEMA); + patchEntity(endpoint.getId(), endpointJson, endpoint, ADMIN_AUTH_HEADERS); + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + List requestFields = endpoint.getRequestSchema().getSchemaFields(); + assertFields(api_response_fields, requestFields); + requestFields.get(0).getTags().add(PII_SENSITIVE_TAG_LABEL); + requestFields.get(0).getTags().add(USER_ADDRESS_TAG_LABEL); + patchEntity(endpoint.getId(), endpointJson, endpoint, ADMIN_AUTH_HEADERS); + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + endpointJson = JsonUtils.pojoToJson(endpoint); + requestFields = endpoint.getRequestSchema().getSchemaFields(); + fields = endpoint.getResponseSchema().getSchemaFields(); + requestFields.get(0).getTags().remove(PII_SENSITIVE_TAG_LABEL); + fields.get(0).getTags().remove(USER_ADDRESS_TAG_LABEL); + patchEntity(endpoint.getId(), endpointJson, endpoint, ADMIN_AUTH_HEADERS); + endpoint = getAPIEndpoint(apiEndpoint.getId(), "tags", ADMIN_AUTH_HEADERS); + requestFields = endpoint.getRequestSchema().getSchemaFields(); + fields = endpoint.getResponseSchema().getSchemaFields(); + assertEquals(1, requestFields.get(0).getTags().size()); + assertEquals(1, fields.get(0).getTags().size()); + assertEquals(USER_ADDRESS_TAG_LABEL, requestFields.get(0).getTags().get(0)); + assertEquals(PII_SENSITIVE_TAG_LABEL, fields.get(0).getTags().get(0)); + } + @Override public CreateAPIEndpoint createRequest(String name) { return new CreateAPIEndpoint()