From 6ebb471ad6088b6933095d8cf40b034f9a21da94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 10:19:00 +0100 Subject: [PATCH 01/11] init --- .gitignore | 19 + src/appmixer/redmine/README | 7 + src/appmixer/redmine/auth.js | 33 + src/appmixer/redmine/bundle.json | 9 + .../redmine/core/DeleteIssues/DeleteIssues.js | 72 + .../redmine/core/DeleteIssues/component.json | 69 + .../redmine/core/GetIssues/GetIssues.js | 85 + .../redmine/core/GetIssues/component.json | 527 +++ .../core/GetIssuesFormat/GetIssuesFormat.js | 96 + .../core/GetIssuesFormat/component.json | 387 ++ .../core/PostIssuesFormat/PostIssuesFormat.js | 94 + .../core/PostIssuesFormat/component.json | 474 +++ .../redmine/core/PutIssues/PutIssues.js | 95 + .../redmine/core/PutIssues/component.json | 304 ++ src/appmixer/redmine/lib.js | 90 + src/appmixer/redmine/openapi.orig.yml | 3659 +++++++++++++++++ src/appmixer/redmine/openapi.yml | 1359 ++++++ src/appmixer/redmine/package.json | 11 + src/appmixer/redmine/service.json | 8 + 19 files changed, 7398 insertions(+) create mode 100644 .gitignore create mode 100644 src/appmixer/redmine/README create mode 100644 src/appmixer/redmine/auth.js create mode 100644 src/appmixer/redmine/bundle.json create mode 100644 src/appmixer/redmine/core/DeleteIssues/DeleteIssues.js create mode 100644 src/appmixer/redmine/core/DeleteIssues/component.json create mode 100644 src/appmixer/redmine/core/GetIssues/GetIssues.js create mode 100644 src/appmixer/redmine/core/GetIssues/component.json create mode 100644 src/appmixer/redmine/core/GetIssuesFormat/GetIssuesFormat.js create mode 100644 src/appmixer/redmine/core/GetIssuesFormat/component.json create mode 100644 src/appmixer/redmine/core/PostIssuesFormat/PostIssuesFormat.js create mode 100644 src/appmixer/redmine/core/PostIssuesFormat/component.json create mode 100644 src/appmixer/redmine/core/PutIssues/PutIssues.js create mode 100644 src/appmixer/redmine/core/PutIssues/component.json create mode 100644 src/appmixer/redmine/lib.js create mode 100644 src/appmixer/redmine/openapi.orig.yml create mode 100644 src/appmixer/redmine/openapi.yml create mode 100644 src/appmixer/redmine/package.json create mode 100644 src/appmixer/redmine/service.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..3f6fd2f05 --- /dev/null +++ b/.gitignore @@ -0,0 +1,19 @@ +node_modules/ +frontend/node_modules/ +frontend/build/ +gridd/spmdb +logs/ +deploy/ +.DS_Store +*.log +*.cmd +*.bat +.idea/* +.fuse_* +tags +yarn.lock +**/yarn.lock +tags.lock +.vscode +*~* +.env.local diff --git a/src/appmixer/redmine/README b/src/appmixer/redmine/README new file mode 100644 index 000000000..18b46f761 --- /dev/null +++ b/src/appmixer/redmine/README @@ -0,0 +1,7 @@ +# Redmine + +## Generate module + +```sh +appmixer init openapi ./redmine/openapi.yml ./redmine/ +``` diff --git a/src/appmixer/redmine/auth.js b/src/appmixer/redmine/auth.js new file mode 100644 index 000000000..8e7a265c2 --- /dev/null +++ b/src/appmixer/redmine/auth.js @@ -0,0 +1,33 @@ +'use strict'; + +const lib = require('./lib'); + +module.exports = { + + type: 'apiKey', + + definition: { + + auth: { + apiKey: { + type: 'text', + name: 'API Key', + tooltip: 'Enter your API key.' + }, + 'url': { type: 'text', name: 'url', tooltip: 'Redmine URL' } + }, + // TODO: hide key partialy. Also show domain + accountNameFromProfileInfo: 'apiKey', + + replaceVariables(context, str) { + Object.keys(this.auth).forEach(variableName => { + str = str.replaceAll('{' + variableName + '}', context[variableName]); + }); + return str; + }, + + validate: context => { + return true; + } + } +}; diff --git a/src/appmixer/redmine/bundle.json b/src/appmixer/redmine/bundle.json new file mode 100644 index 000000000..626e5f03b --- /dev/null +++ b/src/appmixer/redmine/bundle.json @@ -0,0 +1,9 @@ +{ + "name": "appmixer.redmineapi", + "version": "1.0.0", + "changelog": { + "1.0.0": [ + "Redmine API" + ] + } +} \ No newline at end of file diff --git a/src/appmixer/redmine/core/DeleteIssues/DeleteIssues.js b/src/appmixer/redmine/core/DeleteIssues/DeleteIssues.js new file mode 100644 index 000000000..c4f71e14c --- /dev/null +++ b/src/appmixer/redmine/core/DeleteIssues/DeleteIssues.js @@ -0,0 +1,72 @@ +'use strict'; + +const lib = require('../../lib'); + +module.exports = { + + receive: async function(context) { + + await this.httpRequest(context); + + // http 204 No Content on success + return context.sendJson({}, 'out'); + }, + + httpRequest: async function(context) { + + // eslint-disable-next-line no-unused-vars + const input = context.messages.in.content; + + let url = lib.getBaseUrl(context) + `/issues/${input['issue_id']}.${input['format']}`; + + const headers = {}; + + headers['X-Redmine-API-Key'] = context.auth.apiKey; + + const req = { + url: url, + method: 'DELETE', + headers: headers + }; + + try { + const response = await context.httpRequest(req); + const log = { + step: 'http-request-success', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: { + data: response.data, + status: response.status, + statusText: response.statusText, + headers: response.headers + } + }; + await context.log(log); + return response; + } catch (err) { + const log = { + step: 'http-request-error', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: err.response ? { + data: err.response.data, + status: err.response.status, + statusText: err.response.statusText, + headers: err.response.headers + } : undefined + }; + await context.log(log); + throw err; + } + } + +}; diff --git a/src/appmixer/redmine/core/DeleteIssues/component.json b/src/appmixer/redmine/core/DeleteIssues/component.json new file mode 100644 index 000000000..cd12ef9e1 --- /dev/null +++ b/src/appmixer/redmine/core/DeleteIssues/component.json @@ -0,0 +1,69 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi.core.DeleteIssues", + "author": "Appmixer ", + "description": "", + "private": false, + "quota": {}, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "required": [ + "format", + "issue_id" + ], + "properties": { + "format": { + "type": "string", + "enum": [ + "json", + "xml" + ] + }, + "issue_id": { + "type": "integer" + } + } + }, + "inspector": { + "inputs": { + "format": { + "type": "select", + "index": 0, + "label": "Format", + "tooltip": "", + "options": [ + { + "content": "json", + "value": "json" + }, + { + "content": "xml", + "value": "xml" + } + ] + }, + "issue_id": { + "type": "number", + "index": 1, + "label": "Issue Id", + "tooltip": "" + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [] + } + ], + "properties": {}, + "auth": { + "service": "appmixer:redmineapi" + }, + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" +} \ No newline at end of file diff --git a/src/appmixer/redmine/core/GetIssues/GetIssues.js b/src/appmixer/redmine/core/GetIssues/GetIssues.js new file mode 100644 index 000000000..06a924711 --- /dev/null +++ b/src/appmixer/redmine/core/GetIssues/GetIssues.js @@ -0,0 +1,85 @@ +'use strict'; + +const lib = require('../../lib'); + +module.exports = { + + receive: async function(context) { + + const { data } = await this.httpRequest(context); + + return context.sendJson(data, 'out'); + }, + + httpRequest: async function(context) { + + // eslint-disable-next-line no-unused-vars + const input = context.messages.in.content; + + let url = lib.getBaseUrl(context) + `/issues/${input['issue_id']}.${input['format']}`; + + const headers = {}; + const query = new URLSearchParams; + + const queryParameters = { 'include': input['include'] }; + + Object.keys(queryParameters).forEach(parameter => { + if (queryParameters[parameter]) { + query.append(parameter, queryParameters[parameter]); + } + }); + + headers['X-Redmine-API-Key'] = context.auth.apiKey; + + const req = { + url: url, + method: 'GET', + headers: headers + }; + + const queryString = query.toString(); + if (queryString) { + req.url += '?' + queryString; + } + + try { + const response = await context.httpRequest(req); + const log = { + step: 'http-request-success', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: { + data: response.data, + status: response.status, + statusText: response.statusText, + headers: response.headers + } + }; + await context.log(log); + return response; + } catch (err) { + const log = { + step: 'http-request-error', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: err.response ? { + data: err.response.data, + status: err.response.status, + statusText: err.response.statusText, + headers: err.response.headers + } : undefined + }; + await context.log(log); + throw err; + } + } + +}; diff --git a/src/appmixer/redmine/core/GetIssues/component.json b/src/appmixer/redmine/core/GetIssues/component.json new file mode 100644 index 000000000..c51a4d40b --- /dev/null +++ b/src/appmixer/redmine/core/GetIssues/component.json @@ -0,0 +1,527 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi.core.GetIssues", + "author": "Appmixer ", + "description": "", + "private": false, + "quota": {}, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "required": [ + "format", + "issue_id" + ], + "properties": { + "format": { + "type": "string", + "enum": [ + "json", + "xml" + ] + }, + "issue_id": { + "type": "integer" + }, + "include": { + "type": "string", + "enum": [ + "children", + "attachments", + "relations", + "changesets", + "journals", + "watchers", + "allowed_statuses" + ] + } + } + }, + "inspector": { + "inputs": { + "format": { + "type": "select", + "index": 0, + "label": "Format", + "tooltip": "", + "options": [ + { + "content": "json", + "value": "json" + }, + { + "content": "xml", + "value": "xml" + } + ] + }, + "issue_id": { + "type": "number", + "index": 1, + "label": "Issue Id", + "tooltip": "" + }, + "include": { + "type": "select", + "index": 2, + "label": "Include", + "tooltip": "", + "options": [ + { + "content": "children", + "value": "children" + }, + { + "content": "attachments", + "value": "attachments" + }, + { + "content": "relations", + "value": "relations" + }, + { + "content": "changesets", + "value": "changesets" + }, + { + "content": "journals", + "value": "journals" + }, + { + "content": "watchers", + "value": "watchers" + }, + { + "content": "allowed_statuses", + "value": "allowed_statuses" + } + ] + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Issue", + "value": "issue" + }, + { + "label": "Issue Id", + "value": "issue.id" + }, + { + "label": "Issue Project", + "value": "issue.project" + }, + { + "label": "Issue Project Id", + "value": "issue.project.id" + }, + { + "label": "Issue Project Name", + "value": "issue.project.name" + }, + { + "label": "Issue Tracker", + "value": "issue.tracker" + }, + { + "label": "Issue Tracker Id", + "value": "issue.tracker.id" + }, + { + "label": "Issue Tracker Name", + "value": "issue.tracker.name" + }, + { + "label": "Issue Status", + "value": "issue.status" + }, + { + "label": "Issue Status Id", + "value": "issue.status.id" + }, + { + "label": "Issue Status Name", + "value": "issue.status.name" + }, + { + "label": "Issue Status Is Closed", + "value": "issue.status.is_closed" + }, + { + "label": "Issue Priority", + "value": "issue.priority" + }, + { + "label": "Issue Priority Id", + "value": "issue.priority.id" + }, + { + "label": "Issue Priority Name", + "value": "issue.priority.name" + }, + { + "label": "Issue Author", + "value": "issue.author" + }, + { + "label": "Issue Author Id", + "value": "issue.author.id" + }, + { + "label": "Issue Author Name", + "value": "issue.author.name" + }, + { + "label": "Issue Assigned To", + "value": "issue.assigned_to" + }, + { + "label": "Issue Assigned To Id", + "value": "issue.assigned_to.id" + }, + { + "label": "Issue Assigned To Name", + "value": "issue.assigned_to.name" + }, + { + "label": "Issue Category", + "value": "issue.category" + }, + { + "label": "Issue Category Id", + "value": "issue.category.id" + }, + { + "label": "Issue Category Name", + "value": "issue.category.name" + }, + { + "label": "Issue Subject", + "value": "issue.subject" + }, + { + "label": "Issue Description", + "value": "issue.description" + }, + { + "label": "Issue Start Date", + "value": "issue.start_date" + }, + { + "label": "Issue Due Date", + "value": "issue.due_date" + }, + { + "label": "Issue Done Ratio", + "value": "issue.done_ratio" + }, + { + "label": "Issue Is Private", + "value": "issue.is_private" + }, + { + "label": "Issue Estimated Hours", + "value": "issue.estimated_hours" + }, + { + "label": "Issue Total Estimated Hours", + "value": "issue.total_estimated_hours" + }, + { + "label": "Issue Spent Hours", + "value": "issue.spent_hours" + }, + { + "label": "Issue Total Spent Hours", + "value": "issue.total_spent_hours" + }, + { + "label": "Issue Created On", + "value": "issue.created_on" + }, + { + "label": "Issue Updated On", + "value": "issue.updated_on" + }, + { + "label": "Issue Closed On", + "value": "issue.closed_on" + }, + { + "label": "Issue Changesets", + "value": "issue.changesets", + "schema": { + "type": "array", + "items": { + "type": "string" + } + } + }, + { + "label": "Issue Children", + "value": "issue.children", + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "tracker", + "subject" + ], + "properties": { + "id": { + "type": "integer" + }, + "tracker": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "subject": { + "type": "string" + } + } + } + } + }, + { + "label": "Issue Attachments", + "value": "issue.attachments", + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "filename", + "filesize", + "content_type", + "description", + "content_url", + "author", + "created_on" + ], + "properties": { + "id": { + "type": "integer" + }, + "filename": { + "type": "string" + }, + "filesize": { + "type": "integer" + }, + "content_type": { + "type": "string" + }, + "description": { + "type": "string" + }, + "content_url": { + "type": "string" + }, + "author": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "created_on": { + "type": "string", + "format": "data-time" + }, + "thumbnail_url": { + "type": "string" + } + } + } + } + }, + { + "label": "Issue Relations", + "value": "issue.relations", + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "integer" + }, + "issue_id": { + "type": "integer" + }, + "issue_to_id": { + "type": "integer" + }, + "relation_type": { + "type": "string" + }, + "delay": { + "type": "integer", + "nullable": true + } + } + } + } + }, + { + "label": "Issue Journals", + "value": "issue.journals", + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "user", + "notes", + "created_on", + "private_notes", + "details" + ], + "properties": { + "id": { + "type": "integer" + }, + "user": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "notes": { + "type": "string" + }, + "created_on": { + "type": "string", + "format": "date-time" + }, + "private_notes": { + "type": "boolean" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "required": [ + "property", + "name", + "old_value", + "new_value" + ], + "properties": { + "property": { + "type": "string" + }, + "name": { + "type": "string" + }, + "old_value": { + "type": "string", + "nullable": true + }, + "new_value": { + "type": "string" + } + } + } + } + } + } + } + }, + { + "label": "Issue Watchers", + "value": "issue.watchers", + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + } + } + }, + { + "label": "Issue Allowed Statuses", + "value": "issue.allowed_statuses", + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "is_closed", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "is_closed": { + "type": "boolean" + } + } + } + } + } + ] + } + ], + "properties": {}, + "auth": { + "service": "appmixer:redmineapi" + }, + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" +} \ No newline at end of file diff --git a/src/appmixer/redmine/core/GetIssuesFormat/GetIssuesFormat.js b/src/appmixer/redmine/core/GetIssuesFormat/GetIssuesFormat.js new file mode 100644 index 000000000..5807f2935 --- /dev/null +++ b/src/appmixer/redmine/core/GetIssuesFormat/GetIssuesFormat.js @@ -0,0 +1,96 @@ +'use strict'; + +const lib = require('../../lib'); + +module.exports = { + + receive: async function(context) { + + const { data } = await this.httpRequest(context); + + return context.sendJson(data, 'out'); + }, + + httpRequest: async function(context) { + + // eslint-disable-next-line no-unused-vars + const input = context.messages.in.content; + + let url = lib.getBaseUrl(context) + `/issues.${input['format']}`; + + const headers = {}; + const query = new URLSearchParams; + + const queryParameters = { 'offset': input['offset'], + 'limit': input['limit'], + 'sort': input['sort'], + 'include': input['include'], + 'issue_id': input['issue_id'], + 'project_id': input['project_id'], + 'subproject_id': input['subproject_id'], + 'tracker_id': input['tracker_id'], + 'status_id': input['status_id'], + 'assigned_to_id': input['assigned_to_id'], + 'parent_id': input['parent_id'], + 'cf_x': input['cf_x'] }; + + Object.keys(queryParameters).forEach(parameter => { + if (queryParameters[parameter]) { + query.append(parameter, queryParameters[parameter]); + } + }); + + headers['X-Redmine-API-Key'] = context.auth.apiKey; + + const req = { + url: url, + method: 'GET', + headers: headers + }; + + const queryString = query.toString(); + if (queryString) { + req.url += '?' + queryString; + } + + try { + const response = await context.httpRequest(req); + const log = { + step: 'http-request-success', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: { + data: response.data, + status: response.status, + statusText: response.statusText, + headers: response.headers + } + }; + await context.log(log); + return response; + } catch (err) { + const log = { + step: 'http-request-error', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: err.response ? { + data: err.response.data, + status: err.response.status, + statusText: err.response.statusText, + headers: err.response.headers + } : undefined + }; + await context.log(log); + throw err; + } + } + +}; diff --git a/src/appmixer/redmine/core/GetIssuesFormat/component.json b/src/appmixer/redmine/core/GetIssuesFormat/component.json new file mode 100644 index 000000000..17bd5626b --- /dev/null +++ b/src/appmixer/redmine/core/GetIssuesFormat/component.json @@ -0,0 +1,387 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi.core.GetIssuesFormat", + "author": "Appmixer ", + "description": "", + "private": false, + "quota": {}, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "required": [ + "format" + ], + "properties": { + "format": { + "type": "string", + "enum": [ + "json", + "xml" + ] + }, + "offset": { + "type": "integer" + }, + "limit": { + "type": "integer" + }, + "sort": { + "type": "string" + }, + "include": { + "type": "string", + "enum": [ + "attachments", + "relations" + ] + }, + "issue_id": { + "type": "string" + }, + "project_id": { + "type": "string" + }, + "subproject_id": { + "type": "string" + }, + "tracker_id": { + "type": "integer" + }, + "status_id": { + "type": "string" + }, + "assigned_to_id": { + "type": "string" + }, + "parent_id": { + "type": "string" + }, + "cf_x": { + "type": "string" + } + } + }, + "inspector": { + "inputs": { + "format": { + "type": "select", + "index": 0, + "label": "Format", + "tooltip": "", + "options": [ + { + "content": "json", + "value": "json" + }, + { + "content": "xml", + "value": "xml" + } + ] + }, + "offset": { + "type": "number", + "index": 1, + "label": "Offset", + "tooltip": "" + }, + "limit": { + "type": "number", + "index": 2, + "label": "Limit", + "tooltip": "" + }, + "sort": { + "type": "text", + "index": 3, + "label": "Sort", + "tooltip": "" + }, + "include": { + "type": "select", + "index": 4, + "label": "Include", + "tooltip": "", + "options": [ + { + "content": "attachments", + "value": "attachments" + }, + { + "content": "relations", + "value": "relations" + } + ] + }, + "issue_id": { + "type": "text", + "index": 5, + "label": "Issue Id", + "tooltip": "" + }, + "project_id": { + "type": "text", + "index": 6, + "label": "Project Id", + "tooltip": "" + }, + "subproject_id": { + "type": "text", + "index": 7, + "label": "Subproject Id", + "tooltip": "" + }, + "tracker_id": { + "type": "number", + "index": 8, + "label": "Tracker Id", + "tooltip": "" + }, + "status_id": { + "type": "text", + "index": 9, + "label": "Status Id", + "tooltip": "" + }, + "assigned_to_id": { + "type": "text", + "index": 10, + "label": "Assigned To Id", + "tooltip": "" + }, + "parent_id": { + "type": "text", + "index": 11, + "label": "Parent Id", + "tooltip": "" + }, + "cf_x": { + "type": "text", + "index": 12, + "label": "Cf X", + "tooltip": "" + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Issues", + "value": "issues", + "schema": { + "type": "array", + "items": { + "type": "object", + "required": [ + "author", + "closed_on", + "created_on", + "description", + "done_ratio", + "due_date", + "estimated_hours", + "id", + "is_private", + "priority", + "project", + "spent_hours", + "start_date", + "status", + "subject", + "total_estimated_hours", + "total_spent_hours", + "tracker", + "updated_on" + ], + "properties": { + "id": { + "type": "integer" + }, + "project": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "tracker": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "status": { + "type": "object", + "required": [ + "id", + "is_closed", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "is_closed": { + "type": "boolean" + } + } + }, + "priority": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "author": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "assigned_to": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "category": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + } + }, + "subject": { + "type": "string" + }, + "description": { + "type": "string", + "nullable": true + }, + "start_date": { + "type": "string", + "nullable": true + }, + "due_date": { + "type": "string", + "nullable": true + }, + "done_ratio": { + "type": "integer" + }, + "is_private": { + "type": "boolean" + }, + "estimated_hours": { + "type": "number", + "nullable": true + }, + "total_estimated_hours": { + "type": "number", + "nullable": true + }, + "spent_hours": { + "type": "number" + }, + "total_spent_hours": { + "type": "number" + }, + "created_on": { + "type": "string", + "format": "date-time" + }, + "updated_on": { + "type": "string", + "format": "date-time" + }, + "closed_on": { + "type": "string", + "format": "date-time", + "nullable": true + } + } + } + } + }, + { + "label": "Total Count", + "value": "total_count" + }, + { + "label": "Offset", + "value": "offset" + }, + { + "label": "Limit", + "value": "limit" + } + ] + } + ], + "properties": {}, + "auth": { + "service": "appmixer:redmineapi" + }, + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" +} \ No newline at end of file diff --git a/src/appmixer/redmine/core/PostIssuesFormat/PostIssuesFormat.js b/src/appmixer/redmine/core/PostIssuesFormat/PostIssuesFormat.js new file mode 100644 index 000000000..6cfcab613 --- /dev/null +++ b/src/appmixer/redmine/core/PostIssuesFormat/PostIssuesFormat.js @@ -0,0 +1,94 @@ +'use strict'; + +const lib = require('../../lib'); + +module.exports = { + + receive: async function(context) { + + const { data } = await this.httpRequest(context); + + return context.sendJson(data, 'out'); + }, + + httpRequest: async function(context) { + + // eslint-disable-next-line no-unused-vars + const input = context.messages.in.content; + + let url = lib.getBaseUrl(context) + `/issues.${input['format']}`; + + const headers = {}; + + const inputMapping = { + 'issue.project_id': input['issue|project_id'], + 'issue.tracker_id': input['issue|tracker_id'], + 'issue.status_id': input['issue|status_id'], + 'issue.priority_id': input['issue|priority_id'], + 'issue.subject': input['issue|subject'], + 'issue.description': input['issue|description'], + 'issue.start_date': input['issue|start_date'], + 'issue.due_date': input['issue|due_date'], + 'issue.category_id': input['issue|category_id'], + 'issue.fixed_version_id': input['issue|fixed_version_id'], + 'issue.assigned_to_id': input['issue|assigned_to_id'], + 'issue.parent_issue_id': input['issue|parent_issue_id'], + 'issue.custom_fields': input['issue|custom_fields'], + 'issue.watcher_user_ids': input['issue|watcher_user_ids'], + 'issue.is_private': input['issue|is_private'], + 'issue.estimated_hours': input['issue|estimated_hours'], + 'issue.uploads': !!input['issue|uploads'] ? JSON.parse(input['issue|uploads']) : undefined + }; + let requestBody = {}; + lib.setProperties(requestBody, inputMapping); + + headers['X-Redmine-API-Key'] = context.auth.apiKey; + + const req = { + url: url, + method: 'POST', + data: requestBody, + headers: headers + }; + + try { + const response = await context.httpRequest(req); + const log = { + step: 'http-request-success', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: { + data: response.data, + status: response.status, + statusText: response.statusText, + headers: response.headers + } + }; + await context.log(log); + return response; + } catch (err) { + const log = { + step: 'http-request-error', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: err.response ? { + data: err.response.data, + status: err.response.status, + statusText: err.response.statusText, + headers: err.response.headers + } : undefined + }; + await context.log(log); + throw err; + } + } + +}; diff --git a/src/appmixer/redmine/core/PostIssuesFormat/component.json b/src/appmixer/redmine/core/PostIssuesFormat/component.json new file mode 100644 index 000000000..b9eff42b5 --- /dev/null +++ b/src/appmixer/redmine/core/PostIssuesFormat/component.json @@ -0,0 +1,474 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi.core.PostIssuesFormat", + "author": "Appmixer ", + "description": "", + "private": false, + "quota": {}, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "required": [ + "format", + "issue" + ], + "properties": { + "format": { + "type": "string", + "enum": [ + "json", + "xml" + ] + }, + "issue|project_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.project_id" + }, + "issue|tracker_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.tracker_id" + }, + "issue|status_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.status_id" + }, + "issue|priority_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.priority_id" + }, + "issue|subject": { + "type": "string", + "path": "issue.subject" + }, + "issue|description": { + "type": "string", + "nullable": true, + "path": "issue.description" + }, + "issue|start_date": { + "type": "string", + "format": "date", + "nullable": true, + "path": "issue.start_date" + }, + "issue|due_date": { + "type": "string", + "format": "date", + "nullable": true, + "path": "issue.due_date" + }, + "issue|category_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.category_id" + }, + "issue|fixed_version_id": { + "type": "string", + "path": "issue.fixed_version_id" + }, + "issue|assigned_to_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.assigned_to_id" + }, + "issue|parent_issue_id": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "string", + "nullable": true + } + ], + "path": "issue.parent_issue_id" + }, + "issue|custom_fields": { + "type": "string", + "path": "issue.custom_fields" + }, + "issue|watcher_user_ids": { + "type": "array", + "path": "issue.watcher_user_ids", + "items": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ] + } + }, + "issue|is_private": { + "type": "boolean", + "path": "issue.is_private" + }, + "issue|estimated_hours": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "string", + "nullable": true + } + ], + "path": "issue.estimated_hours" + }, + "issue|uploads": { + "type": "string", + "path": "issue.uploads", + "parseInReceive": true, + "properties": { + "upload": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "filename": { + "type": "string" + }, + "description": { + "type": "string" + }, + "content_type": { + "type": "string" + } + } + } + } + } + } + }, + "inspector": { + "inputs": { + "format": { + "type": "select", + "index": 0, + "label": "Format", + "tooltip": "", + "options": [ + { + "content": "json", + "value": "json" + }, + { + "content": "xml", + "value": "xml" + } + ] + }, + "issue|project_id": { + "type": "number", + "index": 1, + "label": "Issue Project Id", + "tooltip": "" + }, + "issue|tracker_id": { + "type": "number", + "index": 2, + "label": "Issue Tracker Id", + "tooltip": "" + }, + "issue|status_id": { + "type": "number", + "index": 3, + "label": "Issue Status Id", + "tooltip": "" + }, + "issue|priority_id": { + "type": "number", + "index": 4, + "label": "Issue Priority Id", + "tooltip": "" + }, + "issue|subject": { + "type": "text", + "index": 5, + "label": "Issue Subject", + "tooltip": "" + }, + "issue|description": { + "type": "text", + "index": 6, + "label": "Issue Description", + "tooltip": "" + }, + "issue|start_date": { + "type": "text", + "index": 7, + "label": "Issue Start Date", + "tooltip": "" + }, + "issue|due_date": { + "type": "text", + "index": 8, + "label": "Issue Due Date", + "tooltip": "" + }, + "issue|category_id": { + "type": "number", + "index": 9, + "label": "Issue Category Id", + "tooltip": "" + }, + "issue|fixed_version_id": { + "type": "text", + "index": 10, + "label": "Issue Fixed Version Id", + "tooltip": "" + }, + "issue|assigned_to_id": { + "type": "number", + "index": 11, + "label": "Issue Assigned To Id", + "tooltip": "" + }, + "issue|parent_issue_id": { + "type": "number", + "index": 12, + "label": "Issue Parent Issue Id", + "tooltip": "" + }, + "issue|custom_fields": { + "type": "text", + "index": 13, + "label": "Issue Custom Fields", + "tooltip": "" + }, + "issue|watcher_user_ids": { + "type": "textarea", + "index": 14, + "label": "Issue Watcher User Ids", + "tooltip": " JSON array. Example: [94313896]." + }, + "issue|is_private": { + "type": "toggle", + "index": 15, + "label": "Issue Is Private", + "tooltip": "" + }, + "issue|estimated_hours": { + "type": "number", + "index": 16, + "label": "Issue Estimated Hours", + "tooltip": "" + }, + "issue|uploads": { + "type": "text", + "index": 17, + "label": "Issue Uploads", + "tooltip": "" + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Issue", + "value": "issue" + }, + { + "label": "Issue Id", + "value": "issue.id" + }, + { + "label": "Issue Project", + "value": "issue.project" + }, + { + "label": "Issue Project Id", + "value": "issue.project.id" + }, + { + "label": "Issue Project Name", + "value": "issue.project.name" + }, + { + "label": "Issue Tracker", + "value": "issue.tracker" + }, + { + "label": "Issue Tracker Id", + "value": "issue.tracker.id" + }, + { + "label": "Issue Tracker Name", + "value": "issue.tracker.name" + }, + { + "label": "Issue Status", + "value": "issue.status" + }, + { + "label": "Issue Status Id", + "value": "issue.status.id" + }, + { + "label": "Issue Status Name", + "value": "issue.status.name" + }, + { + "label": "Issue Status Is Closed", + "value": "issue.status.is_closed" + }, + { + "label": "Issue Priority", + "value": "issue.priority" + }, + { + "label": "Issue Priority Id", + "value": "issue.priority.id" + }, + { + "label": "Issue Priority Name", + "value": "issue.priority.name" + }, + { + "label": "Issue Author", + "value": "issue.author" + }, + { + "label": "Issue Author Id", + "value": "issue.author.id" + }, + { + "label": "Issue Author Name", + "value": "issue.author.name" + }, + { + "label": "Issue Assigned To", + "value": "issue.assigned_to" + }, + { + "label": "Issue Assigned To Id", + "value": "issue.assigned_to.id" + }, + { + "label": "Issue Assigned To Name", + "value": "issue.assigned_to.name" + }, + { + "label": "Issue Category", + "value": "issue.category" + }, + { + "label": "Issue Category Id", + "value": "issue.category.id" + }, + { + "label": "Issue Category Name", + "value": "issue.category.name" + }, + { + "label": "Issue Subject", + "value": "issue.subject" + }, + { + "label": "Issue Description", + "value": "issue.description" + }, + { + "label": "Issue Start Date", + "value": "issue.start_date" + }, + { + "label": "Issue Due Date", + "value": "issue.due_date" + }, + { + "label": "Issue Done Ratio", + "value": "issue.done_ratio" + }, + { + "label": "Issue Is Private", + "value": "issue.is_private" + }, + { + "label": "Issue Estimated Hours", + "value": "issue.estimated_hours" + }, + { + "label": "Issue Total Estimated Hours", + "value": "issue.total_estimated_hours" + }, + { + "label": "Issue Spent Hours", + "value": "issue.spent_hours" + }, + { + "label": "Issue Total Spent Hours", + "value": "issue.total_spent_hours" + }, + { + "label": "Issue Created On", + "value": "issue.created_on" + }, + { + "label": "Issue Updated On", + "value": "issue.updated_on" + }, + { + "label": "Issue Closed On", + "value": "issue.closed_on" + } + ] + } + ], + "properties": {}, + "auth": { + "service": "appmixer:redmineapi" + }, + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" +} \ No newline at end of file diff --git a/src/appmixer/redmine/core/PutIssues/PutIssues.js b/src/appmixer/redmine/core/PutIssues/PutIssues.js new file mode 100644 index 000000000..74e07b113 --- /dev/null +++ b/src/appmixer/redmine/core/PutIssues/PutIssues.js @@ -0,0 +1,95 @@ +'use strict'; + +const lib = require('../../lib'); + +module.exports = { + + receive: async function(context) { + + await this.httpRequest(context); + + // http 204 No Content on success + return context.sendJson({}, 'out'); + }, + + httpRequest: async function(context) { + + // eslint-disable-next-line no-unused-vars + const input = context.messages.in.content; + + let url = lib.getBaseUrl(context) + `/issues/${input['issue_id']}.${input['format']}`; + + const headers = {}; + + const inputMapping = { + 'issue.project_id': input['issue|project_id'], + 'issue.tracker_id': input['issue|tracker_id'], + 'issue.status_id': input['issue|status_id'], + 'issue.priority_id': input['issue|priority_id'], + 'issue.subject': input['issue|subject'], + 'issue.description': input['issue|description'], + 'issue.start_date': input['issue|start_date'], + 'issue.due_date': input['issue|due_date'], + 'issue.category_id': input['issue|category_id'], + 'issue.fixed_version_id': input['issue|fixed_version_id'], + 'issue.assigned_to_id': input['issue|assigned_to_id'], + 'issue.parent_issue_id': input['issue|parent_issue_id'], + 'issue.custom_fields': input['issue|custom_fields'], + 'issue.is_private': input['issue|is_private'], + 'issue.estimated_hours': input['issue|estimated_hours'], + 'issue.notes': input['issue|notes'], + 'issue.private_notes': input['issue|private_notes'] + }; + let requestBody = {}; + lib.setProperties(requestBody, inputMapping); + + headers['X-Redmine-API-Key'] = context.auth.apiKey; + + const req = { + url: url, + method: 'PUT', + data: requestBody, + headers: headers + }; + + try { + const response = await context.httpRequest(req); + const log = { + step: 'http-request-success', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: { + data: response.data, + status: response.status, + statusText: response.statusText, + headers: response.headers + } + }; + await context.log(log); + return response; + } catch (err) { + const log = { + step: 'http-request-error', + request: { + url: req.url, + method: req.method, + headers: req.headers, + data: req.data + }, + response: err.response ? { + data: err.response.data, + status: err.response.status, + statusText: err.response.statusText, + headers: err.response.headers + } : undefined + }; + await context.log(log); + throw err; + } + } + +}; diff --git a/src/appmixer/redmine/core/PutIssues/component.json b/src/appmixer/redmine/core/PutIssues/component.json new file mode 100644 index 000000000..65b0fecd6 --- /dev/null +++ b/src/appmixer/redmine/core/PutIssues/component.json @@ -0,0 +1,304 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi.core.PutIssues", + "author": "Appmixer ", + "description": "", + "private": false, + "quota": {}, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "required": [ + "format", + "issue_id" + ], + "properties": { + "format": { + "type": "string", + "enum": [ + "json", + "xml" + ] + }, + "issue_id": { + "type": "integer" + }, + "issue|project_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.project_id" + }, + "issue|tracker_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.tracker_id" + }, + "issue|status_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.status_id" + }, + "issue|priority_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.priority_id" + }, + "issue|subject": { + "type": "string", + "path": "issue.subject" + }, + "issue|description": { + "type": "string", + "nullable": true, + "path": "issue.description" + }, + "issue|start_date": { + "type": "string", + "format": "date", + "nullable": true, + "path": "issue.start_date" + }, + "issue|due_date": { + "type": "string", + "format": "date", + "nullable": true, + "path": "issue.due_date" + }, + "issue|category_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.category_id" + }, + "issue|fixed_version_id": { + "type": "string", + "path": "issue.fixed_version_id" + }, + "issue|assigned_to_id": { + "oneOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "path": "issue.assigned_to_id" + }, + "issue|parent_issue_id": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "string", + "nullable": true + } + ], + "path": "issue.parent_issue_id" + }, + "issue|custom_fields": { + "type": "string", + "path": "issue.custom_fields" + }, + "issue|is_private": { + "type": "boolean", + "path": "issue.is_private" + }, + "issue|estimated_hours": { + "oneOf": [ + { + "type": "integer", + "nullable": true + }, + { + "type": "string", + "nullable": true + } + ], + "path": "issue.estimated_hours" + }, + "issue|notes": { + "type": "string", + "path": "issue.notes" + }, + "issue|private_notes": { + "type": "string", + "path": "issue.private_notes" + } + } + }, + "inspector": { + "inputs": { + "format": { + "type": "select", + "index": 0, + "label": "Format", + "tooltip": "", + "options": [ + { + "content": "json", + "value": "json" + }, + { + "content": "xml", + "value": "xml" + } + ] + }, + "issue_id": { + "type": "number", + "index": 1, + "label": "Issue Id", + "tooltip": "" + }, + "issue|project_id": { + "type": "number", + "index": 2, + "label": "Issue Project Id", + "tooltip": "" + }, + "issue|tracker_id": { + "type": "number", + "index": 3, + "label": "Issue Tracker Id", + "tooltip": "" + }, + "issue|status_id": { + "type": "number", + "index": 4, + "label": "Issue Status Id", + "tooltip": "" + }, + "issue|priority_id": { + "type": "number", + "index": 5, + "label": "Issue Priority Id", + "tooltip": "" + }, + "issue|subject": { + "type": "text", + "index": 6, + "label": "Issue Subject", + "tooltip": "" + }, + "issue|description": { + "type": "text", + "index": 7, + "label": "Issue Description", + "tooltip": "" + }, + "issue|start_date": { + "type": "text", + "index": 8, + "label": "Issue Start Date", + "tooltip": "" + }, + "issue|due_date": { + "type": "text", + "index": 9, + "label": "Issue Due Date", + "tooltip": "" + }, + "issue|category_id": { + "type": "number", + "index": 10, + "label": "Issue Category Id", + "tooltip": "" + }, + "issue|fixed_version_id": { + "type": "text", + "index": 11, + "label": "Issue Fixed Version Id", + "tooltip": "" + }, + "issue|assigned_to_id": { + "type": "number", + "index": 12, + "label": "Issue Assigned To Id", + "tooltip": "" + }, + "issue|parent_issue_id": { + "type": "number", + "index": 13, + "label": "Issue Parent Issue Id", + "tooltip": "" + }, + "issue|custom_fields": { + "type": "text", + "index": 14, + "label": "Issue Custom Fields", + "tooltip": "" + }, + "issue|is_private": { + "type": "toggle", + "index": 15, + "label": "Issue Is Private", + "tooltip": "" + }, + "issue|estimated_hours": { + "type": "number", + "index": 16, + "label": "Issue Estimated Hours", + "tooltip": "" + }, + "issue|notes": { + "type": "text", + "index": 17, + "label": "Issue Notes", + "tooltip": "" + }, + "issue|private_notes": { + "type": "text", + "index": 18, + "label": "Issue Private Notes", + "tooltip": "" + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [] + } + ], + "properties": {}, + "auth": { + "service": "appmixer:redmineapi" + }, + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" +} \ No newline at end of file diff --git a/src/appmixer/redmine/lib.js b/src/appmixer/redmine/lib.js new file mode 100644 index 000000000..f819d4cfa --- /dev/null +++ b/src/appmixer/redmine/lib.js @@ -0,0 +1,90 @@ +'use strict'; + +module.exports = { + + jsonata: require('jsonata'), + + jsonPointer: require('json-pointer'), + + jmespath: require('jmespath'), + + FormData: require('form-data'), + + getBaseUrl: function(context) { + + let url = ''; + return url; + }, + + setProperty: function(obj, path, value) { + + if (!obj || typeof obj !== 'object' || !path) { + throw new Error('Invalid input'); + } + + if (typeof value === 'undefined') return; + + const pathArray = Array.isArray(path) ? path : path.split('.'); + const pathLength = pathArray.length; + + for (let i = 0; i < pathLength - 1; i++) { + const key = pathArray[i]; + if (!obj.hasOwnProperty(key) || typeof obj[key] !== 'object') { + obj[key] = {}; + } + obj = obj[key]; + } + + obj[pathArray[pathLength - 1]] = value; + }, + + setProperties: function(obj, mapping) { + + Object.keys(mapping || {}).forEach(path => { + this.setProperty(obj, path, mapping[path]); + }); + }, + + replaceRuntimeExpressions: async function(template, context, response, request) { + + if (template === '$request.body') { + return request.data; + } + + let result = typeof template === 'string' ? template : JSON.stringify(template); + + result = result.replace(/{\$webhookUrl}/g, context.getWebhookUrl()); + result = result.replace(/{\$baseUrl}/g, this.getBaseUrl(context)); + + result = result.replace(/{\$response.body#([^}]*)}/g, (match, pointer) => { + return this.jsonPointer.get(response.data, pointer); + }); + + result = result.replace(/{\$parameters\.([^}]*)}/g, (match, pointer) => { + return this.jsonPointer.get(context.properties, '/' + pointer); + }); + + result = result.replace(/{\$connection.profile\.([^}]*)}/g, (match, pointer) => { + return this.jsonPointer.get(context.auth.profileInfo, '/' + pointer); + }); + result = result.replace(/{\$connection.profile#([^}]*)}/g, (match, pointer) => { + return this.jsonPointer.get(context.auth.profileInfo, pointer); + }); + + const responseTransformPromises = []; + const responseTransformRegex = /{\$response.transform#(.*(? { + const expression = this.jsonata(exp); + responseTransformPromises.push(expression.evaluate(response)); + }); + const replacements = await Promise.all(responseTransformPromises); + result = result.replace(responseTransformRegex, () => replacements.shift()); + + result = result.replace(/{\$response.header\.([^}]*)}/g, (match, pointer) => { + return this.jsonPointer.get(response.headers, '/' + pointer); + }); + + return typeof template === 'string' ? result : JSON.parse(result); + } + +}; diff --git a/src/appmixer/redmine/openapi.orig.yml b/src/appmixer/redmine/openapi.orig.yml new file mode 100644 index 000000000..3a5f8279f --- /dev/null +++ b/src/appmixer/redmine/openapi.orig.yml @@ -0,0 +1,3659 @@ +openapi: 3.0.3 +info: + title: Redmine API + description: 'NOTE: This is unofficial OpenAPI specification file.' + version: 5.0.0 + contact: + name: d-yoshi/redmine-openapi + url: 'https://github.com/d-yoshi/redmine-openapi' +externalDocs: + description: Redmine API Official Developer Guide + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api' +security: + - BasicAuth: [] + - ApiKeyAuth: [] +paths: + '/issues.{format}': + get: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Listing-issues' + summary: Listing issues + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/limit' + - name: sort + in: query + schema: + type: string + - name: include + in: query + schema: + type: string + enum: + - attachments + - relations + - name: issue_id + in: query + schema: + type: string + - name: project_id + in: query + schema: + type: string + - name: subproject_id + in: query + schema: + type: string + - name: tracker_id + in: query + schema: + type: integer + - name: status_id + in: query + schema: + type: string + - name: assigned_to_id + in: query + schema: + type: string + - name: parent_id + in: query + schema: + type: string + - name: cf_x + in: query + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - issues + - total_count + - offset + - limit + properties: + issues: + type: array + items: + allOf: + - $ref: '#/components/schemas/Issue' + - type: object + required: + - spent_hours + - total_spent_hours + properties: + spent_hours: + type: number + total_spent_hours: + type: number + total_count: + type: integer + offset: + type: integer + limit: + type: integer + post: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Creating-an-issue' + summary: Creating an issue + parameters: + - $ref: '#/components/parameters/format' + requestBody: + content: + application/json: + schema: + type: object + required: + - issue + properties: + issue: + type: object + required: + - project_id + - tracer_id + - status_id + - subject + properties: + project_id: + oneOf: + - type: integer + - type: string + tracker_id: + oneOf: + - type: integer + - type: string + status_id: + oneOf: + - type: integer + - type: string + priority_id: + oneOf: + - type: integer + - type: string + subject: + type: string + description: + type: string + nullable: true + start_date: + type: string + format: date + nullable: true + due_date: + type: string + format: date + nullable: true + category_id: + oneOf: + - type: integer + - type: string + fixed_version_id: + type: string + assigned_to_id: + oneOf: + - type: integer + - type: string + parent_issue_id: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + custom_fields: + type: string + watcher_user_ids: + type: array + items: + oneOf: + - type: integer + - type: string + is_private: + type: boolean + estimated_hours: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + uploads: + type: object + properties: + upload: + type: object + properties: + token: + type: string + filename: + type: string + description: + type: string + content_type: + type: string + responses: + '201': + description: '' + content: + application/json: + schema: + type: object + required: + - issue + properties: + issue: + $ref: '#/components/schemas/Issue' + '/issues/{issue_id}.{format}': + get: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Showing-an-issue' + summary: Showing an issue + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + - name: include + in: query + schema: + type: string + enum: + - children + - attachments + - relations + - changesets + - journals + - watchers + - allowed_statuses + responses: + '200': + description: '' + content: + application/json: + schema: + allOf: + - type: object + required: + - issue + properties: + issue: + $ref: '#/components/schemas/Issue' + - type: object + required: + - issue + properties: + issue: + $ref: '#/components/schemas/IssuePartial' + put: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue' + summary: Updating an issue + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + issue: + type: object + properties: + project_id: + oneOf: + - type: integer + - type: string + tracker_id: + oneOf: + - type: integer + - type: string + status_id: + oneOf: + - type: integer + - type: string + priority_id: + oneOf: + - type: integer + - type: string + subject: + type: string + description: + type: string + nullable: true + start_date: + type: string + format: date + nullable: true + due_date: + type: string + format: date + nullable: true + category_id: + oneOf: + - type: integer + - type: string + fixed_version_id: + type: string + assigned_to_id: + oneOf: + - type: integer + - type: string + parent_issue_id: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + custom_fields: + type: string + is_private: + type: boolean + estimated_hours: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + notes: + type: string + private_notes: + type: string + responses: + '204': + description: '' + delete: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Deleting-an-issue' + summary: Deleting an issue + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + responses: + '204': + description: '' + '/issues/{issue_id}/watchers.{format}': + post: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Adding-a-watcher' + summary: Adding a watcher + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + requestBody: + content: + application/json: + schema: + type: object + required: + - user_id + properties: + user_id: + oneOf: + - type: integer + - type: string + responses: + '204': + description: '' + '/issues/{issue_id}/watchers/{user_id}.{format}': + delete: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Removing-a-watcher' + summary: Removing a watcher + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + - $ref: '#/components/parameters/user_id' + responses: + '204': + description: '' + '/projects.{format}': + get: + tags: + - Projects + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Listing-projects' + summary: Listing projects + parameters: + - $ref: '#/components/parameters/format' + - name: include + in: query + schema: + type: string + enum: + - trackers + - issue_categories + - enabled_modules + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - projects + - total_count + - offset + - limit + properties: + projects: + type: array + items: + $ref: '#/components/schemas/Project' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + post: + tags: + - Projects + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Creating-a-project' + summary: Creating a project + parameters: + - $ref: '#/components/parameters/format' + requestBody: + content: + application/json: + schema: + type: object + required: + - project + properties: + project: + type: object + required: + - name + - identifier + properties: + name: + type: string + identifier: + type: string + description: + type: string + nullable: true + homepage: + type: string + nullable: true + is_public: + type: boolean + parent_id: + oneOf: + - type: integer + - type: string + inherit_members: + type: boolean + default_assigned_to_id: + type: string + default_version_id: + type: string + tracker_ids: + type: array + items: + oneOf: + - type: integer + - type: string + enabled_module_names: + type: array + items: + type: string + issue_custom_field_ids: + type: array + items: + oneOf: + - type: integer + - type: string + custom_field_values: + type: object + additionalProperties: + type: string + example: + '1': VALUE + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Project' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/projects/{project_id}.{format}': + get: + tags: + - Projects + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Showing-a-project' + summary: Showing a project + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + - name: include + in: query + schema: + type: string + enum: + - trackers + - issue_categories + - enabled_modules + - time_entry_activities + responses: + '200': + description: '' + content: + application/json: + schema: + allOf: + - type: object + required: + - project + properties: + project: + $ref: '#/components/schemas/Project' + - type: object + required: + - project + properties: + project: + type: object + properties: + trackers: + type: array + items: + $ref: '#/components/schemas/IdName' + issue_categories: + type: array + items: + $ref: '#/components/schemas/IdName' + enabled_modules: + type: array + items: + $ref: '#/components/schemas/IdName' + time_entry_activities: + type: array + items: + $ref: '#/components/schemas/IdName' + put: + tags: + - Projects + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Updating-a-project' + summary: Updating a project + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + project: + type: object + properties: + name: + type: string + description: + type: string + homepage: + type: string + is_public: + type: boolean + parent_id: + type: integer + inherit_members: + type: boolean + default_assigned_to_id: + type: string + default_version_id: + type: string + tracker_ids: + type: array + items: + oneOf: + - type: integer + - type: string + enabled_module_names: + type: array + items: + type: string + issue_custom_field_ids: + type: array + items: + oneOf: + - type: integer + - type: string + custom_field_values: + type: object + additionalProperties: + type: string + example: + '1': VALUE + responses: + '204': + description: '' + delete: + tags: + - Projects + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Deleting-a-project' + summary: Deleting a project + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '204': + description: '' + '/projects/{project_id}/archive.{format}': + put: + tags: + - Projects + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Archiving-a-project' + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '204': + description: '' + '/projects/{project_id}/unarchive.{format}': + put: + tags: + - Projects + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Unarchiving-a-project' + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '204': + description: '' + '/projects/{project_id}/memberships.{format}': + get: + tags: + - Project Memberships + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#GET' + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - memberships + - total_count + - offset + - limit + properties: + memberships: + type: array + items: + $ref: '#/components/schemas/Membersip' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + post: + tags: + - Project Memberships + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#POST' + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + requestBody: + content: + application/json: + schema: + type: object + required: + - membership + properties: + membership: + type: object + required: + - user_id + - role_ids + properties: + user_id: + oneOf: + - type: integer + - type: string + role_ids: + type: array + items: + oneOf: + - type: integer + - type: string + responses: + '201': + description: '' + content: + application/json: + schema: + type: object + required: + - membership + properties: + membership: + $ref: '#/components/schemas/Membersip' + '/memberships/{membership_id}.{format}': + get: + tags: + - Project Memberships + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#GET-2' + parameters: + - $ref: '#/components/parameters/project_id' + - $ref: '#/components/parameters/membership_id' + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - membership + properties: + membership: + $ref: '#/components/schemas/Membersip' + put: + tags: + - Project Memberships + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#PUT' + parameters: + - $ref: '#/components/parameters/project_id' + - $ref: '#/components/parameters/membership_id' + - $ref: '#/components/parameters/format' + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + delete: + tags: + - Project Memberships + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#DELETE' + parameters: + - $ref: '#/components/parameters/project_id' + - $ref: '#/components/parameters/membership_id' + - $ref: '#/components/parameters/format' + responses: + '204': + description: '' + '/users.{format}': + get: + tags: + - Users + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#GET' + parameters: + - $ref: '#/components/parameters/format' + - name: status + in: query + schema: + type: integer + - name: name + in: query + schema: + type: string + - name: group_id + in: query + schema: + type: integer + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - users + - total_count + - offset + - limit + properties: + users: + type: array + items: + $ref: '#/components/schemas/User' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + post: + tags: + - Users + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#POST' + parameters: + - $ref: '#/components/parameters/format' + requestBody: + content: + application/json: + schema: + type: object + required: + - user + properties: + user: + type: object + required: + - login + - firstname + - lastname + - mail + properties: + login: + type: string + password: + type: string + firstname: + type: string + lastname: + type: string + mail: + type: string + auth_source_id: + type: integer + mail_notification: + type: boolean + must_change_passwd: + type: boolean + generate_password: + type: boolean + responses: + '201': + description: '' + content: + application/json: + schema: + type: object + properties: + user: + allOf: + - $ref: '#/components/schemas/User' + - $ref: '#/components/schemas/UserPartial' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/users/{user_id}.{format}': + get: + tags: + - Users + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#GET-2' + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/user_id' + - name: include + in: query + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + user: + allOf: + - $ref: '#/components/schemas/User' + - $ref: '#/components/schemas/UserPartial' + - type: object + properties: + custom_fields: + type: array + items: + $ref: '#/components/schemas/IdName' + memberships: + type: array + items: + type: object + properties: + project: + type: string + roles: + type: array + items: + $ref: '#/components/schemas/Role' + groups: + type: array + items: + $ref: '#/components/schemas/IdName' + put: + tags: + - Users + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#PUT' + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/user_id' + requestBody: + content: + application/json: + schema: + type: object + required: + - user + properties: + user: + type: object + properties: + login: + type: string + password: + type: string + firstname: + type: string + lastname: + type: string + mail: + type: string + auth_source_id: + type: integer + mail_notification: + type: boolean + must_change_passwd: + type: boolean + generate_password: + type: boolean + admin: + type: boolean + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + delete: + tags: + - Users + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#DELETE' + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/user_id' + responses: + '204': + description: '' + '/users/current.{format}': + get: + tags: + - Users + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#GET-2' + parameters: + - $ref: '#/components/parameters/format' + - name: include + in: query + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + user: + allOf: + - $ref: '#/components/schemas/User' + - $ref: '#/components/schemas/UserPartial' + - type: object + properties: + custom_fields: + type: array + items: + $ref: '#/components/schemas/IdName' + '/time_entries.{format}': + get: + tags: + - Time Entries + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Listing-time-entries' + summary: Listing time entries + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/limit' + - name: user_id + in: query + schema: + type: integer + - name: project_id + in: query + schema: + type: string + - name: spent_on + in: query + schema: + type: string + format: date + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - time_entries + - total_count + - offset + - limit + properties: + time_entries: + type: array + items: + $ref: '#/components/schemas/TimeEntry' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + post: + tags: + - Time Entries + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Creating-a-time-entry' + summary: Creating a time entry + parameters: + - $ref: '#/components/parameters/format' + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + time_entry: + type: object + required: + - issue_id + - hours + properties: + hours: + oneOf: + - type: number + - type: string + spent_on: + type: string + format: date + activity_id: + oneOf: + - type: integer + - type: string + comments: + type: string + user_id: + oneOf: + - type: integer + - type: string + - oneOf: + - type: object + properties: + time_entry: + type: object + required: + - issue_id + properties: + issue_id: + oneOf: + - type: integer + - type: string + - type: object + properties: + time_entry: + type: object + required: + - project_id + properties: + project_id: + oneOf: + - type: integer + - type: string + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/TimeEntry' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/time_entries/{time_entry_id}.{format}': + get: + tags: + - Time Entries + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Showing-a-time-entry' + summary: Showing a time entry + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/time_entry_id' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/TimeEntry' + put: + tags: + - Time Entries + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Updating-a-time-entry' + summary: Updating a time entry + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/time_entry_id' + requestBody: + content: + application/json: + schema: + allOf: + - type: object + properties: + time_entry: + type: object + required: + - issue_id + - hours + properties: + hours: + oneOf: + - type: number + - type: string + spent_on: + type: string + format: date + activity_id: + oneOf: + - type: integer + - type: string + comments: + type: string + user_id: + oneOf: + - type: integer + - type: string + - oneOf: + - type: object + properties: + time_entry: + type: object + required: + - issue_id + properties: + issue_id: + oneOf: + - type: integer + - type: string + - type: object + properties: + time_entry: + type: object + required: + - project_id + properties: + project_id: + oneOf: + - type: integer + - type: string + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + delete: + tags: + - Time Entries + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Deleting-a-time-entry' + summary: Deleting a time entry + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/time_entry_id' + responses: + '204': + description: '' + '/news.{format}': + get: + tags: + - News + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - news + - total_count + - offset + - limit + properties: + news: + type: array + items: + $ref: '#/components/schemas/News' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + '/projects/{project_id}/news.{format}': + get: + tags: + - News + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News#GET-2' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - news + - total_count + - offset + - limit + properties: + news: + type: array + items: + $ref: '#/components/schemas/News' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + '/issues/{issue_id}/relations.{format}': + get: + tags: + - Issue Relations + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - relations + properties: + relations: + type: array + items: + $ref: '#/components/schemas/IssueRelation' + post: + tags: + - Issue Relations + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#POST' + summary: POST + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + requestBody: + content: + application/json: + schema: + type: object + required: + - relation + properties: + relation: + type: object + required: + - issue_to_id + - relation_type + properties: + issue_to_id: + type: integer + relation_type: + type: string + enum: + - relates + - duplicates + - duplicated + - blocks + - blocked + - precedes + - follows + - copied_to + - copied_from + delay: + type: integer + nullable: true + responses: + '201': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/relations/{issue_relation_id}.{format}': + get: + tags: + - Issue Relations + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#GET-2' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_relation_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + relation: + $ref: '#/components/schemas/IssueRelation' + delete: + tags: + - Issue Relations + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#DELETE' + summary: DELETE + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_relation_id' + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/projects/{project_id}/versions.{format}': + get: + tags: + - Versions + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - versions + properties: + versions: + type: array + items: + $ref: '#/components/schemas/Version' + total_count: + type: integer + post: + tags: + - Versions + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#POST' + summary: POST + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + requestBody: + content: + application/json: + schema: + type: object + required: + - version + properties: + version: + type: object + required: + - name + properties: + name: + type: string + status: + type: string + enum: + - open + - locked + - closed + sharing: + type: string + enum: + - none + - descendants + - hierarchy + - tree + - system + due_date: + type: string + format: date + nullable: true + description: + type: string + wiki_page_title: + type: string + nullable: true + responses: + '201': + description: '' + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/Version' + - type: object + properties: + estimated_hours: + type: number + spent_hours: + type: number + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/versions/{version_id}.{format}': + get: + tags: + - Versions + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#GET-2' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/version_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - version + properties: + version: + type: array + items: + allOf: + - $ref: '#/components/schemas/Version' + - type: object + properties: + estimated_hours: + type: number + spent_hours: + type: number + put: + tags: + - Versions + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#PUT' + summary: PUT + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/version_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + version: + type: object + properties: + name: + type: string + status: + type: string + enum: + - open + - locked + - closed + sharing: + type: string + enum: + - none + - descendants + - hierarchy + - tree + - system + due_date: + type: string + format: date + nullable: true + description: + type: string + wiki_page_title: + type: string + nullable: true + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + delete: + tags: + - Versions + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#DELETE' + summary: DELETE + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/version_id' + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/projects/{project_id}/wiki/index.{format}': + get: + tags: + - Wiki Pages + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Getting-the-pages-list-of-a-wiki' + summary: Getting the pages list of a wiki + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - wiki_pages + properties: + wiki_pages: + type: array + items: + $ref: '#/components/schemas/WikiPages' + '/projects/{project_id}/wiki/{wiki_page_title}.{format}': + get: + tags: + - Wiki Pages + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Getting-a-wiki-page' + summary: Getting a wiki page + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + - $ref: '#/components/parameters/wiki_page_title' + - name: include + in: query + schema: + type: string + enum: + - attachments + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - wiki_page + properties: + wiki_page: + $ref: '#/components/schemas/WikiPage' + put: + tags: + - Wiki Pages + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Creating-or-updating-a-wiki-page' + summary: Creating or updating a wiki page + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + - $ref: '#/components/parameters/wiki_page_title' + requestBody: + content: + application/json: + schema: + type: object + properties: + wiki_page: + type: object + required: + - text + properties: + text: + type: string + comments: + type: string + version: + type: integer + responses: + '201': + description: '' + '204': + description: '' + '409': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + delete: + tags: + - Wiki Pages + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Deleting-a-wiki-page' + summary: Deleting a wiki page + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + - $ref: '#/components/parameters/wiki_page_title' + responses: + '204': + description: '' + '/projects/{project_id}/wiki/{wiki_page_title}/{version_id}.{format}': + get: + tags: + - Wiki Pages + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Getting-an-old-version-of-a-wiki-page' + summary: Getting an old version of a wiki page + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + - $ref: '#/components/parameters/wiki_page_title' + - $ref: '#/components/parameters/version_id' + - name: include + in: query + schema: + type: string + enum: + - attachments + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - wiki_page + properties: + wiki_page: + $ref: '#/components/schemas/WikiPage' + '/queries.{format}': + get: + tags: + - Queries + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Queries#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - queries + - total_count + - offset + - limit + properties: + queries: + type: array + items: + $ref: '#/components/schemas/Query' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + '/attachments/{attachment_id}.{format}': + get: + tags: + - Attachments + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/attachment_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + attachment: + $ref: '#/components/schemas/Attachment' + patch: + tags: + - Attachments + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments#PATCH' + summary: PATCH + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/attachment_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + attachment: + type: object + properties: + filename: + type: string + description: + type: string + responses: + '204': + description: '' + delete: + tags: + - Attachments + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments#DELETE' + summary: DELETE + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/attachment_id' + responses: + '204': + description: '' + '/issue_statuses.{format}': + get: + tags: + - Issue Statuses + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses#GET' + summary: Returns possible Status Values for Issues + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/IssueStatuses' + '/trackers.{format}': + get: + tags: + - Trackers + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Trackers' + '/projects/{project_id}/issue_categories.{format}': + get: + tags: + - Issue Categories + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - issue_categories + - total_count + properties: + issue_categories: + type: array + items: + $ref: '#/components/schemas/IssueCategory' + total_count: + type: integer + post: + tags: + - Issue Categories + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#POST' + summary: POST + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + requestBody: + content: + application/json: + schema: + type: object + required: + - issue_category + properties: + issue_category: + type: object + required: + - name + properties: + name: + type: string + assigned_to_id: + oneOf: + - type: integer + - type: string + responses: + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/IssueCategory' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/enumerations/issue_priorities.{format}': + get: + tags: + - Enumerations + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - issue_priorities + properties: + issue_priorities: + type: array + items: + $ref: '#/components/schemas/IssuePriority' + '/enumerations/time_entry_activities.{format}': + get: + tags: + - Enumerations + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations#GET-2' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - time_entry_activities + properties: + time_entry_activities: + type: array + items: + $ref: '#/components/schemas/TimeEntryActivity' + '/enumerations/document_categories.{format}': + get: + tags: + - Enumerations + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations#GET-3' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - document_categories + properties: + document_categories: + type: array + items: + $ref: '#/components/schemas/DocumentCategory' + '/issue_categories/{issue_category_id}.{format}': + get: + tags: + - Issue Categories + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#GET-2' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_category_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - issue_category + properties: + issue_category: + $ref: '#/components/schemas/IssueCategory' + put: + tags: + - Issue Categories + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#PUT' + summary: PUT + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_category_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + issue_category: + type: object + properties: + name: + type: string + assigned_to_id: + oneOf: + - type: integer + - type: string + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + delete: + tags: + - Issue Categories + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#DELETE' + summary: DELETE + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_category_id' + - name: reassign_to_id + in: query + schema: + type: integer + responses: + '204': + description: '' + '/roles.{format}': + get: + tags: + - Roles + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + roles: + type: array + items: + $ref: '#/components/schemas/IdName' + '/roles/{role_id}.{format}': + get: + tags: + - Roles + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles#GET-2' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/role_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + properties: + role: + $ref: '#/components/schemas/Role' + '/groups.{format}': + get: + tags: + - Groups + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - groups + properties: + groups: + type: array + items: + $ref: '#/components/schemas/IdName' + post: + tags: + - Groups + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#POST' + summary: POST + parameters: + - $ref: '#/components/parameters/format' + requestBody: + content: + application/json: + schema: + type: object + properties: + group: + type: object + properties: + name: + type: string + user_ids: + type: array + items: + oneOf: + - type: integer + - type: string + responses: + '201': + description: '' + content: + application/json: + schema: + type: object + properties: + group: + $ref: '#/components/schemas/IdName' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/groups/{group_id}.{format}': + get: + tags: + - Groups + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#GET-2' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/group_id' + - name: include + in: query + schema: + type: string + enum: + - users + - memberships + responses: + '200': + description: '' + content: + application/json: + schema: + allOf: + - type: object + properties: + group: + $ref: '#/components/schemas/IdName' + - type: object + properties: + group: + type: object + properties: + users: + type: array + items: + $ref: '#/components/schemas/IdName' + memberships: + type: array + items: + type: object + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + roles: + type: array + items: + $ref: '#/components/schemas/IdName' + put: + tags: + - Groups + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#PUT' + summary: PUT + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/group_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + group: + type: object + properties: + name: + type: string + user_ids: + type: array + items: + oneOf: + - type: integer + - type: string + responses: + '204': + description: '' + delete: + tags: + - Groups + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#DELETE' + summary: DELETE + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/group_id' + responses: + '204': + description: '' + '/groups/{group_id}/users.{format}': + post: + tags: + - Groups + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#POST-2' + summary: POST + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/group_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + user_id: + oneOf: + - type: integer + - type: string + responses: + '204': + description: '' + '/groups/{group_id}/users/{user_id}.{format}': + delete: + tags: + - Groups + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#DELETE-2' + summary: DELETE + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/group_id' + - $ref: '#/components/parameters/user_id' + responses: + '204': + description: '' + '/custom_fields.{format}': + get: + tags: + - Custom Fields + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_CustomFields#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - custom_fields + properties: + custom_fields: + type: array + items: + $ref: '#/components/schemas/CustomField' + '/search.{format}': + get: + tags: + - Search + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Search#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/limit' + - $ref: '#/components/parameters/offset' + - name: q + in: query + schema: + type: string + - name: scope + in: query + schema: + type: string + enum: + - all + - my_project + - subprojects + - name: all_words + in: query + schema: + type: boolean + - name: titles_only + in: query + schema: + type: boolean + - name: issues + in: query + schema: + type: integer + - name: news + in: query + schema: + type: integer + - name: wiki_pages + in: query + schema: + type: integer + - name: projects + in: query + schema: + type: integer + - name: documents + in: query + schema: + type: integer + - name: changesets + in: query + schema: + type: integer + - name: messages + in: query + schema: + type: integer + - name: open_issues + in: query + schema: + type: integer + - name: attachments + in: query + schema: + oneOf: + - type: string + - type: integer + enum: + - 0 + - 1 + - only + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - results + - total_count + - offset + - limit + properties: + results: + type: array + items: + $ref: '#/components/schemas/Search' + total_count: + type: integer + offset: + type: integer + limit: + type: integer + '/projects/{project_id}/files.{format}': + get: + tags: + - Files + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - files + properties: + files: + type: array + items: + $ref: '#/components/schemas/File' + post: + tags: + - Files + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files#POST' + summary: POST + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/project_id' + requestBody: + content: + application/json: + schema: + type: object + required: + - file + properties: + file: + type: object + required: + - token + properties: + token: + type: string + version_id: + oneOf: + - type: integer + - type: string + filename: + type: string + description: + type: string + responses: + '204': + description: '' + content: + application/json: + schema: + type: object + required: + - file + properties: + file: + type: object + properties: + token: + type: string + version_id: + type: string + filename: + type: string + description: + type: string + '/my/account.{format}': + get: + tags: + - My Account + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount#GET' + summary: GET + parameters: + - $ref: '#/components/parameters/format' + responses: + '200': + description: '' + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/User' + - $ref: '#/components/schemas/UserPartial' + - type: object + properties: + custom_fields: + type: array + items: + $ref: '#/components/schemas/IdName' + put: + tags: + - My Account + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount#PUT' + summary: PUT + parameters: + - $ref: '#/components/parameters/format' + requestBody: + content: + application/json: + schema: + type: object + properties: + user: + type: object + properties: + login: + type: string + password: + type: string + firstname: + type: string + lastname: + type: string + mail: + type: string + auth_source_id: + type: integer + mail_notification: + type: boolean + must_change_passwd: + type: boolean + generate_password: + type: boolean + admin: + type: boolean + responses: + '204': + description: '' + '422': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' + '/journals/{journal_id}.{format}': + put: + tags: + - Journals + summary: PUT + parameters: + - $ref: '#/components/parameters/format' + - name: journal_id + in: path + required: true + schema: + type: integer + requestBody: + content: + application/json: + schema: + type: object + properties: + journal: + type: object + properties: + notes: + type: string + nullable: true + private_notes: + type: boolean + responses: + '204': + description: '' + '/uploads.{format}': + post: + tags: + - Attachments + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api#Attaching-files' + summary: Attaching files + parameters: + - $ref: '#/components/parameters/format' + - name: filename + in: query + schema: + type: string + requestBody: + content: + application/octet-stream: + schema: + type: string + format: binary + responses: + '201': + description: '' + content: + application/json: + schema: + type: object + properties: + upload: + type: object + properties: + id: + type: integer + token: + type: string + '406': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/Errors' +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + ApiKeyAuth: + type: apiKey + in: header + name: X-Redmine-API-Key + parameters: + format: + name: format + in: path + required: true + schema: + type: string + enum: + - json + - xml + limit: + name: limit + in: query + schema: + type: integer + offset: + name: offset + in: query + schema: + type: integer + issue_id: + name: issue_id + in: path + required: true + schema: + type: integer + project_id: + name: project_id + in: path + required: true + schema: + type: string + membership_id: + name: membership_id + in: path + required: true + schema: + type: string + user_id: + name: user_id + in: path + required: true + schema: + type: integer + time_entry_id: + name: time_entry_id + in: path + required: true + schema: + type: integer + issue_relation_id: + name: issue_relation_id + in: path + required: true + schema: + type: integer + version_id: + name: version_id + in: path + required: true + schema: + type: integer + wiki_page_title: + name: wiki_page_title + in: path + required: true + schema: + type: string + attachment_id: + name: attachment_id + in: path + required: true + schema: + type: number + issue_category_id: + name: issue_category_id + in: path + required: true + schema: + type: integer + role_id: + name: role_id + in: path + required: true + schema: + type: integer + group_id: + name: group_id + in: path + required: true + schema: + type: integer + schemas: + IdName: + type: object + required: + - id + - name + properties: + id: + type: integer + name: + type: string + Issue: + type: object + required: + - id + - project + - tracker + - status + - priority + - author + - subject + - description + - start_date + - due_date + - done_ratio + - is_private + - estimated_hours + - total_estimated_hours + - spent_hours + - total_spent_hours + - created_on + - updated_on + - closed_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + tracker: + $ref: '#/components/schemas/IdName' + status: + $ref: '#/components/schemas/IssueStatus' + priority: + $ref: '#/components/schemas/IdName' + author: + $ref: '#/components/schemas/IdName' + assigned_to: + $ref: '#/components/schemas/IdName' + category: + $ref: '#/components/schemas/IdName' + subject: + type: string + description: + type: string + nullable: true + start_date: + type: string + nullable: true + due_date: + type: string + nullable: true + done_ratio: + type: integer + is_private: + type: boolean + estimated_hours: + type: number + nullable: true + total_estimated_hours: + type: number + nullable: true + spent_hours: + type: number + total_spent_hours: + type: number + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + closed_on: + type: string + format: date-time + nullable: true + IssuePartial: + type: object + properties: + changesets: + type: array + items: + type: string + children: + type: array + items: + type: object + required: + - id + - tracker + - subject + properties: + id: + type: integer + tracker: + $ref: '#/components/schemas/IdName' + subject: + type: string + attachments: + type: array + items: + allOf: + - $ref: '#/components/schemas/Attachment' + - type: object + properties: + thumbnail_url: + type: string + relations: + type: array + items: + type: object + properties: + id: + type: integer + issue_id: + type: integer + issue_to_id: + type: integer + relation_type: + type: string + delay: + type: integer + nullable: true + journals: + type: array + items: + type: object + required: + - id + - user + - notes + - created_on + - private_notes + - details + properties: + id: + type: integer + user: + $ref: '#/components/schemas/IdName' + notes: + type: string + created_on: + type: string + format: date-time + private_notes: + type: boolean + details: + type: array + items: + type: object + required: + - property + - name + - old_value + - new_value + properties: + property: + type: string + name: + type: string + old_value: + type: string + nullable: true + new_value: + type: string + watchers: + type: array + items: + $ref: '#/components/schemas/IdName' + allowed_statuses: + type: array + items: + $ref: '#/components/schemas/IssueStatus' + Project: + type: object + required: + - id + - name + - identifier + - description + - status + - is_public + - inherit_members + - created_on + - updated_on + properties: + id: + type: integer + name: + type: integer + identifier: + type: integer + description: + type: integer + nullable: true + homepage: + type: string + nullable: true + parent_id: + type: integer + status: + type: integer + is_public: + type: boolean + inherit_members: + type: boolean + trackers: + type: array + items: + $ref: '#/components/schemas/IdName' + issue_categories: + type: array + items: + $ref: '#/components/schemas/IdName' + enabled_modules: + type: array + items: + $ref: '#/components/schemas/IdName' + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + User: + type: object + required: + - id + - login + - admin + - firstname + - lastname + - mail + - created_on + - updated_on + - last_login_on + - passwd_changed_on + - twofa_scheme + properties: + id: + type: integer + login: + type: string + admin: + type: boolean + firstname: + type: string + lastname: + type: string + mail: + type: string + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + last_login_on: + type: string + format: date-time + nullable: true + passwd_changed_on: + type: string + format: date-time + nullable: true + twofa_scheme: + type: object + nullable: true + UserPartial: + type: object + required: + - api_key + - status + properties: + api_key: + type: string + status: + type: integer + Membersip: + oneOf: + - type: object + required: + - id + - project + - user + - roles + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + user: + $ref: '#/components/schemas/IdName' + roles: + type: array + items: + $ref: '#/components/schemas/IdName' + - type: object + required: + - id + - project + - group + - roles + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + group: + $ref: '#/components/schemas/IdName' + roles: + type: array + items: + $ref: '#/components/schemas/IdName' + TimeEntry: + type: object + required: + - id + - project + - issue + - user + - activity + - hours + - comments + - spent_on + - created_on + - updated_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + issue: + type: object + properties: + id: + type: integer + user: + $ref: '#/components/schemas/IdName' + activity: + $ref: '#/components/schemas/IdName' + hours: + type: number + comments: + type: string + spent_on: + type: string + format: date + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + News: + type: object + required: + - id + - project + - author + - title + - summary + - description + - created_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + author: + $ref: '#/components/schemas/IdName' + title: + type: string + summary: + type: string + description: + type: string + created_on: + type: string + format: date-time + IssueRelation: + type: object + required: + - id + - issue_id + - issue_to_id + - relation_type + - delay + properties: + id: + type: integer + issue_id: + type: integer + issue_to_id: + type: integer + relation_type: + type: string + delay: + type: integer + nullable: true + Version: + type: object + required: + - id + - project + - name + - status + - due_date + - sharing + - description + - wiki_page_title + - created_on + - updated_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + name: + type: string + description: + type: string + nullable: true + status: + type: string + enum: + - open + - locked + - closed + due_date: + type: string + format: date + nullable: true + sharing: + type: string + enum: + - none + - descendants + - hierarchy + - tree + - system + wiki_page_title: + type: string + nullable: true + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + WikiPage: + type: object + required: + - title + - text + - version + - author + - comments + - created_on + - updated_on + properties: + title: + type: string + parent: + type: object + required: + - title + properties: + title: + type: string + text: + type: string + version: + type: integer + author: + $ref: '#/components/schemas/IdName' + comments: + type: string + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + WikiPages: + type: object + required: + - title + - version + - created_on + - updated_on + properties: + title: + type: integer + parent: + type: object + required: + - title + properties: + title: + type: string + version: + type: integer + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + Query: + allOf: + - type: object + required: + - is_public + - project_id + properties: + is_public: + type: boolean + project_id: + type: integer + nullable: true + - $ref: '#/components/schemas/IdName' + IssueStatus: + allOf: + - $ref: '#/components/schemas/IdName' + - type: object + required: + - is_closed + properties: + is_closed: + type: boolean + Attachment: + type: object + required: + - id + - filename + - filesize + - content_type + - description + - content_url + - author + - created_on + properties: + id: + type: integer + filename: + type: string + filesize: + type: integer + content_type: + type: string + description: + type: string + content_url: + type: string + author: + $ref: '#/components/schemas/IdName' + created_on: + type: string + format: data-time + IssueStatuses: + type: object + required: + - issue_statuses + properties: + issue_statuses: + type: array + items: + $ref: '#/components/schemas/IssueStatus' + Group: + $ref: '#/components/schemas/IdName' + Tracker: + type: object + properties: + id: + type: integer + name: + type: string + default_status: + $ref: '#/components/schemas/IdName' + description: + type: string + nullable: true + enabled_standard_fields: + type: array + items: + type: string + Trackers: + type: object + required: + - trackers + properties: + trackers: + type: array + items: + $ref: '#/components/schemas/Tracker' + IssuePriority: + allOf: + - type: object + required: + - is_default + - active + properties: + is_default: + type: boolean + active: + type: boolean + - $ref: '#/components/schemas/IdName' + TimeEntryActivity: + allOf: + - type: object + required: + - is_default + - active + properties: + is_default: + type: boolean + active: + type: boolean + - $ref: '#/components/schemas/IdName' + DocumentCategory: + allOf: + - type: object + required: + - is_default + - active + properties: + is_default: + type: boolean + active: + type: boolean + - $ref: '#/components/schemas/IdName' + IssueCategory: + type: object + required: + - id + - project + - name + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + name: + type: string + assigned_to: + $ref: '#/components/schemas/IdName' + Role: + allOf: + - type: object + required: + - assignable + - issue_visibility + - time_entries_visibility + - users_visibility + - permissions + properties: + assignable: + type: boolean + issues_visibility: + type: string + time_entries_visibility: + type: string + users_visibility: + type: string + permissions: + type: array + items: + type: string + - $ref: '#/components/schemas/IdName' + CustomField: + type: object + properties: + id: + type: integer + name: + type: string + customized_type: + type: string + enum: + - issue + - project + - time_entry + - version + - document + - user + - group + - time_entry_activity + - issue_priority + - document_category + field_format: + type: string + enum: + - enumeration + - string + - version + - attachment + - user + - list + - link + - float + - int + - date + - bool + - text + regexp: + type: string + min_length: + type: integer + nullable: true + max_length: + type: integer + nullable: true + is_required: + type: boolean + is_filter: + type: boolean + searchable: + type: boolean + multiple: + type: boolean + default_value: + type: string + nullable: true + visible: + type: boolean + trackers: + type: array + items: + $ref: '#/components/schemas/IdName' + roles: + type: array + items: + $ref: '#/components/schemas/Role' + possible_values: + type: array + items: + type: object + properties: + value: + type: string + label: + type: string + Search: + type: object + required: + - id + - title + - type + - url + - description + - datetime + properties: + id: + type: integer + title: + type: string + type: + type: string + url: + type: string + description: + type: string + datetime: + type: string + format: date-time + File: + type: object + required: + - id + - filename + - filesize + - content_type + - description + - content_url + - author + - created_on + - digest + - downloads + properties: + id: + type: integer + filename: + type: string + filesize: + type: integer + content_type: + type: string + description: + type: string + content_url: + type: string + thumbnail_url: + type: string + author: + $ref: '#/components/schemas/IdName' + created_on: + type: string + format: date-time + version: + $ref: '#/components/schemas/IdName' + digest: + type: string + downloads: + type: integer + Errors: + type: object + required: + - errors + properties: + errors: + items: + type: string +tags: + - name: Issues + description: 'Status: Stable, Availablity: 1.0' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues' + - name: Projects + description: 'Status: Stable, Availablity: 1.0' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects' + - name: Project Memberships + description: 'Status: Alpha, Availablity: 1.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships' + - name: Users + description: 'Status: Stable, Availablity: 1.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users' + - name: Time Entries + description: 'Status: Stable, Availablity: 1.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries' + - name: News + description: 'Status: Prototype, Note: Prototype implementation for index only, Availablity: 1.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News' + - name: Issue Relations + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations' + - name: Versions + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions' + - name: Wiki Pages + description: 'Status: Alpha, Availablity: 2.2' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages' + - name: Queries + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Queries' + - name: Attachments + description: 'Status: Beta, Notes: Adding attachments via the API added in 1.4, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments' + - name: Issue Statuses + description: 'Status: Alpha, Notes: Provides the list of all statuses, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses' + - name: Trackers + description: 'Status: Alpha, Notes: Provides the list of all trackers, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' + - name: Enumerations + description: 'Status: Alpha, Notes: Provides the list of issue priorities and time tracking activities, Availablity: 2.2' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations' + - name: Issue Categories + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories' + - name: Roles + description: 'Status: Alpha, Availablity: 1.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles' + - name: Groups + description: 'Status: Alpha, Availablity: 2.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups' + - name: Custom Fields + description: 'Status: Alpha, Availablity: 2.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_CustomFields' + - name: Search + description: 'Status: Alpha, Availablity: 3.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Search' + - name: Files + description: 'Status: Alpha, Availablity: 3.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files' + - name: My Account + description: 'Status: Alpha, Availablity: 4.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount' + - name: Journals + description: 'Status: Alpha, Availablity: 5.0' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Journals?parent=Rest_api' diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml new file mode 100644 index 000000000..ae4d18110 --- /dev/null +++ b/src/appmixer/redmine/openapi.yml @@ -0,0 +1,1359 @@ +openapi: 3.0.3 +info: + title: Redmine API + description: 'Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.' + version: 5.0.0 + x-connector-icon: 'data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K' + contact: + name: d-yoshi/redmine-openapi + url: 'https://github.com/d-yoshi/redmine-openapi' +externalDocs: + description: Redmine API Official Developer Guide + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api' +security: + - BasicAuth: [] + - ApiKeyAuth: [] +paths: + '/issues.{format}': + get: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Listing-issues' + summary: Listing issues + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/offset' + - $ref: '#/components/parameters/limit' + - name: sort + in: query + schema: + type: string + - name: include + in: query + schema: + type: string + enum: + - attachments + - relations + - name: issue_id + in: query + schema: + type: string + - name: project_id + in: query + schema: + type: string + - name: subproject_id + in: query + schema: + type: string + - name: tracker_id + in: query + schema: + type: integer + - name: status_id + in: query + schema: + type: string + - name: assigned_to_id + in: query + schema: + type: string + - name: parent_id + in: query + schema: + type: string + - name: cf_x + in: query + schema: + type: string + responses: + '200': + description: '' + content: + application/json: + schema: + type: object + required: + - issues + - total_count + - offset + - limit + properties: + issues: + type: array + items: + allOf: + - $ref: '#/components/schemas/Issue' + - type: object + required: + - spent_hours + - total_spent_hours + properties: + spent_hours: + type: number + total_spent_hours: + type: number + total_count: + type: integer + offset: + type: integer + limit: + type: integer + post: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Creating-an-issue' + summary: Creating an issue + parameters: + - $ref: '#/components/parameters/format' + requestBody: + content: + application/json: + schema: + type: object + required: + - issue + properties: + issue: + type: object + required: + - project_id + - tracer_id + - status_id + - subject + properties: + project_id: + oneOf: + - type: integer + - type: string + tracker_id: + oneOf: + - type: integer + - type: string + status_id: + oneOf: + - type: integer + - type: string + priority_id: + oneOf: + - type: integer + - type: string + subject: + type: string + description: + type: string + nullable: true + start_date: + type: string + format: date + nullable: true + due_date: + type: string + format: date + nullable: true + category_id: + oneOf: + - type: integer + - type: string + fixed_version_id: + type: string + assigned_to_id: + oneOf: + - type: integer + - type: string + parent_issue_id: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + custom_fields: + type: string + watcher_user_ids: + type: array + items: + oneOf: + - type: integer + - type: string + is_private: + type: boolean + estimated_hours: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + uploads: + type: object + properties: + upload: + type: object + properties: + token: + type: string + filename: + type: string + description: + type: string + content_type: + type: string + responses: + '201': + description: '' + content: + application/json: + schema: + type: object + required: + - issue + properties: + issue: + $ref: '#/components/schemas/Issue' + '/issues/{issue_id}.{format}': + get: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Showing-an-issue' + summary: Showing an issue + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + - name: include + in: query + schema: + type: string + enum: + - children + - attachments + - relations + - changesets + - journals + - watchers + - allowed_statuses + responses: + '200': + description: '' + content: + application/json: + schema: + allOf: + - type: object + required: + - issue + properties: + issue: + $ref: '#/components/schemas/Issue' + - type: object + required: + - issue + properties: + issue: + $ref: '#/components/schemas/IssuePartial' + put: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue' + summary: Updating an issue + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + requestBody: + content: + application/json: + schema: + type: object + properties: + issue: + type: object + properties: + project_id: + oneOf: + - type: integer + - type: string + tracker_id: + oneOf: + - type: integer + - type: string + status_id: + oneOf: + - type: integer + - type: string + priority_id: + oneOf: + - type: integer + - type: string + subject: + type: string + description: + type: string + nullable: true + start_date: + type: string + format: date + nullable: true + due_date: + type: string + format: date + nullable: true + category_id: + oneOf: + - type: integer + - type: string + fixed_version_id: + type: string + assigned_to_id: + oneOf: + - type: integer + - type: string + parent_issue_id: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + custom_fields: + type: string + is_private: + type: boolean + estimated_hours: + oneOf: + - type: integer + nullable: true + - type: string + nullable: true + notes: + type: string + private_notes: + type: string + responses: + '204': + description: '' + delete: + tags: + - Issues + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Deleting-an-issue' + summary: Deleting an issue + parameters: + - $ref: '#/components/parameters/format' + - $ref: '#/components/parameters/issue_id' + responses: + '204': + description: '' +components: + securitySchemes: + BasicAuth: + type: http + scheme: basic + ApiKeyAuth: + type: apiKey + in: header + name: X-Redmine-API-Key + parameters: + format: + name: format + in: path + required: true + schema: + type: string + enum: + - json + - xml + limit: + name: limit + in: query + schema: + type: integer + offset: + name: offset + in: query + schema: + type: integer + issue_id: + name: issue_id + in: path + required: true + schema: + type: integer + project_id: + name: project_id + in: path + required: true + schema: + type: string + membership_id: + name: membership_id + in: path + required: true + schema: + type: string + user_id: + name: user_id + in: path + required: true + schema: + type: integer + time_entry_id: + name: time_entry_id + in: path + required: true + schema: + type: integer + issue_relation_id: + name: issue_relation_id + in: path + required: true + schema: + type: integer + version_id: + name: version_id + in: path + required: true + schema: + type: integer + wiki_page_title: + name: wiki_page_title + in: path + required: true + schema: + type: string + attachment_id: + name: attachment_id + in: path + required: true + schema: + type: number + issue_category_id: + name: issue_category_id + in: path + required: true + schema: + type: integer + role_id: + name: role_id + in: path + required: true + schema: + type: integer + group_id: + name: group_id + in: path + required: true + schema: + type: integer + schemas: + IdName: + type: object + required: + - id + - name + properties: + id: + type: integer + name: + type: string + Issue: + type: object + required: + - id + - project + - tracker + - status + - priority + - author + - subject + - description + - start_date + - due_date + - done_ratio + - is_private + - estimated_hours + - total_estimated_hours + - spent_hours + - total_spent_hours + - created_on + - updated_on + - closed_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + tracker: + $ref: '#/components/schemas/IdName' + status: + $ref: '#/components/schemas/IssueStatus' + priority: + $ref: '#/components/schemas/IdName' + author: + $ref: '#/components/schemas/IdName' + assigned_to: + $ref: '#/components/schemas/IdName' + category: + $ref: '#/components/schemas/IdName' + subject: + type: string + description: + type: string + nullable: true + start_date: + type: string + nullable: true + due_date: + type: string + nullable: true + done_ratio: + type: integer + is_private: + type: boolean + estimated_hours: + type: number + nullable: true + total_estimated_hours: + type: number + nullable: true + spent_hours: + type: number + total_spent_hours: + type: number + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + closed_on: + type: string + format: date-time + nullable: true + IssuePartial: + type: object + properties: + changesets: + type: array + items: + type: string + children: + type: array + items: + type: object + required: + - id + - tracker + - subject + properties: + id: + type: integer + tracker: + $ref: '#/components/schemas/IdName' + subject: + type: string + attachments: + type: array + items: + allOf: + - $ref: '#/components/schemas/Attachment' + - type: object + properties: + thumbnail_url: + type: string + relations: + type: array + items: + type: object + properties: + id: + type: integer + issue_id: + type: integer + issue_to_id: + type: integer + relation_type: + type: string + delay: + type: integer + nullable: true + journals: + type: array + items: + type: object + required: + - id + - user + - notes + - created_on + - private_notes + - details + properties: + id: + type: integer + user: + $ref: '#/components/schemas/IdName' + notes: + type: string + created_on: + type: string + format: date-time + private_notes: + type: boolean + details: + type: array + items: + type: object + required: + - property + - name + - old_value + - new_value + properties: + property: + type: string + name: + type: string + old_value: + type: string + nullable: true + new_value: + type: string + watchers: + type: array + items: + $ref: '#/components/schemas/IdName' + allowed_statuses: + type: array + items: + $ref: '#/components/schemas/IssueStatus' + Project: + type: object + required: + - id + - name + - identifier + - description + - status + - is_public + - inherit_members + - created_on + - updated_on + properties: + id: + type: integer + name: + type: integer + identifier: + type: integer + description: + type: integer + nullable: true + homepage: + type: string + nullable: true + parent_id: + type: integer + status: + type: integer + is_public: + type: boolean + inherit_members: + type: boolean + trackers: + type: array + items: + $ref: '#/components/schemas/IdName' + issue_categories: + type: array + items: + $ref: '#/components/schemas/IdName' + enabled_modules: + type: array + items: + $ref: '#/components/schemas/IdName' + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + User: + type: object + required: + - id + - login + - admin + - firstname + - lastname + - mail + - created_on + - updated_on + - last_login_on + - passwd_changed_on + - twofa_scheme + properties: + id: + type: integer + login: + type: string + admin: + type: boolean + firstname: + type: string + lastname: + type: string + mail: + type: string + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + last_login_on: + type: string + format: date-time + nullable: true + passwd_changed_on: + type: string + format: date-time + nullable: true + twofa_scheme: + type: object + nullable: true + UserPartial: + type: object + required: + - api_key + - status + properties: + api_key: + type: string + status: + type: integer + Membersip: + oneOf: + - type: object + required: + - id + - project + - user + - roles + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + user: + $ref: '#/components/schemas/IdName' + roles: + type: array + items: + $ref: '#/components/schemas/IdName' + - type: object + required: + - id + - project + - group + - roles + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + group: + $ref: '#/components/schemas/IdName' + roles: + type: array + items: + $ref: '#/components/schemas/IdName' + TimeEntry: + type: object + required: + - id + - project + - issue + - user + - activity + - hours + - comments + - spent_on + - created_on + - updated_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + issue: + type: object + properties: + id: + type: integer + user: + $ref: '#/components/schemas/IdName' + activity: + $ref: '#/components/schemas/IdName' + hours: + type: number + comments: + type: string + spent_on: + type: string + format: date + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + News: + type: object + required: + - id + - project + - author + - title + - summary + - description + - created_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + author: + $ref: '#/components/schemas/IdName' + title: + type: string + summary: + type: string + description: + type: string + created_on: + type: string + format: date-time + IssueRelation: + type: object + required: + - id + - issue_id + - issue_to_id + - relation_type + - delay + properties: + id: + type: integer + issue_id: + type: integer + issue_to_id: + type: integer + relation_type: + type: string + delay: + type: integer + nullable: true + Version: + type: object + required: + - id + - project + - name + - status + - due_date + - sharing + - description + - wiki_page_title + - created_on + - updated_on + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + name: + type: string + description: + type: string + nullable: true + status: + type: string + enum: + - open + - locked + - closed + due_date: + type: string + format: date + nullable: true + sharing: + type: string + enum: + - none + - descendants + - hierarchy + - tree + - system + wiki_page_title: + type: string + nullable: true + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + WikiPage: + type: object + required: + - title + - text + - version + - author + - comments + - created_on + - updated_on + properties: + title: + type: string + parent: + type: object + required: + - title + properties: + title: + type: string + text: + type: string + version: + type: integer + author: + $ref: '#/components/schemas/IdName' + comments: + type: string + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + WikiPages: + type: object + required: + - title + - version + - created_on + - updated_on + properties: + title: + type: integer + parent: + type: object + required: + - title + properties: + title: + type: string + version: + type: integer + created_on: + type: string + format: date-time + updated_on: + type: string + format: date-time + Query: + allOf: + - type: object + required: + - is_public + - project_id + properties: + is_public: + type: boolean + project_id: + type: integer + nullable: true + - $ref: '#/components/schemas/IdName' + IssueStatus: + allOf: + - $ref: '#/components/schemas/IdName' + - type: object + required: + - is_closed + properties: + is_closed: + type: boolean + Attachment: + type: object + required: + - id + - filename + - filesize + - content_type + - description + - content_url + - author + - created_on + properties: + id: + type: integer + filename: + type: string + filesize: + type: integer + content_type: + type: string + description: + type: string + content_url: + type: string + author: + $ref: '#/components/schemas/IdName' + created_on: + type: string + format: data-time + IssueStatuses: + type: object + required: + - issue_statuses + properties: + issue_statuses: + type: array + items: + $ref: '#/components/schemas/IssueStatus' + Group: + $ref: '#/components/schemas/IdName' + Tracker: + type: object + properties: + id: + type: integer + name: + type: string + default_status: + $ref: '#/components/schemas/IdName' + description: + type: string + nullable: true + enabled_standard_fields: + type: array + items: + type: string + Trackers: + type: object + required: + - trackers + properties: + trackers: + type: array + items: + $ref: '#/components/schemas/Tracker' + IssuePriority: + allOf: + - type: object + required: + - is_default + - active + properties: + is_default: + type: boolean + active: + type: boolean + - $ref: '#/components/schemas/IdName' + TimeEntryActivity: + allOf: + - type: object + required: + - is_default + - active + properties: + is_default: + type: boolean + active: + type: boolean + - $ref: '#/components/schemas/IdName' + DocumentCategory: + allOf: + - type: object + required: + - is_default + - active + properties: + is_default: + type: boolean + active: + type: boolean + - $ref: '#/components/schemas/IdName' + IssueCategory: + type: object + required: + - id + - project + - name + properties: + id: + type: integer + project: + $ref: '#/components/schemas/IdName' + name: + type: string + assigned_to: + $ref: '#/components/schemas/IdName' + Role: + allOf: + - type: object + required: + - assignable + - issue_visibility + - time_entries_visibility + - users_visibility + - permissions + properties: + assignable: + type: boolean + issues_visibility: + type: string + time_entries_visibility: + type: string + users_visibility: + type: string + permissions: + type: array + items: + type: string + - $ref: '#/components/schemas/IdName' + CustomField: + type: object + properties: + id: + type: integer + name: + type: string + customized_type: + type: string + enum: + - issue + - project + - time_entry + - version + - document + - user + - group + - time_entry_activity + - issue_priority + - document_category + field_format: + type: string + enum: + - enumeration + - string + - version + - attachment + - user + - list + - link + - float + - int + - date + - bool + - text + regexp: + type: string + min_length: + type: integer + nullable: true + max_length: + type: integer + nullable: true + is_required: + type: boolean + is_filter: + type: boolean + searchable: + type: boolean + multiple: + type: boolean + default_value: + type: string + nullable: true + visible: + type: boolean + trackers: + type: array + items: + $ref: '#/components/schemas/IdName' + roles: + type: array + items: + $ref: '#/components/schemas/Role' + possible_values: + type: array + items: + type: object + properties: + value: + type: string + label: + type: string + Search: + type: object + required: + - id + - title + - type + - url + - description + - datetime + properties: + id: + type: integer + title: + type: string + type: + type: string + url: + type: string + description: + type: string + datetime: + type: string + format: date-time + File: + type: object + required: + - id + - filename + - filesize + - content_type + - description + - content_url + - author + - created_on + - digest + - downloads + properties: + id: + type: integer + filename: + type: string + filesize: + type: integer + content_type: + type: string + description: + type: string + content_url: + type: string + thumbnail_url: + type: string + author: + $ref: '#/components/schemas/IdName' + created_on: + type: string + format: date-time + version: + $ref: '#/components/schemas/IdName' + digest: + type: string + downloads: + type: integer + Errors: + type: object + required: + - errors + properties: + errors: + items: + type: string +tags: + - name: Issues + description: 'Status: Stable, Availablity: 1.0' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues' + - name: Projects + description: 'Status: Stable, Availablity: 1.0' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects' + - name: Project Memberships + description: 'Status: Alpha, Availablity: 1.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships' + - name: Users + description: 'Status: Stable, Availablity: 1.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users' + - name: Time Entries + description: 'Status: Stable, Availablity: 1.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries' + - name: News + description: 'Status: Prototype, Note: Prototype implementation for index only, Availablity: 1.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News' + - name: Issue Relations + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations' + - name: Versions + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions' + - name: Wiki Pages + description: 'Status: Alpha, Availablity: 2.2' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages' + - name: Queries + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Queries' + - name: Attachments + description: 'Status: Beta, Notes: Adding attachments via the API added in 1.4, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments' + - name: Issue Statuses + description: 'Status: Alpha, Notes: Provides the list of all statuses, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses' + - name: Trackers + description: 'Status: Alpha, Notes: Provides the list of all trackers, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' + - name: Enumerations + description: 'Status: Alpha, Notes: Provides the list of issue priorities and time tracking activities, Availablity: 2.2' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations' + - name: Issue Categories + description: 'Status: Alpha, Availablity: 1.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories' + - name: Roles + description: 'Status: Alpha, Availablity: 1.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles' + - name: Groups + description: 'Status: Alpha, Availablity: 2.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups' + - name: Custom Fields + description: 'Status: Alpha, Availablity: 2.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_CustomFields' + - name: Search + description: 'Status: Alpha, Availablity: 3.3' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Search' + - name: Files + description: 'Status: Alpha, Availablity: 3.4' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files' + - name: My Account + description: 'Status: Alpha, Availablity: 4.1' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount' + - name: Journals + description: 'Status: Alpha, Availablity: 5.0' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Journals?parent=Rest_api' diff --git a/src/appmixer/redmine/package.json b/src/appmixer/redmine/package.json new file mode 100644 index 000000000..fd371515b --- /dev/null +++ b/src/appmixer/redmine/package.json @@ -0,0 +1,11 @@ +{ + "name": "appmixer.redmineapi", + "version": "1.0.0", + "private": true, + "dependencies": { + "jsonata": "2.0.3", + "json-pointer": "0.6.2", + "jmespath": "0.16.0", + "form-data": "4.0.0" + } +} \ No newline at end of file diff --git a/src/appmixer/redmine/service.json b/src/appmixer/redmine/service.json new file mode 100644 index 000000000..8671c6849 --- /dev/null +++ b/src/appmixer/redmine/service.json @@ -0,0 +1,8 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi", + "label": "Redmineapi", + "description": "

Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.

", + "category": "applications", + "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" +} \ No newline at end of file From 060605e84ede1462247cd551669a949faf5463cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 10:20:09 +0100 Subject: [PATCH 02/11] icon --- src/appmixer/redmine/core/DeleteIssues/component.json | 2 +- src/appmixer/redmine/core/GetIssues/component.json | 2 +- src/appmixer/redmine/core/GetIssuesFormat/component.json | 2 +- src/appmixer/redmine/core/PostIssuesFormat/component.json | 4 ++-- src/appmixer/redmine/core/PutIssues/component.json | 2 +- src/appmixer/redmine/openapi.yml | 2 +- src/appmixer/redmine/service.json | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/appmixer/redmine/core/DeleteIssues/component.json b/src/appmixer/redmine/core/DeleteIssues/component.json index cd12ef9e1..f806bd198 100644 --- a/src/appmixer/redmine/core/DeleteIssues/component.json +++ b/src/appmixer/redmine/core/DeleteIssues/component.json @@ -65,5 +65,5 @@ "auth": { "service": "appmixer:redmineapi" }, - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/GetIssues/component.json b/src/appmixer/redmine/core/GetIssues/component.json index c51a4d40b..833480e4f 100644 --- a/src/appmixer/redmine/core/GetIssues/component.json +++ b/src/appmixer/redmine/core/GetIssues/component.json @@ -523,5 +523,5 @@ "auth": { "service": "appmixer:redmineapi" }, - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/GetIssuesFormat/component.json b/src/appmixer/redmine/core/GetIssuesFormat/component.json index 17bd5626b..023ac3489 100644 --- a/src/appmixer/redmine/core/GetIssuesFormat/component.json +++ b/src/appmixer/redmine/core/GetIssuesFormat/component.json @@ -383,5 +383,5 @@ "auth": { "service": "appmixer:redmineapi" }, - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/PostIssuesFormat/component.json b/src/appmixer/redmine/core/PostIssuesFormat/component.json index b9eff42b5..7ce683345 100644 --- a/src/appmixer/redmine/core/PostIssuesFormat/component.json +++ b/src/appmixer/redmine/core/PostIssuesFormat/component.json @@ -287,7 +287,7 @@ "type": "textarea", "index": 14, "label": "Issue Watcher User Ids", - "tooltip": " JSON array. Example: [94313896]." + "tooltip": " JSON array. Example: [-12971247]." }, "issue|is_private": { "type": "toggle", @@ -470,5 +470,5 @@ "auth": { "service": "appmixer:redmineapi" }, - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/PutIssues/component.json b/src/appmixer/redmine/core/PutIssues/component.json index 65b0fecd6..2664996ca 100644 --- a/src/appmixer/redmine/core/PutIssues/component.json +++ b/src/appmixer/redmine/core/PutIssues/component.json @@ -300,5 +300,5 @@ "auth": { "service": "appmixer:redmineapi" }, - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml index ae4d18110..c13dd1113 100644 --- a/src/appmixer/redmine/openapi.yml +++ b/src/appmixer/redmine/openapi.yml @@ -3,7 +3,7 @@ info: title: Redmine API description: 'Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.' version: 5.0.0 - x-connector-icon: 'data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K' + x-connector-icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC' contact: name: d-yoshi/redmine-openapi url: 'https://github.com/d-yoshi/redmine-openapi' diff --git a/src/appmixer/redmine/service.json b/src/appmixer/redmine/service.json index 8671c6849..70382f625 100644 --- a/src/appmixer/redmine/service.json +++ b/src/appmixer/redmine/service.json @@ -4,5 +4,5 @@ "label": "Redmineapi", "description": "

Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.

", "category": "applications", - "icon": "data:image/svg+xml;base64,PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CjxtZXRhIGNoYXJzZXQ9InV0Zi04IiAvPgo8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiLz4KPHRpdGxlPjQwNCAtIFJlZG1pbmU8L3RpdGxlPgo8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgo8bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iUmVkbWluZSIgLz4KPG1ldGEgbmFtZT0ia2V5d29yZHMiIGNvbnRlbnQ9Imlzc3VlLGJ1Zyx0cmFja2VyIiAvPgo8bWV0YSBuYW1lPSJjc3JmLXBhcmFtIiBjb250ZW50PSJhdXRoZW50aWNpdHlfdG9rZW4iIC8+CjxtZXRhIG5hbWU9ImNzcmYtdG9rZW4iIGNvbnRlbnQ9Ik43OUNia0drOWVyanZqT0VyRXNkOFo3VFo5N3hJb0NteU5VV3ZCUUFXSktuNEx4Y084UGpBN2p6elhQY3JveVhaYU03RSt6ZmdFcWVJMXIxMHdKdkhBPT0iIC8+CjxsaW5rIHJlbD0nc2hvcnRjdXQgaWNvbicgaHJlZj0nL2Zhdmljb24uaWNvPzE2NzkzMDIxMjknIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgaHJlZj0iL3N0eWxlc2hlZXRzL2pxdWVyeS9qcXVlcnktdWktMS4xMy4yLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy90cmlidXRlLTUuMS4zLmNzcz8xNjc5MzAyMTI5IiAvPgo8bGluayByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIGhyZWY9Ii9zdHlsZXNoZWV0cy9hcHBsaWNhdGlvbi5jc3M/MTY3OTMwMjEyOSIgLz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiBocmVmPSIvc3R5bGVzaGVldHMvcmVzcG9uc2l2ZS5jc3M/MTY3OTMwMjEyOSIgLz4KCjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvanF1ZXJ5LTMuNi4xLXVpLTEuMTMuMi11anMtNS4yLjguMS5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9qcXVlcnktbWlncmF0ZS0zLjMuMi5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdHJpYnV0ZS01LjEuMy5taW4uanM/MTY3OTMwMjEyOSI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvamF2YXNjcmlwdHMvdGFibGVzb3J0LTUuMi4xLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy90YWJsZXNvcnQtNS4yLjEubnVtYmVyLm1pbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9hcHBsaWNhdGlvbi5qcz8xNjc5MzAyMTI5Ij48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii9qYXZhc2NyaXB0cy9yZXNwb25zaXZlLmpzPzE2NzkzMDIxMjkiPjwvc2NyaXB0Pgo8c2NyaXB0PgovLzwhW0NEQVRBWwokKHdpbmRvdykub24oJ2xvYWQnLCBmdW5jdGlvbigpeyB3YXJuTGVhdmluZ1Vuc2F2ZWQoJ1RoZSBjdXJyZW50IHBhZ2UgY29udGFpbnMgdW5zYXZlZCB0ZXh0IHRoYXQgd2lsbCBiZSBsb3N0IGlmIHlvdSBsZWF2ZSB0aGlzIHBhZ2UuJyk7IH0pOwovL11dPgo8L3NjcmlwdD4KCjxzY3JpcHQ+Ci8vPCFbQ0RBVEFbCnJtID0gd2luZG93LnJtIHx8IHt9O3JtLkF1dG9Db21wbGV0ZSA9IHJtLkF1dG9Db21wbGV0ZSB8fCB7fTtybS5BdXRvQ29tcGxldGUuZGF0YVNvdXJjZXMgPSAneyJpc3N1ZXMiOiIvaXNzdWVzL2F1dG9fY29tcGxldGU/cT0iLCJ3aWtpX3BhZ2VzIjoiL3dpa2lfcGFnZXMvYXV0b19jb21wbGV0ZT9xPSJ9JzsKLy9dXT4KPC9zY3JpcHQ+Cgo8IS0tIHBhZ2Ugc3BlY2lmaWMgdGFncyAtLT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0iaGFzLW1haW4tbWVudSBjb250cm9sbGVyLWF0dGFjaG1lbnRzIGFjdGlvbi1kb3dubG9hZCBhdmF0YXJzLW9uIj4KCjxkaXYgaWQ9IndyYXBwZXIiPgoKPGRpdiBjbGFzcz0iZmx5b3V0LW1lbnUganMtZmx5b3V0LW1lbnUiPgoKICAgICAgICA8ZGl2IGNsYXNzPSJmbHlvdXQtbWVudV9fc2VhcmNoIj4KICAgICAgICAgICAgPGZvcm0gYWN0aW9uPSIvc2VhcmNoIiBhY2NlcHQtY2hhcnNldD0iVVRGLTgiIG5hbWU9ImZvcm0tZTc4MDA2YWYiIG1ldGhvZD0iZ2V0Ij48aW5wdXQgbmFtZT0idXRmOCIgdHlwZT0iaGlkZGVuIiB2YWx1ZT0iJiN4MjcxMzsiIC8+CiAgICAgICAgICAgIAogICAgICAgICAgICA8bGFiZWwgY2xhc3M9InNlYXJjaC1tYWduaWZpZXIgc2VhcmNoLW1hZ25pZmllci0tZmx5b3V0IiBmb3I9ImZseW91dC1zZWFyY2giPiYjOTkwNjs8L2xhYmVsPgogICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9ImZseW91dC1zZWFyY2giIGNsYXNzPSJzbWFsbCBqcy1zZWFyY2gtaW5wdXQiIHBsYWNlaG9sZGVyPSJTZWFyY2giIC8+CjwvZm9ybT4gICAgICAgIDwvZGl2PgoKCiAgICAgICAgPGgzPlByb2plY3Q8L2gzPgogICAgICAgIDxzcGFuIGNsYXNzPSJqcy1wcm9qZWN0LW1lbnUiPjwvc3Bhbj4KCiAgICA8aDM+R2VuZXJhbDwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtZ2VuZXJhbC1tZW51Ij48L3NwYW4+CgogICAgPHNwYW4gY2xhc3M9ImpzLXNpZGViYXIgZmx5b3V0LW1lbnVfX3NpZGViYXIiPjwvc3Bhbj4KCiAgICA8aDM+UHJvZmlsZTwvaDM+CiAgICA8c3BhbiBjbGFzcz0ianMtcHJvZmlsZS1tZW51Ij48L3NwYW4+Cgo8L2Rpdj4KCjxkaXYgaWQ9IndyYXBwZXIyIj4KPGRpdiBpZD0id3JhcHBlcjMiPgo8ZGl2IGlkPSJ0b3AtbWVudSI+CiAgICA8ZGl2IGlkPSJhY2NvdW50Ij4KICAgICAgICA8dWw+PGxpPjxhIGNsYXNzPSJsb2dpbiIgaHJlZj0iL2xvZ2luIj5TaWduIGluPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJyZWdpc3RlciIgaHJlZj0iL2FjY291bnQvcmVnaXN0ZXIiPlJlZ2lzdGVyPC9hPjwvbGk+PC91bD4gICAgPC9kaXY+CiAgICAKICAgIDx1bD48bGk+PGEgY2xhc3M9ImhvbWUiIGhyZWY9Ii8iPkhvbWU8L2E+PC9saT48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJoZWxwIiBocmVmPSJodHRwczovL3d3dy5yZWRtaW5lLm9yZy9ndWlkZSI+SGVscDwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8ZGl2IGlkPSJoZWFkZXIiPgoKICAgIDxhIGhyZWY9IiMiIGNsYXNzPSJtb2JpbGUtdG9nZ2xlLWJ1dHRvbiBqcy1mbHlvdXQtbWVudS10b2dnbGUtYnV0dG9uIj48L2E+CgogICAgPGRpdiBpZD0icXVpY2stc2VhcmNoIj4KICAgICAgICA8Zm9ybSBhY3Rpb249Ii9zZWFyY2giIGFjY2VwdC1jaGFyc2V0PSJVVEYtOCIgbmFtZT0iZm9ybS00OWJjZDI3MCIgbWV0aG9kPSJnZXQiPjxpbnB1dCBuYW1lPSJ1dGY4IiB0eXBlPSJoaWRkZW4iIHZhbHVlPSImI3gyNzEzOyIgLz4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJzY29wZSIgLz4KICAgICAgICAKICAgICAgICA8bGFiZWwgZm9yPSdxJz4KICAgICAgICAgIDxhIGFjY2Vzc2tleT0iNCIgaHJlZj0iL3NlYXJjaCI+U2VhcmNoPC9hPjoKICAgICAgICA8L2xhYmVsPgogICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiBpZD0icSIgc2l6ZT0iMjAiIGNsYXNzPSJzbWFsbCIgYWNjZXNza2V5PSJmIiBkYXRhLWF1dG8tY29tcGxldGU9InRydWUiIC8+CjwvZm9ybT4gICAgICAgIDxkaXYgaWQ9InByb2plY3QtanVtcCIgY2xhc3M9ImRyZG4iPjxzcGFuIGNsYXNzPSJkcmRuLXRyaWdnZXIiPkp1bXAgdG8gYSBwcm9qZWN0Li4uPC9zcGFuPjxkaXYgY2xhc3M9ImRyZG4tY29udGVudCI+PGRpdiBjbGFzcz0icXVpY2stc2VhcmNoIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0icSIgaWQ9InByb2plY3RzLXF1aWNrLXNlYXJjaCIgdmFsdWU9IiIgY2xhc3M9ImF1dG9jb21wbGV0ZSIgZGF0YS1hdXRvbWNvbXBsZXRlLXVybD0iL3Byb2plY3RzL2F1dG9jb21wbGV0ZS5qcz9qdW1wPXdpa2kiIGF1dG9jb21wbGV0ZT0ib2ZmIiAvPjwvZGl2PjxkaXYgY2xhc3M9ImRyZG4taXRlbXMgcHJvamVjdHMgc2VsZWN0aW9uIj48L2Rpdj48ZGl2IGNsYXNzPSJkcmRuLWl0ZW1zIGFsbC1wcm9qZWN0cyBzZWxlY3Rpb24iPjxhIGNsYXNzPSJzZWxlY3RlZCIgaHJlZj0iL3Byb2plY3RzP2p1bXA9d2lraSI+QWxsIFByb2plY3RzPC9hPjwvZGl2PjwvZGl2PjwvZGl2PgogICAgPC9kaXY+CgogICAgPGgxPlJlZG1pbmU8L2gxPgoKICAgIDxkaXYgaWQ9Im1haW4tbWVudSIgY2xhc3M9InRhYnMiPgogICAgICAgIDx1bD48bGk+PGEgY2xhc3M9InByb2plY3RzIiBocmVmPSIvcHJvamVjdHMiPlByb2plY3RzPC9hPjwvbGk+PGxpPjxhIGNsYXNzPSJhY3Rpdml0eSIgaHJlZj0iL2FjdGl2aXR5Ij5BY3Rpdml0eTwvYT48L2xpPjxsaT48YSBjbGFzcz0iaXNzdWVzIiBocmVmPSIvaXNzdWVzIj5Jc3N1ZXM8L2E+PC9saT48bGk+PGEgY2xhc3M9Im5ld3MiIGhyZWY9Ii9uZXdzIj5OZXdzPC9hPjwvbGk+PC91bD4KICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJzLWJ1dHRvbnMiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLWxlZnQiIG9uY2xpY2s9Im1vdmVUYWJMZWZ0KHRoaXMpOyByZXR1cm4gZmFsc2U7Ij48L2J1dHRvbj4KICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0idGFiLXJpZ2h0IiBvbmNsaWNrPSJtb3ZlVGFiUmlnaHQodGhpcyk7IHJldHVybiBmYWxzZTsiPjwvYnV0dG9uPgogICAgICAgIDwvZGl2PgogICAgPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0ibWFpbiIgY2xhc3M9IiI+CiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgICAJCTxiciAvPgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tCgkJZ29vZ2xlX2FkX2NsaWVudCA9ICJwdWItMDQ0NzI4NDM0NDUxNzM3MCI7CgkJZ29vZ2xlX2FsdGVybmF0ZV9jb2xvciA9ICJGRkZGRkYiOwoJCWdvb2dsZV9hZF93aWR0aCA9IDE2MDsKCQlnb29nbGVfYWRfaGVpZ2h0ID0gNjAwOwoJCWdvb2dsZV9hZF9mb3JtYXQgPSAiMTYweDYwMF9hcyI7CgkJZ29vZ2xlX2FkX3R5cGUgPSAidGV4dF9pbWFnZSI7CgkJZ29vZ2xlX2FkX2NoYW5uZWwgPSAiIjsKCQlnb29nbGVfY29sb3JfYm9yZGVyID0gIkVFRUVFRSI7CgkJZ29vZ2xlX2NvbG9yX2JnID0gIkZGRkZGRiI7CgkJZ29vZ2xlX2NvbG9yX2xpbmsgPSAiNDg0ODQ4IjsKCQlnb29nbGVfY29sb3JfdGV4dCA9ICI0ODQ4NDgiOwoJCWdvb2dsZV9jb2xvcl91cmwgPSAiMkE1Njg1IjsKCQkvLy0tPgoJCTwvc2NyaXB0PgoJCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IgoJCSAgc3JjPSIvL3BhZ2VhZDIuZ29vZ2xlc3luZGljYXRpb24uY29tL3BhZ2VhZC9zaG93X2Fkcy5qcyI+CgkJPC9zY3JpcHQ+CiAgICAgICAgICAgICAgICA8YnIgLz4KCiAgICAgICAgCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjb250ZW50Ij4KICAgICAgICAKICAgICAgICA8aDI+NDA0PC9oMj4KCiAgPHAgaWQ9ImVycm9yRXhwbGFuYXRpb24iPlRoZSBwYWdlIHlvdSB3ZXJlIHRyeWluZyB0byBhY2Nlc3MgZG9lc24mIzM5O3QgZXhpc3Qgb3IgaGFzIGJlZW4gcmVtb3ZlZC48L3A+CgoKPHA+PGEgaHJlZj0iamF2YXNjcmlwdDpoaXN0b3J5LmJhY2soKSI+QmFjazwvYT48L3A+CgoKICAgICAgICAKICAgICAgICA8ZGl2IHN0eWxlPSJjbGVhcjpib3RoOyI+PC9kaXY+CiAgICA8L2Rpdj4KPC9kaXY+CjxkaXYgaWQ9ImZvb3RlciI+CiAgICBQb3dlcmVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vd3d3LnJlZG1pbmUub3JnLyI+UmVkbWluZTwvYT4gJmNvcHk7IDIwMDYtMjAyMyBKZWFuLVBoaWxpcHBlIExhbmcKPC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0iYWpheC1pbmRpY2F0b3IiIHN0eWxlPSJkaXNwbGF5Om5vbmU7Ij48c3Bhbj5Mb2FkaW5nLi4uPC9zcGFuPjwvZGl2Pgo8ZGl2IGlkPSJhamF4LW1vZGFsIiBzdHlsZT0iZGlzcGxheTpub25lOyI+PC9kaXY+Cgo8L2Rpdj4KPC9kaXY+Cgo8L2JvZHk+CjwvaHRtbD4K" + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file From d304bf7826b341cfff6ede4461b6cf8b348c88a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 10:29:52 +0100 Subject: [PATCH 03/11] component labels --- src/appmixer/redmine/core/DeleteIssues/component.json | 1 + src/appmixer/redmine/core/GetIssues/component.json | 1 + src/appmixer/redmine/core/GetIssuesFormat/component.json | 1 + src/appmixer/redmine/core/PostIssuesFormat/component.json | 3 ++- src/appmixer/redmine/core/PutIssues/component.json | 1 + src/appmixer/redmine/openapi.yml | 5 +++++ 6 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/appmixer/redmine/core/DeleteIssues/component.json b/src/appmixer/redmine/core/DeleteIssues/component.json index f806bd198..d98e81e6f 100644 --- a/src/appmixer/redmine/core/DeleteIssues/component.json +++ b/src/appmixer/redmine/core/DeleteIssues/component.json @@ -62,6 +62,7 @@ } ], "properties": {}, + "label": "DeleteIssue", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/core/GetIssues/component.json b/src/appmixer/redmine/core/GetIssues/component.json index 833480e4f..5e09b219d 100644 --- a/src/appmixer/redmine/core/GetIssues/component.json +++ b/src/appmixer/redmine/core/GetIssues/component.json @@ -520,6 +520,7 @@ } ], "properties": {}, + "label": "GetIssue", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/core/GetIssuesFormat/component.json b/src/appmixer/redmine/core/GetIssuesFormat/component.json index 023ac3489..ff54466b1 100644 --- a/src/appmixer/redmine/core/GetIssuesFormat/component.json +++ b/src/appmixer/redmine/core/GetIssuesFormat/component.json @@ -380,6 +380,7 @@ } ], "properties": {}, + "label": "FindIssues", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/core/PostIssuesFormat/component.json b/src/appmixer/redmine/core/PostIssuesFormat/component.json index 7ce683345..c798186bb 100644 --- a/src/appmixer/redmine/core/PostIssuesFormat/component.json +++ b/src/appmixer/redmine/core/PostIssuesFormat/component.json @@ -287,7 +287,7 @@ "type": "textarea", "index": 14, "label": "Issue Watcher User Ids", - "tooltip": " JSON array. Example: [-12971247]." + "tooltip": " JSON array. Example: [\"exercitation\"]." }, "issue|is_private": { "type": "toggle", @@ -467,6 +467,7 @@ } ], "properties": {}, + "label": "CreateIssue", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/core/PutIssues/component.json b/src/appmixer/redmine/core/PutIssues/component.json index 2664996ca..34a51b249 100644 --- a/src/appmixer/redmine/core/PutIssues/component.json +++ b/src/appmixer/redmine/core/PutIssues/component.json @@ -297,6 +297,7 @@ } ], "properties": {}, + "label": "UpdateIssue", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml index c13dd1113..3347f8faf 100644 --- a/src/appmixer/redmine/openapi.yml +++ b/src/appmixer/redmine/openapi.yml @@ -21,6 +21,7 @@ paths: externalDocs: url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Listing-issues' summary: Listing issues + x-connector-label: FindIssues parameters: - $ref: '#/components/parameters/format' - $ref: '#/components/parameters/offset' @@ -107,6 +108,7 @@ paths: externalDocs: url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Creating-an-issue' summary: Creating an issue + x-connector-label: CreateIssue parameters: - $ref: '#/components/parameters/format' requestBody: @@ -219,6 +221,7 @@ paths: externalDocs: url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Showing-an-issue' summary: Showing an issue + x-connector-label: GetIssue parameters: - $ref: '#/components/parameters/format' - $ref: '#/components/parameters/issue_id' @@ -259,6 +262,7 @@ paths: externalDocs: url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue' summary: Updating an issue + x-connector-label: UpdateIssue parameters: - $ref: '#/components/parameters/format' - $ref: '#/components/parameters/issue_id' @@ -339,6 +343,7 @@ paths: externalDocs: url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Deleting-an-issue' summary: Deleting an issue + x-connector-label: DeleteIssue parameters: - $ref: '#/components/parameters/format' - $ref: '#/components/parameters/issue_id' From 18f3cac4b72d2e6c8afc5a22a310a8310cba7128 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 11:53:30 +0100 Subject: [PATCH 04/11] init from different openapi spec - https://github.com/Lerrrtaste/redmine-openapi-specification/blob/main/redmine_openapi.yaml --- .../core/GetIssuesFormat/component.json | 388 -------- .../IssueCreate.js} | 12 +- .../redmine/core/IssueCreate/component.json | 200 ++++ .../IssueDelete.js} | 2 +- .../component.json | 43 +- .../GetIssues.js => IssueShow/IssueShow.js} | 2 +- .../{GetIssues => IssueShow}/component.json | 292 ++---- .../IssueUpdate.js} | 5 +- .../{PutIssues => IssueUpdate}/component.json | 239 ++--- .../IssuesList.js} | 10 +- .../redmine/core/IssuesList/component.json | 485 +++++++++ .../core/PostIssuesFormat/component.json | 475 --------- src/appmixer/redmine/lib.js | 3 +- src/appmixer/redmine/openapi.yml | 10 +- src/appmixer/redmine/openapi2.yml | 928 ++++++++++++++++++ 15 files changed, 1794 insertions(+), 1300 deletions(-) delete mode 100644 src/appmixer/redmine/core/GetIssuesFormat/component.json rename src/appmixer/redmine/core/{PostIssuesFormat/PostIssuesFormat.js => IssueCreate/IssueCreate.js} (87%) create mode 100644 src/appmixer/redmine/core/IssueCreate/component.json rename src/appmixer/redmine/core/{DeleteIssues/DeleteIssues.js => IssueDelete/IssueDelete.js} (95%) rename src/appmixer/redmine/core/{DeleteIssues => IssueDelete}/component.json (62%) rename src/appmixer/redmine/core/{GetIssues/GetIssues.js => IssueShow/IssueShow.js} (96%) rename src/appmixer/redmine/core/{GetIssues => IssueShow}/component.json (60%) rename src/appmixer/redmine/core/{PutIssues/PutIssues.js => IssueUpdate/IssueUpdate.js} (93%) rename src/appmixer/redmine/core/{PutIssues => IssueUpdate}/component.json (59%) rename src/appmixer/redmine/core/{GetIssuesFormat/GetIssuesFormat.js => IssuesList/IssuesList.js} (89%) create mode 100644 src/appmixer/redmine/core/IssuesList/component.json delete mode 100644 src/appmixer/redmine/core/PostIssuesFormat/component.json create mode 100644 src/appmixer/redmine/openapi2.yml diff --git a/src/appmixer/redmine/core/GetIssuesFormat/component.json b/src/appmixer/redmine/core/GetIssuesFormat/component.json deleted file mode 100644 index ff54466b1..000000000 --- a/src/appmixer/redmine/core/GetIssuesFormat/component.json +++ /dev/null @@ -1,388 +0,0 @@ -{ - "version": "1.0.0", - "name": "appmixer.redmineapi.core.GetIssuesFormat", - "author": "Appmixer ", - "description": "", - "private": false, - "quota": {}, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "required": [ - "format" - ], - "properties": { - "format": { - "type": "string", - "enum": [ - "json", - "xml" - ] - }, - "offset": { - "type": "integer" - }, - "limit": { - "type": "integer" - }, - "sort": { - "type": "string" - }, - "include": { - "type": "string", - "enum": [ - "attachments", - "relations" - ] - }, - "issue_id": { - "type": "string" - }, - "project_id": { - "type": "string" - }, - "subproject_id": { - "type": "string" - }, - "tracker_id": { - "type": "integer" - }, - "status_id": { - "type": "string" - }, - "assigned_to_id": { - "type": "string" - }, - "parent_id": { - "type": "string" - }, - "cf_x": { - "type": "string" - } - } - }, - "inspector": { - "inputs": { - "format": { - "type": "select", - "index": 0, - "label": "Format", - "tooltip": "", - "options": [ - { - "content": "json", - "value": "json" - }, - { - "content": "xml", - "value": "xml" - } - ] - }, - "offset": { - "type": "number", - "index": 1, - "label": "Offset", - "tooltip": "" - }, - "limit": { - "type": "number", - "index": 2, - "label": "Limit", - "tooltip": "" - }, - "sort": { - "type": "text", - "index": 3, - "label": "Sort", - "tooltip": "" - }, - "include": { - "type": "select", - "index": 4, - "label": "Include", - "tooltip": "", - "options": [ - { - "content": "attachments", - "value": "attachments" - }, - { - "content": "relations", - "value": "relations" - } - ] - }, - "issue_id": { - "type": "text", - "index": 5, - "label": "Issue Id", - "tooltip": "" - }, - "project_id": { - "type": "text", - "index": 6, - "label": "Project Id", - "tooltip": "" - }, - "subproject_id": { - "type": "text", - "index": 7, - "label": "Subproject Id", - "tooltip": "" - }, - "tracker_id": { - "type": "number", - "index": 8, - "label": "Tracker Id", - "tooltip": "" - }, - "status_id": { - "type": "text", - "index": 9, - "label": "Status Id", - "tooltip": "" - }, - "assigned_to_id": { - "type": "text", - "index": 10, - "label": "Assigned To Id", - "tooltip": "" - }, - "parent_id": { - "type": "text", - "index": 11, - "label": "Parent Id", - "tooltip": "" - }, - "cf_x": { - "type": "text", - "index": 12, - "label": "Cf X", - "tooltip": "" - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "options": [ - { - "label": "Issues", - "value": "issues", - "schema": { - "type": "array", - "items": { - "type": "object", - "required": [ - "author", - "closed_on", - "created_on", - "description", - "done_ratio", - "due_date", - "estimated_hours", - "id", - "is_private", - "priority", - "project", - "spent_hours", - "start_date", - "status", - "subject", - "total_estimated_hours", - "total_spent_hours", - "tracker", - "updated_on" - ], - "properties": { - "id": { - "type": "integer" - }, - "project": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "tracker": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "status": { - "type": "object", - "required": [ - "id", - "is_closed", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "is_closed": { - "type": "boolean" - } - } - }, - "priority": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "author": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "assigned_to": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "category": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "subject": { - "type": "string" - }, - "description": { - "type": "string", - "nullable": true - }, - "start_date": { - "type": "string", - "nullable": true - }, - "due_date": { - "type": "string", - "nullable": true - }, - "done_ratio": { - "type": "integer" - }, - "is_private": { - "type": "boolean" - }, - "estimated_hours": { - "type": "number", - "nullable": true - }, - "total_estimated_hours": { - "type": "number", - "nullable": true - }, - "spent_hours": { - "type": "number" - }, - "total_spent_hours": { - "type": "number" - }, - "created_on": { - "type": "string", - "format": "date-time" - }, - "updated_on": { - "type": "string", - "format": "date-time" - }, - "closed_on": { - "type": "string", - "format": "date-time", - "nullable": true - } - } - } - } - }, - { - "label": "Total Count", - "value": "total_count" - }, - { - "label": "Offset", - "value": "offset" - }, - { - "label": "Limit", - "value": "limit" - } - ] - } - ], - "properties": {}, - "label": "FindIssues", - "auth": { - "service": "appmixer:redmineapi" - }, - "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" -} \ No newline at end of file diff --git a/src/appmixer/redmine/core/PostIssuesFormat/PostIssuesFormat.js b/src/appmixer/redmine/core/IssueCreate/IssueCreate.js similarity index 87% rename from src/appmixer/redmine/core/PostIssuesFormat/PostIssuesFormat.js rename to src/appmixer/redmine/core/IssueCreate/IssueCreate.js index 6cfcab613..4de691f1e 100644 --- a/src/appmixer/redmine/core/PostIssuesFormat/PostIssuesFormat.js +++ b/src/appmixer/redmine/core/IssueCreate/IssueCreate.js @@ -6,9 +6,10 @@ module.exports = { receive: async function(context) { - const { data } = await this.httpRequest(context); + await this.httpRequest(context); - return context.sendJson(data, 'out'); + // http 204 No Content on success + return context.sendJson({}, 'out'); }, httpRequest: async function(context) { @@ -16,7 +17,7 @@ module.exports = { // eslint-disable-next-line no-unused-vars const input = context.messages.in.content; - let url = lib.getBaseUrl(context) + `/issues.${input['format']}`; + let url = lib.getBaseUrl(context) + '/issues.json'; const headers = {}; @@ -27,8 +28,6 @@ module.exports = { 'issue.priority_id': input['issue|priority_id'], 'issue.subject': input['issue|subject'], 'issue.description': input['issue|description'], - 'issue.start_date': input['issue|start_date'], - 'issue.due_date': input['issue|due_date'], 'issue.category_id': input['issue|category_id'], 'issue.fixed_version_id': input['issue|fixed_version_id'], 'issue.assigned_to_id': input['issue|assigned_to_id'], @@ -36,8 +35,7 @@ module.exports = { 'issue.custom_fields': input['issue|custom_fields'], 'issue.watcher_user_ids': input['issue|watcher_user_ids'], 'issue.is_private': input['issue|is_private'], - 'issue.estimated_hours': input['issue|estimated_hours'], - 'issue.uploads': !!input['issue|uploads'] ? JSON.parse(input['issue|uploads']) : undefined + 'issue.estimated_hours': input['issue|estimated_hours'] }; let requestBody = {}; lib.setProperties(requestBody, inputMapping); diff --git a/src/appmixer/redmine/core/IssueCreate/component.json b/src/appmixer/redmine/core/IssueCreate/component.json new file mode 100644 index 000000000..e1758f42d --- /dev/null +++ b/src/appmixer/redmine/core/IssueCreate/component.json @@ -0,0 +1,200 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi.core.IssueCreate", + "author": "Appmixer ", + "description": "

Creates a new issue.

", + "private": false, + "quota": {}, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "required": [ + "issue" + ], + "properties": { + "issue|project_id": { + "title": "ProjectId", + "type": "integer", + "path": "issue.project_id" + }, + "issue|tracker_id": { + "title": "TrackerId", + "type": "integer", + "path": "issue.tracker_id" + }, + "issue|status_id": { + "title": "StatusId", + "type": "integer", + "path": "issue.status_id" + }, + "issue|priority_id": { + "title": "PriorityId", + "type": "integer", + "path": "issue.priority_id" + }, + "issue|subject": { + "title": "Subject", + "type": "string", + "path": "issue.subject" + }, + "issue|description": { + "title": "Description", + "type": "string", + "path": "issue.description" + }, + "issue|category_id": { + "title": "CategoryId", + "type": "integer", + "path": "issue.category_id" + }, + "issue|fixed_version_id": { + "title": "FixedVersionId", + "type": "integer", + "description": "ID of the Target Versions (previously called \"Fixed Version\" and still referred to as such in the API)", + "path": "issue.fixed_version_id" + }, + "issue|assigned_to_id": { + "title": "AssignedToId", + "type": "integer", + "description": "ID of the user to assign the issue to (currently no mechanism to assign by name)", + "path": "issue.assigned_to_id" + }, + "issue|parent_issue_id": { + "title": "ParentIssueId", + "type": "integer", + "description": "ID of the parent issue", + "path": "issue.parent_issue_id" + }, + "issue|custom_fields": { + "title": "CustomFields", + "type": "array", + "path": "issue.custom_fields", + "items": { + "type": "object" + } + }, + "issue|watcher_user_ids": { + "title": "WatcherUserIds", + "type": "array", + "description": "Array of user ids to add as watchers", + "path": "issue.watcher_user_ids", + "items": { + "type": "integer" + } + }, + "issue|is_private": { + "title": "IsPrivate", + "type": "boolean", + "path": "issue.is_private" + }, + "issue|estimated_hours": { + "title": "EstimatedHours", + "type": "number", + "path": "issue.estimated_hours" + } + } + }, + "inspector": { + "inputs": { + "issue|project_id": { + "type": "number", + "index": 0, + "label": "Issue Project Id", + "tooltip": "" + }, + "issue|tracker_id": { + "type": "number", + "index": 1, + "label": "Issue Tracker Id", + "tooltip": "" + }, + "issue|status_id": { + "type": "number", + "index": 2, + "label": "Issue Status Id", + "tooltip": "" + }, + "issue|priority_id": { + "type": "number", + "index": 3, + "label": "Issue Priority Id", + "tooltip": "" + }, + "issue|subject": { + "type": "text", + "index": 4, + "label": "Issue Subject", + "tooltip": "" + }, + "issue|description": { + "type": "text", + "index": 5, + "label": "Issue Description", + "tooltip": "" + }, + "issue|category_id": { + "type": "number", + "index": 6, + "label": "Issue Category Id", + "tooltip": "" + }, + "issue|fixed_version_id": { + "type": "number", + "index": 7, + "label": "Issue Fixed Version Id", + "tooltip": "

ID of the Target Versions (previously called \"Fixed Version\" and still referred to as such in the API)

" + }, + "issue|assigned_to_id": { + "type": "number", + "index": 8, + "label": "Issue Assigned To Id", + "tooltip": "

ID of the user to assign the issue to (currently no mechanism to assign by name)

" + }, + "issue|parent_issue_id": { + "type": "number", + "index": 9, + "label": "Issue Parent Issue Id", + "tooltip": "

ID of the parent issue

" + }, + "issue|custom_fields": { + "type": "textarea", + "index": 10, + "label": "Issue Custom Fields", + "tooltip": " JSON array. Example: [{}]." + }, + "issue|watcher_user_ids": { + "type": "textarea", + "index": 11, + "label": "Issue Watcher User Ids", + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [12489033]." + }, + "issue|is_private": { + "type": "toggle", + "index": 12, + "label": "Issue Is Private", + "tooltip": "" + }, + "issue|estimated_hours": { + "type": "number", + "index": 13, + "label": "Issue Estimated Hours", + "tooltip": "" + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [] + } + ], + "properties": {}, + "auth": { + "service": "appmixer:redmineapi" + }, + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" +} \ No newline at end of file diff --git a/src/appmixer/redmine/core/DeleteIssues/DeleteIssues.js b/src/appmixer/redmine/core/IssueDelete/IssueDelete.js similarity index 95% rename from src/appmixer/redmine/core/DeleteIssues/DeleteIssues.js rename to src/appmixer/redmine/core/IssueDelete/IssueDelete.js index c4f71e14c..f8a610ac6 100644 --- a/src/appmixer/redmine/core/DeleteIssues/DeleteIssues.js +++ b/src/appmixer/redmine/core/IssueDelete/IssueDelete.js @@ -17,7 +17,7 @@ module.exports = { // eslint-disable-next-line no-unused-vars const input = context.messages.in.content; - let url = lib.getBaseUrl(context) + `/issues/${input['issue_id']}.${input['format']}`; + let url = lib.getBaseUrl(context) + `/issues/${input['id']}.json`; const headers = {}; diff --git a/src/appmixer/redmine/core/DeleteIssues/component.json b/src/appmixer/redmine/core/IssueDelete/component.json similarity index 62% rename from src/appmixer/redmine/core/DeleteIssues/component.json rename to src/appmixer/redmine/core/IssueDelete/component.json index d98e81e6f..69c333084 100644 --- a/src/appmixer/redmine/core/DeleteIssues/component.json +++ b/src/appmixer/redmine/core/IssueDelete/component.json @@ -1,8 +1,8 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.DeleteIssues", + "name": "appmixer.redmineapi.core.IssueDelete", "author": "Appmixer ", - "description": "", + "description": "

Deletes a issue.

", "private": false, "quota": {}, "inPorts": [ @@ -11,45 +11,21 @@ "schema": { "type": "object", "required": [ - "format", - "issue_id" + "id" ], "properties": { - "format": { - "type": "string", - "enum": [ - "json", - "xml" - ] - }, - "issue_id": { - "type": "integer" + "id": { + "type": "string" } } }, "inspector": { "inputs": { - "format": { - "type": "select", + "id": { + "type": "text", "index": 0, - "label": "Format", - "tooltip": "", - "options": [ - { - "content": "json", - "value": "json" - }, - { - "content": "xml", - "value": "xml" - } - ] - }, - "issue_id": { - "type": "number", - "index": 1, - "label": "Issue Id", - "tooltip": "" + "label": "Id", + "tooltip": "

id or identifier of the project/issue/user/timeEntry

" } } } @@ -62,7 +38,6 @@ } ], "properties": {}, - "label": "DeleteIssue", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/core/GetIssues/GetIssues.js b/src/appmixer/redmine/core/IssueShow/IssueShow.js similarity index 96% rename from src/appmixer/redmine/core/GetIssues/GetIssues.js rename to src/appmixer/redmine/core/IssueShow/IssueShow.js index 06a924711..32cd25e59 100644 --- a/src/appmixer/redmine/core/GetIssues/GetIssues.js +++ b/src/appmixer/redmine/core/IssueShow/IssueShow.js @@ -16,7 +16,7 @@ module.exports = { // eslint-disable-next-line no-unused-vars const input = context.messages.in.content; - let url = lib.getBaseUrl(context) + `/issues/${input['issue_id']}.${input['format']}`; + let url = lib.getBaseUrl(context) + `/issues/${input['id']}.json`; const headers = {}; const query = new URLSearchParams; diff --git a/src/appmixer/redmine/core/GetIssues/component.json b/src/appmixer/redmine/core/IssueShow/component.json similarity index 60% rename from src/appmixer/redmine/core/GetIssues/component.json rename to src/appmixer/redmine/core/IssueShow/component.json index 5e09b219d..dd5503eb2 100644 --- a/src/appmixer/redmine/core/GetIssues/component.json +++ b/src/appmixer/redmine/core/IssueShow/component.json @@ -1,8 +1,8 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.GetIssues", + "name": "appmixer.redmineapi.core.IssueShow", "author": "Appmixer ", - "description": "", + "description": "

Returns the issue of given id or identifier.

", "private": false, "quota": {}, "inPorts": [ @@ -11,93 +11,30 @@ "schema": { "type": "object", "required": [ - "format", - "issue_id" + "id" ], "properties": { - "format": { - "type": "string", - "enum": [ - "json", - "xml" - ] - }, - "issue_id": { - "type": "integer" + "id": { + "type": "string" }, "include": { - "type": "string", - "enum": [ - "children", - "attachments", - "relations", - "changesets", - "journals", - "watchers", - "allowed_statuses" - ] + "type": "string" } } }, "inspector": { "inputs": { - "format": { - "type": "select", + "id": { + "type": "text", "index": 0, - "label": "Format", - "tooltip": "", - "options": [ - { - "content": "json", - "value": "json" - }, - { - "content": "xml", - "value": "xml" - } - ] - }, - "issue_id": { - "type": "number", - "index": 1, - "label": "Issue Id", - "tooltip": "" + "label": "Id", + "tooltip": "

id or identifier of the project/issue/user/timeEntry

" }, "include": { - "type": "select", - "index": 2, + "type": "text", + "index": 1, "label": "Include", - "tooltip": "", - "options": [ - { - "content": "children", - "value": "children" - }, - { - "content": "attachments", - "value": "attachments" - }, - { - "content": "relations", - "value": "relations" - }, - { - "content": "changesets", - "value": "changesets" - }, - { - "content": "journals", - "value": "journals" - }, - { - "content": "watchers", - "value": "watchers" - }, - { - "content": "allowed_statuses", - "value": "allowed_statuses" - } - ] + "tooltip": "

fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers

" } } } @@ -151,10 +88,6 @@ "label": "Issue Status Name", "value": "issue.status.name" }, - { - "label": "Issue Status Is Closed", - "value": "issue.status.is_closed" - }, { "label": "Issue Priority", "value": "issue.priority" @@ -191,18 +124,6 @@ "label": "Issue Assigned To Name", "value": "issue.assigned_to.name" }, - { - "label": "Issue Category", - "value": "issue.category" - }, - { - "label": "Issue Category Id", - "value": "issue.category.id" - }, - { - "label": "Issue Category Name", - "value": "issue.category.name" - }, { "label": "Issue Subject", "value": "issue.subject" @@ -231,18 +152,6 @@ "label": "Issue Estimated Hours", "value": "issue.estimated_hours" }, - { - "label": "Issue Total Estimated Hours", - "value": "issue.total_estimated_hours" - }, - { - "label": "Issue Spent Hours", - "value": "issue.spent_hours" - }, - { - "label": "Issue Total Spent Hours", - "value": "issue.total_spent_hours" - }, { "label": "Issue Created On", "value": "issue.created_on" @@ -255,48 +164,25 @@ "label": "Issue Closed On", "value": "issue.closed_on" }, - { - "label": "Issue Changesets", - "value": "issue.changesets", - "schema": { - "type": "array", - "items": { - "type": "string" - } - } - }, { "label": "Issue Children", "value": "issue.children", "schema": { + "title": "Children", "type": "array", "items": { "type": "object", "required": [ "id", - "tracker", - "subject" + "name" ], "properties": { "id": { + "title": "Id", "type": "integer" }, - "tracker": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "subject": { + "name": { + "title": "Name", "type": "string" } } @@ -307,58 +193,21 @@ "label": "Issue Attachments", "value": "issue.attachments", "schema": { + "title": "Attachments", "type": "array", "items": { "type": "object", "required": [ "id", - "filename", - "filesize", - "content_type", - "description", - "content_url", - "author", - "created_on" + "name" ], "properties": { "id": { + "title": "Id", "type": "integer" }, - "filename": { - "type": "string" - }, - "filesize": { - "type": "integer" - }, - "content_type": { - "type": "string" - }, - "description": { - "type": "string" - }, - "content_url": { - "type": "string" - }, - "author": { - "type": "object", - "required": [ - "id", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - } - } - }, - "created_on": { - "type": "string", - "format": "data-time" - }, - "thumbnail_url": { + "name": { + "title": "Name", "type": "string" } } @@ -369,25 +218,47 @@ "label": "Issue Relations", "value": "issue.relations", "schema": { + "title": "Realtions", "type": "array", "items": { "type": "object", + "required": [ + "id", + "name" + ], "properties": { "id": { + "title": "Id", "type": "integer" }, - "issue_id": { - "type": "integer" - }, - "issue_to_id": { + "name": { + "title": "Name", + "type": "string" + } + } + } + } + }, + { + "label": "Issue Changesets", + "value": "issue.changesets", + "schema": { + "title": "Chagesets", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", "type": "integer" }, - "relation_type": { + "name": { + "title": "Name", "type": "string" - }, - "delay": { - "type": "integer", - "nullable": true } } } @@ -397,19 +268,14 @@ "label": "Issue Journals", "value": "issue.journals", "schema": { + "title": "Journals", "type": "array", "items": { + "title": "Journal", "type": "object", - "required": [ - "id", - "user", - "notes", - "created_on", - "private_notes", - "details" - ], "properties": { "id": { + "title": "Id", "type": "integer" }, "user": { @@ -420,9 +286,11 @@ ], "properties": { "id": { + "title": "Id", "type": "integer" }, "name": { + "title": "Name", "type": "string" } } @@ -431,8 +299,7 @@ "type": "string" }, "created_on": { - "type": "string", - "format": "date-time" + "type": "string" }, "private_notes": { "type": "boolean" @@ -441,12 +308,6 @@ "type": "array", "items": { "type": "object", - "required": [ - "property", - "name", - "old_value", - "new_value" - ], "properties": { "property": { "type": "string" @@ -455,8 +316,7 @@ "type": "string" }, "old_value": { - "type": "string", - "nullable": true + "type": "string" }, "new_value": { "type": "string" @@ -472,6 +332,7 @@ "label": "Issue Watchers", "value": "issue.watchers", "schema": { + "title": "Watchers", "type": "array", "items": { "type": "object", @@ -481,46 +342,21 @@ ], "properties": { "id": { + "title": "Id", "type": "integer" }, "name": { + "title": "Name", "type": "string" } } } } - }, - { - "label": "Issue Allowed Statuses", - "value": "issue.allowed_statuses", - "schema": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "is_closed", - "name" - ], - "properties": { - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "is_closed": { - "type": "boolean" - } - } - } - } } ] } ], "properties": {}, - "label": "GetIssue", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/core/PutIssues/PutIssues.js b/src/appmixer/redmine/core/IssueUpdate/IssueUpdate.js similarity index 93% rename from src/appmixer/redmine/core/PutIssues/PutIssues.js rename to src/appmixer/redmine/core/IssueUpdate/IssueUpdate.js index 74e07b113..6052de94c 100644 --- a/src/appmixer/redmine/core/PutIssues/PutIssues.js +++ b/src/appmixer/redmine/core/IssueUpdate/IssueUpdate.js @@ -17,7 +17,7 @@ module.exports = { // eslint-disable-next-line no-unused-vars const input = context.messages.in.content; - let url = lib.getBaseUrl(context) + `/issues/${input['issue_id']}.${input['format']}`; + let url = lib.getBaseUrl(context) + `/issues/${input['id']}.json`; const headers = {}; @@ -28,13 +28,12 @@ module.exports = { 'issue.priority_id': input['issue|priority_id'], 'issue.subject': input['issue|subject'], 'issue.description': input['issue|description'], - 'issue.start_date': input['issue|start_date'], - 'issue.due_date': input['issue|due_date'], 'issue.category_id': input['issue|category_id'], 'issue.fixed_version_id': input['issue|fixed_version_id'], 'issue.assigned_to_id': input['issue|assigned_to_id'], 'issue.parent_issue_id': input['issue|parent_issue_id'], 'issue.custom_fields': input['issue|custom_fields'], + 'issue.watcher_user_ids': input['issue|watcher_user_ids'], 'issue.is_private': input['issue|is_private'], 'issue.estimated_hours': input['issue|estimated_hours'], 'issue.notes': input['issue|notes'], diff --git a/src/appmixer/redmine/core/PutIssues/component.json b/src/appmixer/redmine/core/IssueUpdate/component.json similarity index 59% rename from src/appmixer/redmine/core/PutIssues/component.json rename to src/appmixer/redmine/core/IssueUpdate/component.json index 34a51b249..6cafa1dbe 100644 --- a/src/appmixer/redmine/core/PutIssues/component.json +++ b/src/appmixer/redmine/core/IssueUpdate/component.json @@ -1,8 +1,8 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.PutIssues", + "name": "appmixer.redmineapi.core.IssueUpdate", "author": "Appmixer ", - "description": "", + "description": "

Updates a issue.

", "private": false, "quota": {}, "inPorts": [ @@ -11,280 +11,210 @@ "schema": { "type": "object", "required": [ - "format", - "issue_id" + "id", + "issue" ], "properties": { - "format": { - "type": "string", - "enum": [ - "json", - "xml" - ] - }, - "issue_id": { - "type": "integer" + "id": { + "type": "string" }, "issue|project_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], + "title": "ProjectId", + "type": "integer", "path": "issue.project_id" }, "issue|tracker_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], + "title": "TrackerId", + "type": "integer", "path": "issue.tracker_id" }, "issue|status_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], + "title": "StatusId", + "type": "integer", "path": "issue.status_id" }, "issue|priority_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], + "title": "PriorityId", + "type": "integer", "path": "issue.priority_id" }, "issue|subject": { + "title": "Subject", "type": "string", "path": "issue.subject" }, "issue|description": { + "title": "Description", "type": "string", - "nullable": true, "path": "issue.description" }, - "issue|start_date": { - "type": "string", - "format": "date", - "nullable": true, - "path": "issue.start_date" - }, - "issue|due_date": { - "type": "string", - "format": "date", - "nullable": true, - "path": "issue.due_date" - }, "issue|category_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], + "title": "CategoryId", + "type": "integer", "path": "issue.category_id" }, "issue|fixed_version_id": { - "type": "string", + "title": "FixedVersionId", + "type": "integer", + "description": "ID of the Target Versions (previously called \"Fixed Version\" and still referred to as such in the API)", "path": "issue.fixed_version_id" }, "issue|assigned_to_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], + "title": "AssignedToId", + "type": "integer", + "description": "ID of the user to assign the issue to (currently no mechanism to assign by name)", "path": "issue.assigned_to_id" }, "issue|parent_issue_id": { - "oneOf": [ - { - "type": "integer", - "nullable": true - }, - { - "type": "string", - "nullable": true - } - ], + "title": "ParentIssueId", + "type": "integer", + "description": "ID of the parent issue", "path": "issue.parent_issue_id" }, "issue|custom_fields": { - "type": "string", - "path": "issue.custom_fields" + "title": "CustomFields", + "type": "array", + "path": "issue.custom_fields", + "items": { + "type": "object" + } + }, + "issue|watcher_user_ids": { + "title": "WatcherUserIds", + "type": "array", + "description": "Array of user ids to add as watchers", + "path": "issue.watcher_user_ids", + "items": { + "type": "integer" + } }, "issue|is_private": { + "title": "IsPrivate", "type": "boolean", "path": "issue.is_private" }, "issue|estimated_hours": { - "oneOf": [ - { - "type": "integer", - "nullable": true - }, - { - "type": "string", - "nullable": true - } - ], + "title": "EstimatedHours", + "type": "number", "path": "issue.estimated_hours" }, "issue|notes": { + "title": "Notes", + "description": "Comments about the update", "type": "string", "path": "issue.notes" }, "issue|private_notes": { - "type": "string", + "title": "PrivateNotes", + "description": "true if notes are private", + "type": "boolean", "path": "issue.private_notes" } } }, "inspector": { "inputs": { - "format": { - "type": "select", + "id": { + "type": "text", "index": 0, - "label": "Format", - "tooltip": "", - "options": [ - { - "content": "json", - "value": "json" - }, - { - "content": "xml", - "value": "xml" - } - ] - }, - "issue_id": { - "type": "number", - "index": 1, - "label": "Issue Id", - "tooltip": "" + "label": "Id", + "tooltip": "

id or identifier of the project/issue/user/timeEntry

" }, "issue|project_id": { "type": "number", - "index": 2, + "index": 1, "label": "Issue Project Id", "tooltip": "" }, "issue|tracker_id": { "type": "number", - "index": 3, + "index": 2, "label": "Issue Tracker Id", "tooltip": "" }, "issue|status_id": { "type": "number", - "index": 4, + "index": 3, "label": "Issue Status Id", "tooltip": "" }, "issue|priority_id": { "type": "number", - "index": 5, + "index": 4, "label": "Issue Priority Id", "tooltip": "" }, "issue|subject": { "type": "text", - "index": 6, + "index": 5, "label": "Issue Subject", "tooltip": "" }, "issue|description": { "type": "text", - "index": 7, + "index": 6, "label": "Issue Description", "tooltip": "" }, - "issue|start_date": { - "type": "text", - "index": 8, - "label": "Issue Start Date", - "tooltip": "" - }, - "issue|due_date": { - "type": "text", - "index": 9, - "label": "Issue Due Date", - "tooltip": "" - }, "issue|category_id": { "type": "number", - "index": 10, + "index": 7, "label": "Issue Category Id", "tooltip": "" }, "issue|fixed_version_id": { - "type": "text", - "index": 11, + "type": "number", + "index": 8, "label": "Issue Fixed Version Id", - "tooltip": "" + "tooltip": "

ID of the Target Versions (previously called \"Fixed Version\" and still referred to as such in the API)

" }, "issue|assigned_to_id": { "type": "number", - "index": 12, + "index": 9, "label": "Issue Assigned To Id", - "tooltip": "" + "tooltip": "

ID of the user to assign the issue to (currently no mechanism to assign by name)

" }, "issue|parent_issue_id": { "type": "number", - "index": 13, + "index": 10, "label": "Issue Parent Issue Id", - "tooltip": "" + "tooltip": "

ID of the parent issue

" }, "issue|custom_fields": { - "type": "text", - "index": 14, + "type": "textarea", + "index": 11, "label": "Issue Custom Fields", - "tooltip": "" + "tooltip": " JSON array. Example: [{}]." + }, + "issue|watcher_user_ids": { + "type": "textarea", + "index": 12, + "label": "Issue Watcher User Ids", + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [16858947]." }, "issue|is_private": { "type": "toggle", - "index": 15, + "index": 13, "label": "Issue Is Private", "tooltip": "" }, "issue|estimated_hours": { "type": "number", - "index": 16, + "index": 14, "label": "Issue Estimated Hours", "tooltip": "" }, "issue|notes": { "type": "text", - "index": 17, + "index": 15, "label": "Issue Notes", - "tooltip": "" + "tooltip": "

Comments about the update

" }, "issue|private_notes": { - "type": "text", - "index": 18, + "type": "toggle", + "index": 16, "label": "Issue Private Notes", - "tooltip": "" + "tooltip": "

true if notes are private

" } } } @@ -297,7 +227,6 @@ } ], "properties": {}, - "label": "UpdateIssue", "auth": { "service": "appmixer:redmineapi" }, diff --git a/src/appmixer/redmine/core/GetIssuesFormat/GetIssuesFormat.js b/src/appmixer/redmine/core/IssuesList/IssuesList.js similarity index 89% rename from src/appmixer/redmine/core/GetIssuesFormat/GetIssuesFormat.js rename to src/appmixer/redmine/core/IssuesList/IssuesList.js index 5807f2935..849ec1508 100644 --- a/src/appmixer/redmine/core/GetIssuesFormat/GetIssuesFormat.js +++ b/src/appmixer/redmine/core/IssuesList/IssuesList.js @@ -16,13 +16,13 @@ module.exports = { // eslint-disable-next-line no-unused-vars const input = context.messages.in.content; - let url = lib.getBaseUrl(context) + `/issues.${input['format']}`; + let url = lib.getBaseUrl(context) + '/issues.json'; const headers = {}; const query = new URLSearchParams; - const queryParameters = { 'offset': input['offset'], - 'limit': input['limit'], + const queryParameters = { 'limit': input['limit'], + 'offset': input['offset'], 'sort': input['sort'], 'include': input['include'], 'issue_id': input['issue_id'], @@ -30,9 +30,7 @@ module.exports = { 'subproject_id': input['subproject_id'], 'tracker_id': input['tracker_id'], 'status_id': input['status_id'], - 'assigned_to_id': input['assigned_to_id'], - 'parent_id': input['parent_id'], - 'cf_x': input['cf_x'] }; + 'assigned_to_id': input['assigned_to_id'] }; Object.keys(queryParameters).forEach(parameter => { if (queryParameters[parameter]) { diff --git a/src/appmixer/redmine/core/IssuesList/component.json b/src/appmixer/redmine/core/IssuesList/component.json new file mode 100644 index 000000000..ac30fbe06 --- /dev/null +++ b/src/appmixer/redmine/core/IssuesList/component.json @@ -0,0 +1,485 @@ +{ + "version": "1.0.0", + "name": "appmixer.redmineapi.core.IssuesList", + "author": "Appmixer ", + "description": "

Returns a paginated list of issues. By default, it returns open issues only.

", + "private": false, + "quota": {}, + "inPorts": [ + { + "name": "in", + "schema": { + "type": "object", + "properties": { + "limit": { + "type": "integer" + }, + "offset": { + "type": "integer" + }, + "sort": { + "type": "string" + }, + "include": { + "type": "string" + }, + "issue_id": { + "type": "integer" + }, + "project_id": { + "type": "integer" + }, + "subproject_id": { + "type": "integer" + }, + "tracker_id": { + "type": "integer" + }, + "status_id": { + "type": "string" + }, + "assigned_to_id": { + "type": "string" + } + } + }, + "inspector": { + "inputs": { + "limit": { + "type": "number", + "index": 0, + "label": "Limit", + "tooltip": "

the number of items to be present in the response (default is 25, maximum is 100)

" + }, + "offset": { + "type": "number", + "index": 1, + "label": "Offset", + "tooltip": "

the offset of the first object to retrieve

" + }, + "sort": { + "type": "text", + "index": 2, + "label": "Sort", + "tooltip": "

column to sort with. Append :desc to invert the order. (optional)

" + }, + "include": { + "type": "text", + "index": 3, + "label": "Include", + "tooltip": "

fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers

" + }, + "issue_id": { + "type": "number", + "index": 4, + "label": "Issue Id", + "tooltip": "

get issue with the given id or multiple issues by id using comma to separate id.

" + }, + "project_id": { + "type": "number", + "index": 5, + "label": "Project Id", + "tooltip": "

get issues from the project with the given id (a numeric value, not a project identifier).

" + }, + "subproject_id": { + "type": "number", + "index": 6, + "label": "Subproject Id", + "tooltip": "

get issues from the subproject with the given id. You can use projectid=XXX&subprojectid=!* to get only the issues of a given project and none of its subprojects.

" + }, + "tracker_id": { + "type": "number", + "index": 7, + "label": "Tracker Id", + "tooltip": "

get issues from the tracker with the given id

" + }, + "status_id": { + "type": "text", + "index": 8, + "label": "Status Id", + "tooltip": "

get issues with the given status id only. Possible values: open, closed, * to get open and closed issues, status id

" + }, + "assigned_to_id": { + "type": "text", + "index": 9, + "label": "Assigned To Id", + "tooltip": "

get issues which are assigned to the given user id. me can be used instead an ID to fetch all issues from the logged in user (via API key or HTTP auth)

" + } + } + } + } + ], + "outPorts": [ + { + "name": "out", + "options": [ + { + "label": "Issues", + "value": "issues", + "schema": { + "title": "Issues", + "type": "array", + "items": { + "type": "object", + "title": "Issue", + "required": [ + "id", + "project", + "tracker", + "status", + "priority", + "author", + "subject", + "description", + "start_date", + "due_date", + "done_ratio", + "is_private", + "estimated_hours", + "created_on", + "updated_on", + "closed_on" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "project": { + "title": "Project", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "tracker": { + "title": "Tracker", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "status": { + "title": "Status", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "priority": { + "title": "Priority", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "author": { + "title": "Author", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "assigned_to": { + "title": "AssignedTo", + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "subject": { + "title": "Subject", + "type": "string" + }, + "description": { + "title": "Description", + "type": "string" + }, + "start_date": { + "title": "StartDate", + "type": "string" + }, + "due_date": { + "title": "DueDate", + "type": "string" + }, + "done_ratio": { + "title": "DoneRatio", + "type": "integer" + }, + "is_private": { + "title": "Is Private", + "type": "boolean" + }, + "estimated_hours": { + "title": "EstimatedHours", + "type": "number" + }, + "created_on": { + "title": "CreatedOn", + "type": "string" + }, + "updated_on": { + "title": "UpdatedOn", + "type": "string" + }, + "closed_on": { + "title": "ClosedOn", + "type": "string" + }, + "children": { + "title": "Children", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + }, + "attachments": { + "title": "Attachments", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + }, + "relations": { + "title": "Realtions", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + }, + "changesets": { + "title": "Chagesets", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + }, + "journals": { + "title": "Journals", + "type": "array", + "items": { + "title": "Journal", + "type": "object", + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "user": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "notes": { + "type": "string" + }, + "created_on": { + "type": "string" + }, + "private_notes": { + "type": "boolean" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "property": { + "type": "string" + }, + "name": { + "type": "string" + }, + "old_value": { + "type": "string" + }, + "new_value": { + "type": "string" + } + } + } + } + } + } + }, + "watchers": { + "title": "Watchers", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + } + } + } + } + }, + { + "label": "Total Count", + "value": "total_count" + }, + { + "label": "Offset", + "value": "offset" + }, + { + "label": "Limit", + "value": "limit" + } + ] + } + ], + "properties": {}, + "auth": { + "service": "appmixer:redmineapi" + }, + "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" +} \ No newline at end of file diff --git a/src/appmixer/redmine/core/PostIssuesFormat/component.json b/src/appmixer/redmine/core/PostIssuesFormat/component.json deleted file mode 100644 index c798186bb..000000000 --- a/src/appmixer/redmine/core/PostIssuesFormat/component.json +++ /dev/null @@ -1,475 +0,0 @@ -{ - "version": "1.0.0", - "name": "appmixer.redmineapi.core.PostIssuesFormat", - "author": "Appmixer ", - "description": "", - "private": false, - "quota": {}, - "inPorts": [ - { - "name": "in", - "schema": { - "type": "object", - "required": [ - "format", - "issue" - ], - "properties": { - "format": { - "type": "string", - "enum": [ - "json", - "xml" - ] - }, - "issue|project_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], - "path": "issue.project_id" - }, - "issue|tracker_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], - "path": "issue.tracker_id" - }, - "issue|status_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], - "path": "issue.status_id" - }, - "issue|priority_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], - "path": "issue.priority_id" - }, - "issue|subject": { - "type": "string", - "path": "issue.subject" - }, - "issue|description": { - "type": "string", - "nullable": true, - "path": "issue.description" - }, - "issue|start_date": { - "type": "string", - "format": "date", - "nullable": true, - "path": "issue.start_date" - }, - "issue|due_date": { - "type": "string", - "format": "date", - "nullable": true, - "path": "issue.due_date" - }, - "issue|category_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], - "path": "issue.category_id" - }, - "issue|fixed_version_id": { - "type": "string", - "path": "issue.fixed_version_id" - }, - "issue|assigned_to_id": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ], - "path": "issue.assigned_to_id" - }, - "issue|parent_issue_id": { - "oneOf": [ - { - "type": "integer", - "nullable": true - }, - { - "type": "string", - "nullable": true - } - ], - "path": "issue.parent_issue_id" - }, - "issue|custom_fields": { - "type": "string", - "path": "issue.custom_fields" - }, - "issue|watcher_user_ids": { - "type": "array", - "path": "issue.watcher_user_ids", - "items": { - "oneOf": [ - { - "type": "integer" - }, - { - "type": "string" - } - ] - } - }, - "issue|is_private": { - "type": "boolean", - "path": "issue.is_private" - }, - "issue|estimated_hours": { - "oneOf": [ - { - "type": "integer", - "nullable": true - }, - { - "type": "string", - "nullable": true - } - ], - "path": "issue.estimated_hours" - }, - "issue|uploads": { - "type": "string", - "path": "issue.uploads", - "parseInReceive": true, - "properties": { - "upload": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "filename": { - "type": "string" - }, - "description": { - "type": "string" - }, - "content_type": { - "type": "string" - } - } - } - } - } - } - }, - "inspector": { - "inputs": { - "format": { - "type": "select", - "index": 0, - "label": "Format", - "tooltip": "", - "options": [ - { - "content": "json", - "value": "json" - }, - { - "content": "xml", - "value": "xml" - } - ] - }, - "issue|project_id": { - "type": "number", - "index": 1, - "label": "Issue Project Id", - "tooltip": "" - }, - "issue|tracker_id": { - "type": "number", - "index": 2, - "label": "Issue Tracker Id", - "tooltip": "" - }, - "issue|status_id": { - "type": "number", - "index": 3, - "label": "Issue Status Id", - "tooltip": "" - }, - "issue|priority_id": { - "type": "number", - "index": 4, - "label": "Issue Priority Id", - "tooltip": "" - }, - "issue|subject": { - "type": "text", - "index": 5, - "label": "Issue Subject", - "tooltip": "" - }, - "issue|description": { - "type": "text", - "index": 6, - "label": "Issue Description", - "tooltip": "" - }, - "issue|start_date": { - "type": "text", - "index": 7, - "label": "Issue Start Date", - "tooltip": "" - }, - "issue|due_date": { - "type": "text", - "index": 8, - "label": "Issue Due Date", - "tooltip": "" - }, - "issue|category_id": { - "type": "number", - "index": 9, - "label": "Issue Category Id", - "tooltip": "" - }, - "issue|fixed_version_id": { - "type": "text", - "index": 10, - "label": "Issue Fixed Version Id", - "tooltip": "" - }, - "issue|assigned_to_id": { - "type": "number", - "index": 11, - "label": "Issue Assigned To Id", - "tooltip": "" - }, - "issue|parent_issue_id": { - "type": "number", - "index": 12, - "label": "Issue Parent Issue Id", - "tooltip": "" - }, - "issue|custom_fields": { - "type": "text", - "index": 13, - "label": "Issue Custom Fields", - "tooltip": "" - }, - "issue|watcher_user_ids": { - "type": "textarea", - "index": 14, - "label": "Issue Watcher User Ids", - "tooltip": " JSON array. Example: [\"exercitation\"]." - }, - "issue|is_private": { - "type": "toggle", - "index": 15, - "label": "Issue Is Private", - "tooltip": "" - }, - "issue|estimated_hours": { - "type": "number", - "index": 16, - "label": "Issue Estimated Hours", - "tooltip": "" - }, - "issue|uploads": { - "type": "text", - "index": 17, - "label": "Issue Uploads", - "tooltip": "" - } - } - } - } - ], - "outPorts": [ - { - "name": "out", - "options": [ - { - "label": "Issue", - "value": "issue" - }, - { - "label": "Issue Id", - "value": "issue.id" - }, - { - "label": "Issue Project", - "value": "issue.project" - }, - { - "label": "Issue Project Id", - "value": "issue.project.id" - }, - { - "label": "Issue Project Name", - "value": "issue.project.name" - }, - { - "label": "Issue Tracker", - "value": "issue.tracker" - }, - { - "label": "Issue Tracker Id", - "value": "issue.tracker.id" - }, - { - "label": "Issue Tracker Name", - "value": "issue.tracker.name" - }, - { - "label": "Issue Status", - "value": "issue.status" - }, - { - "label": "Issue Status Id", - "value": "issue.status.id" - }, - { - "label": "Issue Status Name", - "value": "issue.status.name" - }, - { - "label": "Issue Status Is Closed", - "value": "issue.status.is_closed" - }, - { - "label": "Issue Priority", - "value": "issue.priority" - }, - { - "label": "Issue Priority Id", - "value": "issue.priority.id" - }, - { - "label": "Issue Priority Name", - "value": "issue.priority.name" - }, - { - "label": "Issue Author", - "value": "issue.author" - }, - { - "label": "Issue Author Id", - "value": "issue.author.id" - }, - { - "label": "Issue Author Name", - "value": "issue.author.name" - }, - { - "label": "Issue Assigned To", - "value": "issue.assigned_to" - }, - { - "label": "Issue Assigned To Id", - "value": "issue.assigned_to.id" - }, - { - "label": "Issue Assigned To Name", - "value": "issue.assigned_to.name" - }, - { - "label": "Issue Category", - "value": "issue.category" - }, - { - "label": "Issue Category Id", - "value": "issue.category.id" - }, - { - "label": "Issue Category Name", - "value": "issue.category.name" - }, - { - "label": "Issue Subject", - "value": "issue.subject" - }, - { - "label": "Issue Description", - "value": "issue.description" - }, - { - "label": "Issue Start Date", - "value": "issue.start_date" - }, - { - "label": "Issue Due Date", - "value": "issue.due_date" - }, - { - "label": "Issue Done Ratio", - "value": "issue.done_ratio" - }, - { - "label": "Issue Is Private", - "value": "issue.is_private" - }, - { - "label": "Issue Estimated Hours", - "value": "issue.estimated_hours" - }, - { - "label": "Issue Total Estimated Hours", - "value": "issue.total_estimated_hours" - }, - { - "label": "Issue Spent Hours", - "value": "issue.spent_hours" - }, - { - "label": "Issue Total Spent Hours", - "value": "issue.total_spent_hours" - }, - { - "label": "Issue Created On", - "value": "issue.created_on" - }, - { - "label": "Issue Updated On", - "value": "issue.updated_on" - }, - { - "label": "Issue Closed On", - "value": "issue.closed_on" - } - ] - } - ], - "properties": {}, - "label": "CreateIssue", - "auth": { - "service": "appmixer:redmineapi" - }, - "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" -} \ No newline at end of file diff --git a/src/appmixer/redmine/lib.js b/src/appmixer/redmine/lib.js index f819d4cfa..5c442492e 100644 --- a/src/appmixer/redmine/lib.js +++ b/src/appmixer/redmine/lib.js @@ -12,7 +12,8 @@ module.exports = { getBaseUrl: function(context) { - let url = ''; + let url = '{url}'; + url = url.replaceAll('{url}', context.auth?.url || context.config?.url || 'https://redmine.acme.com'); return url; }, diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml index 3347f8faf..bdebb6b88 100644 --- a/src/appmixer/redmine/openapi.yml +++ b/src/appmixer/redmine/openapi.yml @@ -13,6 +13,13 @@ externalDocs: security: - BasicAuth: [] - ApiKeyAuth: [] +servers: + - url: '{url}' + description: Redmine URL + variables: + url: + description: Redmine URL + default: 'https://redmine.acme.com' paths: '/issues.{format}': get: @@ -20,7 +27,7 @@ paths: - Issues externalDocs: url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Listing-issues' - summary: Listing issues + summary: Returns a paginated list of issues. By default, it returns open issues only. x-connector-label: FindIssues parameters: - $ref: '#/components/parameters/format' @@ -30,6 +37,7 @@ paths: in: query schema: type: string + description: 'A comma separated list of field names with an optional sort order. Order defaults to ascending. Example: sort=created_on:desc,subject:asc' - name: include in: query schema: diff --git a/src/appmixer/redmine/openapi2.yml b/src/appmixer/redmine/openapi2.yml new file mode 100644 index 000000000..9223a7a25 --- /dev/null +++ b/src/appmixer/redmine/openapi2.yml @@ -0,0 +1,928 @@ +swagger: '2.0' +info: + title: 'Redmine API' + description: 'Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.' + x-connector-icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC' + version: '1.3' +host: localhost:8080 +basePath: / +schemes: [https] +externalDocs: + description: Redmine API Documentation + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api' +servers: + - url: '{url}' + description: Redmine URL + variables: + url: + description: Redmine URL + default: 'https://redmine.acme.com' + +##Notes +# PowerApps Custom Connectors do NOT support Operation level Parameter definition + +## Implemented Queries +# +# Projects +# - ProjectsList +# - ProjectShow +# +# Issues +# - IssuesList +# - IssueShow +# - IssueCreate +# - IssueUpdate +# - IssueDelete +# +# Time Entries +# - TimeList +# - TimeShow +# - TimeCreate +# - TimeUpdate +# - TimeDelete +# +# Issue Statuses +# - StatusesList +# +# Trackers +# - TrackersList +# +# +Validation Error Response + + +## "Content-Type" and "Accepts" Header. +# XML is also supported, but I don't use it +consumes: [application/json] +produces: [application/json] + + +## Authentication +# https://swagger.io/docs/specification/2-0/authentication/ +securityDefinitions: + api_key: + type: apiKey + in: header + name: X-Redmine-API-Key + +security: + - api_key: [] + + +## Tags +# https://swagger.io/docs/specification/2-0/grouping-operations-with-tags/ +tags: + - name: 'Projects' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_Projects + - name: 'Issues' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_Issues + - name: 'TimeEntries' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries + - name: 'IssueStatuses' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses + - name: 'Trackers' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' + + +## Endpoints +# https://swagger.io/docs/specification/2-0/paths-and-operations/ +paths: + /issues.json: + get: + summary: 'List issues' + description: 'Returns a paginated list of issues. By default, it returns open issues only.' + operationId: IssuesList + tags: [ Issues ] + parameters: + - $ref: '#/parameters/limitParam' + - $ref: '#/parameters/offsetParam' + - name: sort + in: query + description: column to sort with. Append :desc to invert the order. (optional) + required: false + type: string + - name: include + in: query + description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' + required: false + type: string + - name: issue_id + in: query + description: 'get issue with the given id or multiple issues by id using comma to separate id.' + required: false + type: integer + format: int32 + - name: project_id + in: query + description: 'get issues from the project with the given id (a numeric value, not a project identifier).' + required: false + type: integer + format: int32 + - name: subproject_id + in: query + description: 'get issues from the subproject with the given id. You can use project_id=XXX&subproject_id=!* to get only the issues of a given project and none of its subprojects.' + required: false + type: integer + format: int32 + - name: tracker_id + in: query + description: 'get issues from the tracker with the given id' + required: false + type: integer + format: int32 + - name: status_id + in: query + description: 'get issues with the given status id only. Possible values: open, closed, * to get open and closed issues, status id' + required: false + type: string + - name: assigned_to_id + in: query + description: 'get issues which are assigned to the given user id. me can be used instead an ID to fetch all issues from the logged in user (via API key or HTTP auth)' + required: false + type: string + responses: + 200: + description: "OK" + schema: + type: object + required: + - issues + - total_count + - offset + - limit + properties: + issues: #array + title: Issues + type: array + items: + $ref: '#/definitions/issue' + total_count: + $ref: '#/definitions/totalCount' + offset: + $ref: '#/definitions/offset' + limit: + $ref: '#/definitions/limit' + post: + summary: 'Create issue' + description: 'Creates a new issue.' + operationId: IssueCreate + tags: [ Issues ] + parameters: + - name: issue + in: body + required: true + description: 'issue attributes' + schema: + title: Body + type: object + required: + - issue + properties: + issue: + type: object + title: Issue + required: + - project_id + - subject + - priority_id + - tracker_id + properties: + project_id: + title: ProjectId + type: integer + format: int32 + tracker_id: + title: TrackerId + type: integer + format: int32 + status_id: + title: StatusId + type: integer + format: int32 + priority_id: + title: PriorityId + type: integer + format: int32 + subject: + title: Subject + type: string + description: + title: Description + type: string + category_id: + title: CategoryId + type: integer + format: int32 + fixed_version_id: + title: FixedVersionId + type: integer + format: int32 + description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' + assigned_to_id: + title: AssignedToId + type: integer + format: int32 + description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' + parent_issue_id: + title: ParentIssueId + type: integer + format: int32 + description: 'ID of the parent issue' + custom_fields: + title: CustomFields + type: array + items: + type: object + watcher_user_ids: + title: WatcherUserIds + type: array + description: 'Array of user ids to add as watchers' + items: + type: integer + format: int32 + is_private: + title: IsPrivate + type: boolean + estimated_hours: + title: EstimatedHours + type: number + format: float + responses: + 201: + description: 'Created: issue was created' + 422: + $ref: '#/responses/validationError' + /issues/{id}.json: + get: + summary: 'Show issues' + description: 'Returns the issue of given id or identifier.' + operationId: IssueShow + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + - name: include + in: query + description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' + required: false + type: string + responses: + 200: + description: OK + schema: + type: object + required: + - issue + properties: + issue: + $ref: '#/definitions/issue' + put: + summary: 'Update issue' + description: 'Updates a issue.' + operationId: IssueUpdate + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + - name: issue + in: body + required: true + description: 'issue attributes' + schema: + title: Body + type: object + required: + - issue + properties: + issue: + title: Issue + type: object + properties: + project_id: + title: ProjectId + type: integer + format: int32 + tracker_id: + title: TrackerId + type: integer + format: int32 + status_id: + title: StatusId + type: integer + format: int32 + priority_id: + title: PriorityId + type: integer + format: int32 + subject: + title: Subject + type: string + description: + title: Description + type: string + category_id: + title: CategoryId + type: integer + format: int32 + fixed_version_id: + title: FixedVersionId + type: integer + format: int32 + description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' + assigned_to_id: + title: AssignedToId + type: integer + format: int32 + description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' + parent_issue_id: + title: ParentIssueId + type: integer + format: int32 + description: 'ID of the parent issue' + custom_fields: + title: CustomFields + type: array + items: + type: object + watcher_user_ids: + title: WatcherUserIds + type: array + description: 'Array of user ids to add as watchers' + items: + type: integer + format: int32 + is_private: + title: IsPrivate + type: boolean + estimated_hours: + title: EstimatedHours + type: number + format: float + notes: + title: Notes + description: 'Comments about the update' + type: string + private_notes: + title: PrivateNotes + description: 'true if notes are private' + type: boolean + responses: + 201: + description: 'OK' + 422: + $ref: '#/responses/validationError' + delete: + summary: 'Delete issue' + description: 'Deletes a issue.' + operationId: IssueDelete + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + responses: + 200: + description: OK + +## Parameters +# https://swagger.io/docs/specification/2-0/describing-parameters/ +parameters: + idParam: + name: "id" + in: path + description: "id or identifier of the project/issue/user/timeEntry" + required: true + type: string + limitParam: + name: limit + in: query + description: "the number of items to be present in the response (default is 25, maximum is 100)" + required: false + type: integer + format: int32 + offsetParam: + name: offset + in: query + description: "the offset of the first object to retrieve" + required: false + type: integer + format: int32 + + +## Responses +# https://swagger.io/docs/specification/2-0/describing-responses/ +responses: + validationError: + description: 'Unprocessable Entity' + schema: + type: object + required: + - errors + properties: + errors: + title: Errors + type: array + items: + type: string + + +## Input and Output Models +# Common data structure (schema object) definitions. +definitions: + idNameObject: + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + totalCount: + title: TotalCount + type: integer + format: int32 + offset: + title: Offset + type: integer + format: int32 + limit: + title: Limit + type: integer + format: int32 + project: + type: object + title: Project + required: + - id + - name + - identifier + - description + - status + - created_on + - updated_on + - is_public + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + identifier: + title: Identifier + type: string + description: + title: Description + type: string + status: + title: Status + type: integer + format: int32 + is_public: + title: IsPublic + type: boolean + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + parent: + title: Parent + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + #below: optional associated data from 'include' parameter + issue_categories: + title: IssueCategories + type: array + items: + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + trackers: + title: Trackers + type: array + items: + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + enabled_modules: + title: EnabledModules + type: array + items: + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + time_entry_activities: + title: TimeEntryActivities + type: array + items: + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + issue: + type: object + title: Issue + required: + - id + - project + - tracker + - status + - priority + - author + - subject + - description + - start_date + - due_date + - done_ratio + - is_private + - estimated_hours + - created_on + - updated_on + - closed_on + properties: + id: + title: Id + type: integer + format: int32 + project: + title: Project + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + tracker: + title: Tracker + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + status: + title: Status + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + priority: + title: Priority + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + author: + title: Author + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + assigned_to: + title: AssignedTo + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + subject: + title: Subject + type: string + description: + title: Description + type: string + start_date: + title: StartDate + type: string + due_date: + title: DueDate + type: string + done_ratio: + title: DoneRatio + type: integer + format: int32 + is_private: + title: Is Private + type: boolean + estimated_hours: + title: EstimatedHours + type: number + format: float + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + closed_on: + title: ClosedOn + type: string + #below: optional associated data from 'include' parameter + children: + title: Children + type: array + items: + $ref: '#/definitions/idNameObject' + attachments: + title: Attachments + type: array + items: + $ref: '#/definitions/idNameObject' + relations: + title: Realtions + type: array + items: + $ref: '#/definitions/idNameObject' + changesets: + title: Chagesets + type: array + items: + $ref: '#/definitions/idNameObject' + journals: + title: Journals + type: array + items: + title: Journal + type: object + properties: + id: + title: Id + type: integer + format: int32 + user: + $ref: '#/definitions/idNameObject' + notes: + type: string + created_on: + type: string + private_notes: + type: boolean + details: + type: array + items: + type: object + properties: + property: + type: string + name: + type: string + old_value: + type: string + new_value: + type: string + watchers: + title: Watchers + type: array + items: + $ref: '#/definitions/idNameObject' + timeEntry: + type: object + title: TimeEntry + required: + - id + - project + - user + - activity + - hours + - comments + - spent_on + - created_on + - updated_on + properties: + id: + title: Id + type: integer + format: int32 + project: + title: Project + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + issue: + title: Issue + type: object + required: + - id + properties: + id: + title: Id + type: integer + format: int32 + user: + title: User + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + activity: + title: Activity + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + hours: + title: Hours + type: number + format: float + comments: + title: Comments + type: string + spent_on: + title: SpentOn + type: string + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + issueStatus: + title: IssueStatus + type: object + required: + - id + - name + - is_default + - is_closed + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + is_default: + title: IsDefault + type: boolean + is_closed: + title: IsClosed + type: boolean + tracker: + title: IssueStatus + type: object + required: + - id + - name + - default_status + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + default_status: + title: DefaultStatus + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + enumeration: + title: Enumeration + type: object + required: + - id + - name + - is_default + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + is_default: + title: IsDefault + type: boolean From 0983c80b01587fa49322d73eff583f633c58a4b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 12:07:51 +0100 Subject: [PATCH 05/11] init from different openapi spec - https://github.com/Lerrrtaste/redmine-openapi-specification/blob/main/redmine_openapi.yaml --- src/appmixer/redmine/bundle.json | 4 +- .../redmine/core/IssueCreate/component.json | 6 +- .../redmine/core/IssueDelete/component.json | 4 +- .../redmine/core/IssueShow/component.json | 4 +- .../redmine/core/IssueUpdate/component.json | 6 +- .../redmine/core/IssuesList/component.json | 12 +- src/appmixer/redmine/openapi.orig.yml | 4658 ++++------------- src/appmixer/redmine/openapi.yml | 2092 +++----- src/appmixer/redmine/openapi2.yml | 928 ---- src/appmixer/redmine/package.json | 2 +- src/appmixer/redmine/service.json | 4 +- 11 files changed, 1969 insertions(+), 5751 deletions(-) delete mode 100644 src/appmixer/redmine/openapi2.yml diff --git a/src/appmixer/redmine/bundle.json b/src/appmixer/redmine/bundle.json index 626e5f03b..4d58f5fb0 100644 --- a/src/appmixer/redmine/bundle.json +++ b/src/appmixer/redmine/bundle.json @@ -1,9 +1,9 @@ { - "name": "appmixer.redmineapi", + "name": "appmixer.redmine", "version": "1.0.0", "changelog": { "1.0.0": [ - "Redmine API" + "Redmine" ] } } \ No newline at end of file diff --git a/src/appmixer/redmine/core/IssueCreate/component.json b/src/appmixer/redmine/core/IssueCreate/component.json index e1758f42d..e14c9e6c5 100644 --- a/src/appmixer/redmine/core/IssueCreate/component.json +++ b/src/appmixer/redmine/core/IssueCreate/component.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.IssueCreate", + "name": "appmixer.redmine.core.IssueCreate", "author": "Appmixer ", "description": "

Creates a new issue.

", "private": false, @@ -168,7 +168,7 @@ "type": "textarea", "index": 11, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [12489033]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [23131539]." }, "issue|is_private": { "type": "toggle", @@ -194,7 +194,7 @@ ], "properties": {}, "auth": { - "service": "appmixer:redmineapi" + "service": "appmixer:redmine" }, "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/IssueDelete/component.json b/src/appmixer/redmine/core/IssueDelete/component.json index 69c333084..791114737 100644 --- a/src/appmixer/redmine/core/IssueDelete/component.json +++ b/src/appmixer/redmine/core/IssueDelete/component.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.IssueDelete", + "name": "appmixer.redmine.core.IssueDelete", "author": "Appmixer ", "description": "

Deletes a issue.

", "private": false, @@ -39,7 +39,7 @@ ], "properties": {}, "auth": { - "service": "appmixer:redmineapi" + "service": "appmixer:redmine" }, "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/IssueShow/component.json b/src/appmixer/redmine/core/IssueShow/component.json index dd5503eb2..e4e8e6359 100644 --- a/src/appmixer/redmine/core/IssueShow/component.json +++ b/src/appmixer/redmine/core/IssueShow/component.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.IssueShow", + "name": "appmixer.redmine.core.IssueShow", "author": "Appmixer ", "description": "

Returns the issue of given id or identifier.

", "private": false, @@ -358,7 +358,7 @@ ], "properties": {}, "auth": { - "service": "appmixer:redmineapi" + "service": "appmixer:redmine" }, "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/IssueUpdate/component.json b/src/appmixer/redmine/core/IssueUpdate/component.json index 6cafa1dbe..df4b090d5 100644 --- a/src/appmixer/redmine/core/IssueUpdate/component.json +++ b/src/appmixer/redmine/core/IssueUpdate/component.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.IssueUpdate", + "name": "appmixer.redmine.core.IssueUpdate", "author": "Appmixer ", "description": "

Updates a issue.

", "private": false, @@ -190,7 +190,7 @@ "type": "textarea", "index": 12, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [16858947]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [44774447]." }, "issue|is_private": { "type": "toggle", @@ -228,7 +228,7 @@ ], "properties": {}, "auth": { - "service": "appmixer:redmineapi" + "service": "appmixer:redmine" }, "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/core/IssuesList/component.json b/src/appmixer/redmine/core/IssuesList/component.json index ac30fbe06..a58778ef5 100644 --- a/src/appmixer/redmine/core/IssuesList/component.json +++ b/src/appmixer/redmine/core/IssuesList/component.json @@ -1,6 +1,6 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi.core.IssuesList", + "name": "appmixer.redmine.core.IssuesList", "author": "Appmixer ", "description": "

Returns a paginated list of issues. By default, it returns open issues only.

", "private": false, @@ -12,7 +12,8 @@ "type": "object", "properties": { "limit": { - "type": "integer" + "type": "integer", + "maximum": 100 }, "offset": { "type": "integer" @@ -49,13 +50,14 @@ "type": "number", "index": 0, "label": "Limit", - "tooltip": "

the number of items to be present in the response (default is 25, maximum is 100)

" + "tooltip": "

the number of items to be present in the response (default is 25, maximum is 100)

", + "max": 100 }, "offset": { "type": "number", "index": 1, "label": "Offset", - "tooltip": "

the offset of the first object to retrieve

" + "tooltip": "

skip this number of issues in response (optional)

" }, "sort": { "type": "text", @@ -479,7 +481,7 @@ ], "properties": {}, "auth": { - "service": "appmixer:redmineapi" + "service": "appmixer:redmine" }, "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" } \ No newline at end of file diff --git a/src/appmixer/redmine/openapi.orig.yml b/src/appmixer/redmine/openapi.orig.yml index 3a5f8279f..a62955c0a 100644 --- a/src/appmixer/redmine/openapi.orig.yml +++ b/src/appmixer/redmine/openapi.orig.yml @@ -1,3659 +1,1247 @@ -openapi: 3.0.3 +swagger: '2.0' info: - title: Redmine API - description: 'NOTE: This is unofficial OpenAPI specification file.' - version: 5.0.0 - contact: - name: d-yoshi/redmine-openapi - url: 'https://github.com/d-yoshi/redmine-openapi' + title: 'Redmine API' + description: 'Custom (incomplete!) OpenAPI Specification for the Redmine Rest API' + version: '1.3' +host: localhost:8080 +basePath: / +schemes: [https] externalDocs: - description: Redmine API Official Developer Guide + description: Redmine API Documentation url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api' + + +##Notes +# PowerApps Custom Connectors do NOT support Operation level Parameter definition + +## Implemented Queries +# +# Projects +# - ProjectsList +# - ProjectShow +# +# Issues +# - IssuesList +# - IssueShow +# - IssueCreate +# - IssueUpdate +# - IssueDelete +# +# Time Entries +# - TimeList +# - TimeShow +# - TimeCreate +# - TimeUpdate +# - TimeDelete +# +# Issue Statuses +# - StatusesList +# +# Trackers +# - TrackersList +# +# +Validation Error Response + + +## "Content-Type" and "Accepts" Header. +# XML is also supported, but I don't use it +consumes: [application/json] +produces: [application/json] + + +## Authentication +# https://swagger.io/docs/specification/2-0/authentication/ +securityDefinitions: + api_key: + type: apiKey + in: header + name: X-Redmine-API-Key + security: - - BasicAuth: [] - - ApiKeyAuth: [] + - api_key: [] + + +## Tags +# https://swagger.io/docs/specification/2-0/grouping-operations-with-tags/ +tags: + - name: 'Projects' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_Projects + - name: 'Issues' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_Issues + - name: 'TimeEntries' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries + - name: 'IssueStatuses' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses + - name: 'Trackers' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' + + +## Endpoints +# https://swagger.io/docs/specification/2-0/paths-and-operations/ paths: - '/issues.{format}': + /projects.json: get: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Listing-issues' - summary: Listing issues + summary: 'List Projects' + description: 'Returns all projects (all public projects and private projects where user have access to).' + operationId: ProjectsList + tags: [ Projects ] parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/offset' - - $ref: '#/components/parameters/limit' - - name: sort + - $ref: '#/parameters/limitParam' + - $ref: '#/parameters/offsetParam' + - name: include in: query + description: 'fetch associated data (optional). Possible values: trackers, issue_categories, enabled_modules. Values should be separated by a comma ",".' + required: false + type: string + responses: + 200: + description: "OK" schema: - type: string + type: object + required: + - projects + - total_count + - offset + - limit + properties: + projects: + title: Projects + type: array + items: + $ref: '#/definitions/project' + total_count: + $ref: '#/definitions/totalCount' + offset: + $ref: '#/definitions/offset' + limit: + $ref: '#/definitions/limit' + /projects/{id}.json: + get: + summary: 'Show Project' + description: 'Returns the project of given id or identifier.' + operationId: ProjectShow + tags: [ Projects ] + parameters: + - $ref: '#/parameters/idParam' - name: include in: query + description: 'fetch associated data (optional). Possible values: trackers, issue_categories, enabled_modules (since 2.6.0), time_entry_activities (since 3.4.0). Values should be separated by a comma ",".' + required: false + type: string + responses: + 200: + description: "OK" schema: - type: string - enum: - - attachments - - relations + type: object + required: + - project + properties: + project: + $ref: '#/definitions/project' + /issues.json: + get: + summary: 'List issues' + description: 'Returns a paginated list of issues. By default, it returns open issues only.' + operationId: IssuesList + tags: [ Issues ] + parameters: + - $ref: '#/parameters/limitParam' + - $ref: '#/parameters/offsetParam' + - name: sort + in: query + description: column to sort with. Append :desc to invert the order. (optional) + required: false + type: string + - name: include + in: query + description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' + required: false + type: string - name: issue_id in: query - schema: - type: string + description: 'get issue with the given id or multiple issues by id using comma to separate id.' + required: false + type: integer + format: int32 - name: project_id in: query - schema: - type: string + description: 'get issues from the project with the given id (a numeric value, not a project identifier).' + required: false + type: integer + format: int32 - name: subproject_id in: query - schema: - type: string + description: 'get issues from the subproject with the given id. You can use project_id=XXX&subproject_id=!* to get only the issues of a given project and none of its subprojects.' + required: false + type: integer + format: int32 - name: tracker_id in: query - schema: - type: integer + description: 'get issues from the tracker with the given id' + required: false + type: integer + format: int32 - name: status_id in: query - schema: - type: string + description: 'get issues with the given status id only. Possible values: open, closed, * to get open and closed issues, status id' + required: false + type: string - name: assigned_to_id in: query + description: 'get issues which are assigned to the given user id. me can be used instead an ID to fetch all issues from the logged in user (via API key or HTTP auth)' + required: false + type: string + responses: + 200: + description: "OK" schema: - type: string - - name: parent_id - in: query - schema: - type: string - - name: cf_x - in: query + type: object + required: + - issues + - total_count + - offset + - limit + properties: + issues: #array + title: Issues + type: array + items: + $ref: '#/definitions/issue' + total_count: + $ref: '#/definitions/totalCount' + offset: + $ref: '#/definitions/offset' + limit: + $ref: '#/definitions/limit' + post: + summary: 'Create issue' + description: 'Creates a new issue.' + operationId: IssueCreate + tags: [ Issues ] + parameters: + - name: issue + in: body + required: true + description: 'issue attributes' schema: - type: string - responses: - '200': - description: '' - content: - application/json: - schema: + title: Body + type: object + required: + - issue + properties: + issue: type: object + title: Issue required: - - issues - - total_count - - offset - - limit + - project_id + - subject + - priority_id + - tracker_id properties: - issues: - type: array - items: - allOf: - - $ref: '#/components/schemas/Issue' - - type: object - required: - - spent_hours - - total_spent_hours - properties: - spent_hours: - type: number - total_spent_hours: - type: number - total_count: + project_id: + title: ProjectId type: integer - offset: + format: int32 + tracker_id: + title: TrackerId type: integer - limit: + format: int32 + status_id: + title: StatusId type: integer - post: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Creating-an-issue' - summary: Creating an issue - parameters: - - $ref: '#/components/parameters/format' - requestBody: - content: - application/json: + format: int32 + priority_id: + title: PriorityId + type: integer + format: int32 + subject: + title: Subject + type: string + description: + title: Description + type: string + category_id: + title: CategoryId + type: integer + format: int32 + fixed_version_id: + title: FixedVersionId + type: integer + format: int32 + description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' + assigned_to_id: + title: AssignedToId + type: integer + format: int32 + description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' + parent_issue_id: + title: ParentIssueId + type: integer + format: int32 + description: 'ID of the parent issue' + custom_fields: + title: CustomFields + type: array + items: + type: object + watcher_user_ids: + title: WatcherUserIds + type: array + description: 'Array of user ids to add as watchers' + items: + type: integer + format: int32 + is_private: + title: IsPrivate + type: boolean + estimated_hours: + title: EstimatedHours + type: number + format: float + responses: + 201: + description: 'Created: issue was created' + 422: + $ref: '#/responses/validationError' + /issues/{id}.json: + get: + summary: 'Show issues' + description: 'Returns the issue of given id or identifier.' + operationId: IssueShow + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + - name: include + in: query + description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' + required: false + type: string + responses: + 200: + description: OK schema: type: object required: - issue properties: issue: - type: object - required: - - project_id - - tracer_id - - status_id - - subject - properties: - project_id: - oneOf: - - type: integer - - type: string - tracker_id: - oneOf: - - type: integer - - type: string - status_id: - oneOf: - - type: integer - - type: string - priority_id: - oneOf: - - type: integer - - type: string - subject: - type: string - description: - type: string - nullable: true - start_date: - type: string - format: date - nullable: true - due_date: - type: string - format: date - nullable: true - category_id: - oneOf: - - type: integer - - type: string - fixed_version_id: - type: string - assigned_to_id: - oneOf: - - type: integer - - type: string - parent_issue_id: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true - custom_fields: - type: string - watcher_user_ids: - type: array - items: - oneOf: - - type: integer - - type: string - is_private: - type: boolean - estimated_hours: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true - uploads: - type: object - properties: - upload: - type: object - properties: - token: - type: string - filename: - type: string - description: - type: string - content_type: - type: string - responses: - '201': - description: '' - content: - application/json: - schema: - type: object - required: - - issue - properties: - issue: - $ref: '#/components/schemas/Issue' - '/issues/{issue_id}.{format}': - get: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Showing-an-issue' - summary: Showing an issue - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - - name: include - in: query - schema: - type: string - enum: - - children - - attachments - - relations - - changesets - - journals - - watchers - - allowed_statuses - responses: - '200': - description: '' - content: - application/json: - schema: - allOf: - - type: object - required: - - issue - properties: - issue: - $ref: '#/components/schemas/Issue' - - type: object - required: - - issue - properties: - issue: - $ref: '#/components/schemas/IssuePartial' - put: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue' - summary: Updating an issue - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - requestBody: - content: - application/json: + $ref: '#/definitions/issue' + put: + summary: 'Update issue' + description: 'Updates a issue.' + operationId: IssueUpdate + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + - name: issue + in: body + required: true + description: 'issue attributes' schema: + title: Body type: object + required: + - issue properties: issue: + title: Issue type: object properties: project_id: - oneOf: - - type: integer - - type: string + title: ProjectId + type: integer + format: int32 tracker_id: - oneOf: - - type: integer - - type: string + title: TrackerId + type: integer + format: int32 status_id: - oneOf: - - type: integer - - type: string + title: StatusId + type: integer + format: int32 priority_id: - oneOf: - - type: integer - - type: string + title: PriorityId + type: integer + format: int32 subject: + title: Subject type: string description: + title: Description type: string - nullable: true - start_date: - type: string - format: date - nullable: true - due_date: - type: string - format: date - nullable: true category_id: - oneOf: - - type: integer - - type: string + title: CategoryId + type: integer + format: int32 fixed_version_id: - type: string + title: FixedVersionId + type: integer + format: int32 + description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' assigned_to_id: - oneOf: - - type: integer - - type: string + title: AssignedToId + type: integer + format: int32 + description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' parent_issue_id: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true + title: ParentIssueId + type: integer + format: int32 + description: 'ID of the parent issue' custom_fields: - type: string + title: CustomFields + type: array + items: + type: object + watcher_user_ids: + title: WatcherUserIds + type: array + description: 'Array of user ids to add as watchers' + items: + type: integer + format: int32 is_private: + title: IsPrivate type: boolean estimated_hours: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true + title: EstimatedHours + type: number + format: float notes: + title: Notes + description: 'Comments about the update' type: string private_notes: - type: string - responses: - '204': - description: '' - delete: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Deleting-an-issue' - summary: Deleting an issue + title: PrivateNotes + description: 'true if notes are private' + type: boolean + responses: + 201: + description: 'OK' + 422: + $ref: '#/responses/validationError' + delete: + summary: 'Delete issue' + description: 'Deletes a issue.' + operationId: IssueDelete + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + responses: + 200: + description: OK + /time_entries.json: + get: + summary: 'List time entries' + description: 'Returns time entries.' + operationId: TimeList + tags: [ TimeEntries ] parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' + - $ref: '#/parameters/limitParam' + - $ref: '#/parameters/offsetParam' + - name: user_id + in: query + required: false + type: string + - name: project_id + in: query + description: 'When filtering by project id, you can use either project numeric ID or its string identifier.' + required: false + type: string + - name: spent_on + in: query + required: false + description: 'Date syntax: YYYY-MM-DD' + type: string + - name: from + in: query + required: false + description: 'Date syntax: YYYY-MM-DD' + type: string + - name: to + in: query + description: 'Date syntax: YYYY-MM-DD' + required: false + type: string responses: - '204': - description: '' - '/issues/{issue_id}/watchers.{format}': + 200: + description: OK + schema: + type: object + required: + - time_entries + - total_count + - offset + - limit + properties: + time_entries: + type: array + title: TimeEntries + items: + $ref: '#/definitions/timeEntry' + total_count: + $ref: '#/definitions/totalCount' + offset: + $ref: '#/definitions/offset' + limit: + $ref: '#/definitions/limit' post: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Adding-a-watcher' - summary: Adding a watcher - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - requestBody: - content: - application/json: - schema: - type: object - required: - - user_id - properties: - user_id: - oneOf: - - type: integer - - type: string - responses: - '204': - description: '' - '/issues/{issue_id}/watchers/{user_id}.{format}': - delete: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Removing-a-watcher' - summary: Removing a watcher + summary: 'Create a time entry' + description: 'Creates a time entry.' + operationId: TimeCreate + tags: [ TimeEntries ] parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - - $ref: '#/components/parameters/user_id' - responses: - '204': - description: '' - '/projects.{format}': + - name: time_entry + in: body + required: true + description: 'the time entry to add. (either issue_id or project id is required!)' + schema: + type: object + title: Body + required: + - time_entry + properties: + time_entry: + title: TimeEntry + type: object + required: + - hours + - comments + properties: + issue_id: + title: IssueId + type: integer + format: int32 + description: 'the issue id to log time on (only one id is required).' + project_id: + title: ProjectId + type: integer + format: int32 + description: 'the project id to log time on (only one id is required).' + spent_on: + title: SpentOn + type: string + description: 'the date the time was spent (default to the current date); format is e.g. 2020-12-24' + hours: + title: Hours + type: number + format: float + description: 'the number of spent hours' + activity_id: + title: ActivityId + type: integer + format: int32 + description: 'the id of the time activity. This parameter is required unless a default activity is defined in Redmine.' + comments: + title: Comments + type: string + description: 'short description for the entry (255 characters max)' + user_id: + title: UserId + type: integer + format: int32 + description: 'user id to be specified in need of posting time on behalf of another user' + responses: + 201: + description: 'Created: time entry was created' + 422: + $ref: '#/responses/validationError' + /time_entries/{id}.json: get: - tags: - - Projects - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Listing-projects' - summary: Listing projects + summary: 'Show time entry' + description: 'Returns the time entry of given id.' + operationId: TimeShow + tags: [ TimeEntries ] parameters: - - $ref: '#/components/parameters/format' - - name: include - in: query - schema: - type: string - enum: - - trackers - - issue_categories - - enabled_modules + - $ref: '#/parameters/idParam' responses: - '200': - description: '' - content: - application/json: - schema: + 200: + description: OK + schema: + type: object + required: + - time_entry + properties: + time_entry: + $ref: '#/definitions/timeEntry' + put: + summary: 'Update a time entry' + description: 'Updates a time entry.' + operationId: TimeUpdate + tags: [ TimeEntries ] + parameters: + - $ref: '#/parameters/idParam' + - name: time_entry + in: body + required: true + description: the time entry attributes + schema: + title: Body + type: object + required: + - time_entry + properties: + time_entry: + title: TimeEntry type: object - required: - - projects - - total_count - - offset - - limit properties: - projects: - type: array - items: - $ref: '#/components/schemas/Project' - total_count: + issue_id: + title: IssueId + type: integer + format: int32 + project_id: + title: ProjectId type: integer - offset: + format: int32 + spent_on: + title: SpentOn + type: string + hours: + title: Hours + type: number + format: float + description: 'the number of spent hours' + activity_id: + title: ActivityId type: integer - limit: + format: int32 + comments: + title: Comments + type: string + description: 'short description for the entry (255 characters max)' + user_id: + title: UserId type: integer - post: - tags: - - Projects - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Creating-a-project' - summary: Creating a project + format: int32 + description: 'user id to be specified in need of posting time on behalf of another user' + responses: + 200: + description: 'OK: time entry was updated' + 422: + $ref: '#/responses/validationError' + delete: + summary: 'Delete a time entry' + description: 'Deletes a time entry.' + operationId: TimeDelete + tags: [ TimeEntries ] parameters: - - $ref: '#/components/parameters/format' - requestBody: - content: - application/json: + - $ref: '#/parameters/idParam' + responses: + 200: + description: OK + /issue_statuses.json: + get: + summary: 'List issue Statuses' + description: 'Returns the list of all issue statuses.' + operationId: StatusesList + tags: [ IssueStatuses ] + responses: + 200: + description: OK schema: type: object required: - - project + - issue_statuses properties: - project: - type: object - required: - - name - - identifier - properties: - name: - type: string - identifier: - type: string - description: - type: string - nullable: true - homepage: - type: string - nullable: true - is_public: - type: boolean - parent_id: - oneOf: - - type: integer - - type: string - inherit_members: - type: boolean - default_assigned_to_id: - type: string - default_version_id: - type: string - tracker_ids: - type: array - items: - oneOf: - - type: integer - - type: string - enabled_module_names: - type: array - items: - type: string - issue_custom_field_ids: - type: array - items: - oneOf: - - type: integer - - type: string - custom_field_values: - type: object - additionalProperties: - type: string - example: - '1': VALUE - responses: - '201': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Project' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/projects/{project_id}.{format}': + issue_statuses: #array + title: IssueStatuses + type: array + items: + $ref: '#/definitions/issueStatus' + /trackers.json: get: - tags: - - Projects - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Showing-a-project' - summary: Showing a project - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - - name: include - in: query + summary: 'List trackers' + description: 'Returns the list of all trackers.' + operationId: TrackersList + tags: [ Trackers ] + responses: + 200: + description: OK schema: - type: string - enum: + type: object + required: - trackers - - issue_categories - - enabled_modules - - time_entry_activities - responses: - '200': - description: '' - content: - application/json: - schema: - allOf: - - type: object - required: - - project - properties: - project: - $ref: '#/components/schemas/Project' - - type: object - required: - - project - properties: - project: - type: object - properties: - trackers: - type: array - items: - $ref: '#/components/schemas/IdName' - issue_categories: - type: array - items: - $ref: '#/components/schemas/IdName' - enabled_modules: - type: array - items: - $ref: '#/components/schemas/IdName' - time_entry_activities: - type: array - items: - $ref: '#/components/schemas/IdName' - put: - tags: - - Projects - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Updating-a-project' - summary: Updating a project + properties: + trackers: + title: Trackers + type: array + items: + $ref: '#/definitions/tracker' + /enumerations/{resource}.json: + get: + summary: 'List Enumerations' + description: 'Possible parameters: issue_priorities, time_entry_activities, document_categories' + operationId: EnumerationsList + tags: [ Enumerations ] parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - requestBody: - content: - application/json: - schema: - type: object - properties: - project: - type: object - properties: - name: - type: string - description: - type: string - homepage: - type: string - is_public: - type: boolean - parent_id: - type: integer - inherit_members: - type: boolean - default_assigned_to_id: - type: string - default_version_id: - type: string - tracker_ids: - type: array - items: - oneOf: - - type: integer - - type: string - enabled_module_names: - type: array - items: - type: string - issue_custom_field_ids: - type: array - items: - oneOf: - - type: integer - - type: string - custom_field_values: - type: object - additionalProperties: - type: string - example: - '1': VALUE - responses: - '204': - description: '' - delete: - tags: - - Projects - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Deleting-a-project' - summary: Deleting a project - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '204': - description: '' - '/projects/{project_id}/archive.{format}': - put: - tags: - - Projects - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Archiving-a-project' - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '204': - description: '' - '/projects/{project_id}/unarchive.{format}': - put: - tags: - - Projects - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects#Unarchiving-a-project' - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '204': - description: '' - '/projects/{project_id}/memberships.{format}': - get: - tags: - - Project Memberships - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#GET' - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - memberships - - total_count - - offset - - limit - properties: - memberships: - type: array - items: - $ref: '#/components/schemas/Membersip' - total_count: - type: integer - offset: - type: integer - limit: - type: integer - post: - tags: - - Project Memberships - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#POST' - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - requestBody: - content: - application/json: - schema: - type: object - required: - - membership - properties: - membership: - type: object - required: - - user_id - - role_ids - properties: - user_id: - oneOf: - - type: integer - - type: string - role_ids: - type: array - items: - oneOf: - - type: integer - - type: string - responses: - '201': - description: '' - content: - application/json: - schema: - type: object - required: - - membership - properties: - membership: - $ref: '#/components/schemas/Membersip' - '/memberships/{membership_id}.{format}': - get: - tags: - - Project Memberships - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#GET-2' - parameters: - - $ref: '#/components/parameters/project_id' - - $ref: '#/components/parameters/membership_id' - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - membership - properties: - membership: - $ref: '#/components/schemas/Membersip' - put: - tags: - - Project Memberships - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#PUT' - parameters: - - $ref: '#/components/parameters/project_id' - - $ref: '#/components/parameters/membership_id' - - $ref: '#/components/parameters/format' - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - delete: - tags: - - Project Memberships - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships#DELETE' - parameters: - - $ref: '#/components/parameters/project_id' - - $ref: '#/components/parameters/membership_id' - - $ref: '#/components/parameters/format' - responses: - '204': - description: '' - '/users.{format}': - get: - tags: - - Users - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#GET' - parameters: - - $ref: '#/components/parameters/format' - - name: status - in: query - schema: - type: integer - - name: name - in: query - schema: - type: string - - name: group_id - in: query - schema: - type: integer - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - users - - total_count - - offset - - limit - properties: - users: - type: array - items: - $ref: '#/components/schemas/User' - total_count: - type: integer - offset: - type: integer - limit: - type: integer - post: - tags: - - Users - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#POST' - parameters: - - $ref: '#/components/parameters/format' - requestBody: - content: - application/json: - schema: - type: object - required: - - user - properties: - user: - type: object - required: - - login - - firstname - - lastname - - mail - properties: - login: - type: string - password: - type: string - firstname: - type: string - lastname: - type: string - mail: - type: string - auth_source_id: - type: integer - mail_notification: - type: boolean - must_change_passwd: - type: boolean - generate_password: - type: boolean - responses: - '201': - description: '' - content: - application/json: - schema: - type: object - properties: - user: - allOf: - - $ref: '#/components/schemas/User' - - $ref: '#/components/schemas/UserPartial' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/users/{user_id}.{format}': - get: - tags: - - Users - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#GET-2' - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/user_id' - - name: include - in: query - schema: - type: string - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - properties: - user: - allOf: - - $ref: '#/components/schemas/User' - - $ref: '#/components/schemas/UserPartial' - - type: object - properties: - custom_fields: - type: array - items: - $ref: '#/components/schemas/IdName' - memberships: - type: array - items: - type: object - properties: - project: - type: string - roles: - type: array - items: - $ref: '#/components/schemas/Role' - groups: - type: array - items: - $ref: '#/components/schemas/IdName' - put: - tags: - - Users - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#PUT' - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/user_id' - requestBody: - content: - application/json: - schema: - type: object - required: - - user - properties: - user: - type: object - properties: - login: - type: string - password: - type: string - firstname: - type: string - lastname: - type: string - mail: - type: string - auth_source_id: - type: integer - mail_notification: - type: boolean - must_change_passwd: - type: boolean - generate_password: - type: boolean - admin: - type: boolean - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - delete: - tags: - - Users - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#DELETE' - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/user_id' - responses: - '204': - description: '' - '/users/current.{format}': - get: - tags: - - Users - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users#GET-2' - parameters: - - $ref: '#/components/parameters/format' - - name: include - in: query - schema: - type: string - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - properties: - user: - allOf: - - $ref: '#/components/schemas/User' - - $ref: '#/components/schemas/UserPartial' - - type: object - properties: - custom_fields: - type: array - items: - $ref: '#/components/schemas/IdName' - '/time_entries.{format}': - get: - tags: - - Time Entries - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Listing-time-entries' - summary: Listing time entries - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/offset' - - $ref: '#/components/parameters/limit' - - name: user_id - in: query - schema: - type: integer - - name: project_id - in: query - schema: - type: string - - name: spent_on - in: query - schema: - type: string - format: date - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - time_entries - - total_count - - offset - - limit - properties: - time_entries: - type: array - items: - $ref: '#/components/schemas/TimeEntry' - total_count: - type: integer - offset: - type: integer - limit: - type: integer - post: - tags: - - Time Entries - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Creating-a-time-entry' - summary: Creating a time entry - parameters: - - $ref: '#/components/parameters/format' - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - time_entry: - type: object - required: - - issue_id - - hours - properties: - hours: - oneOf: - - type: number - - type: string - spent_on: - type: string - format: date - activity_id: - oneOf: - - type: integer - - type: string - comments: - type: string - user_id: - oneOf: - - type: integer - - type: string - - oneOf: - - type: object - properties: - time_entry: - type: object - required: - - issue_id - properties: - issue_id: - oneOf: - - type: integer - - type: string - - type: object - properties: - time_entry: - type: object - required: - - project_id - properties: - project_id: - oneOf: - - type: integer - - type: string - responses: - '201': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/TimeEntry' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/time_entries/{time_entry_id}.{format}': - get: - tags: - - Time Entries - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Showing-a-time-entry' - summary: Showing a time entry - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/time_entry_id' - responses: - '200': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/TimeEntry' - put: - tags: - - Time Entries - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Updating-a-time-entry' - summary: Updating a time entry - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/time_entry_id' - requestBody: - content: - application/json: - schema: - allOf: - - type: object - properties: - time_entry: - type: object - required: - - issue_id - - hours - properties: - hours: - oneOf: - - type: number - - type: string - spent_on: - type: string - format: date - activity_id: - oneOf: - - type: integer - - type: string - comments: - type: string - user_id: - oneOf: - - type: integer - - type: string - - oneOf: - - type: object - properties: - time_entry: - type: object - required: - - issue_id - properties: - issue_id: - oneOf: - - type: integer - - type: string - - type: object - properties: - time_entry: - type: object - required: - - project_id - properties: - project_id: - oneOf: - - type: integer - - type: string - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - delete: - tags: - - Time Entries - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries#Deleting-a-time-entry' - summary: Deleting a time entry - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/time_entry_id' - responses: - '204': - description: '' - '/news.{format}': - get: - tags: - - News - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - news - - total_count - - offset - - limit - properties: - news: - type: array - items: - $ref: '#/components/schemas/News' - total_count: - type: integer - offset: - type: integer - limit: - type: integer - '/projects/{project_id}/news.{format}': - get: - tags: - - News - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News#GET-2' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - news - - total_count - - offset - - limit - properties: - news: - type: array - items: - $ref: '#/components/schemas/News' - total_count: - type: integer - offset: - type: integer - limit: - type: integer - '/issues/{issue_id}/relations.{format}': - get: - tags: - - Issue Relations - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - relations - properties: - relations: - type: array - items: - $ref: '#/components/schemas/IssueRelation' - post: - tags: - - Issue Relations - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#POST' - summary: POST - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - requestBody: - content: - application/json: - schema: - type: object - required: - - relation - properties: - relation: - type: object - required: - - issue_to_id - - relation_type - properties: - issue_to_id: - type: integer - relation_type: - type: string - enum: - - relates - - duplicates - - duplicated - - blocks - - blocked - - precedes - - follows - - copied_to - - copied_from - delay: - type: integer - nullable: true - responses: - '201': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/relations/{issue_relation_id}.{format}': - get: - tags: - - Issue Relations - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#GET-2' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_relation_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - properties: - relation: - $ref: '#/components/schemas/IssueRelation' - delete: - tags: - - Issue Relations - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations#DELETE' - summary: DELETE - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_relation_id' - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/projects/{project_id}/versions.{format}': - get: - tags: - - Versions - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - versions - properties: - versions: - type: array - items: - $ref: '#/components/schemas/Version' - total_count: - type: integer - post: - tags: - - Versions - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#POST' - summary: POST - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - requestBody: - content: - application/json: - schema: - type: object - required: - - version - properties: - version: - type: object - required: - - name - properties: - name: - type: string - status: - type: string - enum: - - open - - locked - - closed - sharing: - type: string - enum: - - none - - descendants - - hierarchy - - tree - - system - due_date: - type: string - format: date - nullable: true - description: - type: string - wiki_page_title: - type: string - nullable: true - responses: - '201': - description: '' - content: - application/json: - schema: - allOf: - - $ref: '#/components/schemas/Version' - - type: object - properties: - estimated_hours: - type: number - spent_hours: - type: number - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/versions/{version_id}.{format}': - get: - tags: - - Versions - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#GET-2' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/version_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - version - properties: - version: - type: array - items: - allOf: - - $ref: '#/components/schemas/Version' - - type: object - properties: - estimated_hours: - type: number - spent_hours: - type: number - put: - tags: - - Versions - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#PUT' - summary: PUT - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/version_id' - requestBody: - content: - application/json: - schema: - type: object - properties: - version: - type: object - properties: - name: - type: string - status: - type: string - enum: - - open - - locked - - closed - sharing: - type: string - enum: - - none - - descendants - - hierarchy - - tree - - system - due_date: - type: string - format: date - nullable: true - description: - type: string - wiki_page_title: - type: string - nullable: true - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - delete: - tags: - - Versions - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions#DELETE' - summary: DELETE - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/version_id' - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/projects/{project_id}/wiki/index.{format}': - get: - tags: - - Wiki Pages - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Getting-the-pages-list-of-a-wiki' - summary: Getting the pages list of a wiki - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - wiki_pages - properties: - wiki_pages: - type: array - items: - $ref: '#/components/schemas/WikiPages' - '/projects/{project_id}/wiki/{wiki_page_title}.{format}': - get: - tags: - - Wiki Pages - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Getting-a-wiki-page' - summary: Getting a wiki page - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - - $ref: '#/components/parameters/wiki_page_title' - - name: include - in: query - schema: - type: string - enum: - - attachments - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - wiki_page - properties: - wiki_page: - $ref: '#/components/schemas/WikiPage' - put: - tags: - - Wiki Pages - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Creating-or-updating-a-wiki-page' - summary: Creating or updating a wiki page - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - - $ref: '#/components/parameters/wiki_page_title' - requestBody: - content: - application/json: - schema: - type: object - properties: - wiki_page: - type: object - required: - - text - properties: - text: - type: string - comments: - type: string - version: - type: integer - responses: - '201': - description: '' - '204': - description: '' - '409': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - delete: - tags: - - Wiki Pages - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Deleting-a-wiki-page' - summary: Deleting a wiki page - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - - $ref: '#/components/parameters/wiki_page_title' - responses: - '204': - description: '' - '/projects/{project_id}/wiki/{wiki_page_title}/{version_id}.{format}': - get: - tags: - - Wiki Pages - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages#Getting-an-old-version-of-a-wiki-page' - summary: Getting an old version of a wiki page - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - - $ref: '#/components/parameters/wiki_page_title' - - $ref: '#/components/parameters/version_id' - - name: include - in: query - schema: - type: string - enum: - - attachments - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - wiki_page - properties: - wiki_page: - $ref: '#/components/schemas/WikiPage' - '/queries.{format}': - get: - tags: - - Queries - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Queries#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - queries - - total_count - - offset - - limit - properties: - queries: - type: array - items: - $ref: '#/components/schemas/Query' - total_count: - type: integer - offset: - type: integer - limit: - type: integer - '/attachments/{attachment_id}.{format}': - get: - tags: - - Attachments - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/attachment_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - properties: - attachment: - $ref: '#/components/schemas/Attachment' - patch: - tags: - - Attachments - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments#PATCH' - summary: PATCH - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/attachment_id' - requestBody: - content: - application/json: - schema: - type: object - properties: - attachment: - type: object - properties: - filename: - type: string - description: - type: string - responses: - '204': - description: '' - delete: - tags: - - Attachments - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments#DELETE' - summary: DELETE - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/attachment_id' - responses: - '204': - description: '' - '/issue_statuses.{format}': - get: - tags: - - Issue Statuses - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses#GET' - summary: Returns possible Status Values for Issues - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/IssueStatuses' - '/trackers.{format}': - get: - tags: - - Trackers - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Trackers' - '/projects/{project_id}/issue_categories.{format}': - get: - tags: - - Issue Categories - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - issue_categories - - total_count - properties: - issue_categories: - type: array - items: - $ref: '#/components/schemas/IssueCategory' - total_count: - type: integer - post: - tags: - - Issue Categories - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#POST' - summary: POST - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - requestBody: - content: - application/json: - schema: - type: object - required: - - issue_category - properties: - issue_category: - type: object - required: - - name - properties: - name: - type: string - assigned_to_id: - oneOf: - - type: integer - - type: string - responses: - '201': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/IssueCategory' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/enumerations/issue_priorities.{format}': - get: - tags: - - Enumerations - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - issue_priorities - properties: - issue_priorities: - type: array - items: - $ref: '#/components/schemas/IssuePriority' - '/enumerations/time_entry_activities.{format}': - get: - tags: - - Enumerations - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations#GET-2' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - time_entry_activities - properties: - time_entry_activities: - type: array - items: - $ref: '#/components/schemas/TimeEntryActivity' - '/enumerations/document_categories.{format}': - get: - tags: - - Enumerations - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations#GET-3' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - document_categories - properties: - document_categories: - type: array - items: - $ref: '#/components/schemas/DocumentCategory' - '/issue_categories/{issue_category_id}.{format}': - get: - tags: - - Issue Categories - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#GET-2' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_category_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - issue_category - properties: - issue_category: - $ref: '#/components/schemas/IssueCategory' - put: - tags: - - Issue Categories - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#PUT' - summary: PUT - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_category_id' - requestBody: - content: - application/json: - schema: - type: object - properties: - issue_category: - type: object - properties: - name: - type: string - assigned_to_id: - oneOf: - - type: integer - - type: string - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - delete: - tags: - - Issue Categories - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories#DELETE' - summary: DELETE - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_category_id' - - name: reassign_to_id - in: query - schema: - type: integer - responses: - '204': - description: '' - '/roles.{format}': - get: - tags: - - Roles - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - properties: - roles: - type: array - items: - $ref: '#/components/schemas/IdName' - '/roles/{role_id}.{format}': - get: - tags: - - Roles - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles#GET-2' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/role_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - properties: - role: - $ref: '#/components/schemas/Role' - '/groups.{format}': - get: - tags: - - Groups - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - groups - properties: - groups: - type: array - items: - $ref: '#/components/schemas/IdName' - post: - tags: - - Groups - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#POST' - summary: POST - parameters: - - $ref: '#/components/parameters/format' - requestBody: - content: - application/json: - schema: - type: object - properties: - group: - type: object - properties: - name: - type: string - user_ids: - type: array - items: - oneOf: - - type: integer - - type: string - responses: - '201': - description: '' - content: - application/json: - schema: - type: object - properties: - group: - $ref: '#/components/schemas/IdName' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/groups/{group_id}.{format}': - get: - tags: - - Groups - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#GET-2' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/group_id' - - name: include - in: query - schema: - type: string - enum: - - users - - memberships - responses: - '200': - description: '' - content: - application/json: - schema: - allOf: - - type: object - properties: - group: - $ref: '#/components/schemas/IdName' - - type: object - properties: - group: - type: object - properties: - users: - type: array - items: - $ref: '#/components/schemas/IdName' - memberships: - type: array - items: - type: object - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - roles: - type: array - items: - $ref: '#/components/schemas/IdName' - put: - tags: - - Groups - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#PUT' - summary: PUT - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/group_id' - requestBody: - content: - application/json: - schema: - type: object - properties: - group: - type: object - properties: - name: - type: string - user_ids: - type: array - items: - oneOf: - - type: integer - - type: string - responses: - '204': - description: '' - delete: - tags: - - Groups - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#DELETE' - summary: DELETE - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/group_id' - responses: - '204': - description: '' - '/groups/{group_id}/users.{format}': - post: - tags: - - Groups - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#POST-2' - summary: POST - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/group_id' - requestBody: - content: - application/json: - schema: - type: object - properties: - user_id: - oneOf: - - type: integer - - type: string - responses: - '204': - description: '' - '/groups/{group_id}/users/{user_id}.{format}': - delete: - tags: - - Groups - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups#DELETE-2' - summary: DELETE - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/group_id' - - $ref: '#/components/parameters/user_id' - responses: - '204': - description: '' - '/custom_fields.{format}': - get: - tags: - - Custom Fields - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_CustomFields#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - custom_fields - properties: - custom_fields: - type: array - items: - $ref: '#/components/schemas/CustomField' - '/search.{format}': - get: - tags: - - Search - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Search#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/limit' - - $ref: '#/components/parameters/offset' - - name: q - in: query - schema: - type: string - - name: scope - in: query - schema: - type: string - enum: - - all - - my_project - - subprojects - - name: all_words - in: query - schema: - type: boolean - - name: titles_only - in: query - schema: - type: boolean - - name: issues - in: query - schema: - type: integer - - name: news - in: query - schema: - type: integer - - name: wiki_pages - in: query - schema: - type: integer - - name: projects - in: query - schema: - type: integer - - name: documents - in: query - schema: - type: integer - - name: changesets - in: query - schema: - type: integer - - name: messages - in: query - schema: - type: integer - - name: open_issues - in: query - schema: - type: integer - - name: attachments - in: query - schema: - oneOf: - - type: string - - type: integer - enum: - - 0 - - 1 - - only - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - results - - total_count - - offset - - limit - properties: - results: - type: array - items: - $ref: '#/components/schemas/Search' - total_count: - type: integer - offset: - type: integer - limit: - type: integer - '/projects/{project_id}/files.{format}': - get: - tags: - - Files - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - responses: - '200': - description: '' - content: - application/json: - schema: - type: object - required: - - files - properties: - files: - type: array - items: - $ref: '#/components/schemas/File' - post: - tags: - - Files - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files#POST' - summary: POST - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/project_id' - requestBody: - content: - application/json: - schema: - type: object - required: - - file - properties: - file: - type: object - required: - - token - properties: - token: - type: string - version_id: - oneOf: - - type: integer - - type: string - filename: - type: string - description: - type: string - responses: - '204': - description: '' - content: - application/json: - schema: - type: object - required: - - file - properties: - file: - type: object - properties: - token: - type: string - version_id: - type: string - filename: - type: string - description: - type: string - '/my/account.{format}': - get: - tags: - - My Account - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount#GET' - summary: GET - parameters: - - $ref: '#/components/parameters/format' - responses: - '200': - description: '' - content: - application/json: - schema: - allOf: - - $ref: '#/components/schemas/User' - - $ref: '#/components/schemas/UserPartial' - - type: object - properties: - custom_fields: - type: array - items: - $ref: '#/components/schemas/IdName' - put: - tags: - - My Account - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount#PUT' - summary: PUT - parameters: - - $ref: '#/components/parameters/format' - requestBody: - content: - application/json: - schema: - type: object - properties: - user: - type: object - properties: - login: - type: string - password: - type: string - firstname: - type: string - lastname: - type: string - mail: - type: string - auth_source_id: - type: integer - mail_notification: - type: boolean - must_change_passwd: - type: boolean - generate_password: - type: boolean - admin: - type: boolean - responses: - '204': - description: '' - '422': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' - '/journals/{journal_id}.{format}': - put: - tags: - - Journals - summary: PUT - parameters: - - $ref: '#/components/parameters/format' - - name: journal_id + - name: 'resource' in: path + description: 'Possible values: issue_priorities, time_entry_activities, document_categories' required: true - schema: - type: integer - requestBody: - content: - application/json: - schema: - type: object - properties: - journal: - type: object - properties: - notes: - type: string - nullable: true - private_notes: - type: boolean + type: string responses: - '204': - description: '' - '/uploads.{format}': - post: - tags: - - Attachments - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api#Attaching-files' - summary: Attaching files - parameters: - - $ref: '#/components/parameters/format' - - name: filename - in: query + 200: + description: OK schema: - type: string - requestBody: - content: - application/octet-stream: - schema: - type: string - format: binary - responses: - '201': - description: '' - content: - application/json: - schema: - type: object - properties: - upload: - type: object - properties: - id: - type: integer - token: - type: string - '406': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/Errors' -components: - securitySchemes: - BasicAuth: - type: http - scheme: basic - ApiKeyAuth: - type: apiKey - in: header - name: X-Redmine-API-Key - parameters: - format: - name: format - in: path - required: true - schema: - type: string - enum: - - json - - xml - limit: - name: limit - in: query - schema: - type: integer - offset: - name: offset - in: query - schema: - type: integer - issue_id: - name: issue_id - in: path - required: true - schema: - type: integer - project_id: - name: project_id - in: path - required: true - schema: - type: string - membership_id: - name: membership_id - in: path - required: true - schema: - type: string - user_id: - name: user_id - in: path - required: true - schema: - type: integer - time_entry_id: - name: time_entry_id - in: path - required: true - schema: - type: integer - issue_relation_id: - name: issue_relation_id - in: path - required: true - schema: - type: integer - version_id: - name: version_id - in: path - required: true - schema: - type: integer - wiki_page_title: - name: wiki_page_title - in: path - required: true - schema: - type: string - attachment_id: - name: attachment_id - in: path - required: true - schema: - type: number - issue_category_id: - name: issue_category_id - in: path - required: true - schema: - type: integer - role_id: - name: role_id - in: path - required: true - schema: - type: integer - group_id: - name: group_id - in: path - required: true - schema: - type: integer - schemas: - IdName: - type: object - required: - - id - - name - properties: - id: - type: integer - name: - type: string - Issue: - type: object - required: - - id - - project - - tracker - - status - - priority - - author - - subject - - description - - start_date - - due_date - - done_ratio - - is_private - - estimated_hours - - total_estimated_hours - - spent_hours - - total_spent_hours - - created_on - - updated_on - - closed_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - tracker: - $ref: '#/components/schemas/IdName' - status: - $ref: '#/components/schemas/IssueStatus' - priority: - $ref: '#/components/schemas/IdName' - author: - $ref: '#/components/schemas/IdName' - assigned_to: - $ref: '#/components/schemas/IdName' - category: - $ref: '#/components/schemas/IdName' - subject: - type: string - description: - type: string - nullable: true - start_date: - type: string - nullable: true - due_date: - type: string - nullable: true - done_ratio: - type: integer - is_private: - type: boolean - estimated_hours: - type: number - nullable: true - total_estimated_hours: - type: number - nullable: true - spent_hours: - type: number - total_spent_hours: - type: number - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - closed_on: - type: string - format: date-time - nullable: true - IssuePartial: - type: object - properties: - changesets: - type: array - items: - type: string - children: - type: array - items: - type: object - required: - - id - - tracker - - subject - properties: - id: - type: integer - tracker: - $ref: '#/components/schemas/IdName' - subject: - type: string - attachments: - type: array - items: - allOf: - - $ref: '#/components/schemas/Attachment' - - type: object - properties: - thumbnail_url: - type: string - relations: - type: array - items: - type: object - properties: - id: - type: integer - issue_id: - type: integer - issue_to_id: - type: integer - relation_type: - type: string - delay: - type: integer - nullable: true - journals: - type: array - items: type: object - required: - - id - - user - - notes - - created_on - - private_notes - - details properties: - id: - type: integer - user: - $ref: '#/components/schemas/IdName' - notes: - type: string - created_on: - type: string - format: date-time - private_notes: - type: boolean - details: + time_entry_activities: type: array items: - type: object - required: - - property - - name - - old_value - - new_value - properties: - property: - type: string - name: - type: string - old_value: - type: string - nullable: true - new_value: - type: string - watchers: - type: array - items: - $ref: '#/components/schemas/IdName' - allowed_statuses: - type: array - items: - $ref: '#/components/schemas/IssueStatus' - Project: + $ref: '#/definitions/enumeration' + document_categories: + type: array + items: + $ref: '#/definitions/enumeration' + issue_priorities: + type: array + items: + $ref: '#/definitions/enumeration' + +## Parameters +# https://swagger.io/docs/specification/2-0/describing-parameters/ +parameters: + idParam: + name: "id" + in: path + description: "id or identifier of the project/issue/user/timeEntry" + required: true + type: string + limitParam: + name: limit + in: query + description: "the number of items to be present in the response (default is 25, maximum is 100)" + required: false + type: integer + format: int32 + offsetParam: + name: offset + in: query + description: "the offset of the first object to retrieve" + required: false + type: integer + format: int32 + + +## Responses +# https://swagger.io/docs/specification/2-0/describing-responses/ +responses: + validationError: + description: 'Unprocessable Entity' + schema: type: object required: - - id - - name - - identifier - - description - - status - - is_public - - inherit_members - - created_on - - updated_on + - errors properties: - id: - type: integer - name: - type: integer - identifier: - type: integer - description: - type: integer - nullable: true - homepage: - type: string - nullable: true - parent_id: - type: integer - status: - type: integer - is_public: - type: boolean - inherit_members: - type: boolean - trackers: - type: array - items: - $ref: '#/components/schemas/IdName' - issue_categories: - type: array - items: - $ref: '#/components/schemas/IdName' - enabled_modules: + errors: + title: Errors type: array items: - $ref: '#/components/schemas/IdName' - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - User: - type: object - required: - - id - - login - - admin - - firstname - - lastname - - mail - - created_on - - updated_on - - last_login_on - - passwd_changed_on - - twofa_scheme - properties: - id: - type: integer - login: - type: string - admin: - type: boolean - firstname: - type: string - lastname: - type: string - mail: - type: string - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - last_login_on: - type: string - format: date-time - nullable: true - passwd_changed_on: - type: string - format: date-time - nullable: true - twofa_scheme: + type: string + + +## Input and Output Models +# Common data structure (schema object) definitions. +definitions: + idNameObject: + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + totalCount: + title: TotalCount + type: integer + format: int32 + offset: + title: Offset + type: integer + format: int32 + limit: + title: Limit + type: integer + format: int32 + project: + type: object + title: Project + required: + - id + - name + - identifier + - description + - status + - created_on + - updated_on + - is_public + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + identifier: + title: Identifier + type: string + description: + title: Description + type: string + status: + title: Status + type: integer + format: int32 + is_public: + title: IsPublic + type: boolean + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + parent: + title: Parent + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + #below: optional associated data from 'include' parameter + issue_categories: + title: IssueCategories + type: array + items: type: object - nullable: true - UserPartial: - type: object - required: - - api_key - - status - properties: - api_key: - type: string - status: - type: integer - Membersip: - oneOf: - - type: object required: - id - - project - - user - - roles + - name properties: id: + title: Id type: integer - project: - $ref: '#/components/schemas/IdName' - user: - $ref: '#/components/schemas/IdName' - roles: - type: array - items: - $ref: '#/components/schemas/IdName' - - type: object + format: int32 + name: + title: Name + type: string + trackers: + title: Trackers + type: array + items: + type: object required: - id - - project - - group - - roles + - name properties: id: + title: Id type: integer - project: - $ref: '#/components/schemas/IdName' - group: - $ref: '#/components/schemas/IdName' - roles: - type: array - items: - $ref: '#/components/schemas/IdName' - TimeEntry: - type: object - required: - - id - - project - - issue - - user - - activity - - hours - - comments - - spent_on - - created_on - - updated_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - issue: + format: int32 + name: + title: Name + type: string + enabled_modules: + title: EnabledModules + type: array + items: type: object + required: + - id + - name properties: id: + title: Id type: integer - user: - $ref: '#/components/schemas/IdName' - activity: - $ref: '#/components/schemas/IdName' - hours: - type: number - comments: - type: string - spent_on: - type: string - format: date - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - News: - type: object - required: - - id - - project - - author - - title - - summary - - description - - created_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - author: - $ref: '#/components/schemas/IdName' - title: - type: string - summary: - type: string - description: - type: string - created_on: - type: string - format: date-time - IssueRelation: - type: object - required: - - id - - issue_id - - issue_to_id - - relation_type - - delay - properties: - id: - type: integer - issue_id: - type: integer - issue_to_id: - type: integer - relation_type: - type: string - delay: - type: integer - nullable: true - Version: - type: object - required: - - id - - project - - name - - status - - due_date - - sharing - - description - - wiki_page_title - - created_on - - updated_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - name: - type: string - description: - type: string - nullable: true - status: - type: string - enum: - - open - - locked - - closed - due_date: - type: string - format: date - nullable: true - sharing: - type: string - enum: - - none - - descendants - - hierarchy - - tree - - system - wiki_page_title: - type: string - nullable: true - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - WikiPage: - type: object - required: - - title - - text - - version - - author - - comments - - created_on - - updated_on - properties: - title: - type: string - parent: - type: object - required: - - title - properties: - title: + format: int32 + name: + title: Name type: string - text: - type: string - version: - type: integer - author: - $ref: '#/components/schemas/IdName' - comments: - type: string - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - WikiPages: - type: object - required: - - title - - version - - created_on - - updated_on - properties: - title: - type: integer - parent: + time_entry_activities: + title: TimeEntryActivities + type: array + items: type: object required: - - title - properties: - title: - type: string - version: - type: integer - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - Query: - allOf: - - type: object - required: - - is_public - - project_id + - id + - name properties: - is_public: - type: boolean - project_id: + id: + title: Id type: integer - nullable: true - - $ref: '#/components/schemas/IdName' - IssueStatus: - allOf: - - $ref: '#/components/schemas/IdName' - - type: object - required: - - is_closed - properties: - is_closed: - type: boolean - Attachment: - type: object - required: - - id - - filename - - filesize - - content_type - - description - - content_url - - author - - created_on - properties: - id: - type: integer - filename: - type: string - filesize: - type: integer - content_type: - type: string - description: - type: string - content_url: - type: string - author: - $ref: '#/components/schemas/IdName' - created_on: - type: string - format: data-time - IssueStatuses: - type: object - required: - - issue_statuses - properties: - issue_statuses: - type: array - items: - $ref: '#/components/schemas/IssueStatus' - Group: - $ref: '#/components/schemas/IdName' - Tracker: - type: object - properties: - id: - type: integer - name: - type: string - default_status: - $ref: '#/components/schemas/IdName' - description: - type: string - nullable: true - enabled_standard_fields: - type: array - items: + format: int32 + name: + title: Name + type: string + issue: + type: object + title: Issue + required: + - id + - project + - tracker + - status + - priority + - author + - subject + - description + - start_date + - due_date + - done_ratio + - is_private + - estimated_hours + - created_on + - updated_on + - closed_on + properties: + id: + title: Id + type: integer + format: int32 + project: + title: Project + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name type: string - Trackers: - type: object - required: - - trackers - properties: - trackers: - type: array - items: - $ref: '#/components/schemas/Tracker' - IssuePriority: - allOf: - - type: object - required: - - is_default - - active - properties: - is_default: - type: boolean - active: - type: boolean - - $ref: '#/components/schemas/IdName' - TimeEntryActivity: - allOf: - - type: object - required: - - is_default - - active - properties: - is_default: - type: boolean - active: - type: boolean - - $ref: '#/components/schemas/IdName' - DocumentCategory: - allOf: - - type: object - required: - - is_default - - active - properties: - is_default: - type: boolean - active: - type: boolean - - $ref: '#/components/schemas/IdName' - IssueCategory: - type: object - required: - - id - - project - - name - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - name: - type: string - assigned_to: - $ref: '#/components/schemas/IdName' - Role: - allOf: - - type: object - required: - - assignable - - issue_visibility - - time_entries_visibility - - users_visibility - - permissions + tracker: + title: Tracker + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + status: + title: Status + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + priority: + title: Priority + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + author: + title: Author + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + assigned_to: + title: AssignedTo + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + subject: + title: Subject + type: string + description: + title: Description + type: string + start_date: + title: StartDate + type: string + due_date: + title: DueDate + type: string + done_ratio: + title: DoneRatio + type: integer + format: int32 + is_private: + title: Is Private + type: boolean + estimated_hours: + title: EstimatedHours + type: number + format: float + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + closed_on: + title: ClosedOn + type: string + #below: optional associated data from 'include' parameter + children: + title: Children + type: array + items: + $ref: '#/definitions/idNameObject' + attachments: + title: Attachments + type: array + items: + $ref: '#/definitions/idNameObject' + relations: + title: Realtions + type: array + items: + $ref: '#/definitions/idNameObject' + changesets: + title: Chagesets + type: array + items: + $ref: '#/definitions/idNameObject' + journals: + title: Journals + type: array + items: + title: Journal + type: object properties: - assignable: - type: boolean - issues_visibility: - type: string - time_entries_visibility: + id: + title: Id + type: integer + format: int32 + user: + $ref: '#/definitions/idNameObject' + notes: type: string - users_visibility: + created_on: type: string - permissions: + private_notes: + type: boolean + details: type: array items: - type: string - - $ref: '#/components/schemas/IdName' - CustomField: - type: object - properties: - id: - type: integer - name: - type: string - customized_type: - type: string - enum: - - issue - - project - - time_entry - - version - - document - - user - - group - - time_entry_activity - - issue_priority - - document_category - field_format: - type: string - enum: - - enumeration - - string - - version - - attachment - - user - - list - - link - - float - - int - - date - - bool - - text - regexp: - type: string - min_length: - type: integer - nullable: true - max_length: - type: integer - nullable: true - is_required: - type: boolean - is_filter: - type: boolean - searchable: - type: boolean - multiple: - type: boolean - default_value: - type: string - nullable: true - visible: - type: boolean - trackers: - type: array - items: - $ref: '#/components/schemas/IdName' - roles: - type: array - items: - $ref: '#/components/schemas/Role' - possible_values: - type: array - items: - type: object - properties: - value: - type: string - label: - type: string - Search: - type: object - required: - - id - - title - - type - - url - - description - - datetime - properties: - id: - type: integer - title: - type: string - type: - type: string - url: - type: string - description: - type: string - datetime: - type: string - format: date-time - File: - type: object - required: - - id - - filename - - filesize - - content_type - - description - - content_url - - author - - created_on - - digest - - downloads - properties: - id: - type: integer - filename: - type: string - filesize: - type: integer - content_type: - type: string - description: - type: string - content_url: - type: string - thumbnail_url: - type: string - author: - $ref: '#/components/schemas/IdName' - created_on: - type: string - format: date-time - version: - $ref: '#/components/schemas/IdName' - digest: - type: string - downloads: - type: integer - Errors: - type: object - required: - - errors - properties: - errors: - items: + type: object + properties: + property: + type: string + name: + type: string + old_value: + type: string + new_value: + type: string + watchers: + title: Watchers + type: array + items: + $ref: '#/definitions/idNameObject' + timeEntry: + type: object + title: TimeEntry + required: + - id + - project + - user + - activity + - hours + - comments + - spent_on + - created_on + - updated_on + properties: + id: + title: Id + type: integer + format: int32 + project: + title: Project + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name type: string -tags: - - name: Issues - description: 'Status: Stable, Availablity: 1.0' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues' - - name: Projects - description: 'Status: Stable, Availablity: 1.0' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects' - - name: Project Memberships - description: 'Status: Alpha, Availablity: 1.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships' - - name: Users - description: 'Status: Stable, Availablity: 1.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users' - - name: Time Entries - description: 'Status: Stable, Availablity: 1.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries' - - name: News - description: 'Status: Prototype, Note: Prototype implementation for index only, Availablity: 1.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News' - - name: Issue Relations - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations' - - name: Versions - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions' - - name: Wiki Pages - description: 'Status: Alpha, Availablity: 2.2' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages' - - name: Queries - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Queries' - - name: Attachments - description: 'Status: Beta, Notes: Adding attachments via the API added in 1.4, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments' - - name: Issue Statuses - description: 'Status: Alpha, Notes: Provides the list of all statuses, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses' - - name: Trackers - description: 'Status: Alpha, Notes: Provides the list of all trackers, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' - - name: Enumerations - description: 'Status: Alpha, Notes: Provides the list of issue priorities and time tracking activities, Availablity: 2.2' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations' - - name: Issue Categories - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories' - - name: Roles - description: 'Status: Alpha, Availablity: 1.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles' - - name: Groups - description: 'Status: Alpha, Availablity: 2.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups' - - name: Custom Fields - description: 'Status: Alpha, Availablity: 2.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_CustomFields' - - name: Search - description: 'Status: Alpha, Availablity: 3.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Search' - - name: Files - description: 'Status: Alpha, Availablity: 3.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files' - - name: My Account - description: 'Status: Alpha, Availablity: 4.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount' - - name: Journals - description: 'Status: Alpha, Availablity: 5.0' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Journals?parent=Rest_api' + issue: + title: Issue + type: object + required: + - id + properties: + id: + title: Id + type: integer + format: int32 + user: + title: User + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + activity: + title: Activity + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + hours: + title: Hours + type: number + format: float + comments: + title: Comments + type: string + spent_on: + title: SpentOn + type: string + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + issueStatus: + title: IssueStatus + type: object + required: + - id + - name + - is_default + - is_closed + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + is_default: + title: IsDefault + type: boolean + is_closed: + title: IsClosed + type: boolean + tracker: + title: IssueStatus + type: object + required: + - id + - name + - default_status + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + default_status: + title: DefaultStatus + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + enumeration: + title: Enumeration + type: object + required: + - id + - name + - is_default + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + is_default: + title: IsDefault + type: boolean diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml index bdebb6b88..ef1ae79ef 100644 --- a/src/appmixer/redmine/openapi.yml +++ b/src/appmixer/redmine/openapi.yml @@ -1,18 +1,14 @@ -openapi: 3.0.3 +swagger: '2.0' info: - title: Redmine API + title: 'Redmine' description: 'Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.' - version: 5.0.0 x-connector-icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC' - contact: - name: d-yoshi/redmine-openapi - url: 'https://github.com/d-yoshi/redmine-openapi' + version: '1.3' +basePath: / +schemes: [https] externalDocs: - description: Redmine API Official Developer Guide + description: Redmine API Documentation url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api' -security: - - BasicAuth: [] - - ApiKeyAuth: [] servers: - url: '{url}' description: Redmine URL @@ -20,1353 +16,913 @@ servers: url: description: Redmine URL default: 'https://redmine.acme.com' + +##Notes +# PowerApps Custom Connectors do NOT support Operation level Parameter definition + +## Implemented Queries +# +# Projects +# - ProjectsList +# - ProjectShow +# +# Issues +# - IssuesList +# - IssueShow +# - IssueCreate +# - IssueUpdate +# - IssueDelete +# +# Time Entries +# - TimeList +# - TimeShow +# - TimeCreate +# - TimeUpdate +# - TimeDelete +# +# Issue Statuses +# - StatusesList +# +# Trackers +# - TrackersList +# +# +Validation Error Response + + +## "Content-Type" and "Accepts" Header. +# XML is also supported, but I don't use it +consumes: [application/json] +produces: [application/json] + + +## Authentication +# https://swagger.io/docs/specification/2-0/authentication/ +securityDefinitions: + api_key: + type: apiKey + in: header + name: X-Redmine-API-Key + +security: + - api_key: [] + + +## Tags +# https://swagger.io/docs/specification/2-0/grouping-operations-with-tags/ +tags: + - name: 'Projects' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_Projects + - name: 'Issues' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_Issues + - name: 'TimeEntries' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries + - name: 'IssueStatuses' + externalDocs: + url: https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses + - name: 'Trackers' + externalDocs: + url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' + + +## Endpoints +# https://swagger.io/docs/specification/2-0/paths-and-operations/ paths: - '/issues.{format}': + /issues.json: get: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Listing-issues' - summary: Returns a paginated list of issues. By default, it returns open issues only. - x-connector-label: FindIssues + summary: 'List issues' + description: 'Returns a paginated list of issues. By default, it returns open issues only.' + operationId: IssuesList + tags: [ Issues ] parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/offset' - - $ref: '#/components/parameters/limit' + - $ref: '#/parameters/limitParam' + - $ref: '#/parameters/offsetParam' - name: sort in: query - schema: - type: string - description: 'A comma separated list of field names with an optional sort order. Order defaults to ascending. Example: sort=created_on:desc,subject:asc' + description: column to sort with. Append :desc to invert the order. (optional) + required: false + type: string - name: include in: query - schema: - type: string - enum: - - attachments - - relations + description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' + required: false + type: string - name: issue_id in: query - schema: - type: string + description: 'get issue with the given id or multiple issues by id using comma to separate id.' + required: false + type: integer + format: int32 - name: project_id in: query - schema: - type: string + description: 'get issues from the project with the given id (a numeric value, not a project identifier).' + required: false + type: integer + format: int32 - name: subproject_id in: query - schema: - type: string + description: 'get issues from the subproject with the given id. You can use project_id=XXX&subproject_id=!* to get only the issues of a given project and none of its subprojects.' + required: false + type: integer + format: int32 - name: tracker_id in: query - schema: - type: integer + description: 'get issues from the tracker with the given id' + required: false + type: integer + format: int32 - name: status_id in: query - schema: - type: string + description: 'get issues with the given status id only. Possible values: open, closed, * to get open and closed issues, status id' + required: false + type: string - name: assigned_to_id in: query + description: 'get issues which are assigned to the given user id. me can be used instead an ID to fetch all issues from the logged in user (via API key or HTTP auth)' + required: false + type: string + responses: + 200: + description: "OK" schema: - type: string - - name: parent_id - in: query - schema: - type: string - - name: cf_x - in: query + type: object + required: + - issues + - total_count + - offset + - limit + properties: + issues: #array + title: Issues + type: array + items: + $ref: '#/definitions/issue' + total_count: + $ref: '#/definitions/totalCount' + offset: + $ref: '#/definitions/offset' + limit: + $ref: '#/definitions/limit' + post: + summary: 'Create issue' + description: 'Creates a new issue.' + operationId: IssueCreate + tags: [ Issues ] + parameters: + - name: issue + in: body + required: true + description: 'issue attributes' schema: - type: string - responses: - '200': - description: '' - content: - application/json: - schema: + title: Body + type: object + required: + - issue + properties: + issue: type: object + title: Issue required: - - issues - - total_count - - offset - - limit + - project_id + - subject + - priority_id + - tracker_id properties: - issues: - type: array - items: - allOf: - - $ref: '#/components/schemas/Issue' - - type: object - required: - - spent_hours - - total_spent_hours - properties: - spent_hours: - type: number - total_spent_hours: - type: number - total_count: + project_id: + title: ProjectId type: integer - offset: + format: int32 + tracker_id: + title: TrackerId type: integer - limit: + format: int32 + status_id: + title: StatusId type: integer - post: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Creating-an-issue' - summary: Creating an issue - x-connector-label: CreateIssue - parameters: - - $ref: '#/components/parameters/format' - requestBody: - content: - application/json: + format: int32 + priority_id: + title: PriorityId + type: integer + format: int32 + subject: + title: Subject + type: string + description: + title: Description + type: string + category_id: + title: CategoryId + type: integer + format: int32 + fixed_version_id: + title: FixedVersionId + type: integer + format: int32 + description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' + assigned_to_id: + title: AssignedToId + type: integer + format: int32 + description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' + parent_issue_id: + title: ParentIssueId + type: integer + format: int32 + description: 'ID of the parent issue' + custom_fields: + title: CustomFields + type: array + items: + type: object + watcher_user_ids: + title: WatcherUserIds + type: array + description: 'Array of user ids to add as watchers' + items: + type: integer + format: int32 + is_private: + title: IsPrivate + type: boolean + estimated_hours: + title: EstimatedHours + type: number + format: float + responses: + 201: + description: 'Created: issue was created' + 422: + $ref: '#/responses/validationError' + /issues/{id}.json: + get: + summary: 'Show issues' + description: 'Returns the issue of given id or identifier.' + operationId: IssueShow + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + - name: include + in: query + description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' + required: false + type: string + responses: + 200: + description: OK schema: type: object required: - issue properties: issue: - type: object - required: - - project_id - - tracer_id - - status_id - - subject - properties: - project_id: - oneOf: - - type: integer - - type: string - tracker_id: - oneOf: - - type: integer - - type: string - status_id: - oneOf: - - type: integer - - type: string - priority_id: - oneOf: - - type: integer - - type: string - subject: - type: string - description: - type: string - nullable: true - start_date: - type: string - format: date - nullable: true - due_date: - type: string - format: date - nullable: true - category_id: - oneOf: - - type: integer - - type: string - fixed_version_id: - type: string - assigned_to_id: - oneOf: - - type: integer - - type: string - parent_issue_id: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true - custom_fields: - type: string - watcher_user_ids: - type: array - items: - oneOf: - - type: integer - - type: string - is_private: - type: boolean - estimated_hours: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true - uploads: - type: object - properties: - upload: - type: object - properties: - token: - type: string - filename: - type: string - description: - type: string - content_type: - type: string - responses: - '201': - description: '' - content: - application/json: - schema: - type: object - required: - - issue - properties: - issue: - $ref: '#/components/schemas/Issue' - '/issues/{issue_id}.{format}': - get: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Showing-an-issue' - summary: Showing an issue - x-connector-label: GetIssue - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - - name: include - in: query - schema: - type: string - enum: - - children - - attachments - - relations - - changesets - - journals - - watchers - - allowed_statuses - responses: - '200': - description: '' - content: - application/json: - schema: - allOf: - - type: object - required: - - issue - properties: - issue: - $ref: '#/components/schemas/Issue' - - type: object - required: - - issue - properties: - issue: - $ref: '#/components/schemas/IssuePartial' - put: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue' - summary: Updating an issue - x-connector-label: UpdateIssue - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - requestBody: - content: - application/json: + $ref: '#/definitions/issue' + put: + summary: 'Update issue' + description: 'Updates a issue.' + operationId: IssueUpdate + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + - name: issue + in: body + required: true + description: 'issue attributes' schema: + title: Body type: object + required: + - issue properties: issue: + title: Issue type: object properties: project_id: - oneOf: - - type: integer - - type: string + title: ProjectId + type: integer + format: int32 tracker_id: - oneOf: - - type: integer - - type: string + title: TrackerId + type: integer + format: int32 status_id: - oneOf: - - type: integer - - type: string + title: StatusId + type: integer + format: int32 priority_id: - oneOf: - - type: integer - - type: string + title: PriorityId + type: integer + format: int32 subject: + title: Subject type: string description: + title: Description type: string - nullable: true - start_date: - type: string - format: date - nullable: true - due_date: - type: string - format: date - nullable: true category_id: - oneOf: - - type: integer - - type: string + title: CategoryId + type: integer + format: int32 fixed_version_id: - type: string + title: FixedVersionId + type: integer + format: int32 + description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' assigned_to_id: - oneOf: - - type: integer - - type: string + title: AssignedToId + type: integer + format: int32 + description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' parent_issue_id: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true + title: ParentIssueId + type: integer + format: int32 + description: 'ID of the parent issue' custom_fields: - type: string + title: CustomFields + type: array + items: + type: object + watcher_user_ids: + title: WatcherUserIds + type: array + description: 'Array of user ids to add as watchers' + items: + type: integer + format: int32 is_private: + title: IsPrivate type: boolean estimated_hours: - oneOf: - - type: integer - nullable: true - - type: string - nullable: true + title: EstimatedHours + type: number + format: float notes: + title: Notes + description: 'Comments about the update' type: string private_notes: - type: string - responses: - '204': - description: '' - delete: - tags: - - Issues - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Deleting-an-issue' - summary: Deleting an issue - x-connector-label: DeleteIssue - parameters: - - $ref: '#/components/parameters/format' - - $ref: '#/components/parameters/issue_id' - responses: - '204': - description: '' -components: - securitySchemes: - BasicAuth: - type: http - scheme: basic - ApiKeyAuth: - type: apiKey - in: header - name: X-Redmine-API-Key - parameters: - format: - name: format - in: path - required: true - schema: - type: string - enum: - - json - - xml - limit: - name: limit - in: query - schema: - type: integer - offset: - name: offset - in: query - schema: + title: PrivateNotes + description: 'true if notes are private' + type: boolean + responses: + 201: + description: 'OK' + 422: + $ref: '#/responses/validationError' + delete: + summary: 'Delete issue' + description: 'Deletes a issue.' + operationId: IssueDelete + tags: [ Issues ] + parameters: + - $ref: '#/parameters/idParam' + responses: + 200: + description: OK + +## Parameters +# https://swagger.io/docs/specification/2-0/describing-parameters/ +parameters: + idParam: + name: "id" + in: path + description: "id or identifier of the project/issue/user/timeEntry" + required: true + type: string + limitParam: + name: limit + in: query + description: "the number of items to be present in the response (default is 25, maximum is 100)" + required: false + type: integer + format: int32 + maximum: 100 + offsetParam: + name: offset + in: query + description: "skip this number of issues in response (optional)" + required: false + type: integer + format: int32 + + +## Responses +# https://swagger.io/docs/specification/2-0/describing-responses/ +responses: + validationError: + description: 'Unprocessable Entity' + schema: + type: object + required: + - errors + properties: + errors: + title: Errors + type: array + items: + type: string + + +## Input and Output Models +# Common data structure (schema object) definitions. +definitions: + idNameObject: + type: object + required: + - id + - name + properties: + id: + title: Id type: integer - issue_id: - name: issue_id - in: path - required: true - schema: + format: int32 + name: + title: Name + type: string + totalCount: + title: TotalCount + type: integer + format: int32 + offset: + title: Offset + type: integer + format: int32 + limit: + title: Limit + type: integer + format: int32 + project: + type: object + title: Project + required: + - id + - name + - identifier + - description + - status + - created_on + - updated_on + - is_public + properties: + id: + title: Id type: integer - project_id: - name: project_id - in: path - required: true - schema: + format: int32 + name: + title: Name type: string - membership_id: - name: membership_id - in: path - required: true - schema: + identifier: + title: Identifier type: string - user_id: - name: user_id - in: path - required: true - schema: - type: integer - time_entry_id: - name: time_entry_id - in: path - required: true - schema: - type: integer - issue_relation_id: - name: issue_relation_id - in: path - required: true - schema: - type: integer - version_id: - name: version_id - in: path - required: true - schema: - type: integer - wiki_page_title: - name: wiki_page_title - in: path - required: true - schema: + description: + title: Description type: string - attachment_id: - name: attachment_id - in: path - required: true - schema: - type: number - issue_category_id: - name: issue_category_id - in: path - required: true - schema: + status: + title: Status type: integer - role_id: - name: role_id - in: path - required: true - schema: - type: integer - group_id: - name: group_id - in: path - required: true - schema: - type: integer - schemas: - IdName: - type: object - required: - - id - - name - properties: - id: - type: integer - name: - type: string - Issue: - type: object - required: - - id - - project - - tracker - - status - - priority - - author - - subject - - description - - start_date - - due_date - - done_ratio - - is_private - - estimated_hours - - total_estimated_hours - - spent_hours - - total_spent_hours - - created_on - - updated_on - - closed_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - tracker: - $ref: '#/components/schemas/IdName' - status: - $ref: '#/components/schemas/IssueStatus' - priority: - $ref: '#/components/schemas/IdName' - author: - $ref: '#/components/schemas/IdName' - assigned_to: - $ref: '#/components/schemas/IdName' - category: - $ref: '#/components/schemas/IdName' - subject: - type: string - description: - type: string - nullable: true - start_date: - type: string - nullable: true - due_date: - type: string - nullable: true - done_ratio: - type: integer - is_private: - type: boolean - estimated_hours: - type: number - nullable: true - total_estimated_hours: - type: number - nullable: true - spent_hours: - type: number - total_spent_hours: - type: number - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - closed_on: - type: string - format: date-time - nullable: true - IssuePartial: - type: object - properties: - changesets: - type: array - items: + format: int32 + is_public: + title: IsPublic + type: boolean + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + parent: + title: Parent + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name type: string - children: - type: array - items: - type: object - required: - - id - - tracker - - subject - properties: - id: - type: integer - tracker: - $ref: '#/components/schemas/IdName' - subject: - type: string - attachments: - type: array - items: - allOf: - - $ref: '#/components/schemas/Attachment' - - type: object - properties: - thumbnail_url: - type: string - relations: - type: array - items: - type: object - properties: - id: - type: integer - issue_id: - type: integer - issue_to_id: - type: integer - relation_type: - type: string - delay: - type: integer - nullable: true - journals: - type: array - items: - type: object - required: - - id - - user - - notes - - created_on - - private_notes - - details - properties: - id: - type: integer - user: - $ref: '#/components/schemas/IdName' - notes: - type: string - created_on: - type: string - format: date-time - private_notes: - type: boolean - details: - type: array - items: - type: object - required: - - property - - name - - old_value - - new_value - properties: - property: - type: string - name: - type: string - old_value: - type: string - nullable: true - new_value: - type: string - watchers: - type: array - items: - $ref: '#/components/schemas/IdName' - allowed_statuses: - type: array - items: - $ref: '#/components/schemas/IssueStatus' - Project: - type: object - required: - - id - - name - - identifier - - description - - status - - is_public - - inherit_members - - created_on - - updated_on - properties: - id: - type: integer - name: - type: integer - identifier: - type: integer - description: - type: integer - nullable: true - homepage: - type: string - nullable: true - parent_id: - type: integer - status: - type: integer - is_public: - type: boolean - inherit_members: - type: boolean - trackers: - type: array - items: - $ref: '#/components/schemas/IdName' - issue_categories: - type: array - items: - $ref: '#/components/schemas/IdName' - enabled_modules: - type: array - items: - $ref: '#/components/schemas/IdName' - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - User: - type: object - required: - - id - - login - - admin - - firstname - - lastname - - mail - - created_on - - updated_on - - last_login_on - - passwd_changed_on - - twofa_scheme - properties: - id: - type: integer - login: - type: string - admin: - type: boolean - firstname: - type: string - lastname: - type: string - mail: - type: string - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - last_login_on: - type: string - format: date-time - nullable: true - passwd_changed_on: - type: string - format: date-time - nullable: true - twofa_scheme: + #below: optional associated data from 'include' parameter + issue_categories: + title: IssueCategories + type: array + items: type: object - nullable: true - UserPartial: - type: object - required: - - api_key - - status - properties: - api_key: - type: string - status: - type: integer - Membersip: - oneOf: - - type: object required: - id - - project - - user - - roles + - name properties: id: + title: Id type: integer - project: - $ref: '#/components/schemas/IdName' - user: - $ref: '#/components/schemas/IdName' - roles: - type: array - items: - $ref: '#/components/schemas/IdName' - - type: object + format: int32 + name: + title: Name + type: string + trackers: + title: Trackers + type: array + items: + type: object required: - id - - project - - group - - roles + - name properties: id: + title: Id type: integer - project: - $ref: '#/components/schemas/IdName' - group: - $ref: '#/components/schemas/IdName' - roles: - type: array - items: - $ref: '#/components/schemas/IdName' - TimeEntry: - type: object - required: - - id - - project - - issue - - user - - activity - - hours - - comments - - spent_on - - created_on - - updated_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - issue: + format: int32 + name: + title: Name + type: string + enabled_modules: + title: EnabledModules + type: array + items: type: object + required: + - id + - name properties: id: + title: Id type: integer - user: - $ref: '#/components/schemas/IdName' - activity: - $ref: '#/components/schemas/IdName' - hours: - type: number - comments: - type: string - spent_on: - type: string - format: date - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - News: - type: object - required: - - id - - project - - author - - title - - summary - - description - - created_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - author: - $ref: '#/components/schemas/IdName' - title: - type: string - summary: - type: string - description: - type: string - created_on: - type: string - format: date-time - IssueRelation: - type: object - required: - - id - - issue_id - - issue_to_id - - relation_type - - delay - properties: - id: - type: integer - issue_id: - type: integer - issue_to_id: - type: integer - relation_type: - type: string - delay: - type: integer - nullable: true - Version: - type: object - required: - - id - - project - - name - - status - - due_date - - sharing - - description - - wiki_page_title - - created_on - - updated_on - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - name: - type: string - description: - type: string - nullable: true - status: - type: string - enum: - - open - - locked - - closed - due_date: - type: string - format: date - nullable: true - sharing: - type: string - enum: - - none - - descendants - - hierarchy - - tree - - system - wiki_page_title: - type: string - nullable: true - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - WikiPage: - type: object - required: - - title - - text - - version - - author - - comments - - created_on - - updated_on - properties: - title: - type: string - parent: - type: object - required: - - title - properties: - title: + format: int32 + name: + title: Name type: string - text: - type: string - version: - type: integer - author: - $ref: '#/components/schemas/IdName' - comments: - type: string - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - WikiPages: - type: object - required: - - title - - version - - created_on - - updated_on - properties: - title: - type: integer - parent: + time_entry_activities: + title: TimeEntryActivities + type: array + items: type: object required: - - title - properties: - title: - type: string - version: - type: integer - created_on: - type: string - format: date-time - updated_on: - type: string - format: date-time - Query: - allOf: - - type: object - required: - - is_public - - project_id + - id + - name properties: - is_public: - type: boolean - project_id: + id: + title: Id type: integer - nullable: true - - $ref: '#/components/schemas/IdName' - IssueStatus: - allOf: - - $ref: '#/components/schemas/IdName' - - type: object - required: - - is_closed - properties: - is_closed: - type: boolean - Attachment: - type: object - required: - - id - - filename - - filesize - - content_type - - description - - content_url - - author - - created_on - properties: - id: - type: integer - filename: - type: string - filesize: - type: integer - content_type: - type: string - description: - type: string - content_url: - type: string - author: - $ref: '#/components/schemas/IdName' - created_on: - type: string - format: data-time - IssueStatuses: - type: object - required: - - issue_statuses - properties: - issue_statuses: - type: array - items: - $ref: '#/components/schemas/IssueStatus' - Group: - $ref: '#/components/schemas/IdName' - Tracker: - type: object - properties: - id: - type: integer - name: - type: string - default_status: - $ref: '#/components/schemas/IdName' - description: - type: string - nullable: true - enabled_standard_fields: - type: array - items: + format: int32 + name: + title: Name + type: string + issue: + type: object + title: Issue + required: + - id + - project + - tracker + - status + - priority + - author + - subject + - description + - start_date + - due_date + - done_ratio + - is_private + - estimated_hours + - created_on + - updated_on + - closed_on + properties: + id: + title: Id + type: integer + format: int32 + project: + title: Project + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name type: string - Trackers: - type: object - required: - - trackers - properties: - trackers: - type: array - items: - $ref: '#/components/schemas/Tracker' - IssuePriority: - allOf: - - type: object - required: - - is_default - - active - properties: - is_default: - type: boolean - active: - type: boolean - - $ref: '#/components/schemas/IdName' - TimeEntryActivity: - allOf: - - type: object - required: - - is_default - - active - properties: - is_default: - type: boolean - active: - type: boolean - - $ref: '#/components/schemas/IdName' - DocumentCategory: - allOf: - - type: object - required: - - is_default - - active - properties: - is_default: - type: boolean - active: - type: boolean - - $ref: '#/components/schemas/IdName' - IssueCategory: - type: object - required: - - id - - project - - name - properties: - id: - type: integer - project: - $ref: '#/components/schemas/IdName' - name: - type: string - assigned_to: - $ref: '#/components/schemas/IdName' - Role: - allOf: - - type: object - required: - - assignable - - issue_visibility - - time_entries_visibility - - users_visibility - - permissions + tracker: + title: Tracker + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + status: + title: Status + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + priority: + title: Priority + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + author: + title: Author + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + assigned_to: + title: AssignedTo + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + subject: + title: Subject + type: string + description: + title: Description + type: string + start_date: + title: StartDate + type: string + due_date: + title: DueDate + type: string + done_ratio: + title: DoneRatio + type: integer + format: int32 + is_private: + title: Is Private + type: boolean + estimated_hours: + title: EstimatedHours + type: number + format: float + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + closed_on: + title: ClosedOn + type: string + #below: optional associated data from 'include' parameter + children: + title: Children + type: array + items: + $ref: '#/definitions/idNameObject' + attachments: + title: Attachments + type: array + items: + $ref: '#/definitions/idNameObject' + relations: + title: Realtions + type: array + items: + $ref: '#/definitions/idNameObject' + changesets: + title: Chagesets + type: array + items: + $ref: '#/definitions/idNameObject' + journals: + title: Journals + type: array + items: + title: Journal + type: object properties: - assignable: - type: boolean - issues_visibility: - type: string - time_entries_visibility: + id: + title: Id + type: integer + format: int32 + user: + $ref: '#/definitions/idNameObject' + notes: type: string - users_visibility: + created_on: type: string - permissions: + private_notes: + type: boolean + details: type: array items: - type: string - - $ref: '#/components/schemas/IdName' - CustomField: - type: object - properties: - id: - type: integer - name: - type: string - customized_type: - type: string - enum: - - issue - - project - - time_entry - - version - - document - - user - - group - - time_entry_activity - - issue_priority - - document_category - field_format: - type: string - enum: - - enumeration - - string - - version - - attachment - - user - - list - - link - - float - - int - - date - - bool - - text - regexp: - type: string - min_length: - type: integer - nullable: true - max_length: - type: integer - nullable: true - is_required: - type: boolean - is_filter: - type: boolean - searchable: - type: boolean - multiple: - type: boolean - default_value: - type: string - nullable: true - visible: - type: boolean - trackers: - type: array - items: - $ref: '#/components/schemas/IdName' - roles: - type: array - items: - $ref: '#/components/schemas/Role' - possible_values: - type: array - items: - type: object - properties: - value: - type: string - label: - type: string - Search: - type: object - required: - - id - - title - - type - - url - - description - - datetime - properties: - id: - type: integer - title: - type: string - type: - type: string - url: - type: string - description: - type: string - datetime: - type: string - format: date-time - File: - type: object - required: - - id - - filename - - filesize - - content_type - - description - - content_url - - author - - created_on - - digest - - downloads - properties: - id: - type: integer - filename: - type: string - filesize: - type: integer - content_type: - type: string - description: - type: string - content_url: - type: string - thumbnail_url: - type: string - author: - $ref: '#/components/schemas/IdName' - created_on: - type: string - format: date-time - version: - $ref: '#/components/schemas/IdName' - digest: - type: string - downloads: - type: integer - Errors: - type: object - required: - - errors - properties: - errors: - items: + type: object + properties: + property: + type: string + name: + type: string + old_value: + type: string + new_value: + type: string + watchers: + title: Watchers + type: array + items: + $ref: '#/definitions/idNameObject' + timeEntry: + type: object + title: TimeEntry + required: + - id + - project + - user + - activity + - hours + - comments + - spent_on + - created_on + - updated_on + properties: + id: + title: Id + type: integer + format: int32 + project: + title: Project + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name type: string -tags: - - name: Issues - description: 'Status: Stable, Availablity: 1.0' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Issues' - - name: Projects - description: 'Status: Stable, Availablity: 1.0' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Projects' - - name: Project Memberships - description: 'Status: Alpha, Availablity: 1.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Memberships' - - name: Users - description: 'Status: Stable, Availablity: 1.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Users' - - name: Time Entries - description: 'Status: Stable, Availablity: 1.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries' - - name: News - description: 'Status: Prototype, Note: Prototype implementation for index only, Availablity: 1.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_News' - - name: Issue Relations - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueRelations' - - name: Versions - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Versions' - - name: Wiki Pages - description: 'Status: Alpha, Availablity: 2.2' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_WikiPages' - - name: Queries - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Queries' - - name: Attachments - description: 'Status: Beta, Notes: Adding attachments via the API added in 1.4, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Attachments' - - name: Issue Statuses - description: 'Status: Alpha, Notes: Provides the list of all statuses, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses' - - name: Trackers - description: 'Status: Alpha, Notes: Provides the list of all trackers, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' - - name: Enumerations - description: 'Status: Alpha, Notes: Provides the list of issue priorities and time tracking activities, Availablity: 2.2' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Enumerations' - - name: Issue Categories - description: 'Status: Alpha, Availablity: 1.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_IssueCategories' - - name: Roles - description: 'Status: Alpha, Availablity: 1.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Roles' - - name: Groups - description: 'Status: Alpha, Availablity: 2.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Groups' - - name: Custom Fields - description: 'Status: Alpha, Availablity: 2.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_CustomFields' - - name: Search - description: 'Status: Alpha, Availablity: 3.3' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Search' - - name: Files - description: 'Status: Alpha, Availablity: 3.4' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Files' - - name: My Account - description: 'Status: Alpha, Availablity: 4.1' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_MyAccount' - - name: Journals - description: 'Status: Alpha, Availablity: 5.0' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Journals?parent=Rest_api' + issue: + title: Issue + type: object + required: + - id + properties: + id: + title: Id + type: integer + format: int32 + user: + title: User + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + activity: + title: Activity + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + hours: + title: Hours + type: number + format: float + comments: + title: Comments + type: string + spent_on: + title: SpentOn + type: string + created_on: + title: CreatedOn + type: string + updated_on: + title: UpdatedOn + type: string + issueStatus: + title: IssueStatus + type: object + required: + - id + - name + - is_default + - is_closed + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + is_default: + title: IsDefault + type: boolean + is_closed: + title: IsClosed + type: boolean + tracker: + title: IssueStatus + type: object + required: + - id + - name + - default_status + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + default_status: + title: DefaultStatus + type: object + required: + - id + - name + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + enumeration: + title: Enumeration + type: object + required: + - id + - name + - is_default + properties: + id: + title: Id + type: integer + format: int32 + name: + title: Name + type: string + is_default: + title: IsDefault + type: boolean diff --git a/src/appmixer/redmine/openapi2.yml b/src/appmixer/redmine/openapi2.yml deleted file mode 100644 index 9223a7a25..000000000 --- a/src/appmixer/redmine/openapi2.yml +++ /dev/null @@ -1,928 +0,0 @@ -swagger: '2.0' -info: - title: 'Redmine API' - description: 'Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.' - x-connector-icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC' - version: '1.3' -host: localhost:8080 -basePath: / -schemes: [https] -externalDocs: - description: Redmine API Documentation - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_api' -servers: - - url: '{url}' - description: Redmine URL - variables: - url: - description: Redmine URL - default: 'https://redmine.acme.com' - -##Notes -# PowerApps Custom Connectors do NOT support Operation level Parameter definition - -## Implemented Queries -# -# Projects -# - ProjectsList -# - ProjectShow -# -# Issues -# - IssuesList -# - IssueShow -# - IssueCreate -# - IssueUpdate -# - IssueDelete -# -# Time Entries -# - TimeList -# - TimeShow -# - TimeCreate -# - TimeUpdate -# - TimeDelete -# -# Issue Statuses -# - StatusesList -# -# Trackers -# - TrackersList -# -# +Validation Error Response - - -## "Content-Type" and "Accepts" Header. -# XML is also supported, but I don't use it -consumes: [application/json] -produces: [application/json] - - -## Authentication -# https://swagger.io/docs/specification/2-0/authentication/ -securityDefinitions: - api_key: - type: apiKey - in: header - name: X-Redmine-API-Key - -security: - - api_key: [] - - -## Tags -# https://swagger.io/docs/specification/2-0/grouping-operations-with-tags/ -tags: - - name: 'Projects' - externalDocs: - url: https://www.redmine.org/projects/redmine/wiki/Rest_Projects - - name: 'Issues' - externalDocs: - url: https://www.redmine.org/projects/redmine/wiki/Rest_Issues - - name: 'TimeEntries' - externalDocs: - url: https://www.redmine.org/projects/redmine/wiki/Rest_TimeEntries - - name: 'IssueStatuses' - externalDocs: - url: https://www.redmine.org/projects/redmine/wiki/Rest_IssueStatuses - - name: 'Trackers' - externalDocs: - url: 'https://www.redmine.org/projects/redmine/wiki/Rest_Trackers' - - -## Endpoints -# https://swagger.io/docs/specification/2-0/paths-and-operations/ -paths: - /issues.json: - get: - summary: 'List issues' - description: 'Returns a paginated list of issues. By default, it returns open issues only.' - operationId: IssuesList - tags: [ Issues ] - parameters: - - $ref: '#/parameters/limitParam' - - $ref: '#/parameters/offsetParam' - - name: sort - in: query - description: column to sort with. Append :desc to invert the order. (optional) - required: false - type: string - - name: include - in: query - description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' - required: false - type: string - - name: issue_id - in: query - description: 'get issue with the given id or multiple issues by id using comma to separate id.' - required: false - type: integer - format: int32 - - name: project_id - in: query - description: 'get issues from the project with the given id (a numeric value, not a project identifier).' - required: false - type: integer - format: int32 - - name: subproject_id - in: query - description: 'get issues from the subproject with the given id. You can use project_id=XXX&subproject_id=!* to get only the issues of a given project and none of its subprojects.' - required: false - type: integer - format: int32 - - name: tracker_id - in: query - description: 'get issues from the tracker with the given id' - required: false - type: integer - format: int32 - - name: status_id - in: query - description: 'get issues with the given status id only. Possible values: open, closed, * to get open and closed issues, status id' - required: false - type: string - - name: assigned_to_id - in: query - description: 'get issues which are assigned to the given user id. me can be used instead an ID to fetch all issues from the logged in user (via API key or HTTP auth)' - required: false - type: string - responses: - 200: - description: "OK" - schema: - type: object - required: - - issues - - total_count - - offset - - limit - properties: - issues: #array - title: Issues - type: array - items: - $ref: '#/definitions/issue' - total_count: - $ref: '#/definitions/totalCount' - offset: - $ref: '#/definitions/offset' - limit: - $ref: '#/definitions/limit' - post: - summary: 'Create issue' - description: 'Creates a new issue.' - operationId: IssueCreate - tags: [ Issues ] - parameters: - - name: issue - in: body - required: true - description: 'issue attributes' - schema: - title: Body - type: object - required: - - issue - properties: - issue: - type: object - title: Issue - required: - - project_id - - subject - - priority_id - - tracker_id - properties: - project_id: - title: ProjectId - type: integer - format: int32 - tracker_id: - title: TrackerId - type: integer - format: int32 - status_id: - title: StatusId - type: integer - format: int32 - priority_id: - title: PriorityId - type: integer - format: int32 - subject: - title: Subject - type: string - description: - title: Description - type: string - category_id: - title: CategoryId - type: integer - format: int32 - fixed_version_id: - title: FixedVersionId - type: integer - format: int32 - description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' - assigned_to_id: - title: AssignedToId - type: integer - format: int32 - description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' - parent_issue_id: - title: ParentIssueId - type: integer - format: int32 - description: 'ID of the parent issue' - custom_fields: - title: CustomFields - type: array - items: - type: object - watcher_user_ids: - title: WatcherUserIds - type: array - description: 'Array of user ids to add as watchers' - items: - type: integer - format: int32 - is_private: - title: IsPrivate - type: boolean - estimated_hours: - title: EstimatedHours - type: number - format: float - responses: - 201: - description: 'Created: issue was created' - 422: - $ref: '#/responses/validationError' - /issues/{id}.json: - get: - summary: 'Show issues' - description: 'Returns the issue of given id or identifier.' - operationId: IssueShow - tags: [ Issues ] - parameters: - - $ref: '#/parameters/idParam' - - name: include - in: query - description: 'fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers' - required: false - type: string - responses: - 200: - description: OK - schema: - type: object - required: - - issue - properties: - issue: - $ref: '#/definitions/issue' - put: - summary: 'Update issue' - description: 'Updates a issue.' - operationId: IssueUpdate - tags: [ Issues ] - parameters: - - $ref: '#/parameters/idParam' - - name: issue - in: body - required: true - description: 'issue attributes' - schema: - title: Body - type: object - required: - - issue - properties: - issue: - title: Issue - type: object - properties: - project_id: - title: ProjectId - type: integer - format: int32 - tracker_id: - title: TrackerId - type: integer - format: int32 - status_id: - title: StatusId - type: integer - format: int32 - priority_id: - title: PriorityId - type: integer - format: int32 - subject: - title: Subject - type: string - description: - title: Description - type: string - category_id: - title: CategoryId - type: integer - format: int32 - fixed_version_id: - title: FixedVersionId - type: integer - format: int32 - description: 'ID of the Target Versions (previously called "Fixed Version" and still referred to as such in the API)' - assigned_to_id: - title: AssignedToId - type: integer - format: int32 - description: 'ID of the user to assign the issue to (currently no mechanism to assign by name)' - parent_issue_id: - title: ParentIssueId - type: integer - format: int32 - description: 'ID of the parent issue' - custom_fields: - title: CustomFields - type: array - items: - type: object - watcher_user_ids: - title: WatcherUserIds - type: array - description: 'Array of user ids to add as watchers' - items: - type: integer - format: int32 - is_private: - title: IsPrivate - type: boolean - estimated_hours: - title: EstimatedHours - type: number - format: float - notes: - title: Notes - description: 'Comments about the update' - type: string - private_notes: - title: PrivateNotes - description: 'true if notes are private' - type: boolean - responses: - 201: - description: 'OK' - 422: - $ref: '#/responses/validationError' - delete: - summary: 'Delete issue' - description: 'Deletes a issue.' - operationId: IssueDelete - tags: [ Issues ] - parameters: - - $ref: '#/parameters/idParam' - responses: - 200: - description: OK - -## Parameters -# https://swagger.io/docs/specification/2-0/describing-parameters/ -parameters: - idParam: - name: "id" - in: path - description: "id or identifier of the project/issue/user/timeEntry" - required: true - type: string - limitParam: - name: limit - in: query - description: "the number of items to be present in the response (default is 25, maximum is 100)" - required: false - type: integer - format: int32 - offsetParam: - name: offset - in: query - description: "the offset of the first object to retrieve" - required: false - type: integer - format: int32 - - -## Responses -# https://swagger.io/docs/specification/2-0/describing-responses/ -responses: - validationError: - description: 'Unprocessable Entity' - schema: - type: object - required: - - errors - properties: - errors: - title: Errors - type: array - items: - type: string - - -## Input and Output Models -# Common data structure (schema object) definitions. -definitions: - idNameObject: - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - totalCount: - title: TotalCount - type: integer - format: int32 - offset: - title: Offset - type: integer - format: int32 - limit: - title: Limit - type: integer - format: int32 - project: - type: object - title: Project - required: - - id - - name - - identifier - - description - - status - - created_on - - updated_on - - is_public - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - identifier: - title: Identifier - type: string - description: - title: Description - type: string - status: - title: Status - type: integer - format: int32 - is_public: - title: IsPublic - type: boolean - created_on: - title: CreatedOn - type: string - updated_on: - title: UpdatedOn - type: string - parent: - title: Parent - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - #below: optional associated data from 'include' parameter - issue_categories: - title: IssueCategories - type: array - items: - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - trackers: - title: Trackers - type: array - items: - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - enabled_modules: - title: EnabledModules - type: array - items: - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - time_entry_activities: - title: TimeEntryActivities - type: array - items: - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - issue: - type: object - title: Issue - required: - - id - - project - - tracker - - status - - priority - - author - - subject - - description - - start_date - - due_date - - done_ratio - - is_private - - estimated_hours - - created_on - - updated_on - - closed_on - properties: - id: - title: Id - type: integer - format: int32 - project: - title: Project - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - tracker: - title: Tracker - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - status: - title: Status - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - priority: - title: Priority - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - author: - title: Author - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - assigned_to: - title: AssignedTo - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - subject: - title: Subject - type: string - description: - title: Description - type: string - start_date: - title: StartDate - type: string - due_date: - title: DueDate - type: string - done_ratio: - title: DoneRatio - type: integer - format: int32 - is_private: - title: Is Private - type: boolean - estimated_hours: - title: EstimatedHours - type: number - format: float - created_on: - title: CreatedOn - type: string - updated_on: - title: UpdatedOn - type: string - closed_on: - title: ClosedOn - type: string - #below: optional associated data from 'include' parameter - children: - title: Children - type: array - items: - $ref: '#/definitions/idNameObject' - attachments: - title: Attachments - type: array - items: - $ref: '#/definitions/idNameObject' - relations: - title: Realtions - type: array - items: - $ref: '#/definitions/idNameObject' - changesets: - title: Chagesets - type: array - items: - $ref: '#/definitions/idNameObject' - journals: - title: Journals - type: array - items: - title: Journal - type: object - properties: - id: - title: Id - type: integer - format: int32 - user: - $ref: '#/definitions/idNameObject' - notes: - type: string - created_on: - type: string - private_notes: - type: boolean - details: - type: array - items: - type: object - properties: - property: - type: string - name: - type: string - old_value: - type: string - new_value: - type: string - watchers: - title: Watchers - type: array - items: - $ref: '#/definitions/idNameObject' - timeEntry: - type: object - title: TimeEntry - required: - - id - - project - - user - - activity - - hours - - comments - - spent_on - - created_on - - updated_on - properties: - id: - title: Id - type: integer - format: int32 - project: - title: Project - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - issue: - title: Issue - type: object - required: - - id - properties: - id: - title: Id - type: integer - format: int32 - user: - title: User - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - activity: - title: Activity - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - hours: - title: Hours - type: number - format: float - comments: - title: Comments - type: string - spent_on: - title: SpentOn - type: string - created_on: - title: CreatedOn - type: string - updated_on: - title: UpdatedOn - type: string - issueStatus: - title: IssueStatus - type: object - required: - - id - - name - - is_default - - is_closed - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - is_default: - title: IsDefault - type: boolean - is_closed: - title: IsClosed - type: boolean - tracker: - title: IssueStatus - type: object - required: - - id - - name - - default_status - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - default_status: - title: DefaultStatus - type: object - required: - - id - - name - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - enumeration: - title: Enumeration - type: object - required: - - id - - name - - is_default - properties: - id: - title: Id - type: integer - format: int32 - name: - title: Name - type: string - is_default: - title: IsDefault - type: boolean diff --git a/src/appmixer/redmine/package.json b/src/appmixer/redmine/package.json index fd371515b..21cd5f819 100644 --- a/src/appmixer/redmine/package.json +++ b/src/appmixer/redmine/package.json @@ -1,5 +1,5 @@ { - "name": "appmixer.redmineapi", + "name": "appmixer.redmine", "version": "1.0.0", "private": true, "dependencies": { diff --git a/src/appmixer/redmine/service.json b/src/appmixer/redmine/service.json index 70382f625..5ca9f706d 100644 --- a/src/appmixer/redmine/service.json +++ b/src/appmixer/redmine/service.json @@ -1,7 +1,7 @@ { "version": "1.0.0", - "name": "appmixer.redmineapi", - "label": "Redmineapi", + "name": "appmixer.redmine", + "label": "Redmine", "description": "

Redmine is a flexible project management web application. Written using the Ruby on Rails framework, it is cross-platform and cross-database.

", "category": "applications", "icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu/AAD/AADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD/AADUAADiAAziAAvUAADdCwDdCwD/AADdCgDbCQDiAAvfAAa/AADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC/AADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB/AACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD+ZBVd/T6V7iAQuPaZGGyjGM38ax3++aUHHNr91ZZt5D7vHU+t5eAatA+9eez4gRwMA4Q0hUoGCm3+rj8SBQkXYdHOtDTk+SdF+N95FqLGFcNMp36IxVriGQAAAAFvck5UAc+id5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW+2c0fZ7Pg8enAe5p62d7+dBfhzBAT+EgapgkPU6tCw8J/jCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0+nTWSEDDJmEZBnluSGbSMiBXLYgL7+AqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR/YND/s4aGRygd5XyMMoz7FybQnEQ+hXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8+1W6to7EZt+Qzs0tZWF7Rzp2HQB7Puf+weGR+HddxyenPjfAmQ/hUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0/w7GV4EQp29L2v8C/wDtc2dUgZNJ+BAAAAAElFTkSuQmCC" From ebcab194840140aa1bd3971c37aa5a2210d28fce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 13:17:19 +0100 Subject: [PATCH 06/11] Update issue_id parameter type to string in openapi.yml fix required fields outports for IssueCreate --- src/appmixer/redmine/openapi.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml index ef1ae79ef..754bb96f3 100644 --- a/src/appmixer/redmine/openapi.yml +++ b/src/appmixer/redmine/openapi.yml @@ -113,8 +113,7 @@ paths: in: query description: 'get issue with the given id or multiple issues by id using comma to separate id.' required: false - type: integer - format: int32 + type: string - name: project_id in: query description: 'get issues from the project with the given id (a numeric value, not a project identifier).' From 1de8b4850672305f239cbd9bf85c391f93fc9443 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 13:17:47 +0100 Subject: [PATCH 07/11] Refactor IssueCreate.js and IssueUpdate/component.json Update IssueCreate.js to return the data received from httpRequest() instead of an empty object. Update component.json files to change the type of "issue_id" property from integer to string. Update openapi.yml to add required properties for creating an issue and update the response schema for creating an issue. Update openapi.yml to remove the "issue" property from the required properties for updating an issue. Update openapi.yml to change the response status code for updating an issue from 201 to 204. --- .../redmine/core/IssueCreate/IssueCreate.js | 5 +- .../redmine/core/IssueCreate/component.json | 319 +++++++++++++++++- .../redmine/core/IssueUpdate/component.json | 5 +- .../redmine/core/IssuesList/component.json | 4 +- src/appmixer/redmine/openapi.yml | 20 +- 5 files changed, 338 insertions(+), 15 deletions(-) diff --git a/src/appmixer/redmine/core/IssueCreate/IssueCreate.js b/src/appmixer/redmine/core/IssueCreate/IssueCreate.js index 4de691f1e..36b82c48f 100644 --- a/src/appmixer/redmine/core/IssueCreate/IssueCreate.js +++ b/src/appmixer/redmine/core/IssueCreate/IssueCreate.js @@ -6,10 +6,9 @@ module.exports = { receive: async function(context) { - await this.httpRequest(context); + const { data } = await this.httpRequest(context); - // http 204 No Content on success - return context.sendJson({}, 'out'); + return context.sendJson(data, 'out'); }, httpRequest: async function(context) { diff --git a/src/appmixer/redmine/core/IssueCreate/component.json b/src/appmixer/redmine/core/IssueCreate/component.json index e14c9e6c5..ba2a621bd 100644 --- a/src/appmixer/redmine/core/IssueCreate/component.json +++ b/src/appmixer/redmine/core/IssueCreate/component.json @@ -11,7 +11,10 @@ "schema": { "type": "object", "required": [ - "issue" + "issue|project_id", + "issue|subject", + "issue|priority_id", + "issue|tracker_id" ], "properties": { "issue|project_id": { @@ -168,7 +171,7 @@ "type": "textarea", "index": 11, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [23131539]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [97824316]." }, "issue|is_private": { "type": "toggle", @@ -189,7 +192,317 @@ "outPorts": [ { "name": "out", - "options": [] + "options": [ + { + "label": "Issue", + "value": "issue" + }, + { + "label": "Issue Id", + "value": "issue.id" + }, + { + "label": "Issue Project", + "value": "issue.project" + }, + { + "label": "Issue Project Id", + "value": "issue.project.id" + }, + { + "label": "Issue Project Name", + "value": "issue.project.name" + }, + { + "label": "Issue Tracker", + "value": "issue.tracker" + }, + { + "label": "Issue Tracker Id", + "value": "issue.tracker.id" + }, + { + "label": "Issue Tracker Name", + "value": "issue.tracker.name" + }, + { + "label": "Issue Status", + "value": "issue.status" + }, + { + "label": "Issue Status Id", + "value": "issue.status.id" + }, + { + "label": "Issue Status Name", + "value": "issue.status.name" + }, + { + "label": "Issue Priority", + "value": "issue.priority" + }, + { + "label": "Issue Priority Id", + "value": "issue.priority.id" + }, + { + "label": "Issue Priority Name", + "value": "issue.priority.name" + }, + { + "label": "Issue Author", + "value": "issue.author" + }, + { + "label": "Issue Author Id", + "value": "issue.author.id" + }, + { + "label": "Issue Author Name", + "value": "issue.author.name" + }, + { + "label": "Issue Assigned To", + "value": "issue.assigned_to" + }, + { + "label": "Issue Assigned To Id", + "value": "issue.assigned_to.id" + }, + { + "label": "Issue Assigned To Name", + "value": "issue.assigned_to.name" + }, + { + "label": "Issue Subject", + "value": "issue.subject" + }, + { + "label": "Issue Description", + "value": "issue.description" + }, + { + "label": "Issue Start Date", + "value": "issue.start_date" + }, + { + "label": "Issue Due Date", + "value": "issue.due_date" + }, + { + "label": "Issue Done Ratio", + "value": "issue.done_ratio" + }, + { + "label": "Issue Is Private", + "value": "issue.is_private" + }, + { + "label": "Issue Estimated Hours", + "value": "issue.estimated_hours" + }, + { + "label": "Issue Created On", + "value": "issue.created_on" + }, + { + "label": "Issue Updated On", + "value": "issue.updated_on" + }, + { + "label": "Issue Closed On", + "value": "issue.closed_on" + }, + { + "label": "Issue Children", + "value": "issue.children", + "schema": { + "title": "Children", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + } + }, + { + "label": "Issue Attachments", + "value": "issue.attachments", + "schema": { + "title": "Attachments", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + } + }, + { + "label": "Issue Relations", + "value": "issue.relations", + "schema": { + "title": "Realtions", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + } + }, + { + "label": "Issue Changesets", + "value": "issue.changesets", + "schema": { + "title": "Chagesets", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + } + }, + { + "label": "Issue Journals", + "value": "issue.journals", + "schema": { + "title": "Journals", + "type": "array", + "items": { + "title": "Journal", + "type": "object", + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "user": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + }, + "notes": { + "type": "string" + }, + "created_on": { + "type": "string" + }, + "private_notes": { + "type": "boolean" + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "property": { + "type": "string" + }, + "name": { + "type": "string" + }, + "old_value": { + "type": "string" + }, + "new_value": { + "type": "string" + } + } + } + } + } + } + } + }, + { + "label": "Issue Watchers", + "value": "issue.watchers", + "schema": { + "title": "Watchers", + "type": "array", + "items": { + "type": "object", + "required": [ + "id", + "name" + ], + "properties": { + "id": { + "title": "Id", + "type": "integer" + }, + "name": { + "title": "Name", + "type": "string" + } + } + } + } + } + ] } ], "properties": {}, diff --git a/src/appmixer/redmine/core/IssueUpdate/component.json b/src/appmixer/redmine/core/IssueUpdate/component.json index df4b090d5..9852b03b7 100644 --- a/src/appmixer/redmine/core/IssueUpdate/component.json +++ b/src/appmixer/redmine/core/IssueUpdate/component.json @@ -11,8 +11,7 @@ "schema": { "type": "object", "required": [ - "id", - "issue" + "id" ], "properties": { "id": { @@ -190,7 +189,7 @@ "type": "textarea", "index": 12, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [44774447]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [-85262415]." }, "issue|is_private": { "type": "toggle", diff --git a/src/appmixer/redmine/core/IssuesList/component.json b/src/appmixer/redmine/core/IssuesList/component.json index a58778ef5..932c546dd 100644 --- a/src/appmixer/redmine/core/IssuesList/component.json +++ b/src/appmixer/redmine/core/IssuesList/component.json @@ -25,7 +25,7 @@ "type": "string" }, "issue_id": { - "type": "integer" + "type": "string" }, "project_id": { "type": "integer" @@ -72,7 +72,7 @@ "tooltip": "

fetch associated data (optional, use comma to fetch multiple associations). Possible values: children,attachments,relations,changesets,journals,watchers

" }, "issue_id": { - "type": "number", + "type": "text", "index": 4, "label": "Issue Id", "tooltip": "

get issue with the given id or multiple issues by id using comma to separate id.

" diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml index 754bb96f3..9de628d7e 100644 --- a/src/appmixer/redmine/openapi.yml +++ b/src/appmixer/redmine/openapi.yml @@ -178,7 +178,10 @@ paths: title: Body type: object required: - - issue + - issue|project_id + - issue|subject + - issue|priority_id + - issue|tracker_id properties: issue: type: object @@ -251,7 +254,16 @@ paths: format: float responses: 201: - description: 'Created: issue was created' + description: '' + content: + application/json: + schema: + type: object + required: + - issue + properties: + issue: + $ref: '#/definitions/issue' 422: $ref: '#/responses/validationError' /issues/{id}.json: @@ -292,7 +304,6 @@ paths: title: Body type: object required: - - issue properties: issue: title: Issue @@ -367,7 +378,8 @@ paths: description: 'true if notes are private' type: boolean responses: - 201: + 204: + # There is no response body even though the documentation says so in https://www.redmine.org/projects/redmine/wiki/Rest_Issues#Updating-an-issue description: 'OK' 422: $ref: '#/responses/validationError' From 35c9837f447a74bb12fe5c9e102e1355c092f540 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 13:39:55 +0100 Subject: [PATCH 08/11] Update issue descriptions --- src/appmixer/redmine/core/IssueCreate/component.json | 4 ++-- src/appmixer/redmine/core/IssueDelete/component.json | 2 +- src/appmixer/redmine/core/IssueShow/component.json | 2 +- src/appmixer/redmine/core/IssueUpdate/component.json | 4 ++-- src/appmixer/redmine/core/IssuesList/component.json | 2 +- src/appmixer/redmine/openapi.yml | 5 ----- 6 files changed, 7 insertions(+), 12 deletions(-) diff --git a/src/appmixer/redmine/core/IssueCreate/component.json b/src/appmixer/redmine/core/IssueCreate/component.json index ba2a621bd..7eb7e68ea 100644 --- a/src/appmixer/redmine/core/IssueCreate/component.json +++ b/src/appmixer/redmine/core/IssueCreate/component.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "appmixer.redmine.core.IssueCreate", "author": "Appmixer ", - "description": "

Creates a new issue.

", + "description": "

Creates a new issue.

", "private": false, "quota": {}, "inPorts": [ @@ -171,7 +171,7 @@ "type": "textarea", "index": 11, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [97824316]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [58466105]." }, "issue|is_private": { "type": "toggle", diff --git a/src/appmixer/redmine/core/IssueDelete/component.json b/src/appmixer/redmine/core/IssueDelete/component.json index 791114737..9463641b4 100644 --- a/src/appmixer/redmine/core/IssueDelete/component.json +++ b/src/appmixer/redmine/core/IssueDelete/component.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "appmixer.redmine.core.IssueDelete", "author": "Appmixer ", - "description": "

Deletes a issue.

", + "description": "

Deletes a issue.

", "private": false, "quota": {}, "inPorts": [ diff --git a/src/appmixer/redmine/core/IssueShow/component.json b/src/appmixer/redmine/core/IssueShow/component.json index e4e8e6359..2f71064b6 100644 --- a/src/appmixer/redmine/core/IssueShow/component.json +++ b/src/appmixer/redmine/core/IssueShow/component.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "appmixer.redmine.core.IssueShow", "author": "Appmixer ", - "description": "

Returns the issue of given id or identifier.

", + "description": "

Returns the issue of given id or identifier.

", "private": false, "quota": {}, "inPorts": [ diff --git a/src/appmixer/redmine/core/IssueUpdate/component.json b/src/appmixer/redmine/core/IssueUpdate/component.json index 9852b03b7..680835244 100644 --- a/src/appmixer/redmine/core/IssueUpdate/component.json +++ b/src/appmixer/redmine/core/IssueUpdate/component.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "appmixer.redmine.core.IssueUpdate", "author": "Appmixer ", - "description": "

Updates a issue.

", + "description": "

Updates a issue.

", "private": false, "quota": {}, "inPorts": [ @@ -189,7 +189,7 @@ "type": "textarea", "index": 12, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [-85262415]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [93781903]." }, "issue|is_private": { "type": "toggle", diff --git a/src/appmixer/redmine/core/IssuesList/component.json b/src/appmixer/redmine/core/IssuesList/component.json index 932c546dd..0f608710a 100644 --- a/src/appmixer/redmine/core/IssuesList/component.json +++ b/src/appmixer/redmine/core/IssuesList/component.json @@ -2,7 +2,7 @@ "version": "1.0.0", "name": "appmixer.redmine.core.IssuesList", "author": "Appmixer ", - "description": "

Returns a paginated list of issues. By default, it returns open issues only.

", + "description": "

Returns a paginated list of issues. By default, it returns open issues only.

", "private": false, "quota": {}, "inPorts": [ diff --git a/src/appmixer/redmine/openapi.yml b/src/appmixer/redmine/openapi.yml index 9de628d7e..107805076 100644 --- a/src/appmixer/redmine/openapi.yml +++ b/src/appmixer/redmine/openapi.yml @@ -92,7 +92,6 @@ tags: paths: /issues.json: get: - summary: 'List issues' description: 'Returns a paginated list of issues. By default, it returns open issues only.' operationId: IssuesList tags: [ Issues ] @@ -165,7 +164,6 @@ paths: limit: $ref: '#/definitions/limit' post: - summary: 'Create issue' description: 'Creates a new issue.' operationId: IssueCreate tags: [ Issues ] @@ -268,7 +266,6 @@ paths: $ref: '#/responses/validationError' /issues/{id}.json: get: - summary: 'Show issues' description: 'Returns the issue of given id or identifier.' operationId: IssueShow tags: [ Issues ] @@ -290,7 +287,6 @@ paths: issue: $ref: '#/definitions/issue' put: - summary: 'Update issue' description: 'Updates a issue.' operationId: IssueUpdate tags: [ Issues ] @@ -384,7 +380,6 @@ paths: 422: $ref: '#/responses/validationError' delete: - summary: 'Delete issue' description: 'Deletes a issue.' operationId: IssueDelete tags: [ Issues ] From ccdf3d62a5f41664384822bc8ecaef1d8bd56b02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 14:51:34 +0100 Subject: [PATCH 09/11] Update Redmine authentication and issue components --- src/appmixer/redmine/README | 66 +++++++++++++++++++ src/appmixer/redmine/auth.js | 32 +++++++-- .../redmine/core/IssueCreate/component.json | 2 +- .../redmine/core/IssueUpdate/component.json | 2 +- 4 files changed, 95 insertions(+), 7 deletions(-) diff --git a/src/appmixer/redmine/README b/src/appmixer/redmine/README index 18b46f761..583345784 100644 --- a/src/appmixer/redmine/README +++ b/src/appmixer/redmine/README @@ -5,3 +5,69 @@ ```sh appmixer init openapi ./redmine/openapi.yml ./redmine/ ``` + +## Manual Updates + +Apply the following manual updates since those are not covered by the OpenAPI generator. + +### auth.js + +Replace the whole content of the file with: + +``` +'use strict'; + +module.exports = { + + type: 'apiKey', + + definition: { + + auth: { + apiKey: { + type: 'text', + name: 'API Key', + tooltip: 'Enter your API key.' + }, + 'url': { type: 'text', name: 'url', tooltip: 'Redmine URL' } + }, + + replaceVariables(context, str) { + Object.keys(this.auth).forEach(variableName => { + str = str.replaceAll('{' + variableName + '}', context[variableName]); + }); + return str; + }, + + async requestProfileInfo(context) { + const method = 'GET'; + const url = '/my/account.json'; + const baseUrl = context.url; + const options = { method: method, url: baseUrl + url }; + options.headers = { + 'X-Redmine-API-Key': '{apiKey}' + }; + options.headers = JSON.parse(this.replaceVariables(context, JSON.stringify(options.headers))); + const { data } = await context.httpRequest(options); + // Return string in format: admin - abc*** + const info = `${data.user.login} - ${data.user.api_key.slice(0, 3)}***` + return { info }; + }, + + accountNameFromProfileInfo: 'info', + + async validate(context) { + const method = 'GET'; + const url = '/my/account.json'; + const baseUrl = context.url; + const options = { method: method, url: baseUrl + url }; + options.headers = { + 'X-Redmine-API-Key': '{apiKey}' + }; + options.headers = JSON.parse(this.replaceVariables(context, JSON.stringify(options.headers))); + await context.httpRequest(options); + return true; + } + } +}; +``` diff --git a/src/appmixer/redmine/auth.js b/src/appmixer/redmine/auth.js index 8e7a265c2..666f84c5c 100644 --- a/src/appmixer/redmine/auth.js +++ b/src/appmixer/redmine/auth.js @@ -1,7 +1,5 @@ 'use strict'; -const lib = require('./lib'); - module.exports = { type: 'apiKey', @@ -16,8 +14,6 @@ module.exports = { }, 'url': { type: 'text', name: 'url', tooltip: 'Redmine URL' } }, - // TODO: hide key partialy. Also show domain - accountNameFromProfileInfo: 'apiKey', replaceVariables(context, str) { Object.keys(this.auth).forEach(variableName => { @@ -26,7 +22,33 @@ module.exports = { return str; }, - validate: context => { + async requestProfileInfo(context) { + const method = 'GET'; + const url = '/my/account.json'; + const baseUrl = context.url; + const options = { method: method, url: baseUrl + url }; + options.headers = { + 'X-Redmine-API-Key': '{apiKey}' + }; + options.headers = JSON.parse(this.replaceVariables(context, JSON.stringify(options.headers))); + const { data } = await context.httpRequest(options); + // Return string in format: admin - abc*** + const info = `${data.user.login} - ${data.user.api_key.slice(0, 3)}***` + return { info }; + }, + + accountNameFromProfileInfo: 'info', + + async validate(context) { + const method = 'GET'; + const url = '/my/account.json'; + const baseUrl = context.url; + const options = { method: method, url: baseUrl + url }; + options.headers = { + 'X-Redmine-API-Key': '{apiKey}' + }; + options.headers = JSON.parse(this.replaceVariables(context, JSON.stringify(options.headers))); + await context.httpRequest(options); return true; } } diff --git a/src/appmixer/redmine/core/IssueCreate/component.json b/src/appmixer/redmine/core/IssueCreate/component.json index 7eb7e68ea..3139b38c1 100644 --- a/src/appmixer/redmine/core/IssueCreate/component.json +++ b/src/appmixer/redmine/core/IssueCreate/component.json @@ -171,7 +171,7 @@ "type": "textarea", "index": 11, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [58466105]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [-42962995]." }, "issue|is_private": { "type": "toggle", diff --git a/src/appmixer/redmine/core/IssueUpdate/component.json b/src/appmixer/redmine/core/IssueUpdate/component.json index 680835244..7228d5b24 100644 --- a/src/appmixer/redmine/core/IssueUpdate/component.json +++ b/src/appmixer/redmine/core/IssueUpdate/component.json @@ -189,7 +189,7 @@ "type": "textarea", "index": 12, "label": "Issue Watcher User Ids", - "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [93781903]." + "tooltip": "

Array of user ids to add as watchers

JSON array. Example: [36849599]." }, "issue|is_private": { "type": "toggle", From b563cddaa05bb4b68077d05915c4b1c2093646ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 14:53:53 +0100 Subject: [PATCH 10/11] eslint --- src/appmixer/redmine/auth.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/appmixer/redmine/auth.js b/src/appmixer/redmine/auth.js index 666f84c5c..6bed96b9b 100644 --- a/src/appmixer/redmine/auth.js +++ b/src/appmixer/redmine/auth.js @@ -33,7 +33,7 @@ module.exports = { options.headers = JSON.parse(this.replaceVariables(context, JSON.stringify(options.headers))); const { data } = await context.httpRequest(options); // Return string in format: admin - abc*** - const info = `${data.user.login} - ${data.user.api_key.slice(0, 3)}***` + const info = `${data.user.login} - ${data.user.api_key.slice(0, 3)}***`; return { info }; }, From c914c234297dbfdfc4f6fa4471a5a3167bab8ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Hofman?= Date: Wed, 17 Jan 2024 15:12:43 +0100 Subject: [PATCH 11/11] add test-flow --- src/appmixer/redmine/test-flow.json | 196 ++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 src/appmixer/redmine/test-flow.json diff --git a/src/appmixer/redmine/test-flow.json b/src/appmixer/redmine/test-flow.json new file mode 100644 index 000000000..de28ac8eb --- /dev/null +++ b/src/appmixer/redmine/test-flow.json @@ -0,0 +1,196 @@ +{ + "name": "Redmine E2E Test Case", + "description": "Testing Redmine issues", + "flow": { + "27653074-3bab-43be-811a-3b41cd973a83": { + "type": "appmixer.utils.controls.OnStart", + "x": -64, + "y": 0, + "source": {}, + "version": "1.0.0", + "config": { + "transform": {} + } + }, + "c40e6a02-2417-49cd-be0d-df6d469052b7": { + "type": "appmixer.redmine.core.IssuesList", + "x": 80, + "y": 0, + "source": { + "in": { + "27653074-3bab-43be-811a-3b41cd973a83": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "27653074-3bab-43be-811a-3b41cd973a83": { + "out": { + "type": "json2new", + "modifiers": { + "limit": {}, + "issue_id": {} + }, + "lambda": { + "limit": 100, + "issue_id": "9,55,56" + } + } + } + } + } + } + }, + "7b970ad1-5430-4531-8b4c-d45c665da01d": { + "type": "appmixer.redmine.core.IssueCreate", + "x": 224, + "y": 0, + "source": { + "in": { + "c40e6a02-2417-49cd-be0d-df6d469052b7": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "c40e6a02-2417-49cd-be0d-df6d469052b7": { + "out": { + "type": "json2new", + "modifiers": { + "issue|subject": {}, + "issue|description": {}, + "issue|priority_id": {}, + "issue|project_id": {}, + "issue|tracker_id": {} + }, + "lambda": { + "issue|subject": "Hello world", + "issue|description": "My computer is broken. Id doesn't work!", + "issue|priority_id": 2, + "issue|project_id": 1, + "issue|tracker_id": 3 + } + } + } + } + } + } + }, + "be572c56-97f4-4e89-832c-2e071a74577a": { + "type": "appmixer.redmine.core.IssueShow", + "x": 496, + "y": 0, + "version": "1.0.0", + "source": { + "in": { + "b67a9b9e-6740-4422-9661-3a5d7c159f1d": [ + "out" + ] + } + }, + "config": { + "transform": { + "in": { + "b67a9b9e-6740-4422-9661-3a5d7c159f1d": { + "out": { + "type": "json2new", + "modifiers": { + "id": { + "2d2272bc-00ad-480e-a8f8-3e092bdd7fa3": { + "variable": "$.7b970ad1-5430-4531-8b4c-d45c665da01d.out.issue.id", + "functions": [] + } + } + }, + "lambda": { + "id": "{{{2d2272bc-00ad-480e-a8f8-3e092bdd7fa3}}}" + } + } + } + } + } + } + }, + "b67a9b9e-6740-4422-9661-3a5d7c159f1d": { + "type": "appmixer.redmine.core.IssueUpdate", + "x": 352, + "y": 0, + "source": { + "in": { + "7b970ad1-5430-4531-8b4c-d45c665da01d": [ + "out" + ] + } + }, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "7b970ad1-5430-4531-8b4c-d45c665da01d": { + "out": { + "type": "json2new", + "modifiers": { + "id": { + "bc86fe69-4ca8-4479-87fc-82c968d17527": { + "variable": "$.7b970ad1-5430-4531-8b4c-d45c665da01d.out.issue.id", + "functions": [] + } + }, + "issue|subject": {}, + "issue|notes": {} + }, + "lambda": { + "id": "{{{bc86fe69-4ca8-4479-87fc-82c968d17527}}}", + "issue|subject": "Updated Hello world", + "issue|notes": "noooooootes updaed" + } + } + } + } + } + } + }, + "e49ec3ea-c240-42dd-a15a-f2bd7efa5660": { + "type": "appmixer.redmine.core.IssueDelete", + "x": 656, + "y": 0, + "version": "1.0.0", + "config": { + "transform": { + "in": { + "be572c56-97f4-4e89-832c-2e071a74577a": { + "out": { + "type": "json2new", + "modifiers": { + "id": { + "28191113-5b0e-4437-850a-048ff00f1841": { + "variable": "$.be572c56-97f4-4e89-832c-2e071a74577a.out.issue.id", + "functions": [] + } + } + }, + "lambda": { + "id": "{{{28191113-5b0e-4437-850a-048ff00f1841}}}" + } + } + } + } + } + }, + "source": { + "in": { + "be572c56-97f4-4e89-832c-2e071a74577a": [ + "out" + ] + } + } + } + }, + "thumbnail": "data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%25%22%20height%3D%22100%25%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20joint-selector%3D%22svg%22%20id%3D%22v-379%22%20viewBox%3D%22-74%20-10%20830.296875%20111.80000305175781%22%3E%3Cstyle%20id%3D%22v-380%22%20type%3D%22text%2Fcss%22%3E%3C!%5BCDATA%5Bfont-family%3A%20sans-serif%3B%20font-display%3A%20auto%3B%20font-style%3A%20normal%3B%20font-size%3A%20100%25%5D%5D%3E%3C%2Fstyle%3E%3Cdefs%20joint-selector%3D%22defs%22%3E%3Cmarker%20id%3D%22v-42056921440%22%20orient%3D%22auto%22%20overflow%3D%22visible%22%20markerUnits%3D%22userSpaceOnUse%22%3E%3Cpath%20id%3D%22v-370%22%20stroke%3D%22%232853FF%22%20fill%3D%22%232853FF%22%20transform%3D%22rotate(180)%22%20display%3D%22none%22%2F%3E%3C%2Fmarker%3E%3C%2Fdefs%3E%3Cg%20joint-selector%3D%22layers%22%20class%3D%22joint-layers%22%3E%3Cg%20class%3D%22joint-back-layer%22%2F%3E%3Cg%20class%3D%22joint-cells-layer%20joint-viewport%22%3E%3Cg%20model-id%3D%222ceeeb39-a73e-465e-9414-ade261ff24b5%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_13%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-367%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%2010.5%2034%20L%2074.5%2034%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-368%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%2010.5%2034%20L%2074.5%2034%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%2225d60bb9-93d1-46a6-aa80-a1a4d47a7c94%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_14%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-371%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20154.5%2034%20L%20218.5%2034%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-372%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20154.5%2034%20L%20218.5%2034%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%2220a7ef8d-a65e-49fe-99bc-6c0e409edf53%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_15%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-373%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20426.5%2034%20L%20490.5%2034%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-374%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20426.5%2034%20L%20490.5%2034%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%2255d94304-4c41-4893-a121-4f986a923aff%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_16%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-375%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20298.5%2034%20L%20346.5%2034%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-376%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20298.5%2034%20L%20346.5%2034%22%2F%3E%3C%2Fg%3E%3Cg%20model-id%3D%22757f609a-a895-47e2-b537-a68c06653416%22%20data-type%3D%22diagram.Link%22%20id%3D%22j_17%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-link%20joint-link%20joint-theme-default%22%3E%3Cpath%20joint-selector%3D%22wrapper%22%20id%3D%22v-377%22%20fill%3D%22transparent%22%20cursor%3D%22pointer%22%20stroke%3D%22transparent%22%20stroke-width%3D%2224%22%20d%3D%22M%20570.5%2034%20L%20650.5%2034%22%2F%3E%3Cpath%20joint-selector%3D%22line%22%20id%3D%22v-378%22%20fill%3D%22transparent%22%20pointer-events%3D%22none%22%20stroke%3D%22%232853FF%22%20stroke-width%3D%221%22%20marker-end%3D%22url(%23v-42056921440)%22%20d%3D%22M%20570.5%2034%20L%20650.5%2034%22%2F%3E%3C%2Fg%3E%3C!--z-index%3A-1--%3E%3Cg%20model-id%3D%2227653074-3bab-43be-811a-3b41cd973a83%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_18%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20data-component-name%3D%22appmixer.utils.controls.OnStart%22%20data-component-type%3D%22trigger%22%20magnet%3D%22false%22%20transform%3D%22translate(-64%2C0)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-265%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%226%22%20ry%3D%226%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-266%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2256.5234375%22%20height%3D%2217.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C5.7%2C75.3)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-267%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EOnStart%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-268%22%20xlink%3Ahref%3D%22data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij4KICA8ZyBpZD0iR3JvdXBfNTQ3IiBkYXRhLW5hbWU9Ikdyb3VwIDU0NyIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTI4OSAtMzUpIj4KICAgIDxyZWN0IGlkPSJSZWN0YW5nbGVfMzQ2OCIgZGF0YS1uYW1lPSJSZWN0YW5nbGUgMzQ2OCIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyODkgMzUpIiBmaWxsPSJub25lIi8%2BCiAgICA8cGF0aCBpZD0iY29nIiBkPSJNMTgsNy4zNDdhMS45LDEuOSwwLDAsMCwwLDMuMzA3bC0uNjQ1LDIuMTY1YTEuODk1LDEuODk1LDAsMCwwLTIsMi43NTJMMTMuNSwxNy4wMTNBMS44OTQsMS44OTQsMCwwLDAsMTAuNDcsMThsLTIuOTYxLS4wMDdhMS44OTQsMS44OTQsMCwwLDAtMy4wMjYtLjk4NUwyLjYyOSwxNS41NTVBMS44OTUsMS44OTUsMCwwLDAsLjY0NCwxMi44MTZMMCwxMC42NDJBMS45LDEuOSwwLDAsMCwuOTQ2LDksMS44OTQsMS44OTQsMCwwLDAsMCw3LjM1OEwuNjQzLDUuMTg0QTEuODk1LDEuODk1LDAsMCwwLDIuNjMsMi40NDVMNC40ODIuOTkyYTEuODk0LDEuODk0LDAsMCwwLDEuNzgxLjMzMkExLjg5NCwxLjg5NCwwLDAsMCw3LjUwOC4wMDdMMTAuNDcxLDBhMS44OTQsMS44OTQsMCwwLDAsMS4yNDYsMS4zMjNBMS44OTQsMS44OTQsMCwwLDAsMTMuNS45ODdMMTUuMzU4LDIuNDNhMS44OTUsMS44OTUsMCwwLDAsMiwyLjc1MkwxOCw3LjM0NlpNMTMuMzQxLDMuMzEyYzAtLjA1NywwLS4xMTIsMC0uMTY5bC0uMDcyLS4wNTZBMy42OTMsMy42OTMsMCwwLDEsOS40LDEuOGwtLjgxNCwwQTMuNjksMy42OSwwLDAsMSw0LjcyMSwzLjA5MWwtLjA4NS4wNjhBMy43LDMuNywwLDAsMSwyLjA1MSw2Ljg0LDMuNjksMy42OSwwLDAsMSwyLjc0Niw5YTMuNywzLjcsMCwwLDEtLjY5NSwyLjE2QTMuNywzLjcsMCwwLDEsNC42MzYsMTQuODRsLjA4Ni4wNjhhMy42OTQsMy42OTQsMCwwLDEsMy44NiwxLjI4N2wuODE0LDBhMy42OSwzLjY5LDAsMCwxLDMuODc2LTEuMjg1bC4wNzItLjA1NmEzLjcsMy43LDAsMCwxLDIuNTg2LTMuNywzLjcsMy43LDAsMCwxLDAtNC4zMiwzLjcsMy43LDAsMCwxLTIuNTg4LTMuNTI3Wk05LDEyLjZBMy42LDMuNiwwLDEsMSwxMi42LDksMy42LDMuNiwwLDAsMSw5LDEyLjZabTAtMS44QTEuOCwxLjgsMCwxLDAsNy4yLDksMS44LDEuOCwwLDAsMCw5LDEwLjhaIiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgyOTIgMzgpIi8%2BCiAgPC9nPgo8L3N2Zz4K%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-269%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-270%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-271%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-264%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%224%22%20ry%3D%224%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-272%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-273%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-274%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-276%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-275%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A0--%3E%3Cg%20model-id%3D%22c40e6a02-2417-49cd-be0d-df6d469052b7%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_19%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20data-component-name%3D%22appmixer.redmine.core.IssuesList%22%20data-component-type%3D%22action%22%20magnet%3D%22false%22%20transform%3D%22translate(80%2C0)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-278%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-279%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2270.03125%22%20height%3D%2217.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-1%2C75.3)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-280%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EIssuesList%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-281%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu%2FAAD%2FAADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD%2FAADUAADiAAziAAvUAADdCwDdCwD%2FAADdCgDbCQDiAAvfAAa%2FAADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC%2FAADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB%2FAACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD%2BZBVd%2FT6V7iAQuPaZGGyjGM38ax3%2B%2BaUHHNr91ZZt5D7vHU%2Bt5eAatA%2B9eez4gRwMA4Q0hUoGCm3%2Brj8SBQkXYdHOtDTk%2BSdF%2BN95FqLGFcNMp36IxVriGQAAAAFvck5UAc%2Bid5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW%2B2c0fZ7Pg8enAe5p62d7%2BdBfhzBAT%2BEgapgkPU6tCw8J%2FjCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0%2BnTWSEDDJmEZBnluSGbSMiBXLYgL7%2BAqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR%2FYND%2Fs4aGRygd5XyMMoz7FybQnEQ%2BhXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8%2B1W6to7EZt%2BQzs0tZWF7Rzp2HQB7Puf%2BweGR%2BHddxyenPjfAmQ%2FhUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0%2Fw7GV4EQp29L2v8C%2FwDtc2dUgZNJ%2BBAAAAAElFTkSuQmCC%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-282%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-283%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-284%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-277%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-285%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-286%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-287%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-292%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-291%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-288%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-289%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-290%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-294%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-293%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A1--%3E%3Cg%20model-id%3D%227b970ad1-5430-4531-8b4c-d45c665da01d%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_20%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20data-component-name%3D%22appmixer.redmine.core.IssueCreate%22%20data-component-type%3D%22action%22%20magnet%3D%22false%22%20transform%3D%22translate(224%2C0)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-296%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-297%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2282.7890625%22%20height%3D%2217.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7.4%2C75.3)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-298%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EIssueCreate%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-299%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu%2FAAD%2FAADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD%2FAADUAADiAAziAAvUAADdCwDdCwD%2FAADdCgDbCQDiAAvfAAa%2FAADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC%2FAADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB%2FAACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD%2BZBVd%2FT6V7iAQuPaZGGyjGM38ax3%2B%2BaUHHNr91ZZt5D7vHU%2Bt5eAatA%2B9eez4gRwMA4Q0hUoGCm3%2Brj8SBQkXYdHOtDTk%2BSdF%2BN95FqLGFcNMp36IxVriGQAAAAFvck5UAc%2Bid5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW%2B2c0fZ7Pg8enAe5p62d7%2BdBfhzBAT%2BEgapgkPU6tCw8J%2FjCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0%2BnTWSEDDJmEZBnluSGbSMiBXLYgL7%2BAqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR%2FYND%2Fs4aGRygd5XyMMoz7FybQnEQ%2BhXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8%2B1W6to7EZt%2BQzs0tZWF7Rzp2HQB7Puf%2BweGR%2BHddxyenPjfAmQ%2FhUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0%2Fw7GV4EQp29L2v8C%2FwDtc2dUgZNJ%2BBAAAAAElFTkSuQmCC%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-300%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-301%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-302%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-295%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-303%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-304%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-305%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-310%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-309%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-306%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-307%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-308%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-312%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-311%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A2--%3E%3Cg%20model-id%3D%22be572c56-97f4-4e89-832c-2e071a74577a%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_21%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20data-component-name%3D%22appmixer.redmine.core.IssueShow%22%20data-component-type%3D%22action%22%20magnet%3D%22false%22%20transform%3D%22translate(496%2C0)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-314%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-315%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2276.0390625%22%20height%3D%2217.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-4%2C75.3)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-316%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EIssueShow%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-317%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu%2FAAD%2FAADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD%2FAADUAADiAAziAAvUAADdCwDdCwD%2FAADdCgDbCQDiAAvfAAa%2FAADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC%2FAADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB%2FAACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD%2BZBVd%2FT6V7iAQuPaZGGyjGM38ax3%2B%2BaUHHNr91ZZt5D7vHU%2Bt5eAatA%2B9eez4gRwMA4Q0hUoGCm3%2Brj8SBQkXYdHOtDTk%2BSdF%2BN95FqLGFcNMp36IxVriGQAAAAFvck5UAc%2Bid5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW%2B2c0fZ7Pg8enAe5p62d7%2BdBfhzBAT%2BEgapgkPU6tCw8J%2FjCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0%2BnTWSEDDJmEZBnluSGbSMiBXLYgL7%2BAqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR%2FYND%2Fs4aGRygd5XyMMoz7FybQnEQ%2BhXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8%2B1W6to7EZt%2BQzs0tZWF7Rzp2HQB7Puf%2BweGR%2BHddxyenPjfAmQ%2FhUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0%2Fw7GV4EQp29L2v8C%2FwDtc2dUgZNJ%2BBAAAAAElFTkSuQmCC%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-318%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-319%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-320%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-313%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-321%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-322%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-323%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-328%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-327%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-324%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-325%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-326%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-330%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-329%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A3--%3E%3Cg%20model-id%3D%22b67a9b9e-6740-4422-9661-3a5d7c159f1d%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_22%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20data-component-name%3D%22appmixer.redmine.core.IssueUpdate%22%20data-component-type%3D%22action%22%20magnet%3D%22false%22%20transform%3D%22translate(352%2C0)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-332%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-333%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2285.8046875%22%20height%3D%2217.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.9%2C75.3)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-334%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EIssueUpdate%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-335%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu%2FAAD%2FAADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD%2FAADUAADiAAziAAvUAADdCwDdCwD%2FAADdCgDbCQDiAAvfAAa%2FAADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC%2FAADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB%2FAACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD%2BZBVd%2FT6V7iAQuPaZGGyjGM38ax3%2B%2BaUHHNr91ZZt5D7vHU%2Bt5eAatA%2B9eez4gRwMA4Q0hUoGCm3%2Brj8SBQkXYdHOtDTk%2BSdF%2BN95FqLGFcNMp36IxVriGQAAAAFvck5UAc%2Bid5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW%2B2c0fZ7Pg8enAe5p62d7%2BdBfhzBAT%2BEgapgkPU6tCw8J%2FjCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0%2BnTWSEDDJmEZBnluSGbSMiBXLYgL7%2BAqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR%2FYND%2Fs4aGRygd5XyMMoz7FybQnEQ%2BhXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8%2B1W6to7EZt%2BQzs0tZWF7Rzp2HQB7Puf%2BweGR%2BHddxyenPjfAmQ%2FhUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0%2Fw7GV4EQp29L2v8C%2FwDtc2dUgZNJ%2BBAAAAAElFTkSuQmCC%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-336%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-337%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-338%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-331%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-339%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-340%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-341%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-346%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-345%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-342%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-343%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-344%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-348%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-347%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A4--%3E%3Cg%20model-id%3D%22e49ec3ea-c240-42dd-a15a-f2bd7efa5660%22%20data-type%3D%22diagram.Element%22%20id%3D%22j_23%22%20class%3D%22joint-cell%20joint-type-diagram%20joint-type-diagram-element%20joint-element%20joint-theme-default%22%20data-component-name%3D%22appmixer.redmine.core.IssueDelete%22%20data-component-type%3D%22action%22%20magnet%3D%22false%22%20transform%3D%22translate(656%2C0)%22%3E%3Crect%20joint-selector%3D%22body%22%20id%3D%22v-350%22%20fill%3D%22white%22%20stroke-width%3D%221%22%20stroke%3D%22%23D6D6D6%22%20rx%3D%2236%22%20ry%3D%2236%22%20cursor%3D%22pointer%22%20width%3D%2268%22%20height%3D%2268%22%2F%3E%3Crect%20joint-selector%3D%22label-rect%22%20id%3D%22v-351%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%2281.296875%22%20height%3D%2217.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-6.6%2C75.3)%22%2F%3E%3Ctext%20joint-selector%3D%22label%22%20id%3D%22v-352%22%20font-size%3D%2213.5%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20fill%3D%22black%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C78)%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3EIssueDelete%3C%2Ftspan%3E%3C%2Ftext%3E%3Cimage%20joint-selector%3D%22icon%22%20id%3D%22v-353%22%20xlink%3Ahref%3D%22data%3Aimage%2Fpng%3Bbase64%2CiVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABrVBMVEUAAADnAADfAADdAADkAAvjAAzjAAzjAA3iAAzkAAviAAu%2FAAD%2FAADiAAziAAvfAADWAADcCwDcCwDlAADjAAvmAAjZBgDdCwDdCQDcBgDcCgDdCwD%2FAADUAADiAAziAAvUAADdCwDdCwD%2FAADdCgDbCQDiAAvfAAa%2FAADbCwDdCgDbCgDbBwDMAADaAADiAADeCQDQAADcCgDdBwAAAADdCgDcCwDbCgDCAADbCgDcCwDZCADeCgDbCwDfBwC%2FAADKAADMAADLAADUAADdCQDcCgDJAADJAADLAADKAADTAADLAADLAADKAADaAADIAADLAADMAADLAADKAADNAADLAADNAADLAADKAADOAADLAADLAADKAADEAADLAADMAADKAADMAADMAADKAADLAACjAACUAABVAADKAADNAADLAADLAAB%2FAACZAAChAAChAAChAAChAACpAACZAACpAACmAACgAAChAACfAAChAACcAACiAAChAACcAACeAAChAAChAACgAACiAACiAACgAACdAACiAAChAACgAAChAAChAADdDADdCwDMAACiAADiOACXAAAAi3RSTlMACwgPhrjT1c2sbQQEzrYQE87fCtUfKfigJe3HAwbRwhLyxgHspJYoCOe8vUAFDgluC7JEAZD%2BZBVd%2FT6V7iAQuPaZGGyjGM38ax3%2B%2BaUHHNr91ZZt5D7vHU%2Bt5eAatA%2B9eez4gRwMA4Q0hUoGCm3%2Brj8SBQkXYdHOtDTk%2BSdF%2BN95FqLGFcNMp36IxVriGQAAAAFvck5UAc%2Bid5oAAAFOSURBVDjL3VFXOwNBFL0I0YPoEkJ0ovdeI0TvvSdqRAmC6C2MyW%2B2c0fZ7Pg8enAe5p62d7%2BdBfhzBAT%2BEgapgkPU6tCw8J%2FjCIiMUiOiATRCHBMbpwUV5vEJkJiUrMhTUglJ0%2BnTWSEDDJmEZBnluSGbSMiBXLYgL7%2BAqUJ5oYggik0lpVrNh3orkxXKK5hVWcWVqVoSNbXf76jTAdQ3kMYvw9hEmlsAWj91W3uHHjq7ZBtN3YFg7rH0ctVnpbR%2FYND%2Fs4aGRygd5XyMMoz7FybQnEQ%2BhXzavzCD5iyj5jlG5xU3t8BM6yIXS8sWuqK8%2B1W6to7EZt%2BQzs0tZWF7Rzp2HQB7Puf%2BweGR%2BHddxyenPjfAmQ%2FhUubnaDsdcIHEIyy45A9ewTXOG6Fg44VbcOJ0C4U7XrgHD84HofDIC0%2Fw7GV4EQp29L2v8C%2FwDtc2dUgZNJ%2BBAAAAAElFTkSuQmCC%22%20width%3D%2224%22%20height%3D%2224%22%20clip-path%3D%22url(%23icon-clip)%22%20cursor%3D%22pointer%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C22%2C22)%22%2F%3E%3Cimage%20joint-selector%3D%22marker-image%22%20id%3D%22v-354%22%20height%3D%2220%22%20clip-path%3D%22url(%23icon-clip)%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22marker-text-rect%22%20id%3D%22v-355%22%20rx%3D%223%22%20ry%3D%225%22%20fill%3D%22%23444%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20width%3D%226%22%20height%3D%222%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-3%2C-1)%22%2F%3E%3Ctext%20joint-selector%3D%22marker-text%22%20id%3D%22v-356%22%20text-anchor%3D%22middle%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22500%22%20font-size%3D%2211%22%20fill%3D%22white%22%20cursor%3D%22pointer%22%20display%3D%22none%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C62%2C4)%22%2F%3E%3Crect%20joint-selector%3D%22highlighter%22%20id%3D%22v-349%22%20display%3D%22none%22%20fill%3D%22rgba(255%2C%20193%2C%2077%2C%200.24)%22%20rx%3D%22100%25%22%20ry%3D%22100%25%22%20cursor%3D%22pointer%22%20width%3D%2279%22%20height%3D%2279%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C34%2C34)%22%2F%3E%3Cg%20id%3D%22v-357%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C34)%22%3E%3Crect%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-358%22%20port%3D%22in%22%20port-group%3D%22in%22%20magnet%3D%22true%22%20width%3D%2211%22%20height%3D%2211%22%20rx%3D%223%22%20ry%3D%223%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22white%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-5.5%2C-5.5)%22%2F%3E%3Cg%20id%3D%22v-359%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22end%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-364%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%228.5625%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C-8.6%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-363%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Ein%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3Cg%20id%3D%22v-360%22%20class%3D%22joint-port%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C68%2C34)%22%3E%3Ccircle%20class%3D%22port-body%20joint-port-body%22%20id%3D%22v-361%22%20port%3D%22out%22%20port-group%3D%22out%22%20cursor%3D%22crosshair%22%20magnet%3D%22true%22%20r%3D%226.5%22%20stroke-width%3D%221.5%22%20stroke%3D%22%232853FF%22%20fill%3D%22%23fff%22%2F%3E%3Cg%20id%3D%22v-362%22%20class%3D%22joint-port-label%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C7%2C7)%22%20y%3D%22.3em%22%20text-anchor%3D%22start%22%3E%3Crect%20joint-selector%3D%22connection-port-label-rect%22%20id%3D%22v-366%22%20rx%3D%223%22%20ry%3D%223%22%20fill%3D%22rgba(231%2C%20231%2C%20231%2C%200.9)%22%20display%3D%22none%22%20width%3D%2215.296875%22%20height%3D%2212.5%22%20transform%3D%22matrix(1%2C0%2C0%2C1%2C0%2C-1.2)%22%2F%3E%3Ctext%20joint-selector%3D%22connection-port-label%22%20id%3D%22v-365%22%20font-size%3D%2211%22%20xml%3Aspace%3D%22preserve%22%20y%3D%220.8em%22%20font-family%3D%22%26quot%3Bappmixer%26quot%3B%2C%20sans-serif%22%20font-weight%3D%22400%22%20fill%3D%22%23323232%22%3E%3Ctspan%20dy%3D%220%22%20class%3D%22v-line%22%3Eout%3C%2Ftspan%3E%3C%2Ftext%3E%3C%2Fg%3E%3C%2Fg%3E%3C%2Fg%3E%3C!--z-index%3A5--%3E%3C%2Fg%3E%3Cg%20class%3D%22joint-labels-layer%20joint-viewport%22%2F%3E%3Cg%20class%3D%22joint-front-layer%22%2F%3E%3Cg%20class%3D%22joint-tools-layer%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E" +}