We gebruikten voor de servicedesk-tickets Zendesk. Om de integratie met de andere teams te bevorderen zijn we overgegaan naar Jira. Via dashing hadden we een mooi dashboard op het grote TV-scherm waar je op kon zien hoeveel tickets er nieuw, in behandeling en opgelost waren. Dit moet nu omgebouwd worden naar de API van Jira.
Mijn collega Pieter die de migratie voorbereid en doorgevoerd heeft leverde me deze URL aan, het beginpunt van deze zoektocht: https://developer.atlassian.com/cloud/jira/service-desk/rest/
Een eigen account voor Jira had ik al, dus de eerste stap is kijken of ik een API-key kan krijgen om de data überhaupt op te kunnen vragen. In voorgaande URL wordt verwezen naar https://developer.atlassian.com/cloud/jira/service-desk/jira-rest-api-oauth-authentication/ waar de OAuth-connectie wordt beschreven. Wel met Java en dergelijke, dat ga ik anders doen. Op bitbucket staan verschillende codevoorbeelden, dus die eerst maar eens gedownload: https://bitbucket.org/atlassian_tutorial/atlassian-oauth-examples/downloads/
Ik denk dat ik voor de short-cut ga, eerst de boel met Basic Authentication de gegevens laten opvragen. Dan kan ik het op een later tijdstip ombouwen naar de OAuth-variant. De koppeling is namelijk ook een stage-opdracht, dus als die dat gaat uitzoeken en uitwerken, scheelt me dat weer tijd :)
Je zou een app moeten maken, maar die rechten lijk ik niet te hebben (zou je admin moeten zijn). Als ik echter op de pagina over Basic Authentication kijk (link) zie ik een verwijzing naar het beheren van API-tokens (link). Ik ben al ingelogd en kom hier in het deel "Manage your account". Ik kan hier op de knop Create API Token klikken (wat ik ook doe). Eerst een label aanmaken, service_dashboard in dit geval. Daarna krijg ik een token terug. Vervolgens heb ik even snel in een console-applicatie de werking getest en krijg ik data terug:
string user = "jevolledigeinlognaam@jouwmailadres.nl";
string token = "het_token_wat_je_hebt_ontvangen_in_je_scherm";string authenticator = System.Convert.ToBase64String(UTF8Encoding.UTF8.GetBytes(string.Format("{0}:{1}", user, token)));
string url = "https://jouw-jira-omgeving-url/rest/api/2/dashboard";using (WebClient wc = new WebClient())
{try{
wc.Headers.Add(HttpRequestHeader.Authorization, string.Format("Basic {0}", authenticator));
wc.Headers.Add(HttpRequestHeader.ContentType, "application/json");
string response = UTF8Encoding.UTF8.GetString(wc.DownloadData(url));
Console.WriteLine(response);
}
catch(Exception x){
Console.WriteLine(x.ToString());
}}
Dat doet het dus. Alleen heb ik niet zoveel aan die dashboard-data. Ik wil mijn getalletjes die ik zie als ik in het "servicedesk-deel" zie. Maar ook dat valt mee. Ik keer namelijk terug naar de eerste link die in dit blog genoemd wordt. Door /rest/api/2/dashboard eerst te vervangen met /rest/servicedeskapi/servicedesk krijg ik onze "service-desks" terug. Dat is er 1 (logisch eigenlijk) met ID 1. Hierna de URL aangepast naar /rest/servicedeskapi/servicedesk/1/queue?includeCount=true
Die parameter is nodig omdat anders de totalen niet meegegeven worden. En ja, ik krijg de juiste gegevens terug. Om het nu te testen heb ik even snel in mijn VS2017 console-applicatie de boel laten deserializen met het Newtonsoft.Json nuget-pakket. Hierbij nog even hoe ik dat snel gedaan heb. Tot zover, dit moet ik dus gaan ombouwen naar Ruby.
public class JiraServiceQueueContainer
{
public JiraServiceQueueItem[] values;
}
public class JiraServiceQueueItem
{
public string name;
public int issueCount;
}// aanroepende code:
...
string url = "https://jouw-jira-omgeving-url/rest/servicedeskapi/servicedesk/1/queue?includeCount=true";
using (WebClient wc = new WebClient())
{try{
wc.Headers.Add(HttpRequestHeader.Authorization, string.Format("Basic {0}", authenticator));
wc.Headers.Add(HttpRequestHeader.ContentType, "application/json");
string response = UTF8Encoding.UTF8.GetString(wc.DownloadData(url));
var container = JsonConvert.DeserializeObject<JiraServiceQueueContainer>(response);
foreach (var item in container.values)
{
Console.WriteLine(string.Format("Queue {0} heeft {1} tickets.", item.name, item.issueCount));
}
}
...