public class CreateMetadata{
public void updateAndDeployMetadata() {
// Setup custom metadata to be created in the subscriber org.
Metadata.CustomMetadata customMetadata = new Metadata.CustomMetadata();
customMetadata.fullName = 'ISVNamespace__MetadataTypeName.MetadataRecordName';
Metadata.CustomMetadataValue customField = new Metadata.CustomMetadataValue();
customField.field = 'customField__c';
customField.value = 'New value';
customMetadata.values.add(customField);
Metadata.DeployContainer mdContainer = new Metadata.DeployContainer();
mdContainer.addMetadata(customMetadata);
// Setup deploy callback, MyDeployCallback implements
// the Metadata.DeployCallback interface (code for
// this class not shown in this example)
MyDeployCallback callback = new MyDeployCallback();
// Enqueue custom metadata deployment
Id deployRequestId = Metadata.Operations.enqueueDeployment(mdContainer, callback);
}
}
public class CreateMetadata{
public void updateAndDeployMetadata() {
// Setup custom metadata to be created in the subscriber org.
Metadata.CustomMetadata customMetadata = new Metadata.CustomMetadata();
customMetadata.fullName = 'ISVNamespace__MetadataTypeName.MetadataRecordName';
Metadata.CustomMetadataValue customField = new Metadata.CustomMetadataValue();
customField.field = 'customField__c';
customField.value = 'New value';
customMetadata.values.add(customField);
Metadata.DeployContainer mdContainer = new Metadata.DeployContainer();
mdContainer.addMetadata(customMetadata);
// Setup deploy callback, MyDeployCallback implements
// the Metadata.DeployCallback interface (code for
// this class not shown in this example)
MyDeployCallback callback = new MyDeployCallback();
// Enqueue custom metadata deployment
Id deployRequestId = Metadata.Operations.enqueueDeployment(mdContainer, callback);
}
}
public class MyDeployCallback implements Metadata.DeployCallback {
public void handleResult(Metadata.DeployResult result,
Metadata.DeployCallbackContext context) {
Id jobId = context.getCallbackJobId();
switch on (result.status) {
when Succeeded {
// Deployment was successful
}
when SucceededPartial {
// The deployment succeeded, but some components might not have been successfully deployed. Check Metadata.DeployResult for more details.
}
when Failed {
// Deployment was not successful
}
when Canceled {
}
when Pending, InProgress, Canceling {
// Queued or state changing
}
}
}
}
public class MyDeployCallback implements Metadata.DeployCallback {
public void handleResult(Metadata.DeployResult result,
Metadata.DeployCallbackContext context) {
Id jobId = context.getCallbackJobId();
switch on (result.status) {
when Succeeded {
// Deployment was successful
}
when SucceededPartial {
// The deployment succeeded, but some components might not have been successfully deployed. Check Metadata.DeployResult for more details.
}
when Failed {
// Deployment was not successful
}
when Canceled {
}
when Pending, InProgress, Canceling {
// Queued or state changing
}
}
}
}
public void checkDeployStatus(Id deployRequestId) {
HttpRequest req = new HttpRequest();
req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionID());
req.setHeader('Content-Type', 'application/json');
req.setMethod('GET');
String instanceName = System.Url.getSalesforceBaseUrl().toExternalForm();
// You might need to adjust instanceName if you are working from Visualforce
req.setEndpoint(instanceName + '/services/data/v49.0/metadata/deployRequest/' + deployRequestId + '?includeDetails=true');
Http http = new Http();
try {
HTTPResponse res = http.send(req);
if(res.getStatusCode() == 200) {
String responseBody = res.getBody();
DeployResultJson jsonResult = (DeployResultJson)JSON.deserialize(responseBody, DeployResultJson.class);
if(jsonResult.deployResult.details != null) {
for(Metadata.DeployMessage dm : jsonResult.deployResult.details.componentSuccesses) {
if(dm.fileName == 'package.xml') {
continue;
}
Id newMetadataComponentId = dm.Id;
}
}
}
} catch(System.CalloutException e) {
// Exception Handling
}
}
// Support unpacking via JSON.deserialize from deployRequest metadata api call
public class DeployResultJson {
public String id;
public Object validatedDeployRequestId;
public Object deployOptions;
public Metadata.DeployResult deployResult;
}
public void checkDeployStatus(Id deployRequestId) {
HttpRequest req = new HttpRequest();
req.setHeader('Authorization', 'Bearer ' + UserInfo.getSessionID());
req.setHeader('Content-Type', 'application/json');
req.setMethod('GET');
String instanceName = System.Url.getSalesforceBaseUrl().toExternalForm();
// You might need to adjust instanceName if you are working from Visualforce
req.setEndpoint(instanceName + '/services/data/v49.0/metadata/deployRequest/' + deployRequestId + '?includeDetails=true');
Http http = new Http();
try {
HTTPResponse res = http.send(req);
if(res.getStatusCode() == 200) {
String responseBody = res.getBody();
DeployResultJson jsonResult = (DeployResultJson)JSON.deserialize(responseBody, DeployResultJson.class);
if(jsonResult.deployResult.details != null) {
for(Metadata.DeployMessage dm : jsonResult.deployResult.details.componentSuccesses) {
if(dm.fileName == 'package.xml') {
continue;
}
Id newMetadataComponentId = dm.Id;
}
}
}
} catch(System.CalloutException e) {
// Exception Handling
}
}
// Support unpacking via JSON.deserialize from deployRequest metadata api call
public class DeployResultJson {
public String id;
public Object validatedDeployRequestId;
public Object deployOptions;
public Metadata.DeployResult deployResult;
}