From 34e607d9b61e77f1655cf465470291a6473a3020 Mon Sep 17 00:00:00 2001 From: petruki <31597636+petruki@users.noreply.github.com> Date: Sat, 19 Oct 2024 15:28:32 -0700 Subject: [PATCH] GitOps Account - replaced update token with tokens API --- npm-shrinkwrap.json | 157 +++++++++--------- package.json | 8 +- requests/Switcher API.postman_collection.json | 12 +- src/api-docs/paths/path-gitops.js | 10 +- src/api-docs/schemas/gitops.js | 11 +- src/external/gitops.js | 19 +++ src/routers/gitops.js | 17 +- src/services/gitops/index.js | 11 +- tests/gitops-account.test.js | 59 +++---- 9 files changed, 163 insertions(+), 141 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index af2b301..85633ac 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -23,16 +23,16 @@ "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", "mongodb": "^6.9.0", - "mongoose": "^8.7.1", - "pino": "^9.4.0", - "pino-pretty": "^11.2.2", + "mongoose": "^8.7.2", + "pino": "^9.5.0", + "pino-pretty": "^11.3.0", "swagger-ui-express": "^5.0.1", "switcher-client": "^4.1.1", "validator": "^13.12.0" }, "devDependencies": { "env-cmd": "^10.1.0", - "eslint": "^9.12.0", + "eslint": "^9.13.0", "jest": "^29.7.0", "jest-sonar-reporter": "^2.0.0", "node-notifier": "^10.0.1", @@ -68,18 +68,18 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.7.tgz", - "integrity": "sha512-9ickoLz+hcXCeh7jrcin+/SLWm+GkxE2kTvoYyp38p4WkdFXfQJxDFGWp/YHjiKLPx06z2A7W8XKuqbReXDzsw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", - "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", @@ -88,10 +88,10 @@ "@babel/helper-compilation-targets": "^7.25.7", "@babel/helper-module-transforms": "^7.25.7", "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.7", + "@babel/parser": "^7.25.8", "@babel/template": "^7.25.7", "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/types": "^7.25.8", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -317,12 +317,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.7.tgz", - "integrity": "sha512-aZn7ETtQsjjGG5HruveUK06cU3Hljuhd9Iojm4M8WWv3wLE6OkE5PWbDUkItmMgegmccaITudyuW5RPYrYlgWw==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", "dev": true, "dependencies": { - "@babel/types": "^7.25.7" + "@babel/types": "^7.25.8" }, "bin": { "parser": "bin/babel-parser.js" @@ -595,9 +595,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.7.tgz", - "integrity": "sha512-vwIVdXG+j+FOpkwqHRcBgHLYNL7XMkufrlaFvL9o6Ai9sJn9+PdyIL5qa0XzTZw084c+u9LOls53eoZWP/W5WQ==", + "version": "7.25.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.25.7", @@ -665,9 +665,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -697,9 +697,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -715,9 +715,9 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz", - "integrity": "sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig==", + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.1.tgz", + "integrity": "sha512-HFZ4Mp26nbWk9d/BpvP0YNL6W4UoZF0VFcTw/aPPA8RpOxeFQgK+ClABGgAUXs9Y/RGX/l1vOmrqz1MQt9MNuw==", "dev": true, "dependencies": { "levn": "^0.4.1" @@ -1353,9 +1353,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.7.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.6.tgz", + "integrity": "sha512-/d7Rnj0/ExXDMcioS78/kf1lMzYk4BZV8MZGTBKzTGZ6/406ukkbYlIsZmMPhcR5KlkunDHQLrtAVmSq7r+mSw==", "dev": true, "dependencies": { "undici-types": "~6.19.2" @@ -1419,9 +1419,9 @@ } }, "node_modules/acorn": { - "version": "8.12.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", - "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", + "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -1938,9 +1938,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001667", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", - "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", + "version": "1.0.30001669", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001669.tgz", + "integrity": "sha512-DlWzFDJqstqtIVx1zeSpIMLjunf5SmwOw0N2Ck/QSQdS8PLS4+9HrLaYei4w8BIAL7IB/UEDu889d8vhCTPA0w==", "dev": true, "funding": [ { @@ -2366,9 +2366,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.5.35", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.35.tgz", - "integrity": "sha512-hOSRInrIDm0Brzp4IHW2F/VM+638qOL2CzE0DgpnGzKW27C95IqqeqgKz/hxHGnvPxvQGpHUGD5qRVC9EZY2+A==", + "version": "1.5.41", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.41.tgz", + "integrity": "sha512-dfdv/2xNjX0P8Vzme4cfzHqnPm5xsZXwsolTYr0eyW18IUmNyG08vL+fttvinTfhKfIKdRoqkDIC9e9iWQCNYQ==", "dev": true }, "node_modules/emittery": { @@ -2476,17 +2476,17 @@ } }, "node_modules/eslint": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", - "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", + "@eslint/core": "^0.7.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.12.0", + "@eslint/js": "9.13.0", "@eslint/plugin-kit": "^0.2.0", "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", @@ -2998,13 +2998,13 @@ } }, "node_modules/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.2.tgz", + "integrity": "sha512-Jqc1btCy3QzRbJaICGwKcBfGWuLADRerLzDqi2NwSt/UkXLsHJw2TVResiaoBufHVHy9aSgClOHCeJsSsFLTbg==", "dev": true, "dependencies": { "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", + "hexoid": "^2.0.0", "once": "^1.4.0" }, "funding": { @@ -3280,9 +3280,9 @@ "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" }, "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-2.0.0.tgz", + "integrity": "sha512-qlspKUK7IlSQv2o+5I7yhUd7TxlOG2Vr5LTa3ve2XSNVKAL/n/u/7KLvKmFNimomDIKvZFXWHv0T12mv7rT8Aw==", "dev": true, "engines": { "node": ">=8" @@ -4690,9 +4690,9 @@ } }, "node_modules/mongoose": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.7.1.tgz", - "integrity": "sha512-RpNMyhyzLVCVbf8xTVbrf/18G3MqQzNw5pJdvOJ60fzbCa3cOZzz9L+8XpqzBXtRlgZGWv0T7MmOtvrT8ocp1Q==", + "version": "8.7.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.7.2.tgz", + "integrity": "sha512-Ok4VzMds9p5G3ZSUhmvBm1GdxanbzhS29jpSn02SPj+IXEVFnIdfwAlHHXWkyNscZKlcn8GuMi68FH++jo0flg==", "dependencies": { "bson": "^6.7.0", "kareem": "2.6.3", @@ -4762,9 +4762,9 @@ } }, "node_modules/nise/node_modules/@sinonjs/fake-timers": { - "version": "13.0.2", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.2.tgz", - "integrity": "sha512-4Bb+oqXZTSTZ1q27Izly9lv8B9dlV61CROxPiVtywwzv5SnytJqhvYe6FclHYuXml4cd1VHPo1zd5PmTeJozvA==", + "version": "13.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.3.tgz", + "integrity": "sha512-golm/Sc4CqLV/ZalIP14Nre7zPgd8xG/S3nHULMTBHMX0llyTNhE1O6nrgbfvLX2o0y849CnLKdu8OE05Ztiiw==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.1" @@ -5087,9 +5087,9 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "node_modules/picomatch": { @@ -5105,14 +5105,14 @@ } }, "node_modules/pino": { - "version": "9.4.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.4.0.tgz", - "integrity": "sha512-nbkQb5+9YPhQRz/BeQmrWpEknAaqjpAqRK8NwJpmrX/JHu7JuZC5G1CeAwJDJfGes4h+YihC6in3Q2nGb+Y09w==", + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.5.0.tgz", + "integrity": "sha512-xSEmD4pLnV54t0NOUN16yCl7RIB1c5UUOse5HSyEXtBp+FgFQyPeDutc+Q2ZO7/22vImV7VfEjH/1zV2QuqvYw==", "dependencies": { "atomic-sleep": "^1.0.0", "fast-redact": "^3.1.1", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.2.0", + "pino-abstract-transport": "^2.0.0", "pino-std-serializers": "^7.0.0", "process-warning": "^4.0.0", "quick-format-unescaped": "^4.0.3", @@ -5126,18 +5126,17 @@ } }, "node_modules/pino-abstract-transport": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.2.0.tgz", - "integrity": "sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-2.0.0.tgz", + "integrity": "sha512-F63x5tizV6WCh4R6RHyi2Ml+M70DNRXt/+HANowMflpgGFMAym/VKm6G7ZOQRjqN7XbGxK1Lg9t6ZrtzOaivMw==", "dependencies": { - "readable-stream": "^4.0.0", "split2": "^4.0.0" } }, "node_modules/pino-pretty": { - "version": "11.2.2", - "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.2.2.tgz", - "integrity": "sha512-2FnyGir8nAJAqD3srROdrF1J5BIcMT4nwj7hHSc60El6Uxlym00UbCCd8pYIterstVBFlMyF1yFV8XdGIPbj4A==", + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-11.3.0.tgz", + "integrity": "sha512-oXwn7ICywaZPHmu3epHGU2oJX4nPmKvHvB/bwrJHlGcbEWaVcotkpyVHMKLKmiVryWYByNp0jpgAcXpFJDXJzA==", "dependencies": { "colorette": "^2.0.7", "dateformat": "^4.6.3", @@ -5147,7 +5146,7 @@ "joycon": "^3.1.1", "minimist": "^1.2.6", "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^1.0.0", + "pino-abstract-transport": "^2.0.0", "pump": "^3.0.0", "readable-stream": "^4.0.0", "secure-json-parse": "^2.4.0", @@ -5780,9 +5779,9 @@ } }, "node_modules/sonic-boom": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.1.0.tgz", - "integrity": "sha512-NGipjjRicyJJ03rPiZCJYjwlsuP2d1/5QUviozRXC7S3WdVWNK5e3Ojieb9CCyfhq2UC+3+SRd9nG3I2lPRvUw==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-4.2.0.tgz", + "integrity": "sha512-INb7TM37/mAcsGmc9hyyI6+QR3rR1zVRu36B0NeGXKnOOLiZOfER5SA+N7X7k3yUYRzLWafduTDvJAfDswwEww==", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -6101,9 +6100,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==" + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==" }, "node_modules/type-check": { "version": "0.4.0", diff --git a/package.json b/package.json index b25c93b..7bf4923 100644 --- a/package.json +++ b/package.json @@ -50,16 +50,16 @@ "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", "mongodb": "^6.9.0", - "mongoose": "^8.7.1", - "pino": "^9.4.0", - "pino-pretty": "^11.2.2", + "mongoose": "^8.7.2", + "pino": "^9.5.0", + "pino-pretty": "^11.3.0", "swagger-ui-express": "^5.0.1", "switcher-client": "^4.1.1", "validator": "^13.12.0" }, "devDependencies": { "env-cmd": "^10.1.0", - "eslint": "^9.12.0", + "eslint": "^9.13.0", "jest": "^29.7.0", "jest-sonar-reporter": "^2.0.0", "node-notifier": "^10.0.1", diff --git a/requests/Switcher API.postman_collection.json b/requests/Switcher API.postman_collection.json index 9f2a8e4..0c5790e 100644 --- a/requests/Switcher API.postman_collection.json +++ b/requests/Switcher API.postman_collection.json @@ -5657,7 +5657,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\r\n\t\"repository\": \"{{gitops_github_url}}\",\r\n\t\"token\": \"{{gitops_github_pat}}\",\r\n\t\"branch\": \"staging\",\r\n \"environment\": \"default\",\r\n\t\"domain\": {\r\n\t\t\"id\": \"{{gitops_domain_id}}\",\r\n\t\t\"name\": \"GitOps\"\r\n\t},\r\n\t\"settings\": {\r\n\t\t\"active\": true,\r\n\t\t\"window\": \"30s\",\r\n\t\t\"forceprune\": true\r\n\t}\t\r\n}", + "raw": "{\r\n\t\"repository\": \"{{gitops_github_url}}\",\r\n\t\"token\": \"{{gitops_github_pat}}\",\r\n\t\"branch\": \"develop\",\r\n \"path\": \"resources\",\r\n \"environment\": \"default\",\r\n\t\"domain\": {\r\n\t\t\"id\": \"{{gitops_domain_id}}\",\r\n\t\t\"name\": \"GitOps\"\r\n\t},\r\n\t\"settings\": {\r\n\t\t\"active\": true,\r\n\t\t\"window\": \"30s\",\r\n\t\t\"forceprune\": true\r\n\t}\t\r\n}", "options": { "raw": { "language": "json" @@ -5801,7 +5801,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\r\n\t\"repository\": \"{{gitops_github_url}}\",\r\n\t\"branch\": \"staging\",\r\n \"environment\": \"default\",\r\n\t\"domain\": {\r\n\t\t\"id\": \"{{gitops_domain_id}}\",\r\n\t\t\"name\": \"GitOps\"\r\n\t},\r\n\t\"settings\": {\r\n\t\t\"active\": true,\r\n\t\t\"window\": \"30s\",\r\n\t\t\"forceprune\": true\r\n\t}\t\r\n}", + "raw": "{\r\n \"environment\": \"default\",\r\n\t\"repository\": \"{{gitops_github_url}}\",\r\n\t\"branch\": \"develop\",\r\n \"token\": \"{{gitops_github_pat}}\",\r\n\t\"domain\": {\r\n\t\t\"id\": \"{{gitops_domain_id}}\",\r\n\t\t\"name\": \"GitOps\"\r\n\t},\r\n\t\"settings\": {\r\n\t\t\"active\": true,\r\n\t\t\"window\": \"3m\",\r\n\t\t\"forceprune\": true\r\n\t}\t\r\n}", "options": { "raw": { "language": "json" @@ -5823,7 +5823,7 @@ "response": [] }, { - "name": "GitOps Account - Update Token", + "name": "GitOps Account - Update Tokens", "request": { "auth": { "type": "bearer", @@ -5839,7 +5839,7 @@ "header": [], "body": { "mode": "raw", - "raw": "{\r\n \"environment\": \"default\",\r\n \"token\": \"{{gitops_github_pat}}\",\r\n\t\"domain\": {\r\n\t\t\"id\": \"{{gitops_domain_id}}\"\r\n\t}\r\n}", + "raw": "{\r\n \"token\": \"{{gitops_github_pat}}\",\r\n\t\"domain\": {\r\n\t\t\"id\": \"{{gitops_domain_id}}\"\r\n\t},\r\n \"environments\": [\r\n \"default\"\r\n ]\r\n}", "options": { "raw": { "language": "json" @@ -5847,7 +5847,7 @@ } }, "url": { - "raw": "{{url}}/gitops/v1/account/token", + "raw": "{{url}}/gitops/v1/account/tokens", "host": [ "{{url}}" ], @@ -5855,7 +5855,7 @@ "gitops", "v1", "account", - "token" + "tokens" ] } }, diff --git a/src/api-docs/paths/path-gitops.js b/src/api-docs/paths/path-gitops.js index c95ac39..2d20686 100644 --- a/src/api-docs/paths/path-gitops.js +++ b/src/api-docs/paths/path-gitops.js @@ -94,7 +94,7 @@ export default { '/gitops/v1/account': { put: { tags: ['Switcher GitOps'], - description: 'Update an account to receive gitops changes', + description: 'Update an account for gitops repository access', requestBody: { content: commonSchemaContent('GitOpsAccountUpdateRequest') }, @@ -114,12 +114,12 @@ export default { } } }, - '/gitops/v1/account/token': { + '/gitops/v1/account/tokens': { put: { tags: ['Switcher GitOps'], - description: 'Update an account token to receive gitops changes', + description: 'Update account tokens for gitops repository access', requestBody: { - content: commonSchemaContent('GitOpsAccountTokenUpdateRequest') + content: commonSchemaContent('GitOpsAccountTokensUpdateRequest') }, responses: { 200: { @@ -140,7 +140,7 @@ export default { '/gitops/v1/account/forcesync': { put: { tags: ['Switcher GitOps'], - description: 'Force sync an account to receive gitops changes', + description: 'Force sync an account to lock up for gitops changes', requestBody: { content: commonSchemaContent('GitOpsAccountForceSyncRequest') }, diff --git a/src/api-docs/schemas/gitops.js b/src/api-docs/schemas/gitops.js index a3fcf46..190d51c 100644 --- a/src/api-docs/schemas/gitops.js +++ b/src/api-docs/schemas/gitops.js @@ -177,16 +177,19 @@ export default { type: 'object', properties: accountUpdateRequest }, - GitOpsAccountTokenUpdateRequest: { + GitOpsAccountTokensUpdateRequest: { type: 'object', properties: { token: { type: 'string', description: 'The Git token' }, - environment: { - type: 'string', - description: 'The environment name' + environments: { + type: 'array', + items: { + type: 'string' + }, + description: 'The environments to update' }, domain: { type: 'object', diff --git a/src/external/gitops.js b/src/external/gitops.js index 12b8e3c..4939351 100644 --- a/src/external/gitops.js +++ b/src/external/gitops.js @@ -46,6 +46,25 @@ export async function updateAccount(account) { } } +export async function updateAccountTokens(update, domainId) { + try { + const url = `${process.env.SWITCHER_GITOPS_URL}/account/tokens/${domainId}`; + const response = await axios.put(url, update, { + httpsAgent: agent(url), + headers: headers(domainId) + }); + + if (response.status !== 200) { + throw new GitOpsError(`Failed to update accounts [${response.status}] ${JSON.stringify(response.data)}`, + response.status); + } + + return response.data; + } catch (e) { + throw new GitOpsError(`Failed to update account: ${e.message}`, e.status); + } +} + export async function deleteAccount(domainId, environment) { try { const url = `${process.env.SWITCHER_GITOPS_URL}/account/${domainId}/${environment}`; diff --git a/src/routers/gitops.js b/src/routers/gitops.js index 13372db..40eeeea 100644 --- a/src/routers/gitops.js +++ b/src/routers/gitops.js @@ -18,6 +18,10 @@ const windowValidation = (value) => { throw new Error('Invalid window value (minimum 30s)'); } + if (parseInt(value) < 1) { + throw new Error('Invalid window value (minimum 1[m/h])'); + } + return true; }; @@ -25,6 +29,7 @@ const accountValidators = [ body('token').isString().optional(), body('repository').isURL().withMessage('Invalid repository URL'), body('branch').isString().withMessage('Invalid branch name'), + body('path').isString().optional().withMessage('Invalid path'), body('environment').isString().withMessage('Invalid environment name'), body('domain.id').isMongoId().withMessage('Invalid domain ID'), body('domain.name').isString().withMessage('Invalid domain name'), @@ -74,10 +79,8 @@ router.post('/gitops/v1/account/unsubscribe', auth, [ } }); -router.put('/gitops/v1/account', auth, [ - body('environment').isString(), - body('domain.id').isMongoId().withMessage('Invalid domain ID'), -], validate, featureFlag, async (req, res) => { +router.put('/gitops/v1/account', auth, accountValidators, validate, + featureFlag, async (req, res) => { try { const account = await Service.updateAccount(req.body); res.status(200).send(account); @@ -86,13 +89,13 @@ router.put('/gitops/v1/account', auth, [ } }); -router.put('/gitops/v1/account/token', auth, [ - body('environment').isString(), +router.put('/gitops/v1/account/tokens', auth, [ body('token').isString(), + body('environments').isArray(), body('domain.id').isMongoId().withMessage('Invalid domain ID'), ], validate, featureFlag, async (req, res) => { try { - const account = await Service.updateAccountToken(req.body); + const account = await Service.updateAccountTokens(req.body); res.status(200).send(account); } catch (e) { responseExceptionSilent(res, e, 500, 'Account token update failed'); diff --git a/src/services/gitops/index.js b/src/services/gitops/index.js index 911118f..08228b8 100644 --- a/src/services/gitops/index.js +++ b/src/services/gitops/index.js @@ -37,14 +37,11 @@ export async function updateAccount(account) { return GitOpsFacade.updateAccount(account); } -export async function updateAccountToken(account) { - return GitOpsFacade.updateAccount({ - environment: account.environment, +export async function updateAccountTokens(account) { + return GitOpsFacade.updateAccountTokens({ token: account.token, - domain: { - id: account.domain.id - } - }); + environments: account.environments + }, account.domain.id); } export async function forceSyncAccount(account) { diff --git a/tests/gitops-account.test.js b/tests/gitops-account.test.js index 3025e9a..45cc0d4 100644 --- a/tests/gitops-account.test.js +++ b/tests/gitops-account.test.js @@ -183,6 +183,19 @@ describe('GitOps Account - Subscribe', () => { expect(req.body.errors[0].msg).toBe('Invalid window value (minimum 30s)'); }); + test('GITOPS_ACCOUNT_SUITE - Should return error - window cannot be lower than 1(m/h)', async () => { + const payload = JSON.parse(JSON.stringify(VALID_SUBSCRIPTION_REQUEST)); + payload.settings.window = "0m"; + + const req = await request(app) + .post('/gitops/v1/account/subscribe') + .set('Authorization', `Bearer ${adminMasterAccountToken}`) + .send(payload) + .expect(422); + + expect(req.body.errors[0].msg).toBe('Invalid window value (minimum 1[m/h])'); + }); + test('GITOPS_ACCOUNT_SUITE - Should return error - window cannot use different units than [s,m,h]', async () => { const payload = JSON.parse(JSON.stringify(VALID_SUBSCRIPTION_REQUEST)); payload.settings.window = '1d'; @@ -204,6 +217,7 @@ describe('GitOps Account - Update', () => { repository: 'https://github.com/switcherapi/switcher-gitops-fixture', branch: 'main', environment: EnvType.DEFAULT, + path: 'path/to/file', domain: { id: String(domainId), name: 'Test Domain' @@ -294,55 +308,42 @@ describe('GitOps Account - Update', () => { }) -describe('GitOps Account - Update Token', () => { +describe('GitOps Account - Update All Token', () => { beforeAll(setupDatabase); - const VALID_UPDATE_REQUEST = { - repository: 'https://github.com/switcherapi/switcher-gitops-fixture', - branch: 'main', - environment: EnvType.DEFAULT, - domain: { - id: String(domainId), - name: 'Test Domain' - }, - settings: { - active: true, - window: '30s', - forceprune: true - } - }; - const VALID_TOKEN_UPDATE_REQUEST = { - environment: EnvType.DEFAULT, + environments: [EnvType.DEFAULT], token: '123456', domain: { id: String(domainId) } }; - test('GITOPS_ACCOUNT_SUITE - Should update account token', async () => { - // given - const expectedResponse = JSON.parse(JSON.stringify(VALID_UPDATE_REQUEST)); - expectedResponse.token = '...123'; - + test('GITOPS_ACCOUNT_SUITE - Should update account tokens', async () => { const postStub = sinon.stub(axios, 'put').resolves({ status: 200, - data: expectedResponse + data: { + result: true, + message: 'Account tokens updated successfully' + } }); // test const req = await request(app) - .put('/gitops/v1/account/token') + .put('/gitops/v1/account/tokens') .set('Authorization', `Bearer ${adminMasterAccountToken}`) .send(VALID_TOKEN_UPDATE_REQUEST) .expect(200); // assert - expect(req.body).toMatchObject(expectedResponse); + expect(req.body).toMatchObject({ + result: true, + message: 'Account tokens updated successfully' + }); postStub.restore(); }); - test('GITOPS_ACCOUNT_SUITE - Should return error - error updating account token', async () => { + test('GITOPS_ACCOUNT_SUITE - Should return error - error updating account tokens', async () => { // given const postStub = sinon.stub(axios, 'put').resolves({ status: 500, @@ -353,7 +354,7 @@ describe('GitOps Account - Update Token', () => { // test const req = await request(app) - .put('/gitops/v1/account/token') + .put('/gitops/v1/account/tokens') .set('Authorization', `Bearer ${adminMasterAccountToken}`) .send(VALID_TOKEN_UPDATE_REQUEST) .expect(500); @@ -374,7 +375,7 @@ describe('GitOps Account - Update Token', () => { // test const req = await request(app) - .put('/gitops/v1/account/token') + .put('/gitops/v1/account/tokens') .set('Authorization', `Bearer ${adminMasterAccountToken}`) .send(VALID_TOKEN_UPDATE_REQUEST) .expect(500); @@ -389,7 +390,7 @@ describe('GitOps Account - Update Token', () => { delete payload.domain.id; const req = await request(app) - .put('/gitops/v1/account/token') + .put('/gitops/v1/account/tokens') .set('Authorization', `Bearer ${adminMasterAccountToken}`) .send(payload) .expect(422);