UNPKG

node-red-contrib-gitlab

Version:
693 lines (590 loc) 17.9 kB
/** * Copyright (c) 2017 Kota Suizu * Released under the MIT license * http://opensource.org/licenses/mit-license.php **/ module.exports = function(RED) { "use strict"; var gitlab = require('node-gitlab'); /* One function to handle all the errors */ function requestFail(node, msg, body, err) { const error = err.toString(); msg.payload = error; msg.statusCode = parseInt(error.split("Error")[0].replace("Gitlab", "")); node.error(error, msg); } /** * GitLab API Config **/ function gitlabConfig(n) { RED.nodes.createNode(this, n); this.key = n.key; this.url = n.url; this.project_id = n.project_id; var credentials = this.credentials; if ((credentials) && (credentials.hasOwnProperty("key"))) { this.key = credentials.key; } } RED.nodes.registerType("gitlab-config", gitlabConfig, { credentials: { key: { type: "password" } } }); // === Issues ================================================================= /** * GitLab API Issues List **/ function GitLabListIssues(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); this.state = n.state; this.labels = n.labels; this.milestone = n.milestone; this.order_by = n.order_by; this.sort = n.sort; var node = this; this.on('input', function(msg) { // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } if (_isTypeOf('String', msg.payload.state)) { node.state = msg.payload.state; } if (_isTypeOf('String', msg.payload.labels)) { node.labels = msg.payload.labels; } if (_isTypeOf('String', msg.payload.milestone)) { node.milestone = msg.payload.milestone; } if (_isTypeOf('String', msg.payload.order_by)) { node.order_by = msg.payload.order_by; } if (_isTypeOf('String', msg.payload.sort)) { node.sort = msg.payload.sort; } var iid; if (_isTypeOf('Number', msg.payload.iid)) { iid = msg.payload.iid; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.issues.list({ id: project_id, iid: iid, state: node.state, labels: node.labels, milestone: node.milestone, order_by: node.order_by, sort: node.sort }, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-List-Issues", GitLabListIssues); /** * GitLab API Create Issue **/ function GitLabCreateIssue(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); var node = this; this.on('input', function(msg) { // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } var title; if (_isTypeOf('String', msg.payload.title)) { title = msg.payload.title; } var description; if (_isTypeOf('String', msg.payload.description)) { description = msg.payload.description; } var assignee_id; if (_isTypeOf('Number', msg.payload.assignee_id)) { assignee_id = msg.payload.assignee_id; } var milestone_id; if (_isTypeOf('Number', msg.payload.milestone_id)) { milestone_id = msg.payload.milestone_id; } var labels; if (_isTypeOf('String', msg.payload.labels)) { labels = msg.payload.labels; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.issues.create({ id: project_id, title: title, description: description, assignee_id: assignee_id, milestone_id: milestone_id, labels: labels }, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Create-Issue", GitLabCreateIssue); /** * GitLab API Update Issue **/ function GitLabUpdateIssue(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); var node = this; this.on('input', function(msg) { // Update Params var param = {}; // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } if (_isTypeOf('Number', project_id)) { param.id = project_id; } var issue_id; if (_isTypeOf('Number', msg.payload.issue_id)) { issue_id = msg.payload.issue_id; param.issue_id = issue_id; } var title; if (_isTypeOf('String', msg.payload.title)) { title = msg.payload.title; param.title = title; } var description; if (_isTypeOf('String', msg.payload.description)) { description = msg.payload.description; param.description = description; } var assignee_id; if (_isTypeOf('Number', msg.payload.assignee_id)) { assignee_id = msg.payload.assignee_id; param.assignee_id = assignee_id; } var milestone_id; if (_isTypeOf('Number', msg.payload.milestone_id)) { milestone_id = msg.payload.milestone_id; param.milestone_id = milestone_id; } var labels; if (_isTypeOf('String', msg.payload.labels)) { labels = msg.payload.labels; param.labels = labels; } var state_event; if (_isTypeOf('String', msg.payload.state_event)) { state_event = msg.payload.state_event; param.state_event = state_event; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.issues.update(param, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Update-Issue", GitLabUpdateIssue); /** * GitLab API List Notes **/ function GitLabListNotes(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); var node = this; this.on('input', function(msg) { // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } var issue_id; if (_isTypeOf('Number', msg.payload.issue_id)) { issue_id = msg.payload.issue_id; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.issues.listNotes({ id: project_id, issue_id: issue_id }, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-List-Notes", GitLabListNotes); /** * GitLab API Create Notes **/ function GitLabCreateNote(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); var node = this; this.on('input', function(msg) { // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } var issue_id; if (_isTypeOf('Number', msg.payload.issue_id)) { issue_id = msg.payload.issue_id; } var body; if (_isTypeOf('String', msg.payload.body)) { body = msg.payload.body; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.issues.createNote({ id: project_id, issue_id: issue_id, body: body }, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Create-Note", GitLabCreateNote); /** * GitLab API Create Notes **/ function GitLabUpdateNote(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); var node = this; this.on('input', function(msg) { // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } var issue_id; if (_isTypeOf('Number', msg.payload.issue_id)) { issue_id = msg.payload.issue_id; } var note_id; if (_isTypeOf('Number', msg.payload.note_id)) { note_id = msg.payload.note_id; } var body; if (_isTypeOf('String', msg.payload.body)) { body = msg.payload.body; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.issues.updateNote({ id: project_id, issue_id: issue_id, note_id: note_id, body: body }, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Update-Note", GitLabUpdateNote); // === RepositoryFiles ======================================================== /** * GitLab Get RepositoryFile **/ function GitLabGetRepositoryFile(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); this.ref = n.ref; var node = this; this.on('input', function(msg) { // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } var ref = node.ref; if (_isTypeOf('String', msg.payload.ref)) { ref = msg.payload.ref; } var file_path; if (_isTypeOf('String', msg.payload.file_path)) { file_path = msg.payload.file_path; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.repositoryFiles.get({ id: project_id, ref: ref, file_path: file_path }, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Get-RepositoryFile", GitLabGetRepositoryFile); /** * GitLab Create RepositoryFile **/ function GitLabCreateRepositoryFile(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); this.branch_name = n.branch_name; this.encoding = n.encoding; var node = this; this.on('input', function(msg) { var param = {}; // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } if (_isTypeOf('Number', project_id)) { param.id = project_id; } var branch_name = node.branch_name; if (_isTypeOf('String', msg.payload.branch_name)) { branch_name = msg.payload.branch_name; } if (_isTypeOf('String', branch_name)) { param.branch_name = branch_name; } var encoding = node.encoding; if (_isTypeOf('String', msg.payload.encoding)) { encoding = msg.payload.encoding; } if (_isTypeOf('String', encoding)) { if (encoding === "base64") { param.encoding = encoding; } } var file_path; if (_isTypeOf('String', msg.payload.file_path)) { file_path = msg.payload.file_path; param.file_path = file_path; } var content; if (_isTypeOf('String', msg.payload.content)) { content = msg.payload.content; param.content = content; } var commit_message; if (_isTypeOf('String', msg.payload.commit_message)) { commit_message = msg.payload.commit_message; param.commit_message = commit_message; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.repositoryFiles.create(param, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Create-RepositoryFile", GitLabCreateRepositoryFile); /** * GitLab Update RepositoryFile **/ function GitLabUpdateRepositoryFile(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); this.branch_name = n.branch_name; this.encoding = n.encoding; var node = this; this.on('input', function(msg) { var param = {}; // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } if (_isTypeOf('Number', project_id)) { param.id = project_id; } var branch_name = node.branch_name; if (_isTypeOf('String', msg.payload.branch_name)) { branch_name = msg.payload.branch_name; } if (_isTypeOf('String', branch_name)) { param.branch_name = branch_name; } var encoding = node.encoding; if (_isTypeOf('String', msg.payload.encoding)) { encoding = msg.payload.encoding; } if (_isTypeOf('String', encoding)) { if (encoding === "base64") { param.encoding = encoding; } } var file_path; if (_isTypeOf('String', msg.payload.file_path)) { file_path = msg.payload.file_path; param.file_path = file_path; } var content; if (_isTypeOf('String', msg.payload.content)) { content = msg.payload.content; param.content = content; } var commit_message; if (_isTypeOf('String', msg.payload.commit_message)) { commit_message = msg.payload.commit_message; param.commit_message = commit_message; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.repositoryFiles.update(param, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Update-RepositoryFile", GitLabUpdateRepositoryFile); /** * GitLab Remove RepositoryFile **/ function GitLabRemoveRepositoryFile(n) { RED.nodes.createNode(this, n); this.gitlabConfig = RED.nodes.getNode(n.gitlabconfig); this.branch_name = n.branch_name; var node = this; this.on('input', function(msg) { var param = {}; // Update if MSG has a value var project_id = Number(node.gitlabConfig.project_id); if (_isTypeOf('Number', msg.payload.project_id)) { project_id = msg.payload.project_id; } if (_isTypeOf('Number', project_id)) { param.id = project_id; } var branch_name = node.branch_name; if (_isTypeOf('String', msg.payload.branch_name)) { branch_name = msg.payload.branch_name; } if (_isTypeOf('String', branch_name)) { param.branch_name = branch_name; } var file_path; if (_isTypeOf('String', msg.payload.file_path)) { file_path = msg.payload.file_path; param.file_path = file_path; } var commit_message; if (_isTypeOf('String', msg.payload.commit_message)) { commit_message = msg.payload.commit_message; param.commit_message = commit_message; } var client = gitlab.create({ api: node.gitlabConfig.url, privateToken: node.gitlabConfig.key }); client.repositoryFiles.remove(param, function(error, body) { if (!error) { msg.payload = body; node.log(RED._('Succeeded to API Call.')); } else { requestFail(node, msg, body, error); } node.send(msg); }); }); } RED.nodes.registerType("GitLab-Remove-RepositoryFile", GitLabRemoveRepositoryFile); /** * Object type comparison * String * Number * Boolean * Date * Error * Array * Function * RegExp * Object **/ function _isTypeOf(type, obj) { var clas = Object.prototype.toString.call(obj).slice(8, -1); return obj !== undefined && obj !== null && clas === type; } }