Взаимодействие с сервером Confluence через REST API с помощью NodeJS(JS)

Иногда может возникнуть необходимость автоматизировать некоторые действия в Confluence или выполнить какое-то действие несколько раз и т.д. Для этого можно использовать REST API Confluence вместе с языком программирования и API для взаимодействия через HTTP.

Предыдущий пример с использованием Groovy — https://dev.to/andriimaliuta/how-to-update-several-pages-in-confluence-via-rest-api-k6c.

В этом примере мы будем использовать JavaScript и библиотеку axios (вам не нужен сам axios и вы можете использовать основной FETCH, если хотите — это просто один из способов) для инициирования конечных точек Confluence REST:

  • getPage.js
  • getChildren.js
  • getDescendants.js
  • createComment.js
  • createPage.js
  • deleteLabel.js
  • getPageLabels.js

Файл данных

Сначала мы создадим файл data.js для хранения констант с данными:

const dotenv = require('dotenv');
dotenv.config();
const username = process.env.username;
const password = process.env.password;
const CONF_URL = process.env.CONF_URL;

module.exports = {
  authData: Buffer.from(`${username}:${password}`).toString('base64'),
  CONF_URL
};
Вход в полноэкранный режим Выход из полноэкранного режима

Мы создаем токен Basic Auth Base64 из имени пользователя и пароля.

Получение информации о странице

Запрос:

GET /rest/content
Войти в полноэкранный режим Выйти из полноэкранного режима

CONTENT — это объект, который представляет:

  • страница
  • комментарий
  • блогпост

Пример файла getPage.js:

const axios = require('axios');
const https = require('https');
const { authData, CONF_URL } = require('./data');

module.exports = async function getPage(pageId) {
  console.log('>>> Initiating REST request...');

  return axios.get(`${CONF_URL}/rest/api/content/${pageId}`, {
    headers: {
      Authorization: `Basic ${authData}`,
    },
    httpsAgent: new https.Agent({
      rejectUnauthorized: false,
    }),
  });
};
Вход в полноэкранный режим Выход из полноэкранного режима

getChildren.js

Запрос:

GET ${CONF_URL}/rest/api/content/${pageId}/child/page
Войти в полноэкранный режим Выйти из полноэкранного режима
const axios = require("axios");
const https = require("https");
const { authData, CONF_URL } = require("./data");

module.exports = async function getPageChildren(pageId) {
  console.log(" Initiating REST request...");

  return await axios.get(`${CONF_URL}/rest/api/content/${pageId}/child/page`, {
    headers: {
      Authorization: `Basic ${authData}`,
    },
    httpsAgent: new https.Agent({
      rejectUnauthorized: false,
    }),
  });
};
Войти в полноэкранный режим Выход из полноэкранного режима

getDescendants.js

const axios = require("axios");
const https = require("https");
const { authData, CONF_URL } = require("./data");

module.exports = async function getPageChildren(pageId) {
  console.log(">>> Initiating REST request...");

  return await axios.get(
    `${CONF_URL}/rest/api/search?cql=type+=+"page"+and+ancestor+%3D+"${pageId}"`,
    {
      headers: {
        Authorization: `Basic ${authData}`,
      },
      httpsAgent: new https.Agent({
        rejectUnauthorized: false,
      }),
    }
  );
};
Войти в полноэкранный режим Выйти из полноэкранного режима

Создать страницу (запись в блоге / комментарий)

createPage.js

const axios = require('axios');
const https = require('https');
const { authData, CONF_URL } = require('./data');

module.exports = async function createPage(space, title, body, parent_id) {
  console.log(' Initiating REST request...');
  data = {
    type: 'page',
    title: title,
    space: { key: space },
    body: {
      storage: {
        value: body,
        representation: 'storage',
      },
    },
    ancestors: [{ id: parent_id }],
  };

  return await axios.post(`${CONF_URL}/rest/api/content`, {
    headers: {
      Authorization: `Basic ${authData}`,
      'Content-Type': 'application/json',
    },
    httpsAgent: new https.Agent({
      rejectUnauthorized: false,
    }),
    data: data,
  });
};
Войти в полноэкранный режим Выход из полноэкранного режима

Выполнение запросов

Теперь мы кратим файл index.js (название, конечно, на ваше усмотрение :)) и выполняем необходимые действия. Здесь мы будем CONSOLE.LOG результат запросов, но, конечно, вы можете и дальше корректировать, комбинировать и расширять код, чтобы сделать то, что вам нужно.

const getPage = require('./getPage');
const getChildren = require('./getChildren');
const getDescendants = require('./getDescendants');
const createPage = require('./createPage');
const getPageLabels = require('./getPageLabels');
const createComment = require('./createComment');

const PAGE_ID = 123456; // specify the PAGE ID

async function init() {

// GET PAGE
   getPage(PAGE_ID)
     .then((res) => console.log(res.data))
     .catch((err) => console.log(err));

  // GET all descendant pages of the root one
   getDescendants(PAGE_ID).then((res) => console.log(res.data));

  // ====== Create Page =====
const SPACE_KEY = "TEST";
  createPage(SPACE_KEY, 'MY PAGE TITLE', 'this is body', PAGE_ID).then((res) =>
    console.log(res.data)
  );

  // ====== Create comment ======
   createComment('TEST', 'test title', 'rest comment!', 1000, PAGE_ID).then(
     (res) => console.log(res.data)
   );

// labels

   const PAGE_ID = 12345;
   getPageLabels(PAGE_ID).then((res) => {
     for (label of res.data.results) {
       deleteLabel(PAGE_ID, label.name);
     }
   });

   deleteLabel(labelId, "error-template").then((res) => console.log(res.data));

}

// ========= initiate the code !!
init();

Вход в полноэкранный режим Выход из полноэкранного режима

Вот и все. Конечно, это наглядные примеры, но главное — понять сами принципы и в дальнейшем выполнять практически любые необходимые действия через REST API, что облегчит вам работу с Confluence 🙂

Пожалуйста, дайте мне знать, если это было полезно.

Спасибо!

Оцените статью
Procodings.ru
Добавить комментарий