diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java index 3f8ceaae9d8..eb102e904b6 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java @@ -24,6 +24,7 @@ import org.openmetadata.schema.entity.data.Database; import org.openmetadata.schema.entity.services.DatabaseService; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Relationship; +import org.openmetadata.schema.type.TagLabel; import org.openmetadata.service.Entity; import org.openmetadata.service.exception.CatalogExceptionMessage; import org.openmetadata.service.jdbi3.CollectionDAO.EntityRelationshipRecord; @@ -33,7 +34,7 @@ import org.openmetadata.service.util.EntityUtil.Fields; import org.openmetadata.service.util.FullyQualifiedName; public class DatabaseRepository extends EntityRepository { - private static final String DATABASE_UPDATE_FIELDS = "owner"; + private static final String DATABASE_UPDATE_FIELDS = "owner,tags"; private static final String DATABASE_PATCH_FIELDS = DATABASE_UPDATE_FIELDS; public DatabaseRepository(CollectionDAO dao) { @@ -67,14 +68,14 @@ public class DatabaseRepository extends EntityRepository { // Relationships and fields such as href are derived and not stored as part of json EntityReference owner = database.getOwner(); EntityReference service = database.getService(); - + List tags = database.getTags(); // Don't store owner, database, href and tags as JSON. Build it on the fly based on relationships - database.withOwner(null).withService(null).withHref(null); + database.withOwner(null).withService(null).withHref(null).withTags(null); store(database, update); // Restore the relationships - database.withOwner(owner).withService(service); + database.withOwner(owner).withService(service).withTags(tags); } @Override @@ -82,6 +83,8 @@ public class DatabaseRepository extends EntityRepository { EntityReference service = database.getService(); addRelationship(service.getId(), database.getId(), service.getType(), Entity.DATABASE, Relationship.CONTAINS); storeOwner(database, database.getOwner()); + // Add tag to database relationship + applyTags(database); } private List getSchemas(Database database) throws IOException { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java index e3f27bef8b3..5b21e89a469 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java @@ -16,11 +16,13 @@ import static org.openmetadata.service.Entity.FIELD_OWNER; import static org.openmetadata.service.util.EntityUtil.objectMatch; import java.io.IOException; +import java.util.List; import lombok.Getter; import org.openmetadata.schema.ServiceConnectionEntityInterface; import org.openmetadata.schema.ServiceEntityInterface; import org.openmetadata.schema.entity.services.ServiceType; import org.openmetadata.schema.type.EntityReference; +import org.openmetadata.schema.type.TagLabel; import org.openmetadata.service.secrets.SecretsManager; import org.openmetadata.service.secrets.SecretsManagerFactory; import org.openmetadata.service.util.EntityUtil; @@ -29,7 +31,8 @@ import org.openmetadata.service.util.JsonUtils; public abstract class ServiceEntityRepository< T extends ServiceEntityInterface, S extends ServiceConnectionEntityInterface> extends EntityRepository { - private static final String UPDATE_FIELDS = "owner"; + private static final String UPDATE_FIELDS = "owner,tags"; + private static final String PATCH_FIELDS = UPDATE_FIELDS; @Getter private final Class serviceConnectionClass; @@ -53,7 +56,7 @@ public abstract class ServiceEntityRepository< Class serviceConnectionClass, String updatedFields, ServiceType serviceType) { - super(collectionPath, service, entityDAO.getEntityClass(), entityDAO, dao, "", updatedFields); + super(collectionPath, service, entityDAO.getEntityClass(), entityDAO, dao, PATCH_FIELDS, updatedFields); this.serviceConnectionClass = serviceConnectionClass; this.serviceType = serviceType; } @@ -74,9 +77,9 @@ public abstract class ServiceEntityRepository< public void storeEntity(T service, boolean update) throws IOException { // Relationships and fields such as href are derived and not stored as part of json EntityReference owner = service.getOwner(); - + List tags = service.getTags(); // Don't store owner, service, href and tags as JSON. Build it on the fly based on relationships - service.withOwner(null).withHref(null); + service.withOwner(null).withHref(null).setTags(null); service .getConnection() @@ -92,13 +95,15 @@ public abstract class ServiceEntityRepository< store(service, update); // Restore the relationships - service.withOwner(owner); + service.withOwner(owner).setTags(tags); } @Override public void storeRelationships(T service) { // Add owner relationship storeOwner(service, service.getOwner()); + // add tags relationship + applyTags(service); } @Override diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java index 9ad67ab4910..9310527400a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/databases/DatabaseResource.java @@ -85,7 +85,7 @@ public class DatabaseResource extends EntityResource { public static final String COLLECTION_PATH = "v1/services/databaseServices/"; - static final String FIELDS = "pipelines,owner"; + static final String FIELDS = "pipelines,owner,tags"; @Override public DatabaseService addHref(UriInfo uriInfo, DatabaseService service) { @@ -322,6 +327,32 @@ public class DatabaseServiceResource return response; } + @PATCH + @Path("/{id}") + @Operation( + operationId = "patchDatabaseService", + summary = "Update a database service", + tags = "databaseServices", + description = "Update an existing database service using JsonPatch.", + externalDocs = @ExternalDocumentation(description = "JsonPatch RFC", url = "https://tools.ietf.org/html/rfc6902")) + @Consumes(MediaType.APPLICATION_JSON_PATCH_JSON) + public Response patch( + @Context UriInfo uriInfo, + @Context SecurityContext securityContext, + @PathParam("id") UUID id, + @RequestBody( + description = "JsonPatch with array of operations", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON_PATCH_JSON, + examples = { + @ExampleObject("[" + "{op:remove, path:/a}," + "{op:add, path: /b, value: val}" + "]") + })) + JsonPatch patch) + throws IOException { + return patchInternal(uriInfo, securityContext, id, patch); + } + @DELETE @Path("/{id}") @Operation( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/messaging/MessagingServiceResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/messaging/MessagingServiceResource.java index e4505b90b83..459e439304d 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/messaging/MessagingServiceResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/messaging/MessagingServiceResource.java @@ -16,15 +16,19 @@ package org.openmetadata.service.resources.services.messaging; import static org.openmetadata.service.Entity.FIELD_OWNER; import io.swagger.annotations.Api; +import io.swagger.v3.oas.annotations.ExternalDocumentation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import java.io.IOException; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; +import javax.json.JsonPatch; import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.Min; @@ -32,6 +36,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; +import javax.ws.rs.PATCH; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -319,6 +324,32 @@ public class MessagingServiceResource return response; } + @PATCH + @Path("/{id}") + @Operation( + operationId = "patchMessagingService", + summary = "Update a Messaging Service", + tags = "messagingServices", + description = "Update an existing messaging service using JsonPatch.", + externalDocs = @ExternalDocumentation(description = "JsonPatch RFC", url = "https://tools.ietf.org/html/rfc6902")) + @Consumes(MediaType.APPLICATION_JSON_PATCH_JSON) + public Response patch( + @Context UriInfo uriInfo, + @Context SecurityContext securityContext, + @PathParam("id") UUID id, + @RequestBody( + description = "JsonPatch with array of operations", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON_PATCH_JSON, + examples = { + @ExampleObject("[" + "{op:remove, path:/a}," + "{op:add, path: /b, value: val}" + "]") + })) + JsonPatch patch) + throws IOException { + return patchInternal(uriInfo, securityContext, id, patch); + } + @DELETE @Path("/{id}") @Operation( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/metadata/MetadataServiceResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/metadata/MetadataServiceResource.java index 581b1a6edc7..7ee0bd8cc48 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/metadata/MetadataServiceResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/metadata/MetadataServiceResource.java @@ -1,16 +1,20 @@ package org.openmetadata.service.resources.services.metadata; import io.swagger.annotations.Api; +import io.swagger.v3.oas.annotations.ExternalDocumentation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import java.io.IOException; import java.util.List; import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; +import javax.json.JsonPatch; import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.Min; @@ -18,6 +22,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; +import javax.ws.rs.PATCH; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -65,7 +70,7 @@ import org.openmetadata.service.util.ResultList; public class MetadataServiceResource extends ServiceEntityResource { public static final String COLLECTION_PATH = "v1/services/metadataServices/"; - public static final String FIELDS = "pipelines,owner"; + public static final String FIELDS = "pipelines,owner,tags"; public void initialize(OpenMetadataApplicationConfig config) throws IOException { registerMetadataServices(config); @@ -352,6 +357,32 @@ public class MetadataServiceResource return response; } + @PATCH + @Path("/{id}") + @Operation( + operationId = "patchMetadataService", + summary = "Update a Metadata service", + tags = "metadataService", + description = "Update an existing Metadata service using JsonPatch.", + externalDocs = @ExternalDocumentation(description = "JsonPatch RFC", url = "https://tools.ietf.org/html/rfc6902")) + @Consumes(MediaType.APPLICATION_JSON_PATCH_JSON) + public Response patch( + @Context UriInfo uriInfo, + @Context SecurityContext securityContext, + @PathParam("id") UUID id, + @RequestBody( + description = "JsonPatch with array of operations", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON_PATCH_JSON, + examples = { + @ExampleObject("[" + "{op:remove, path:/a}," + "{op:add, path: /b, value: val}" + "]") + })) + JsonPatch patch) + throws IOException { + return patchInternal(uriInfo, securityContext, id, patch); + } + @DELETE @Path("/{id}") @Operation( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/mlmodel/MlModelServiceResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/mlmodel/MlModelServiceResource.java index 8162945fc50..bf17fab071d 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/mlmodel/MlModelServiceResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/mlmodel/MlModelServiceResource.java @@ -14,15 +14,19 @@ package org.openmetadata.service.resources.services.mlmodel; import io.swagger.annotations.Api; +import io.swagger.v3.oas.annotations.ExternalDocumentation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import java.io.IOException; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; +import javax.json.JsonPatch; import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.Min; @@ -30,6 +34,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; +import javax.ws.rs.PATCH; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -68,7 +73,7 @@ public class MlModelServiceResource extends ServiceEntityResource { public static final String COLLECTION_PATH = "v1/services/mlmodelServices/"; - public static final String FIELDS = "pipelines,owner"; + public static final String FIELDS = "pipelines,owner,tags"; @Override public MlModelService addHref(UriInfo uriInfo, MlModelService service) { @@ -318,6 +323,32 @@ public class MlModelServiceResource return response; } + @PATCH + @Path("/{id}") + @Operation( + operationId = "patchMlModelService", + summary = "Update a MlModel service", + tags = "mlModelServices", + description = "Update an existing MlModelService service using JsonPatch.", + externalDocs = @ExternalDocumentation(description = "JsonPatch RFC", url = "https://tools.ietf.org/html/rfc6902")) + @Consumes(MediaType.APPLICATION_JSON_PATCH_JSON) + public Response patch( + @Context UriInfo uriInfo, + @Context SecurityContext securityContext, + @PathParam("id") UUID id, + @RequestBody( + description = "JsonPatch with array of operations", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON_PATCH_JSON, + examples = { + @ExampleObject("[" + "{op:remove, path:/a}," + "{op:add, path: /b, value: val}" + "]") + })) + JsonPatch patch) + throws IOException { + return patchInternal(uriInfo, securityContext, id, patch); + } + @DELETE @Path("/{id}") @Operation( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/pipeline/PipelineServiceResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/pipeline/PipelineServiceResource.java index 69896a91c94..1b4953b4e3f 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/pipeline/PipelineServiceResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/services/pipeline/PipelineServiceResource.java @@ -14,15 +14,19 @@ package org.openmetadata.service.resources.services.pipeline; import io.swagger.annotations.Api; +import io.swagger.v3.oas.annotations.ExternalDocumentation; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.ExampleObject; import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import java.io.IOException; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; +import javax.json.JsonPatch; import javax.validation.Valid; import javax.validation.constraints.Max; import javax.validation.constraints.Min; @@ -30,6 +34,7 @@ import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.DefaultValue; import javax.ws.rs.GET; +import javax.ws.rs.PATCH; import javax.ws.rs.POST; import javax.ws.rs.PUT; import javax.ws.rs.Path; @@ -317,6 +322,32 @@ public class PipelineServiceResource return response; } + @PATCH + @Path("/{id}") + @Operation( + operationId = "patchPipelineService", + summary = "Update a Pipeline Service", + tags = "pipelineServices", + description = "Update an existing pipeline service using JsonPatch.", + externalDocs = @ExternalDocumentation(description = "JsonPatch RFC", url = "https://tools.ietf.org/html/rfc6902")) + @Consumes(MediaType.APPLICATION_JSON_PATCH_JSON) + public Response patch( + @Context UriInfo uriInfo, + @Context SecurityContext securityContext, + @PathParam("id") UUID id, + @RequestBody( + description = "JsonPatch with array of operations", + content = + @Content( + mediaType = MediaType.APPLICATION_JSON_PATCH_JSON, + examples = { + @ExampleObject("[" + "{op:remove, path:/a}," + "{op:add, path: /b, value: val}" + "]") + })) + JsonPatch patch) + throws IOException { + return patchInternal(uriInfo, securityContext, id, patch); + } + @DELETE @Path("/{id}") @Operation( diff --git a/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java b/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java index c79e039297b..3f54b24742d 100644 --- a/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java +++ b/openmetadata-service/src/test/java/org/openmetadata/service/resources/databases/DatabaseResourceTest.java @@ -125,7 +125,7 @@ public class DatabaseResourceTest extends EntityResourceTest