After Delete Worker Code Sample

JFrog Platform Administration Documentation

Content Type
Administration / Platform

The following section provides a sample code for an After Delete worker.

export default async (
  context: PlatformContext,
  data: AfterDeleteRequest
): Promise<AfterDeleteResponse> => {
  try {
    // The HTTP client facilitates calls to the JFrog Platform REST APIs
    //To call an external endpoint, use 'await context.clients.axios.get("https://foo.com")'
    const res = await context.clients.platformHttp.get(
      "/artifactory/api/v1/system/readiness"
    );

    // You should reach this part if the HTTP request status is successful (HTTP Status 399 or lower)
    if (res.status === 200) {
      console.log("Artifactory ping success");
    } else {
      console.warn(
        `Request was successful and returned status code : ${res.status}`
      );
    }
  } catch (error) {
    // The platformHttp client throws PlatformHttpClientError if the HTTP request status is 400 or higher
    console.error(
      `Request failed with status code ${
        error.status || "<none>"
      } caused by : ${error.message}`
    );
  }

  return {
    message: "proceed",
  };
};

Input Parameters

context

Provides baseUrl, token, and clients to communicate with the JFrog Platform (for more information, see PlatformContext).

data

The request with deleted details sent by Artifactory.

For Artifactory Versions before 7.122

{
  "metadata": {  // Object containing metadata about the artifact
    "repoPath": {  // Information about the repository path for the artifact
      "key": "local-repo",  // Unique identifier for the repository
      "path": "folder/subfolder/my-file",  // Path to the specific file within the repository
      "id": "local-repo:folder/subfolder/my-file",  // Unique identifier combining the repository key and path
      "isRoot": false,  // Indicates if the path is a root directory (false means it is nested)
      "isFolder": false  // Indicates if the path is a folder (false means it is a file)
    },
    "contentLength": 100,  // Length of the content in bytes
    "lastModified": 0,  // Timestamp of the last modification (0 indicates it has not been modified)
    "trustServerChecksums": false,  // Indicates whether server checksums should be trusted
    "servletContextUrl": "servlet.com",  // URL of the servlet context for accessing the artifact
    "skipJarIndexing": false,  // Indicates whether to skip indexing for JAR files
    "disableRedirect": false,  // Indicates whether HTTP redirects should be disabled
    "repoType": 1  // Numeric identifier representing the repository type (e.g., local, remote, virtual)
  },
  "headers": {  // HTTP headers for the request
    "Content-Type": {  // Content-Type header to specify the type of content being sent
      "value": [  // Array of values for the Content-Type header
        "text/plain"  // Indicates that the content type is plain text
      ]
    },
    "Accept": {  // Accept header to specify the expected response format
      "value": [  // Array of values for the Accept header
        "application/json"  // Indicates that the expected response format is JSON
      ]
    }
  },
  "userContext": {  // Context information about the user making the request
    "id": "id",  // Unique identifier for the user
    "isToken": false,  // Indicates if the user is authenticated using a token
    "realm": "realm"  // Realm for user authentication context
  }
}

For Artifactory Versions from 7.122

{
  "metadata": {  // Object containing metadata about the artifact
    "repoPath": {  // Information about the repository path for the artifact
      "key": "local-repo",  // Unique identifier for the repository
      "path": "folder/subfolder/my-file",  // Path to the specific file within the repository
      "id": "local-repo:folder/subfolder/my-file",  // Unique identifier combining the repository key and path
      "isRoot": false,  // Indicates if the path is a root directory (false means it is nested)
      "isFolder": false  // Indicates if the path is a folder (false means it is a file)
    },
    "repoType": 1,  // Numeric identifier representing the type of repository (1 typically denotes a local repository)
    "triggerMetadataCalculation": false,  // Indicates whether metadata calculation should be triggered (false means it does not)
    "allowAsyncDelete": false,  // Indicates if asynchronous deletion of the artifact is allowed (false means it is not)
    "skipTrashcan": false,  // Indicates if the deletion should skip the trashcan (false means it will go to the trashcan)
    "isTriggeredByGc": false,  // Indicates if the deletion was triggered by garbage collection (false means it was not)
    "triggeredByMove": false  // Indicates if the action was triggered by moving the artifact (false means it was not)
 },
 "userContext": {  // Context information about the user making the request
    "id": "id",  // Unique identifier for the user
    "isToken": false,  // Indicates if the user is authenticated using a token
    "realm": "realm"  // Realm for user authentication context
  },
  "itemInfo": {  // Object containing information about the specific item (artifact)
    "repoPath": {  // Repository path information for the item
      "key": "local-repo",  // Unique key identifier for the repository
      "path": "folder/subfolder/my-file",  // Path to the specific item within the repository
      "id": "local-repo:folder/subfolder/my-file",  // Unique identifier combining the repository key and path
      "isRoot": false,  // Indicates if the path is a root directory (false means it is nested)
      "isFolder": false  // Indicates if the path is a folder (false means it is a file)
    },
    "name": "my-artifact",  // Name of the item (artifact)
    "created": 1,  // Timestamp indicating when the item was created (assumed to be Unix timestamp)
    "lastModified": 0  // Timestamp of the last modification (0 indicates no modification)
  }
}
Response
{
 "message": "proceed" // Message to print to the log, in case of an error, it will be printed as a warning
}

message : This is a mandatory field.