marcells/node-build-monitor

View on GitHub
app/services/BitbucketPipelines.js

Summary

Maintainability
D
1 day
Test Coverage
var request = require('../requests');

module.exports = function () {
    var self = this,
        makeUrl = function () {
            return 'https://api.bitbucket.org/2.0/repositories/' + (self.configuration.teamname || self.configuration.username) + '/' + self.configuration.slug + '/pipelines/?sort=-created_on&pagelen=1';
        },
        makeBasicAuthToken = function() {
            return Buffer.from(self.configuration.username + ':' + self.configuration.apiKey).toString('base64');
        },
        makeRequest = function (url, callback) {
          request.makeRequest({
            url: url,
            headers: {Authorization: 'Basic ' + makeBasicAuthToken()}
          }, callback);
        },
        parseDate = function (dateAsString) {
            return dateAsString ? new Date(dateAsString) : null;
        },
        forEachResult = function (body, callback) {
            for (var i = 0; i < body.values.length; i++) {
                callback(body.values[i]);
            }
        },
        getStatus = function (statusText, resultText, stageType) {
            if (statusText === "IN_PROGRESS" && stageType === "pipeline_state_in_progress_paused") return "Gray";
            if (statusText === "COMPLETED" && resultText === "SUCCESSFUL") return "Green";
            if (statusText === "COMPLETED" && resultText === "FAILED") return "Red";
            if (statusText === "COMPLETED" && resultText === "STOPPED") return "Gray";
            if (statusText === "PENDING") return "'#FFA500'";
            if (statusText === "IN_PROGRESS") return "Blue";
        },
        getStatusText = function (statusText, resultText, stageType) {
          if (statusText === "IN_PROGRESS" && stageType === "pipeline_state_in_progress_paused") return "Paused";
          if (statusText === "COMPLETED" && resultText === "SUCCESSFUL") return "Succeeded";
          if (statusText === "COMPLETED" && resultText === "FAILED") return "Failed";
          if (statusText === "COMPLETED" && resultText === "STOPPED") return "Stopped";
          if (statusText === "PENDING") return "Pending";
          if (statusText === "IN_PROGRESS") return "In Progress";

          return statusText;
        },
        simplifyBuild = function (res) {
            return {
                id: res.uuid,
                project: res.repository.name,
                number: res.build_number,
                isRunning: !res.completed_on,
                startedAt: parseDate(res.created_on),
                finishedAt: parseDate(res.completed_on),
                requestedFor: (res.creator || {}).display_name,
                statusText: getStatusText(res.state.name, (res.state.result || {}).name, (res.state.stage || {}).type),
                status: getStatus(res.state.name, (res.state.result || {}).name, (res.state.stage || {}).type),
                url: res.repository.links.self.href
            };
        },
        queryBuilds = function (callback) {
            makeRequest(makeUrl(), function (error, body) {
                if (error || body.type === 'error') {
                  callback(error || body.error);
                  return;
                }

                var builds = [];

                forEachResult(body, function (res) {
                    builds.push(simplifyBuild(res));
                });

                callback(error, builds);
            });
        };

    self.configure = function (config) {
        self.configuration = config;
    };

    self.check = function (callback) {
        queryBuilds(callback);
    };
};