Hi, I have developed a Zendesk Support App that overwrites the primary email address of the end user with a sub email address of the actual requester. The sub email address is an identity of the end user. The app also works fine, I can change the email addresses, at a button click in the app, and switch back. However, I am currently trying to create a reset that will automatically reset the email addresses back to their original state. This reset should be triggered after the agent replies to the requester's ticket and clicks „Submit as new".
// The function to retrieve the primary email address of the end user.
async function getPrimaryEmailAddress(client) {
const{"ticket.requester.id": requesterId }=await client.get(
"ticket.requester.id"
);
const response =await client.request({
url:`/api/v2/users/${requesterId}`,
type:"GET",
});
const userData = response.user;
return userData.email;
}
// The function to retrieve the ticket field ID for "Primary address".
async function getPrimaryCustomFieldID(client) {
const response =await client.request({
url:"/api/v2/ticket_fields",
type:"GET",
});
const ticketFields = response.ticket_fields;
const primaryField = ticketFields.find(
(field)=> field.title==="Primäradresse"
);
return primaryField.id;
}
// The function to store the primary email address in the ticket field "Primary address".
async function savePrimaryEmailAddress(
client,
primaryEmailAddress,
primaryCustomFieldID
) {
await client.set(
`ticket.customField:custom_field_${primaryCustomFieldID}`,
primaryEmailAddress
);
console.log(
"Primary email address saved to ticket field:",
primaryEmailAddress
);
}
// The function to retrieve the primary email address of the end user.
function originalPrimaryEmailAddress() {
}
async function originalPrimaryCustomFieldID(client) {
const response =await client.request({
url:"/api/v2/ticket_fields",
type:"GET",
});
const ticketFields = response.ticket_fields;
const originalPrimaryField = ticketFields.find(
(field)=> field.title==="OriginalPrimäradresse"
);
return originalPrimaryField.id;
}
async function saveOriginalPrimaryEmailAddress(
client,
originalPrimaryEmailAddress,
originalPrimaryCustomFieldID
) {
await client.set(
`ticket.customField:custom_field_${originalPrimaryCustomFieldID}`,
originalPrimaryEmailAddress
);
console.log(
"Primary email address saved to ticket field:",
originalPrimaryEmailAddress
);
}
// Function to retrieve the ticket field ID for "Secondary address".
async function getSecondaryCustomFieldID(client) {
const response =await client.request({
url:"/api/v2/ticket_fields",
type:"GET",
});
const ticketFields = response.ticket_fields;
const secondaryField = ticketFields.find(
(field)=> field.title==="Sekundäradresse"
);
return secondaryField.id;
}
// Function to store the source email address in the ticket field "Secondary address".
async function saveSourceEmailAddress(
client,
sourceEmailAddress,
secondaryCustomFieldID
) {
if(sourceEmailAddress){
await client.set(
`ticket.customField:custom_field_${secondaryCustomFieldID}`,
sourceEmailAddress
);
console.log(
"Source email address saved to ticket field:",
sourceEmailAddress
);
}else{
console.warn("No source email address found.");
}
}
// Function to retrieve all identities of the end user.
async function getUserEmailIdentities(client, userId) {
const response =await client.request({
url:`/api/v2/users/${userId}/identities.json`,
type:"GET",
});
console.log(response);
if(!response.identities|| response.identities.length===0){
console.error("Keine Identitäten gefunden.");
return[];
}
return response.identities;
}
// Function to display a notification in the HTML element.
function showNotification(type, message) {
// Show notification in HTML element
const notificationElement = document.getElementById("notification");
notificationElement.style.display = "block";
notificationElement.textContent = message;
notificationElement.style.color = type === "success" ? "green" : "red";
}
// Function to create and display the dropdown menu with identities.
function createIdentityDropdown(identities, primaryEmailAddress) {
const identitySelectorContainer = document.getElementById(
"identity-selector-container"
);
const identitySelector = document.getElementById("identity-selector");
// Empty the dropdown menu if it is already populated
identitySelector.innerHTML = "";
// show Dropdown-Menü
identitySelectorContainer.style.display = "block";
}
// Function to retrieve the ticket field ID for "alternate field
async function getAlternateCustomFieldID(client) {
const response =await client.request({
url:"/api/v2/ticket_fields",
type:"GET",
});
const ticketFields = response.ticket_fields;
const alternateField = ticketFields.find(
(field)=> field.title==="Ausweichfeld"
);
return alternateField.id;
}
// Function to save the selected e-mail address from the drop-down menu in the ticket field "Alternate field
async function saveSelectedEmailAddress(
client,
selectedEmailAddress,
alternateCustomFieldID
) {
await client.set(
`ticket.customField:custom_field_${alternateCustomFieldID}`,
selectedEmailAddress
);
console.log(
"Selected email address saved to ticket field:",
selectedEmailAddress
);
}
const password = "secret-password";
const authorizationHeader = "Basic " + btoa(email + ":" + password);
const contentTypeHeader = "application/json";
const options = {
headers:{
Authorization: authorizationHeader,
"Content-Type": contentTypeHeader,
Accept:"application/json",
},
};
async function updatePrimaryEmailAddress(client, userId, newPrimaryEmail) {
const userEmailIdentities =await getUserEmailIdentities(client, userId);
console.log("UserEmailIdentities ", userEmailIdentities);
const primaryIdentity = userEmailIdentities.find(
(identity)=> identity.primary
);
if(!primaryIdentity){
console.error("Keine primäre Identität gefunden.");
return;
}
console.log("PrimaryIdentity", primaryIdentity);
const newPrimaryIdentity = userEmailIdentities.find(
(identity)=>
!identity.primary&&
identity.verified &&
identity.value === newPrimaryEmail
);
console.log("newPrimaryIdentity", newPrimaryIdentity);
if(!newPrimaryIdentity){
console.error("Keine neue primäre Identität gefunden.");
return;
}
if(!primaryIdentity ||!newPrimaryIdentity){
console.error(
"Fehler beim Finden der primären oder neuen primären Identität."
);
return;
}
try{
await client.request({
url:`/api/v2/users/${userId}/identities/${newPrimaryIdentity.id}/make_primary`,
type:"PUT",
contentType:"application/json",
data: JSON.stringify({identity:{primary:true}}),
headers: options.headers,
});
console.log("Primäre E-Mail-Adresse aktualisiert.");
return newPrimaryIdentity.value;
}catch(error){
console.error(
"Fehler beim Aktualisieren der primären E-Mail-Adresse:",
error
);
}
}
// Main function to start the process
async function main() {
const client = ZAFClient.init();
document.addEventListener("DOMContentLoaded", function () {
client.on("app.registered", async () => {
try{
const primaryEmailAddress =await getPrimaryEmailAddress(client);
const primaryCustomFieldID =await getPrimaryCustomFieldID(client);
console.log(primaryEmailAddress);
console.log(primaryCustomFieldID);
await savePrimaryEmailAddress(
client,
primaryEmailAddress,
primaryCustomFieldID
);
const requesterId =(await client.get("ticket.requester.id"))[
"ticket.requester.id"
];
console.log("Requester ID:", requesterId);
const getOriginalPrimaryEmailAddress =originalPrimaryEmailAddress();
const getOriginalPrimaryCustomFieldID =
await originalPrimaryCustomFieldID(client);
await savePrimaryEmailAddress(
client,
getOriginalPrimaryEmailAddress,
getOriginalPrimaryCustomFieldID
);
console.log(getOriginalPrimaryEmailAddress);
console.log(getOriginalPrimaryCustomFieldID);
const userEmailIdentities =await getUserEmailIdentities(
client,
requesterId
);
console.log("UserEmailIdentities:", userEmailIdentities);
const sourceEmailData =await getSourceEmailAddress(client);
console.log("Source email data:", sourceEmailData);
const originalRecipients = sourceEmailData
? sourceEmailData.original_recipients
:[];
console.log("Original recipients:", originalRecipients);
// Find a matching identity that is not the primary email address.
const secondaryEmailAddress =findMatchingIdentity(
userEmailIdentities.map((identity) => identity.value),
originalRecipients,
primaryEmailAddress
);
console.log("Secondary email address:", secondaryEmailAddress);
const secondaryCustomFieldID =await getSecondaryCustomFieldID(client);
console.log(secondaryCustomFieldID);
await saveSourceEmailAddress(
client,
secondaryEmailAddress,
secondaryCustomFieldID
);
// Compare primary address and secondary address and display notification if required.
const primaryFieldValueObject =await client.get(
`ticket.customField:custom_field_${primaryCustomFieldID}`
);
console.log("PrimaryFieldValueObject:", primaryFieldValueObject);
const primaryFieldValue =
primaryFieldValueObject[
`ticket.customField:custom_field_${primaryCustomFieldID}`
];
console.log("Primary field value:", primaryFieldValue);
const secondaryFieldValueObject =await client.get(
`ticket.customField:custom_field_${secondaryCustomFieldID}`
);
console.log("SecondaryFieldValueObject:", secondaryFieldValueObject);
const secondaryFieldValue =
secondaryFieldValueObject[
`ticket.customField:custom_field_${secondaryCustomFieldID}`
];
console.log("Secondary field value:", secondaryFieldValue);
if(
primaryFieldValue === primaryEmailAddress &&
secondaryFieldValue === null
){
showNotification(
"success",
"Die Anfrage kommt von der primären E-Mail-Adresse."
);
} else if (
primaryFieldValue === primaryEmailAddress &&
secondaryFieldValue !== primaryEmailAddress
){
showNotification(
"warning",
"Die Anfrage kommt NICHT von der primären E-Mail-Adresse."
);
createIdentityDropdown(userEmailIdentities, primaryEmailAddress);
}
// Add button click handler
const submitButton = document.getElementById("submit-button");
submitButton.addEventListener("click", async () => {
const identitySelector = document.getElementById("identity-selector");
const selectedEmailAddress = identitySelector.value;
const alternateCustomFieldID =await getAlternateCustomFieldID(
client
);
// Save selected e-mail address from the drop-down menu in the ticket field "Alternate field
await saveSelectedEmailAddress(
client,
selectedEmailAddress,
alternateCustomFieldID
);
// Check if the condition for the update is fulfilled
// and perform the necessary updates
// e.g. call the `updatePrimaryEmailAddress` function.
const updatedPrimaryEmail =await updatePrimaryEmailAddress(
client,
requesterId,
selectedEmailAddress
);
console.log(updatedPrimaryEmail);
});
}catch(error){
console.error("Error in main function:", error);
}
});
client.on("ticket.submit.done", async () => {
try{
async function origPrimaryCustomFieldID(client){
const response =await client.request({
url:"/api/v2/ticket_fields",
type:"GET",
});
const ticketFields = response.ticket_fields;
const originalPrimaryField = ticketFields.find(
(field)=> field.title==="OriginalPrimäradresse"
);
return originalPrimaryField.id;
}
const getOrigiPrimaryCustomFieldID =await origPrimaryCustomFieldID(
client
);
console.log(getOrigiPrimaryCustomFieldID);
const origiEmail=(
await client.get(
`ticket.customField:custom_field_${getOrigiPrimaryCustomFieldID}`
)
)[`ticket.customField:custom_field_${getOrigiPrimaryCustomFieldID}`];
console.log(`Original email address: ${origiEmail}`);
const requesterId =(await client.get("ticket.requester.id"))[
"ticket.requester.id"
];
await updatePrimaryEmailAddress(
client,
requesterId,
originalPrimaryFieldValue
);
}catch(error){
console.error("Error in main function:", error);
}
});
});
}
main();
Currently I save the original primary email address, hard coded into the ticket field "OriginalPrimaryAddress". Of course I don't want to have this. Unfortunately, I'm not sure how to restore the original primary email address!
The issue is that our customer has multiple identities for one end user. Depending on the identity from which a ticket is created, a message should also be sent to this identity from the agent. For this purpose, the support app is developed to provide this functionality and to restore the original state after each response from the agent.
6 댓글