...
Digizuite has a very powerful automation engine which allows customers to construct business logic in a drag & drop fashion. The logic consists of a number of steps that can either be a trigger, an action, a filter or for-loop (iterating elements). So an automation could be triggered based on metadata changes on an asset, or an asset arriving at a certain state in a workflow, and then the steps can filter if that change is relevant and if it is then perform certain actions within the DAM or externally. Full docs are here: DC 5.6 Automations.
In this context, it is the ‘externally' part that is interesting to integration. An automation has an action which can invoke an external endpoint with values from the current automation (could be an asset ID or workflow ID) as query parameters. The external system could be simply utilizing a 3rd party service but it could also be a data integration where a downstream system must be notified (broadcast).
Many 3rd party platforms have APIs which could be triggered directly with these invoke endpoints but in many cases you would need to extend the integration with more. The Digizuite Automation could handle all business logic to narrow down what should be triggering the Integration but then the Invoke Endpoint could call a service that simply takes care of transporting what is received to the downstream platformRead more about automations here:DC 5.6 Automations .
One way to extend the Automation is by using own services or maybe creating small purpose-built Azure Functions. For a simple teams or slack integration, or if you wish to extend the platform to talk to your favorite Task & Project Management Software then simply add that API logic in an an Azure Function with 4-5 lines of code and let it be invoked from automation as described above.
Integration Endpoints
Standardizing the Integration Process with Patterns
Extensions with Azure Functions (or own Service)
Azure Functions
Code Block |
---|
[FunctionName("TriggerTeamsIntegration")]
[OpenApiOperation(operationId: "TeamsIntegration", tags: new[] { "Teams", "Integration" })]
[OpenApiSecurity("function_key", SecuritySchemeType.ApiKey, Name = "code", In = OpenApiSecurityLocationType.Query)]
[OpenApiParameter(name: "title", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The **Title** parameter")]
[OpenApiParameter(name: "text ", In = ParameterLocation.Query, Required = false, Type = typeof(string), Description = "The **Text ** parameter")]
[OpenApiParameter(name: "color", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The **Color** parameter")]
[OpenApiParameter(name: "assetId", In = ParameterLocation.Query, Required = true, Type = typeof(string), Description = "The **Color** parameter")]
[OpenApiResponseWithBody(statusCode: HttpStatusCode.OK, contentType: "text/plain", bodyType: typeof(string), Description = "The OK response")]
public async Task<IActionResult> RunTeams(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req)
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
string title = req.Query["title"];
string text = req.Query["text"];
string color = req.Query["color"];
string assetId = req.Query["assetId"];
var assetUrl = $"https://demo-dam-dam-dam.my-domain.com/asset/{assetId}/asset";
if (string.IsNullOrEmpty(title) || string.IsNullOrEmpty(text) || string.IsNullOrEmpty(color))
{
return new BadRequestErrorMessageResult("Invalid Query parameters. Title, text and color are all mandatory");
}
// Adding get asset name to title
var asset = await GetAssetById(assetId);
if (asset != null)
{
title += $" ({asset.Name})";
}
// Let us try it out!
var url = "<INSERT WEBHOOK URL HERE>";
var client = new TeamsNotificationClient(url);
var message = new MessageCard();
message.Title = title;
message.Text = text;
message.Color = color;
message.Sections = new List<MessageSection>();
message.PotentialActions = new List<PotentialAction>();
message.PotentialActions.Add(new PotentialAction()
{
Name = "Open Asset in Media Manager",
Targets = new List<PotentialActionLink>()
{
new()
{
Value = assetUrl
}
}
});
await client.PostMessage(message);
_logger.LogInformation($"Good to go {JsonConvert.SerializeObject(new { message })}");
return new OkObjectResult(message);
} |
Using the SDK in the above context (using https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection to inject it)
Code Block |
---|
.....
public async Task<Asset> GetAssetById(string assetId)
{
var parameters = new SearchParameters("GetAssets")
{
{"sAssetId", assetId}
};
var response = await _searchService.Search<Asset>(parameters);
var listOfAssets = response.Items.ToList();
return listOfAssets.Count > 0 ? listOfAssets.First() : null;
} |
Adding the above to automation or an Integration Endpoint would be a simple exercise. Specifically for automation, one would go and add the following URL:
https://integration-functions.azurewebsites.net/api/TriggerTeamsIntegration?title=myTitle&text=myText&color=f0ad4e&assetId=123
To the Invoke Endpoint as made above then simply take the URL and add it here (remembering to add the right asset ID parameter):
...