Tabela no Confluence Atlassian com base nos dados de uma solicitação REST

Olá!

Neste artigo, mostrarei como criar uma página no Atlassian Confluence com uma tabela, cujos dados virão de uma solicitação REST.

Criaremos uma página no Confluence com uma tabela que conterá dados do projeto em Jira. Obteremos esses dados do Jira usando o método de projeto da API REST padrão do Jira.

Você pode assistir ao vídeo deste artigo aqui .

Instalar scripts de energia para o Confluence


Faremos uma chamada para a API REST do Jira usando o plug-in Power Scripts for Confluence . Este é um plugin gratuito, portanto, esta solução não lhe custará nada.

Bem, a primeira coisa que precisamos fazer é instalar o plug-in Power Scripts for Confluence em nosso Confluence. Instruções detalhadas sobre como fazer isso podem ser encontradas aqui .

Escreva um script


Agora vá para o item de menu de engrenagem -> Gerenciar aplicativos -> SIL Manager.



Crie o arquivo getProjects.sil com o seguinte código:

struct Project {
    string key;
    string name;
    string projectTypeKey;
}

HttpRequest request;
HttpHeader authHeader = httpBasicAuthHeader("admin", "admin");
request.headers += authHeader;
 
Project [] projects = httpGet("http://host.docker.internal:8080/rest/api/2/project", request);
runnerLog(projects);
return projects;

Altere o endereço de host.docker.internal : 8080 / para o endereço da sua instância do Jira.

Execute o script para verificar se os dados estão selecionados no Jira:



Crie uma página no Confluence


Agora crie uma página no Confluence com a macro da tabela SIL . No campo scripts, digite o nome do nosso script getProjects.sil:



publique a página e você verá este resultado:



Vamos complicar a tarefa


Adicione a seguinte funcionalidade à tabela:

  • exibir informações sobre o gerente de projeto
  • dê aos campos nomes mais compreensíveis e de preferência em russo

Primeiro, faça alterações no script getProjects.sil.

Ao mesmo tempo, refatoramos um pouco.

Aqui está o que nosso script fará:

  • obter dados do projeto do Jira por meio de uma chamada para a API REST do Jira
  • convertemos os dados do projeto recebidos em uma exibição tabular
  • imprima o resultado

É assim que fica no código:

Project [] projects = getProjectData();
TableRow [] tableRows =  convertProjectDataToTableData(projects);

return tableRows;

Agora vamos especificar como obtemos os dados do projeto:

  • criar uma solicitação
  • crie um cabeçalho na solicitação com informações sobre o usuário que recebe dados do Jira
  • Adicione o parâmetro expand à nossa consulta. Precisamos selecionar dados sobre o gerente de projetos, mas na resposta padrão não existem esses dados. Portanto, precisamos dizer a Jira que queremos ver os dados sobre o gerente de projetos na resposta. Para isso, o parâmetro de expansão é usado.
  • nós cumprimos o pedido
  • retornar dados

Mas as palavras se transformaram em código:

function getProjectData() {
    HttpRequest request;
    HttpHeader authHeader = httpBasicAuthHeader("admin", "admin");
    request.headers += authHeader;
    HttpQueryParam param = httpCreateParameter("expand", "description,lead,url,projectKeys");
    request.parameters += param;
    Project[] projects = httpGet("http://host.docker.internal:8080/rest/api/2/project", request);
    return projects;
}

Agora vamos definir estruturas de dados para nossos projetos.

Aqui está a resposta que o método de projeto retorna da API REST do Jira (excluí dados desnecessários para tornar a resposta mais curta e, portanto, mais legível):

[
   {
      "key":"KAN",
      "lead":{
         "name":"admin",
         "displayName":"Alexey Matveev",
      },
      "name":"kanban",
      "projectTypeKey":"software"
   },
   {
      "key":"SCRUM",
      "description":"",
      "lead":{
         "name":"admin",
         "displayName":"Alexey Matveev",
      },
      "name":"scrum",
      "projectTypeKey":"software"
   }
]

Como podemos ver, os valores para os campos key, name e projectTypeKey são definidos no primeiro nível do nosso json. Mas para o campo de lead, em vez do valor, vemos json. E esse json já contém os valores dos campos nome e displayName. Portanto, primeiro criamos uma estrutura para json no campo lead (Lead):

struct Lead {
    string name;
    string displayName;
}

Agora estamos prontos para fazer a estrutura para o primeiro nível do nosso json (Projeto):

struct Project {
    string key;
    string name;
    string projectTypeKey;
    Lead lead;
}

Mas o problema é que a macro da tabela SIL só pode funcionar com json com um nível de aninhamento, portanto, precisamos converter nossa estrutura com dois níveis de aninhamento (Project) em uma estrutura com um nível de aninhamento (estrutura plana). Mas primeiro, crie uma estrutura plana (TableRow):

struct TableRow {
    string key;
    string name;
    string projectTypeKey;
    string lead;
    string leadDisplayName;
}

E agora vamos escrever uma função para converter os dados na estrutura do projeto na estrutura TableRow:

function convertProjectDataToTableData(Project [] projectData) {
    TableRow [] tableRows;
    for (Project project in projectData) {
        TableRow tableRow;
        tableRow.key = project.key;
        tableRow.name = project.name;
        tableRow.projectTypeKey = project.projectTypeKey;
        tableRow.lead = project.lead.name;
        tableRow.leadDisplayName = project.lead.displayName;
        tableRows = arrayAddElement(tableRows, tableRow);
    } 
    return tableRows;
}

Todos. O script está pronto!

Aqui está o código getProjects.sil final:

struct Lead {
    string name;
    string displayName;
}

struct Project {
    string key;
    string name;
    string projectTypeKey;
    Lead lead;
}

struct TableRow {
    string key;
    string name;
    string projectTypeKey;
    string lead;
    string leadDisplayName;
}

function getProjectData() {
    HttpRequest request;
    HttpHeader authHeader = httpBasicAuthHeader("admin", "admin");
    request.headers += authHeader;
    HttpQueryParam param = httpCreateParameter("expand", "description,lead,url,projectKeys");
    request.parameters += param;
    string pp = httpGet("http://host.docker.internal:8080/rest/api/2/project", request);
    runnerLog(pp);
    Project[] projects = httpGet("http://host.docker.internal:8080/rest/api/2/project", request);
    return projects;
}

function convertProjectDataToTableData(Project [] projectData) {
    TableRow [] tableRows;
    for (Project project in projectData) {
        TableRow tableRow;
        tableRow.key = project.key;
        tableRow.name = project.name;
        tableRow.projectTypeKey = project.projectTypeKey;
        tableRow.lead = project.lead.name;
        tableRow.leadDisplayName = project.lead.displayName;
        tableRows = arrayAddElement(tableRows, tableRow);
    } 
    return tableRows;
}Project [] projects = getProjectData();
TableRow [] tableRows =  convertProjectDataToTableData(projects);

return tableRows;

Agora, atualizaremos a página no Confluence e veremos nossos dados no gerente de projetos:



mas os nomes das colunas são de alguma forma ininteligíveis. Vamos dar nomes mais bonitos.

Editamos a página, editamos a macro da tabela SIL e inserimos “Chave do Projeto, Nome do Projeto, Tipo de Projeto, Gerente de Projeto, Nome do Gerente de Projeto” no campo de colunas:



Salve a página e aqui está o resultado:



Tudo acabou!

All Articles