diff --git a/dao-api/src/main/java/com/linkedin/metadata/dao/GenericLocalDAO.java b/dao-api/src/main/java/com/linkedin/metadata/dao/GenericLocalDAO.java index 3eb980a2a..0f62fe33c 100644 --- a/dao-api/src/main/java/com/linkedin/metadata/dao/GenericLocalDAO.java +++ b/dao-api/src/main/java/com/linkedin/metadata/dao/GenericLocalDAO.java @@ -54,4 +54,13 @@ void save(@Nonnull Urn urn, @Nonnull Class aspectClass, @Nonnull String metadata */ Map, Optional>> backfill(@Nonnull BackfillMode mode, @Nonnull Map>> urnToAspect); + + /** + * Delete the metadata from database. + * + * @param urn The identifier of the entity which the metadata is associated with. + * @param aspectClass The aspect class for the metadata. + * @param auditStamp audit stamp containing information on who and when the metadata is deleted. + */ + void delete(@Nonnull Urn urn, @Nonnull Class aspectClass, @Nonnull AuditStamp auditStamp); } diff --git a/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanGenericLocalDAO.java b/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanGenericLocalDAO.java index 9e26971ae..bfe2780ff 100644 --- a/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanGenericLocalDAO.java +++ b/dao-impl/ebean-dao/src/main/java/com/linkedin/metadata/dao/EbeanGenericLocalDAO.java @@ -87,9 +87,19 @@ public void setEqualityTesters(Map equalityTesters */ public void save(@Nonnull Urn urn, @Nonnull Class aspectClass, @Nonnull String metadata, @Nonnull AuditStamp auditStamp, @Nullable IngestionTrackingContext trackingContext, @Nullable IngestionMode ingestionMode) { + saveCommon(urn, aspectClass, metadata, auditStamp, trackingContext, ingestionMode); + } + + /* a common helper method for saving metadata */ + void saveCommon(@Nonnull Urn urn, @Nonnull Class aspectClass, @Nullable String metadata, @Nonnull AuditStamp auditStamp, + @Nullable IngestionTrackingContext trackingContext, @Nullable IngestionMode ingestionMode) { runInTransactionWithRetry(() -> { final Optional latest = queryLatest(urn, aspectClass); - RecordTemplate newValue = toRecordTemplate(aspectClass, metadata); + + RecordTemplate newValue = null; + if (metadata != null) { + newValue = toRecordTemplate(aspectClass, metadata); + } if (!latest.isPresent()) { saveLatest(urn, aspectClass, newValue, null, auditStamp, null); @@ -170,6 +180,11 @@ public Map, Optional backfill( throw new RestLiServiceException(HttpStatus.S_400_BAD_REQUEST, String.format("Urn %s is malformed.", urn)); } } + + @Action(name = ACTION_DELETE) + @Nonnull + public Task delete( + @ActionParam(PARAM_URN) @Nonnull String urn, + @ActionParam(PARAM_ASPECT_CLASS) @Nonnull String aspectClass) { + final AuditStamp auditStamp = getAuditor().requestAuditStamp(getContext().getRawRequestContext()); + + try { + Class clazz = this.getClass().getClassLoader().loadClass(aspectClass); + genericLocalDAO().delete(Urn.createFromCharSequence(urn), clazz, auditStamp); + return Task.value(null); + } catch (ClassNotFoundException e) { + throw new RestLiServiceException(HttpStatus.S_400_BAD_REQUEST, String.format("No such class %s.", aspectClass)); + } catch (URISyntaxException e) { + throw new RestLiServiceException(HttpStatus.S_400_BAD_REQUEST, String.format("Urn %s is malformed.", urn)); + } + } } \ No newline at end of file diff --git a/restli-resources/src/main/java/com/linkedin/metadata/restli/RestliConstants.java b/restli-resources/src/main/java/com/linkedin/metadata/restli/RestliConstants.java index 42622c5d2..cdf865947 100644 --- a/restli-resources/src/main/java/com/linkedin/metadata/restli/RestliConstants.java +++ b/restli-resources/src/main/java/com/linkedin/metadata/restli/RestliConstants.java @@ -31,6 +31,7 @@ private RestliConstants() { } public static final String ACTION_RAW_INGEST_ASSET = "rawIngestAsset"; public static final String ACTION_LIST_URNS_FROM_INDEX = "listUrnsFromIndex"; public static final String ACTION_LIST_URNS = "listUrns"; + public static final String ACTION_DELETE = "delete"; public static final String PARAM_INPUT = "input"; public static final String PARAM_ASPECTS = "aspects"; public static final String PARAM_ASPECT = "aspect";