From aa66cb3363a3681cedaf8c8de81fc9b06c4873a0 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Tue, 16 Aug 2022 14:50:42 +0600 Subject: [PATCH 1/6] feat: backfill reviewer payment when requested * add reviewer payment to project_payment when reviewer is either Iterative Reviewer or Reviewer and * challenge.metadata has { name: "reviewerPrize", value: AMT } * remove reviewer payment when reviewer is removed --- challenge-api-v5-mock/mock-challenge-api.js | 6 + config/default.js | 3 + package-lock.json | 490 ++++++++++++++++++-- src/common/helper.js | 7 +- src/dao/ProjectPaymentDAO.js | 60 +++ src/services/ProcessorService.js | 9 +- src/services/ResourceDirectManager.js | 16 +- 7 files changed, 551 insertions(+), 40 deletions(-) create mode 100644 src/dao/ProjectPaymentDAO.js diff --git a/challenge-api-v5-mock/mock-challenge-api.js b/challenge-api-v5-mock/mock-challenge-api.js index 3dec0e0..365b1b3 100644 --- a/challenge-api-v5-mock/mock-challenge-api.js +++ b/challenge-api-v5-mock/mock-challenge-api.js @@ -19,6 +19,12 @@ const sampleChallenge = { 'value': 'value1' } ], + 'metadata': [ + { + 'name': 'reviewerPrize', + 'value': '5' + } + ], 'created': '2019-03-02T14:35:53.948Z', 'createdBy': 'Copilot1', 'updated': '2019-03-02T14:35:53.948Z', diff --git a/config/default.js b/config/default.js index 4c4a8cf..fdde9f0 100755 --- a/config/default.js +++ b/config/default.js @@ -23,6 +23,8 @@ module.exports = { SUBMITTER_ROLE_ID: process.env.SUBMITTER_ROLE_ID || '732339e7-8e30-49d7-9198-cccf9451e221', MANAGER_RESOURCE_ROLE_ID: process.env.MANAGER_RESOURCE_ROLE_ID || '0e9c6879-39e4-4eb6-b8df-92407890faf1', + REVIEWER_ROLE_ID: process.env.REVIEWER_ROLE_ID || '318b9c07-079a-42d9-a81f-b96be1dc1099', + ITERATIVE_REVIEWER_ROLE_ID: process.env.ITERATIVE_REVIEWER_ROLE_ID || 'f6df7212-b9d6-4193-bfb1-b383586fce63', RESOURCE_ROLES_WITHOUT_TIMELINE_NOTIFICATIONS: process.env.RESOURCE_ROLES_WITHOUT_TIMELINE_NOTIFICATIONS ? process.env.RESOURCE_ROLES_WITHOUT_TIMELINE_NOTIFICATIONS.split(',') : ['2a4dc376-a31c-4d00-b173-13934d89e286'], @@ -68,5 +70,6 @@ module.exports = { LEGACY_REVIEWER_ROLE_ID: process.env.LEGACY_REVIEWER_ROLE_ID || 4, LEGACY_REVIEW_PHASE_ID: process.env.LEGACY_REVIEW_PHASE_ID || 4, + LEGACY_REVIEWER_PAYMENT_TYPE_ID: process.env.LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID || 3, COPILOT_PAYMENT_TYPE: process.env.COPILOT_PAYMENT_TYPE || 'copilot' } diff --git a/package-lock.json b/package-lock.json index 44ba781..60b0b44 100644 --- a/package-lock.json +++ b/package-lock.json @@ -204,6 +204,11 @@ "@types/mime": "*" } }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -283,12 +288,50 @@ "default-require-extensions": "^2.0.0" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "are-we-there-yet": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz", + "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -458,6 +501,31 @@ "protocol-buffers-schema": "^3.0.0" } }, + "binary": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", + "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "requires": { + "buffers": "~0.1.1", + "chainsaw": "~0.1.0" + } + }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==", + "requires": { + "inherits": "~2.0.0" + } + }, "bluebird": { "version": "3.5.4", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.4.tgz", @@ -531,6 +599,11 @@ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, + "buffers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", + "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==" + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -605,6 +678,14 @@ "type-detect": "^4.0.5" } }, + "chainsaw": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", + "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", + "requires": { + "traverse": ">=0.3.0 <0.4" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -681,8 +762,7 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" }, "codependency": { "version": "0.1.4", @@ -800,6 +880,11 @@ "resolved": "https://registry.npmjs.org/connection-parse/-/connection-parse-0.0.7.tgz", "integrity": "sha1-GOcxiqsGppkmc3KxDFIm0locmmk=" }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" + }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", @@ -993,6 +1078,11 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" + }, "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", @@ -1059,8 +1149,7 @@ "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" }, "encodeurl": { "version": "1.0.2", @@ -1731,6 +1820,11 @@ "object-assign": "^4.0.1" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" + }, "finalhandler": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", @@ -1901,8 +1995,18 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fstream": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", + "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } }, "function-bind": { "version": "1.1.1", @@ -1916,6 +2020,54 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -1960,7 +2112,6 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -1978,8 +2129,7 @@ "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" }, "growl": { "version": "1.10.5", @@ -2039,6 +2189,11 @@ "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==" + }, "hasha": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", @@ -2114,6 +2269,19 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ifxnjs": { + "version": "10.0.5", + "resolved": "https://registry.npmjs.org/ifxnjs/-/ifxnjs-10.0.5.tgz", + "integrity": "sha512-SwrRsE0A8MNCtPQ9mjeSKBAE2o1HNL+OEem9Bex6bREEqXKSJlEG+fwOkv5eohPuTLB51sgSa369Wj1TrM0f2Q==", + "requires": { + "bindings": "^1.3.1", + "fstream": "~1.0.11", + "nan": "^2.12.1", + "node-gyp": "^3.8.0", + "q": "^1.5.1", + "unzip": "~0.1.11" + } + }, "ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", @@ -2206,8 +2374,7 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" }, "is-promise": { "version": "2.1.0", @@ -2272,8 +2439,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isstream": { "version": "0.1.2", @@ -2693,6 +2859,38 @@ "p-defer": "^1.0.0" } }, + "match-stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", + "integrity": "sha512-TbN21KrvmZ4mHzKqSFeNNNYeOGNNoEE0sQjhOGlHc+W6XhV4nEhJqaQTJj106NF+NYjyJ7pXh23+OQ1d306ORw==", + "requires": { + "buffers": "~0.1.1", + "readable-stream": "~1.0.0" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -2893,8 +3091,12 @@ "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", - "optional": true + "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + }, + "natives": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz", + "integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA==" }, "natural-compare": { "version": "1.4.0", @@ -2985,6 +3187,61 @@ } } }, + "node-gyp": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz", + "integrity": "sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==", + "requires": { + "fstream": "^1.0.0", + "glob": "^7.0.3", + "graceful-fs": "^4.1.2", + "mkdirp": "^0.5.0", + "nopt": "2 || 3", + "npmlog": "0 || 1 || 2 || 3 || 4", + "osenv": "0", + "request": "^2.87.0", + "rimraf": "2", + "semver": "~5.3.0", + "tar": "^2.0.0", + "which": "1" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "requires": { + "abbrev": "1" + } + }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -3006,11 +3263,21 @@ "path-key": "^2.0.0" } }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" }, "nyc": { "version": "14.1.0", @@ -3078,8 +3345,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-keys": { "version": "1.1.1", @@ -3145,8 +3411,7 @@ "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" }, "os-locale": { "version": "3.1.0", @@ -3162,8 +3427,21 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "over": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", + "integrity": "sha512-EEc3GCT5ce2VgLYKGeomTSgQT+4wkS13Ya9XzKiskHtemWPx0YhVErn7PtiowTOsYtRlFe6FksgwFeWG1aOJdg==" }, "p-defer": { "version": "1.0.0", @@ -3446,6 +3724,40 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, + "pullstream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", + "integrity": "sha512-8ckaufxE74rtbwA0lD0GO2Pk/miCfje3uZtGZd/MQpxkoRIBB004aKBnhdc4Y8L7sip0cis/ekib/1lUwUwxuA==", + "requires": { + "over": ">= 0.0.5 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.2 < 2", + "slice-stream": ">= 1.0.0 < 2" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -3461,6 +3773,11 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, "qs": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", @@ -3654,7 +3971,6 @@ "version": "2.4.5", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", - "optional": true, "requires": { "glob": "^6.0.1" } @@ -3764,8 +4080,12 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" }, "setprototypeof": { "version": "1.1.0", @@ -3844,8 +4164,7 @@ "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, "simple-lru-cache": { "version": "0.0.2", @@ -3861,6 +4180,37 @@ "is-fullwidth-code-point": "^2.0.0" } }, + "slice-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", + "integrity": "sha512-fJu1TYTr85OZEkT4lqcCW6oPWPIS5omPnIsB/dL7QWo2sNk03VQ6did4plhh0y3Sf0nJlq5QEUR3vMYevydn7w==", + "requires": { + "readable-stream": "~1.0.31" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -4010,7 +4360,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", @@ -4020,14 +4369,12 @@ "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, "requires": { "ansi-regex": "^4.1.0" } @@ -4144,6 +4491,16 @@ } } }, + "tar": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz", + "integrity": "sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==", + "requires": { + "block-stream": "*", + "fstream": "^1.0.12", + "inherits": "2" + } + }, "tc-core-library-js": { "version": "git+https://github.com/appirio-tech/tc-core-library-js.git#df0b36c51cf80918194cbff777214b3c0cf5a151", "from": "git+https://github.com/appirio-tech/tc-core-library-js.git#v2.6.4", @@ -4343,6 +4700,11 @@ "punycode": "^2.1.1" } }, + "traverse": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", + "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==" + }, "trim-right": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", @@ -4403,6 +4765,61 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" }, + "unzip": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", + "integrity": "sha512-Dvxd7bj2RcfbM+AbNfx0Ufqvk7Kl4YGeAQlEGn9+glDQz1HFxeeRjBStxi/DfIvgutn6hbC4yMc1rEo3x+dmVQ==", + "requires": { + "binary": ">= 0.3.0 < 1", + "fstream": ">= 0.1.30 < 1", + "match-stream": ">= 0.0.2 < 1", + "pullstream": ">= 0.4.1 < 1", + "readable-stream": "~1.0.31", + "setimmediate": ">= 1.0.1 < 2" + }, + "dependencies": { + "fstream": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", + "integrity": "sha512-N1pLGEHoDyCoI8uMmPXJXhn238L4nk41iipXCrqs4Ss0ooYSr5sNj2ucMo5AqJVC4OaOa7IztpBhOaaYTGZVuA==", + "requires": { + "graceful-fs": "~3.0.2", + "inherits": "~2.0.0", + "mkdirp": "0.5", + "rimraf": "2" + } + }, + "graceful-fs": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.12.tgz", + "integrity": "sha512-J55gaCS4iTTJfTXIxSVw3EMQckcqkpdRv3IR7gu6sq0+tbC363Zx6KH/SEwXASK9JRbhyZmVjJEVJIOxYsB3Qg==", + "requires": { + "natives": "^1.1.3" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" + } + } + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -4455,7 +4872,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -4466,6 +4882,14 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "winston": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", diff --git a/src/common/helper.js b/src/common/helper.js index d4fe026..75814f8 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -197,6 +197,10 @@ async function forceV4ESFeeder (legacyId) { await request.put(`${config.V4_ES_FEEDER_API_URL}`).send(body).set({ Authorization: `Bearer ${token}` }) } +function isReviewerRole (roleId) { + return roleId === config.REVIEWER_ROLE_ID || roleId === config.ITERATIVE_REVIEWER_ROLE_ID +} + module.exports = { getInformixConnection, getM2Mtoken, @@ -208,5 +212,6 @@ module.exports = { ESFeederServiceClient, queryDataFromDB, executeSQLonDB, - forceV4ESFeeder + forceV4ESFeeder, + isReviewerRole } diff --git a/src/dao/ProjectPaymentDAO.js b/src/dao/ProjectPaymentDAO.js new file mode 100644 index 0000000..93f6a68 --- /dev/null +++ b/src/dao/ProjectPaymentDAO.js @@ -0,0 +1,60 @@ +const _ = require('lodash') +const helper = require('../common/helper') +const logger = require('../common/logger') + +const QUERY_PROJECT_PAYMENT_MAX_ID = ` + SELECT MAX(project_payment_id) + 1 AS id FROM project_payment +` + +// reference Direct App: https://github.com/appirio-tech/direct-app/blob/dev/components/project_payment_management/src/java/main/com/topcoder/management/payment/impl/persistence/DatabaseProjectPaymentPersistence.java#L58 +// Note that project_payment_id is not a sequence, it is max(project_payment_id) + 1 - unlike other similar tables where it is a sequence +const QUERY_INSERT_PROJECT_PAYMENT = ` +INSERT INTO project_payment + ( resource_id + amount, + project_payment_type_id, + create_user, + modify_user, + create_date, + modify_date, + project_payment_id + ) +VALUES + (?, ?, ?, ?, ?, CURRENT, CURRENT, ?)` + +// reference Direct App: https://github.com/appirio-tech/direct-app/blob/dev/components/project_payment_management/src/java/main/com/topcoder/management/payment/impl/persistence/DatabaseProjectPaymentPersistence.java#L87 +const DELETE_PROJECT_PAYMENT = ` +DELETE FROM project_payment WHERE resource_id = ? +` + +async function persistReviewerPayment (userId, resourceId, amount, projectPaymentTypeId) { + const connection = await helper.getInformixConnection() + try { + await connection.beginTransactionAsync() + const result = await connection.queryAsync(QUERY_PROJECT_PAYMENT_MAX_ID) + const projectPaymentId = _.get(result, '[0].id', null) + + logger.info(`Creating project payment with id ${projectPaymentId}`) + + const query = await helper.prepare(connection, QUERY_INSERT_PROJECT_PAYMENT) + await query.executeAsync([resourceId, amount, projectPaymentTypeId, userId, userId, projectPaymentId]) + + logger.info(`Project payment with id ${projectPaymentId} has been created`) + + await connection.commitTransactionAsync() + } catch (e) { + await connection.rollbackTransactionAsync() + logger.error(`Error in 'createProjectPayment' ${e}`) + } finally { + await connection.closeAsync() + } +} + +async function removeReviewerPayment (resourceId) { + await helper.executeSQLonDB(DELETE_PROJECT_PAYMENT, [resourceId]) +} + +module.exports = { + persistReviewerPayment, + removeReviewerPayment +} diff --git a/src/services/ProcessorService.js b/src/services/ProcessorService.js index 91e1ea0..52382ff 100755 --- a/src/services/ProcessorService.js +++ b/src/services/ProcessorService.js @@ -76,6 +76,9 @@ async function _updateChallengeResource (message, isDelete) { const prizeSets = _.get(v5Challenge, 'prizeSets') const copilotPaymentAmount = _.get(_.find(prizeSets, p => p.type === config.COPILOT_PAYMENT_TYPE), 'prizes[0].value', null) + const metadata = _.get(v5Challenge, 'metadata', []) + const reviewerPaymentAmount = !helper.isReviewerRole(resourceRoleId) ? null : _.get(_.find(metadata, m => m.name === 'reviewerPrize'), 'value', null) + const body = { roleId: resourceRoleId, resourceUserId: userId, @@ -94,8 +97,8 @@ async function _updateChallengeResource (message, isDelete) { if (resourceRole.id === config.SUBMITTER_ROLE_ID && !isTask) { // force sync v4 elasticsearch service logger.debug(`Start v4 challenge reindexing to the elasticsearch service`) - await helper.forceV4ESFeeder(_.get(v5Challenge, 'legacyId')); - await new Promise(resolve => setTimeout(resolve, config.INDEX_CHALLENGE_TIMEOUT * 1000)); + await helper.forceV4ESFeeder(_.get(v5Challenge, 'legacyId')) + await new Promise(resolve => setTimeout(resolve, config.INDEX_CHALLENGE_TIMEOUT * 1000)) logger.debug(`End v4 challenge reindexing to the elasticsearch service`) if (isDelete) { logger.debug(`v4 Unregistering Submitter ${config.CHALLENGE_API_V4_URL}/${_.get(v5Challenge, 'legacyId')}/unregister?userId=${userId} - ${JSON.stringify(body)}`) @@ -110,7 +113,7 @@ async function _updateChallengeResource (message, isDelete) { await ResourceDirectManager.removeResource(legacyChallengeID, resourceRoleId, userId) } else { logger.debug(`Creating Challenge Resource ${userId} to challenge ${legacyChallengeID} with roleID ${resourceRoleId}`) - await ResourceDirectManager.addResource(legacyChallengeID, resourceRoleId, userId, handle, copilotPaymentAmount) + await ResourceDirectManager.addResource(legacyChallengeID, resourceRoleId, userId, handle, copilotPaymentAmount, reviewerPaymentAmount) } } if (config.RESOURCE_ROLES_WITHOUT_TIMELINE_NOTIFICATIONS.indexOf(resourceRole.id) === -1) { diff --git a/src/services/ResourceDirectManager.js b/src/services/ResourceDirectManager.js index 6760c66..26f3e26 100644 --- a/src/services/ResourceDirectManager.js +++ b/src/services/ResourceDirectManager.js @@ -1,9 +1,11 @@ const ProjectServices = require('./ProjectService') const RegistrationDAO = require('../dao/RegistrationDAO') const SequenceDAO = require('../dao/SequenceDAO') +const ProjectPaymentDAO = require('../dao/ProjectPaymentDAO') const logger = require('../common/logger') const config = require('config') const { find, toString } = require('lodash') +const { isReviewerRole } = require('../common/helper') /** * Assign the given roleId to the specified userId in the given project. @@ -14,7 +16,7 @@ const { find, toString } = require('lodash') * the id of the user. * @param handle */ -async function assignRole (legacyChallengeId, roleId, userId, handle, copilotPaymentAmount) { +async function assignRole (legacyChallengeId, roleId, userId, handle, copilotPaymentAmount, reviewerPaymentAmount) { let found = await ProjectServices.resourceExists(legacyChallengeId, roleId, userId) const termChecking = true const eligible = true @@ -43,6 +45,10 @@ async function assignRole (legacyChallengeId, roleId, userId, handle, copilotPay const resourceId = await SequenceDAO.getResourceSeqNextId() await RegistrationDAO.persistResourceWithRoleId(userId, legacyChallengeId, resourceId, roleId, handle, projectPhaseId, copilotPaymentAmount) + if (isReviewerRole(roleId) && reviewerPaymentAmount != null) { + await ProjectPaymentDAO.persistReviewerPayment(userId, resourceId, reviewerPaymentAmount, config.LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID) + } + // only check notification setting for observer, else always add // if (roleId !== Constants.RESOURCE_ROLE_OBSERVER_ID || addNotification) { // await ProjectServices.addNotifications(contestId, userId, Constants.TIMELINE_NOTIFICATION_ID, operatorId) @@ -68,6 +74,10 @@ async function removeRole (legacyChallengeId, roleId, userId) { throw new Error('User ' + userId + ' does not have role ' + roleId + ' for the project ' + legacyChallengeId) } + if (isReviewerRole(roleId)) { + logger.info('Remove reviewer payment first.') + await ProjectPaymentDAO.removeReviewerPayment(existingResource.resourceid) + } await ProjectServices.removeResource(existingResource) } @@ -80,8 +90,8 @@ async function removeRole (legacyChallengeId, roleId, userId) { * @param handle * @param copilotPaymentAmount */ -async function addResource (challengeId, resourceRoleId, userId, handle, copilotPaymentAmount) { - await assignRole(challengeId, resourceRoleId, userId, handle, copilotPaymentAmount) +async function addResource (challengeId, resourceRoleId, userId, handle, copilotPaymentAmount, reviewerPaymentAmount) { + await assignRole(challengeId, resourceRoleId, userId, handle, copilotPaymentAmount, reviewerPaymentAmount) } /** From 6bff2ea643837ed52a13122dca1473d90e1f9e55 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Tue, 16 Aug 2022 14:57:29 +0600 Subject: [PATCH 2/6] ci: deploy to dev --- .circleci/config.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 32327c5..b07b3a4 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -70,6 +70,7 @@ workflows: branches: only: - develop + - feat/reviewer-payment # Production builds are exectuted only on tagged commits to the # master branch. From 8afcbd618e8d1b6d3e93dd8ea9b061afcdef7618 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Tue, 16 Aug 2022 17:01:17 +0600 Subject: [PATCH 3/6] debug: add logs --- src/dao/ProjectPaymentDAO.js | 2 ++ src/dao/RegistrationDAO.js | 2 +- src/services/ResourceDirectManager.js | 3 +++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dao/ProjectPaymentDAO.js b/src/dao/ProjectPaymentDAO.js index 93f6a68..5bc3b8e 100644 --- a/src/dao/ProjectPaymentDAO.js +++ b/src/dao/ProjectPaymentDAO.js @@ -28,8 +28,10 @@ DELETE FROM project_payment WHERE resource_id = ? ` async function persistReviewerPayment (userId, resourceId, amount, projectPaymentTypeId) { + logger.info(`Persist reviewer payment. userId: ${userId}, resourceId: ${resourceId}, amount: ${amount}, projectPaymentTypeId: ${projectPaymentTypeId}`) const connection = await helper.getInformixConnection() try { + logger.info('Open connection.') await connection.beginTransactionAsync() const result = await connection.queryAsync(QUERY_PROJECT_PAYMENT_MAX_ID) const projectPaymentId = _.get(result, '[0].id', null) diff --git a/src/dao/RegistrationDAO.js b/src/dao/RegistrationDAO.js index dddcefd..c75b0cc 100644 --- a/src/dao/RegistrationDAO.js +++ b/src/dao/RegistrationDAO.js @@ -44,7 +44,7 @@ VALUES async function persistResourceWithRoleId (userId, challengeId, resourceId, roleId, handle, projectPhaseId, copilotPaymentAmount) { const regDate = moment().format('MM[.]DD[.]YYYY h:mm A') - // logger.debug(`persistResourceWithRoleId - projectPhaseId: ${projectPhaseId} - ${JSON.stringify([resourceId, roleId, projectPhaseId, challengeId, userId, userId, userId])}`) + logger.debug(`persistResourceWithRoleId - projectPhaseId: ${projectPhaseId} - ${JSON.stringify([resourceId, roleId, projectPhaseId, challengeId, userId, userId, userId])}`) await helper.executeSQLonDB(QUERY_INSERT_RESOURCE_WITH_ROLE, [resourceId, roleId, projectPhaseId, challengeId, userId, userId, userId]) await persistResourceInfo(userId, resourceId, RESOURCE_TYPE_EXT_REF_ID, userId) diff --git a/src/services/ResourceDirectManager.js b/src/services/ResourceDirectManager.js index 26f3e26..73c6950 100644 --- a/src/services/ResourceDirectManager.js +++ b/src/services/ResourceDirectManager.js @@ -46,7 +46,10 @@ async function assignRole (legacyChallengeId, roleId, userId, handle, copilotPay await RegistrationDAO.persistResourceWithRoleId(userId, legacyChallengeId, resourceId, roleId, handle, projectPhaseId, copilotPaymentAmount) if (isReviewerRole(roleId) && reviewerPaymentAmount != null) { + logger.info('Add reviewer payment.') await ProjectPaymentDAO.persistReviewerPayment(userId, resourceId, reviewerPaymentAmount, config.LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID) + } else { + logger.info(`Not a reviewer role ${roleId}.`) } // only check notification setting for observer, else always add From 929235a5c65dce85329a5d1d61f09e22b00c5675 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Wed, 17 Aug 2022 13:16:00 +0600 Subject: [PATCH 4/6] fix: add legacy id test to reviewer role check --- config/default.js | 1 + src/common/helper.js | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/default.js b/config/default.js index fdde9f0..df34d53 100755 --- a/config/default.js +++ b/config/default.js @@ -70,6 +70,7 @@ module.exports = { LEGACY_REVIEWER_ROLE_ID: process.env.LEGACY_REVIEWER_ROLE_ID || 4, LEGACY_REVIEW_PHASE_ID: process.env.LEGACY_REVIEW_PHASE_ID || 4, + LEGACY_REVIEWER_ITERATIVE_ROLE_ID: process.env.LEGACY_REVIEWER_ITERATIVE_ROLE_ID || 21, LEGACY_REVIEWER_PAYMENT_TYPE_ID: process.env.LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID || 3, COPILOT_PAYMENT_TYPE: process.env.COPILOT_PAYMENT_TYPE || 'copilot' } diff --git a/src/common/helper.js b/src/common/helper.js index 75814f8..df73f42 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -198,7 +198,7 @@ async function forceV4ESFeeder (legacyId) { } function isReviewerRole (roleId) { - return roleId === config.REVIEWER_ROLE_ID || roleId === config.ITERATIVE_REVIEWER_ROLE_ID + return roleId === config.REVIEWER_ROLE_ID || roleId === config.ITERATIVE_REVIEWER_ROLE_ID || roleId == config.LEGACY_REVIEWER_ROLE_ID || roleId == config.LEGACY_REVIEWER_ITERATIVE_ROLE_ID } module.exports = { From adbb04e12418128376817a7ef8cd49d217c301ba Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Wed, 17 Aug 2022 13:45:52 +0600 Subject: [PATCH 5/6] fix: sql syntax --- src/dao/ProjectPaymentDAO.js | 2 +- src/services/ResourceDirectManager.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/dao/ProjectPaymentDAO.js b/src/dao/ProjectPaymentDAO.js index 5bc3b8e..b84fd23 100644 --- a/src/dao/ProjectPaymentDAO.js +++ b/src/dao/ProjectPaymentDAO.js @@ -10,7 +10,7 @@ const QUERY_PROJECT_PAYMENT_MAX_ID = ` // Note that project_payment_id is not a sequence, it is max(project_payment_id) + 1 - unlike other similar tables where it is a sequence const QUERY_INSERT_PROJECT_PAYMENT = ` INSERT INTO project_payment - ( resource_id + ( resource_id, amount, project_payment_type_id, create_user, diff --git a/src/services/ResourceDirectManager.js b/src/services/ResourceDirectManager.js index 73c6950..ed06b35 100644 --- a/src/services/ResourceDirectManager.js +++ b/src/services/ResourceDirectManager.js @@ -49,7 +49,7 @@ async function assignRole (legacyChallengeId, roleId, userId, handle, copilotPay logger.info('Add reviewer payment.') await ProjectPaymentDAO.persistReviewerPayment(userId, resourceId, reviewerPaymentAmount, config.LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID) } else { - logger.info(`Not a reviewer role ${roleId}.`) + logger.info(`Not a reviewer role ${roleId} or reviewerPaymentAmount:${reviewerPaymentAmount} is null`) } // only check notification setting for observer, else always add From 36d671fd501b4f4d9b33fe2d66128a18297454f6 Mon Sep 17 00:00:00 2001 From: Rakib Ansary Date: Wed, 17 Aug 2022 14:11:56 +0600 Subject: [PATCH 6/6] fix: env variable --- config/default.js | 2 +- src/dao/ProjectPaymentDAO.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/config/default.js b/config/default.js index df34d53..3fbf9ac 100755 --- a/config/default.js +++ b/config/default.js @@ -71,6 +71,6 @@ module.exports = { LEGACY_REVIEWER_ROLE_ID: process.env.LEGACY_REVIEWER_ROLE_ID || 4, LEGACY_REVIEW_PHASE_ID: process.env.LEGACY_REVIEW_PHASE_ID || 4, LEGACY_REVIEWER_ITERATIVE_ROLE_ID: process.env.LEGACY_REVIEWER_ITERATIVE_ROLE_ID || 21, - LEGACY_REVIEWER_PAYMENT_TYPE_ID: process.env.LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID || 3, + LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID: process.env.LEGACY_PROJECT_REVIEW_PAYMENT_TYPE_ID || 3, COPILOT_PAYMENT_TYPE: process.env.COPILOT_PAYMENT_TYPE || 'copilot' } diff --git a/src/dao/ProjectPaymentDAO.js b/src/dao/ProjectPaymentDAO.js index b84fd23..39bb362 100644 --- a/src/dao/ProjectPaymentDAO.js +++ b/src/dao/ProjectPaymentDAO.js @@ -39,6 +39,7 @@ async function persistReviewerPayment (userId, resourceId, amount, projectPaymen logger.info(`Creating project payment with id ${projectPaymentId}`) const query = await helper.prepare(connection, QUERY_INSERT_PROJECT_PAYMENT) + logger.info('Using parameters: ', [resourceId, amount, projectPaymentTypeId, userId, userId, projectPaymentId]) await query.executeAsync([resourceId, amount, projectPaymentTypeId, userId, userId, projectPaymentId]) logger.info(`Project payment with id ${projectPaymentId} has been created`)