From 99410bae4e561d5b66d0e5318e79b8d46231dd66 Mon Sep 17 00:00:00 2001 From: Mithun Kamath Date: Mon, 24 Aug 2020 12:49:39 +0530 Subject: [PATCH] Fix hapi issues and auth issues --- app-bootstrap.js | 26 +++++++++++- app-constants.js | 28 ------------- app.js | 1 - package-lock.json | 71 +++++++++++++++++---------------- package.json | 2 +- src/bootstrap.js | 29 -------------- src/common/helper.js | 3 -- src/common/logger.js | 2 +- src/{consts.js => constants.js} | 16 +++++++- src/routes.js | 2 +- src/services/UploadService.js | 8 ++-- 11 files changed, 83 insertions(+), 105 deletions(-) delete mode 100644 app-constants.js delete mode 100755 src/bootstrap.js rename src/{consts.js => constants.js} (65%) diff --git a/app-bootstrap.js b/app-bootstrap.js index bfbd838..a302fe4 100644 --- a/app-bootstrap.js +++ b/app-bootstrap.js @@ -1,7 +1,31 @@ /** - * App bootstrap + * add logger and joi to services */ + +const fs = require('fs') +const path = require('path') +const logger = require('./src/common/logger') + global.Promise = require('bluebird') const Joi = require('joi') Joi.id = () => Joi.string().uuid().required() + +/** + * add logger and joi schema to service + * @param dir + */ +function buildServices (dir) { + const files = fs.readdirSync(dir) + files.forEach((file) => { + const curPath = path.join(dir, file) + const stats = fs.statSync(curPath) + if (stats.isDirectory()) { + buildServices(curPath) + } else if (path.extname(file) === '.js') { + logger.buildService(require(curPath)); // eslint-disable-line + } + }) +} + +buildServices(path.join(__dirname, 'src', 'services')) diff --git a/app-constants.js b/app-constants.js deleted file mode 100644 index b7081e3..0000000 --- a/app-constants.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * App constants - */ -const UserRoles = { - admin: 'Admin', - administrator: 'Administrator', - topcoderUser: 'Topcoder User', - copilot: 'Copilot' -} - -const Scopes = { - CreateUpload: 'create:upload', - GetUpload: 'read:upload', - UpdateUpload: 'update:upload', - AllUpload: 'all:upload', - CreateTemplate: 'create:template', - GetTemplate: 'read:template', - AllTemplate: 'all:template', - GetSkill: 'read:skill', - AllSkill: 'all:skill' -} - -const AllAuthenticatedUsers = [UserRoles.admin, UserRoles.administrator, UserRoles.topcoderUser, UserRoles.copilot] - -module.exports = { - Scopes, - AllAuthenticatedUsers -} diff --git a/app.js b/app.js index 4b16afb..4324c9f 100755 --- a/app.js +++ b/app.js @@ -4,7 +4,6 @@ require('./app-bootstrap') -const path = require('path') const config = require('config') const express = require('express') const interceptor = require('express-interceptor') diff --git a/package-lock.json b/package-lock.json index 0ce80a7..1e3fdf6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -46,43 +46,34 @@ } }, "@hapi/address": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz", - "integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@hapi/address/-/address-4.1.0.tgz", + "integrity": "sha512-SkszZf13HVgGmChdHo/PxchnSaCJ6cetVqLzyciudzZRT0jcOouIF/Q93mgjw8cce+D+4F4C1Z/WrfFN+O3VHQ==", + "requires": { + "@hapi/hoek": "^9.0.0" + } }, "@hapi/formula": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-1.2.0.tgz", - "integrity": "sha512-UFbtbGPjstz0eWHb+ga/GM3Z9EzqKXFWIbSOFURU0A/Gku0Bky4bCk9/h//K2Xr3IrCfjFNhMm4jyZ5dbCewGA==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/formula/-/formula-2.0.0.tgz", + "integrity": "sha512-V87P8fv7PI0LH7LiVi8Lkf3x+KCO7pQozXRssAHNXXL9L1K+uyu4XypLXwxqVDKgyQai6qj3/KteNlrqDx4W5A==" }, "@hapi/hoek": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz", - "integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==" - }, - "@hapi/joi": { - "version": "16.1.8", - "resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-16.1.8.tgz", - "integrity": "sha512-wAsVvTPe+FwSrsAurNt5vkg3zo+TblvC5Bb1zMVK6SJzZqw9UrJnexxR+76cpePmtUZKHAPxcQ2Bf7oVHyahhg==", - "requires": { - "@hapi/address": "^2.1.2", - "@hapi/formula": "^1.2.0", - "@hapi/hoek": "^8.2.4", - "@hapi/pinpoint": "^1.0.2", - "@hapi/topo": "^3.1.3" - } + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.0.4.tgz", + "integrity": "sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==" }, "@hapi/pinpoint": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-1.0.2.tgz", - "integrity": "sha512-dtXC/WkZBfC5vxscazuiJ6iq4j9oNx1SHknmIr8hofarpKUZKmlUVYVIhNVzIEgK5Wrc4GMHL5lZtt1uS2flmQ==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@hapi/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-vzXR5MY7n4XeIvLpfl3HtE3coZYO4raKXW766R6DZw/6aLqR26iuZ109K7a0NtF2Db0jxqh7xz2AxkUwpUFybw==" }, "@hapi/topo": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz", - "integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz", + "integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==", "requires": { - "@hapi/hoek": "^8.3.0" + "@hapi/hoek": "^9.0.0" } }, "@tokenizer/token": { @@ -2162,13 +2153,15 @@ "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, "joi": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", - "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", + "version": "17.2.1", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.2.1.tgz", + "integrity": "sha512-YT3/4Ln+5YRpacdmfEfrrKh50/kkgX3LgBltjqnlMPIYiZ4hxXZuVJcxmsvxsdeHg9soZfE3qXxHC2tMpCCBOA==", "requires": { - "hoek": "5.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" + "@hapi/address": "^4.1.0", + "@hapi/formula": "^2.0.0", + "@hapi/hoek": "^9.0.0", + "@hapi/pinpoint": "^2.0.0", + "@hapi/topo": "^5.0.0" } }, "js-cookie": { @@ -3804,6 +3797,16 @@ "stream-consume": "^0.1.0" } }, + "joi": { + "version": "13.7.0", + "resolved": "https://registry.npmjs.org/joi/-/joi-13.7.0.tgz", + "integrity": "sha512-xuY5VkHfeOYK3Hdi91ulocfuFopwgbSORmIwzcwHKESQhC7w1kD5jaVSPnqDxS2I8t3RZ9omCKAxNwXN5zG1/Q==", + "requires": { + "hoek": "5.x.x", + "isemail": "3.x.x", + "topo": "3.x.x" + } + }, "tc-core-library-js": { "version": "github:appirio-tech/tc-core-library-js#d16413db30b1eed21c0cf426e185bedb2329ddab", "from": "github:appirio-tech/tc-core-library-js#v2.6", diff --git a/package.json b/package.json index e30bee0..db5037a 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,6 @@ "url": "" }, "dependencies": { - "@hapi/joi": "^16.1.8", "aws-sdk": "^2.627.0", "axios": "^0.19.2", "bluebird": "^3.5.1", @@ -33,6 +32,7 @@ "file-type": "^14.6.2", "get-parameter-names": "^0.3.0", "http-status-codes": "^1.3.0", + "joi": "^17.2.1", "js-yaml": "^3.14.0", "lodash": "^4.17.19", "multer": "^1.4.2", diff --git a/src/bootstrap.js b/src/bootstrap.js deleted file mode 100755 index ef7e2e9..0000000 --- a/src/bootstrap.js +++ /dev/null @@ -1,29 +0,0 @@ -/** - * add logger and joi to services - */ - -const fs = require('fs') -const path = require('path') -const logger = require('./common/logger') - -/** - * add logger and joi schema to service - * @param dir - */ -function buildServices (dir) { - const files = fs.readdirSync(dir) - files.forEach((file) => { - const curPath = path.join(dir, file) - const stats = fs.statSync(curPath) - if (stats.isDirectory()) { - buildServices(curPath) - } else if (file.toLowerCase().indexOf('service.js') >= 0) { - let serviceName = curPath.split('modules')[1] - serviceName = serviceName.substr(1, serviceName.length - 4) - logger.info(`add decorates for service --> ${serviceName}`) - logger.buildService(serviceName, require(curPath)); // eslint-disable-line - } - }) -} - -buildServices(path.join(__dirname, 'modules')) diff --git a/src/common/helper.js b/src/common/helper.js index 98ad448..f6c5d95 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -5,9 +5,6 @@ const _ = require('lodash') const config = require('config') const AWS = require('aws-sdk') const path = require('path') -const axios = require('axios') -const querystring = require('querystring') -const NodeCache = require('node-cache') const models = require('../models') const errors = require('./errors') const logger = require('./logger') diff --git a/src/common/logger.js b/src/common/logger.js index 1011716..7154cbd 100644 --- a/src/common/logger.js +++ b/src/common/logger.js @@ -119,7 +119,7 @@ logger.decorateWithValidators = function (service) { service[name] = async function () { const args = Array.prototype.slice.call(arguments) const value = _combineObject(params, args) - const normalized = Joi.attempt(value, method.schema) + const normalized = Joi.attempt(value, Joi.object(method.schema)) const newArgs = [] // Joi will normalize values diff --git a/src/consts.js b/src/constants.js similarity index 65% rename from src/consts.js rename to src/constants.js index 18835a2..93517d8 100644 --- a/src/consts.js +++ b/src/constants.js @@ -26,8 +26,20 @@ const AllAuthenticatedUsers = [ */ const AdminUser = [UserRoles.admin, UserRoles.administrator] +const Scopes = { + CreateUpload: 'create:upload', + GetUpload: 'read:upload', + UpdateUpload: 'update:upload', + AllUpload: 'all:upload', + CreateTemplate: 'create:template', + GetTemplate: 'read:template', + AllTemplate: 'all:template', + GetSkill: 'read:skill', + AllSkill: 'all:skill' +} + module.exports = { - UserRoles, AllAuthenticatedUsers, - AdminUser + AdminUser, + Scopes } diff --git a/src/routes.js b/src/routes.js index 073d737..6bcf34b 100644 --- a/src/routes.js +++ b/src/routes.js @@ -4,7 +4,7 @@ const multer = require('multer') const config = require('config') const _ = require('lodash') -const constants = require('../app-constants') +const constants = require('./constants') const fileUpload = multer({ storage: multer.memoryStorage() }) // config template upload properties diff --git a/src/services/UploadService.js b/src/services/UploadService.js index d9dc270..9570dfd 100644 --- a/src/services/UploadService.js +++ b/src/services/UploadService.js @@ -14,12 +14,12 @@ const logger = require('../common/logger') * Checks the type of uploaded file and ensures it's allowed. * @param {Object} upload The uploaded file */ -async function ensureFileTypeIsValid(upload) { +async function ensureFileTypeIsValid (upload) { const allowedExtensions = ['xls', 'xlsx', 'csv'] const allowedMimeTypes = [ 'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'text/csv', + 'text/csv' ] const fileType = await FileType.fromBuffer(upload.buffer) const fileExt = upload.originalname.split('.').pop().toLowerCase() @@ -30,7 +30,7 @@ async function ensureFileTypeIsValid(upload) { if (isAllowed === false) { throw new errors.ForbiddenError(`You are allowed to upload only ${_.join(allowedExtensions, ',')} types.`) } -} +} /** * Get upload entity by id. @@ -117,7 +117,7 @@ partiallyUpdate.schema = { id: Joi.id(), authUser: Joi.object().required(), data: Joi.object().keys({ - status: Joi.string().valid(['pending', 'completed', 'failed']).required(), + status: Joi.string().valid('pending', 'completed', 'failed').required(), info: Joi.string() }).required() }