From 2aafc4e313566e52a4bc977cc2d39a6b5a6734a1 Mon Sep 17 00:00:00 2001 From: yoution Date: Wed, 18 Aug 2021 15:00:36 +0800 Subject: [PATCH 1/7] feat: disable topic about WorkPeriodService, WorkPeriodPaymentService and ResourceBookingService from taas-api --- src/app.js | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/src/app.js b/src/app.js index bc6bb2a..30faa4e 100644 --- a/src/app.js +++ b/src/app.js @@ -11,10 +11,10 @@ const logger = require('./common/logger') const helper = require('./common/helper') const JobProcessorService = require('./services/JobProcessorService') const JobCandidateProcessorService = require('./services/JobCandidateProcessorService') -const ResourceBookingProcessorService = require('./services/ResourceBookingProcessorService') -const WorkPeriodProcessorService = require('./services/WorkPeriodProcessorService') +// const ResourceBookingProcessorService = require('./services/ResourceBookingProcessorService') +// const WorkPeriodProcessorService = require('./services/WorkPeriodProcessorService') const InterviewProcessorService = require('./services/InterviewProcessorService') -const WorkPeriodPaymentProcessorService = require('./services/WorkPeriodPaymentProcessorService') +// const WorkPeriodPaymentProcessorService = require('./services/WorkPeriodPaymentProcessorService') const RoleProcessorService = require('./services/RoleProcessorService') const ActionProcessorService = require('./services/ActionProcessorService') const Mutex = require('async-mutex').Mutex @@ -40,16 +40,16 @@ const topicServiceMapping = { [config.topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC]: JobCandidateProcessorService.processUpdate, [config.topics.TAAS_JOB_CANDIDATE_DELETE_TOPIC]: JobCandidateProcessorService.processDelete, // resource booking - [config.topics.TAAS_RESOURCE_BOOKING_CREATE_TOPIC]: ResourceBookingProcessorService.processCreate, - [config.topics.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC]: ResourceBookingProcessorService.processUpdate, - [config.topics.TAAS_RESOURCE_BOOKING_DELETE_TOPIC]: ResourceBookingProcessorService.processDelete, + // [config.topics.TAAS_RESOURCE_BOOKING_CREATE_TOPIC]: ResourceBookingProcessorService.processCreate, + // [config.topics.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC]: ResourceBookingProcessorService.processUpdate, + // [config.topics.TAAS_RESOURCE_BOOKING_DELETE_TOPIC]: ResourceBookingProcessorService.processDelete, // work period - [config.topics.TAAS_WORK_PERIOD_CREATE_TOPIC]: WorkPeriodProcessorService.processCreate, - [config.topics.TAAS_WORK_PERIOD_UPDATE_TOPIC]: WorkPeriodProcessorService.processUpdate, - [config.topics.TAAS_WORK_PERIOD_DELETE_TOPIC]: WorkPeriodProcessorService.processDelete, + // [config.topics.TAAS_WORK_PERIOD_CREATE_TOPIC]: WorkPeriodProcessorService.processCreate, + // [config.topics.TAAS_WORK_PERIOD_UPDATE_TOPIC]: WorkPeriodProcessorService.processUpdate, + // [config.topics.TAAS_WORK_PERIOD_DELETE_TOPIC]: WorkPeriodProcessorService.processDelete, // work period payment - [config.topics.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC]: WorkPeriodPaymentProcessorService.processCreate, - [config.topics.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC]: WorkPeriodPaymentProcessorService.processUpdate, + // [config.topics.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC]: WorkPeriodPaymentProcessorService.processCreate, + // [config.topics.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC]: WorkPeriodPaymentProcessorService.processUpdate, // interview [config.topics.TAAS_INTERVIEW_REQUEST_TOPIC]: InterviewProcessorService.processRequestInterview, [config.topics.TAAS_INTERVIEW_UPDATE_TOPIC]: InterviewProcessorService.processUpdateInterview, @@ -117,12 +117,10 @@ const dataHandler = (messageSet, topic, partition) => Promise.each(messageSet, a } const transactionId = _.uniqueId('transaction_') try { - if (!topicServiceMapping[topic]) { - throw new Error(`Unknown topic: ${topic}`) // normally it never reaches this line + if (topicServiceMapping[topic]) { + await topicServiceMapping[topic](messageJSON, transactionId) + localLogger.debug(`Successfully processed message with count ${messageCount}`) } - await topicServiceMapping[topic](messageJSON, transactionId) - - localLogger.debug(`Successfully processed message with count ${messageCount}`) } catch (err) { logger.logFullError(err, { component: 'app' }) } finally { From ab7be1f9a7cacce779671057385e42d26a3e7656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E9=BE=9A?= Date: Fri, 20 Aug 2021 09:48:22 +0800 Subject: [PATCH 2/7] feat: disable es update topic --- src/app.js | 22 +++++++------- src/services/JobCandidateProcessorService.js | 24 +++++++-------- src/services/JobProcessorService.js | 32 ++++++++++---------- 3 files changed, 39 insertions(+), 39 deletions(-) diff --git a/src/app.js b/src/app.js index 30faa4e..534b155 100644 --- a/src/app.js +++ b/src/app.js @@ -13,9 +13,9 @@ const JobProcessorService = require('./services/JobProcessorService') const JobCandidateProcessorService = require('./services/JobCandidateProcessorService') // const ResourceBookingProcessorService = require('./services/ResourceBookingProcessorService') // const WorkPeriodProcessorService = require('./services/WorkPeriodProcessorService') -const InterviewProcessorService = require('./services/InterviewProcessorService') +// const InterviewProcessorService = require('./services/InterviewProcessorService') // const WorkPeriodPaymentProcessorService = require('./services/WorkPeriodPaymentProcessorService') -const RoleProcessorService = require('./services/RoleProcessorService') +// const RoleProcessorService = require('./services/RoleProcessorService') const ActionProcessorService = require('./services/ActionProcessorService') const Mutex = require('async-mutex').Mutex const events = require('events') @@ -34,11 +34,11 @@ const topicServiceMapping = { // job [config.topics.TAAS_JOB_CREATE_TOPIC]: JobProcessorService.processCreate, [config.topics.TAAS_JOB_UPDATE_TOPIC]: JobProcessorService.processUpdate, - [config.topics.TAAS_JOB_DELETE_TOPIC]: JobProcessorService.processDelete, + // [config.topics.TAAS_JOB_DELETE_TOPIC]: JobProcessorService.processDelete, // job candidate - [config.topics.TAAS_JOB_CANDIDATE_CREATE_TOPIC]: JobCandidateProcessorService.processCreate, + // [config.topics.TAAS_JOB_CANDIDATE_CREATE_TOPIC]: JobCandidateProcessorService.processCreate, [config.topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC]: JobCandidateProcessorService.processUpdate, - [config.topics.TAAS_JOB_CANDIDATE_DELETE_TOPIC]: JobCandidateProcessorService.processDelete, + // [config.topics.TAAS_JOB_CANDIDATE_DELETE_TOPIC]: JobCandidateProcessorService.processDelete, // resource booking // [config.topics.TAAS_RESOURCE_BOOKING_CREATE_TOPIC]: ResourceBookingProcessorService.processCreate, // [config.topics.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC]: ResourceBookingProcessorService.processUpdate, @@ -51,13 +51,13 @@ const topicServiceMapping = { // [config.topics.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC]: WorkPeriodPaymentProcessorService.processCreate, // [config.topics.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC]: WorkPeriodPaymentProcessorService.processUpdate, // interview - [config.topics.TAAS_INTERVIEW_REQUEST_TOPIC]: InterviewProcessorService.processRequestInterview, - [config.topics.TAAS_INTERVIEW_UPDATE_TOPIC]: InterviewProcessorService.processUpdateInterview, - [config.topics.TAAS_INTERVIEW_BULK_UPDATE_TOPIC]: InterviewProcessorService.processBulkUpdateInterviews, + // [config.topics.TAAS_INTERVIEW_REQUEST_TOPIC]: InterviewProcessorService.processRequestInterview, + // [config.topics.TAAS_INTERVIEW_UPDATE_TOPIC]: InterviewProcessorService.processUpdateInterview, + // [config.topics.TAAS_INTERVIEW_BULK_UPDATE_TOPIC]: InterviewProcessorService.processBulkUpdateInterviews, // role - [config.topics.TAAS_ROLE_CREATE_TOPIC]: RoleProcessorService.processCreate, - [config.topics.TAAS_ROLE_UPDATE_TOPIC]: RoleProcessorService.processUpdate, - [config.topics.TAAS_ROLE_DELETE_TOPIC]: RoleProcessorService.processDelete, + // [config.topics.TAAS_ROLE_CREATE_TOPIC]: RoleProcessorService.processCreate, + // [config.topics.TAAS_ROLE_UPDATE_TOPIC]: RoleProcessorService.processUpdate, + // [config.topics.TAAS_ROLE_DELETE_TOPIC]: RoleProcessorService.processDelete, // action [config.topics.TAAS_ACTION_RETRY_TOPIC]: ActionProcessorService.processRetry } diff --git a/src/services/JobCandidateProcessorService.js b/src/services/JobCandidateProcessorService.js index d245c68..58137ed 100644 --- a/src/services/JobCandidateProcessorService.js +++ b/src/services/JobCandidateProcessorService.js @@ -126,15 +126,15 @@ async function processUpdate (message, transactionId) { index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), id: data.id }) - await esClient.updateExtra({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - id: data.id, - transactionId, - body: { - doc: data - }, - refresh: constants.esRefreshOption - }) + // await esClient.updateExtra({ + // index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), + // id: data.id, + // transactionId, + // body: { + // doc: data + // }, + // refresh: constants.esRefreshOption + // }) await postMessageToZapier({ type: constants.Zapier.MessageType.JobCandidateUpdate, payload: data, @@ -174,9 +174,9 @@ processDelete.schema = { } module.exports = { - processCreate, - processUpdate, - processDelete + // processCreate, + processUpdate + // processDelete } logger.buildService(module.exports, 'JobCandidateProcessorService') diff --git a/src/services/JobProcessorService.js b/src/services/JobProcessorService.js index 9e9cfd0..a1e6388 100644 --- a/src/services/JobProcessorService.js +++ b/src/services/JobProcessorService.js @@ -46,13 +46,13 @@ async function postMessageToZapier ({ type, payload }) { */ async function processCreate (message, transactionId) { const job = message.payload - await esClient.createExtra({ - index: config.get('esConfig.ES_INDEX_JOB'), - id: job.id, - transactionId, - body: job, - refresh: constants.esRefreshOption - }) + // await esClient.createExtra({ + // index: config.get('esConfig.ES_INDEX_JOB'), + // id: job.id, + // transactionId, + // body: job, + // refresh: constants.esRefreshOption + // }) await postMessageToZapier({ type: constants.Zapier.MessageType.JobCreate, payload: job @@ -110,15 +110,15 @@ processCreate.schema = { */ async function processUpdate (message, transactionId) { const data = message.payload - await esClient.updateExtra({ - index: config.get('esConfig.ES_INDEX_JOB'), - id: data.id, - transactionId, - body: { - doc: data - }, - refresh: constants.esRefreshOption - }) + // await esClient.updateExtra({ + // index: config.get('esConfig.ES_INDEX_JOB'), + // id: data.id, + // transactionId, + // body: { + // doc: data + // }, + // refresh: constants.esRefreshOption + // }) await postMessageToZapier({ type: constants.Zapier.MessageType.JobUpdate, payload: data From 9c87c6a352e3227cec84eaf93e61c0504a12e723 Mon Sep 17 00:00:00 2001 From: Sachin Maheshwari Date: Thu, 26 Aug 2021 10:36:33 +0530 Subject: [PATCH 3/7] feature/shapeup4-cqrs-update --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 3dc37e3..7c733d2 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: only: - dev - dev-circleci - - change-validatations-in-job-j + - feature/shapeup4-cqrs-update # Production builds are exectuted only on tagged commits to the # master branch. From 8e27002c0025cffb010566b8140b45d009b05f96 Mon Sep 17 00:00:00 2001 From: yoution Date: Tue, 31 Aug 2021 13:56:35 +0800 Subject: [PATCH 4/7] fix: issue topcoder-platform/taas-apis#524 --- src/services/JobCandidateProcessorService.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/services/JobCandidateProcessorService.js b/src/services/JobCandidateProcessorService.js index 35828b7..3f25882 100644 --- a/src/services/JobCandidateProcessorService.js +++ b/src/services/JobCandidateProcessorService.js @@ -21,10 +21,10 @@ const localLogger = { * @returns {undefined} */ async function updateCandidateStatus ({ type, payload, previousData }) { - if (previousData.status === payload.status) { - localLogger.debug({ context: 'updateCandidateStatus', message: `jobCandidate is already in status: ${payload.status}` }) - return - } + // if (previousData.status === payload.status) { + // localLogger.debug({ context: 'updateCandidateStatus', message: `jobCandidate is already in status: ${payload.status}` }) + // return + // } // if (!['rejected', 'shortlist',].includes(payload.status)) { if (!['client rejected - screening', 'client rejected - interview', 'interview', 'selected', 'withdrawn', 'withdrawn-prescreen'].includes(payload.status)) { localLogger.debug({ context: 'updateCandidateStatus', message: `not interested status: ${payload.status}` }) From 05193c6e50d448cf5badc3be2aba126866c751ae Mon Sep 17 00:00:00 2001 From: Sachin Maheshwari Date: Wed, 1 Sep 2021 18:39:22 +0530 Subject: [PATCH 5/7] creating another branch for cleanup --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7c733d2..00ab761 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -72,7 +72,7 @@ workflows: only: - dev - dev-circleci - - feature/shapeup4-cqrs-update + - feature/shapeup4-cqrs-update2 # Production builds are exectuted only on tagged commits to the # master branch. From bff9586f3a7fe00f89888e40db2c75f099557aea Mon Sep 17 00:00:00 2001 From: yoution Date: Wed, 1 Sep 2021 23:41:53 +0800 Subject: [PATCH 6/7] clean up for cqrs --- README.md | 42 - VERIFICATION.md | 64 - config/default.js | 41 +- config/test.js | 4 +- local/docker-compose.yml | 2 +- package-lock.json | 2041 +---------------- package.json | 26 +- src/app.js | 33 +- src/bootstrap.js | 11 - src/common/constants.js | 16 - src/common/errors.js | 40 - src/common/helper.js | 114 +- src/scripts/createIndex.js | 165 -- src/scripts/deleteIndex.js | 5 +- src/scripts/view-data.js | 5 +- src/services/ActionProcessorService.js | 83 - src/services/InterviewProcessorService.js | 202 -- src/services/JobCandidateProcessorService.js | 96 +- src/services/JobProcessorService.js | 50 +- .../ResourceBookingProcessorService.js | 113 - src/services/RoleProcessorService.js | 124 - .../WorkPeriodPaymentProcessorService.js | 131 -- src/services/WorkPeriodProcessorService.js | 200 -- test/common/testData.js | 43 - test/common/testHelper.js | 53 - test/e2e/test.js | 287 --- test/messages/taas.job.create.event.json | 38 - test/messages/taas.job.delete.event.json | 9 - test/messages/taas.job.update.event.json | 37 - .../taas.jobcandidate.create.event.json | 15 - .../taas.jobcandidate.delete.event.json | 9 - .../taas.jobcandidate.update.event.json | 17 - .../taas.resourcebooking.create.event.json | 21 - .../taas.resourcebooking.delete.event.json | 9 - .../taas.resourcebooking.update.event.json | 23 - test/messages/taas.role.create.event.json | 50 - test/messages/taas.role.delete.event .json | 9 - test/messages/taas.role.update.event.json | 48 - .../taas.workperiod.create.event.json | 22 - .../taas.workperiod.delete.event.json | 9 - .../taas.workperiod.update.event.json | 22 - .../taas.workperiodpayment.create.event.json | 18 - .../taas.workperiodpayment.update.event.json | 18 - test/unit/prepare.js | 91 - test/unit/test.js | 428 ---- 45 files changed, 73 insertions(+), 4811 deletions(-) delete mode 100644 VERIFICATION.md delete mode 100644 src/common/errors.js delete mode 100644 src/services/ActionProcessorService.js delete mode 100644 src/services/InterviewProcessorService.js delete mode 100644 src/services/ResourceBookingProcessorService.js delete mode 100644 src/services/RoleProcessorService.js delete mode 100644 src/services/WorkPeriodPaymentProcessorService.js delete mode 100644 src/services/WorkPeriodProcessorService.js delete mode 100644 test/common/testData.js delete mode 100644 test/common/testHelper.js delete mode 100644 test/e2e/test.js delete mode 100644 test/messages/taas.job.create.event.json delete mode 100644 test/messages/taas.job.delete.event.json delete mode 100644 test/messages/taas.job.update.event.json delete mode 100644 test/messages/taas.jobcandidate.create.event.json delete mode 100644 test/messages/taas.jobcandidate.delete.event.json delete mode 100644 test/messages/taas.jobcandidate.update.event.json delete mode 100644 test/messages/taas.resourcebooking.create.event.json delete mode 100644 test/messages/taas.resourcebooking.delete.event.json delete mode 100644 test/messages/taas.resourcebooking.update.event.json delete mode 100644 test/messages/taas.role.create.event.json delete mode 100644 test/messages/taas.role.delete.event .json delete mode 100644 test/messages/taas.role.update.event.json delete mode 100644 test/messages/taas.workperiod.create.event.json delete mode 100644 test/messages/taas.workperiod.delete.event.json delete mode 100644 test/messages/taas.workperiod.update.event.json delete mode 100644 test/messages/taas.workperiodpayment.create.event.json delete mode 100644 test/messages/taas.workperiodpayment.update.event.json delete mode 100644 test/unit/prepare.js delete mode 100644 test/unit/test.js diff --git a/README.md b/README.md index 647f29f..934c5d6 100644 --- a/README.md +++ b/README.md @@ -22,40 +22,15 @@ The following parameters can be set in config files or in env variables: if provided, it can be either path to private key file or private key content - `KAFKA_MESSAGE_ORIGINATOR`: The originator value for the kafka messages - `KAFKA_GROUP_ID`: the Kafka group id -- `topics.KAFKA_ERROR_TOPIC`: the error topic at which bus api will publish any errors - `topics.TAAS_JOB_CREATE_TOPIC`: the create job entity Kafka message topic - `topics.TAAS_JOB_UPDATE_TOPIC`: the update job entity Kafka message topic -- `topics.TAAS_JOB_DELETE_TOPIC`: the delete job entity Kafka message topic -- `topics.TAAS_JOB_CANDIDATE_CREATE_TOPIC`: the create job candidate entity Kafka message topic - `topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC`: the update job candidate entity Kafka message topic -- `topics.TAAS_JOB_CANDIDATE_DELETE_TOPIC`: the delete job candidate entity Kafka message topic -- `topics.TAAS_RESOURCE_BOOKING_CREATE_TOPIC`: the create resource booking entity Kafka message topic -- `topics.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC`: the update resource booking entity Kafka message topic -- `topics.TAAS_RESOURCE_BOOKING_DELETE_TOPIC`: the delete resource booking entity Kafka message topic -- `topics.TAAS_WORK_PERIOD_CREATE_TOPIC`: the create work period entity Kafka message topic -- `topics.TAAS_WORK_PERIOD_UPDATE_TOPIC`: the update work period entity Kafka message topic -- `topics.TAAS_WORK_PERIOD_DELETE_TOPIC`: the delete work period entity Kafka message topic -- `topics.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC`: the create work period payment entity Kafka message topic -- `topics.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC`: the update work period payment entity Kafka message topic -- `topics.TAAS_INTERVIEW_REQUEST_TOPIC`: the request interview entity Kafka message topic -- `topics.TAAS_INTERVIEW_UPDATE_TOPIC`: the update interview entity Kafka message topic -- `topics.TAAS_INTERVIEW_BULK_UPDATE_TOPIC`: the bulk update interview entity Kafka message topic -- `topics.TAAS_ROLE_CREATE_TOPIC`: the create role entity Kafka message topic -- `topics.TAAS_ROLE_UPDATE_TOPIC`: the update role entity Kafka message topic -- `topics.TAAS_ROLE_DELETE_TOPIC`: the delete role entity Kafka message topic -- `topics.TAAS_ACTION_RETRY_TOPIC`: the retry process Kafka message topic -- `MAX_RETRY`: maximum allowed retry count for failed operations for sending `taas.action.retry` message -- `BASE_RETRY_DELAY`: base amount of retry delay (ms) for failed operations -- `BUSAPI_URL`: Topcoder Bus API URL - `esConfig.HOST`: Elasticsearch host - `esConfig.AWS_REGION`: The Amazon region to use when using AWS Elasticsearch service - `esConfig.ELASTICCLOUD.id`: The elastic cloud id, if your elasticsearch instance is hosted on elastic cloud. DO NOT provide a value for ES_HOST if you are using this - `esConfig.ELASTICCLOUD.username`: The elastic cloud username for basic authentication. Provide this only if your elasticsearch instance is hosted on elastic cloud - `esConfig.ELASTICCLOUD.password`: The elastic cloud password for basic authentication. Provide this only if your elasticsearch instance is hosted on elastic cloud - `esConfig.ES_INDEX_JOB`: the index name for job -- `esConfig.ES_INDEX_JOB_CANDIDATE`: the index name for job candidate -- `esConfig.ES_INDEX_RESOURCE_BOOKING`: the index name for resource booking -- `esConfig.ES_INDEX_ROLE`: the index name for role - `auth0.AUTH0_URL`: Auth0 URL, used to get TC M2M token - `auth0.AUTH0_AUDIENCE`: Auth0 audience, used to get TC M2M token @@ -158,20 +133,3 @@ To run the processor using docker, follow the below steps ``` 5. When you are running the application for the first time, It will take some time initially to download the image and install the dependencies - -## Unit Tests and E2E Tests - -### Unit Tests -- Run `npm run test` to execute unit tests. -- Run `npm run test:cov` to execute unit tests and generate coverage report. - -### E2E Tests -Before running e2e tests, make sure index are created and the processor app is not running. Existing documents will be remove -from ES before and after tests. - -- RUN `npm run e2e` to execute e2e tests. -- RUN `npm run e2e:cov` to execute e2e tests and generate coverage report. - -## Verification - -see [VERIFICATION.md](VERIFICATION.md) diff --git a/VERIFICATION.md b/VERIFICATION.md deleted file mode 100644 index d6696f1..0000000 --- a/VERIFICATION.md +++ /dev/null @@ -1,64 +0,0 @@ -# Verification - -## Create documents in ES - -- Run the following commands to create `Job`, `JobCandidate`, `Interview`, `ResourceBooking`, `WorkPeriod`, `WorkPeriodPayment`, `Role` documents in ES. - - ``` bash - # for Job - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.job.create < test/messages/taas.job.create.event.json - # for JobCandidate - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.jobcandidate.create < test/messages/taas.jobcandidate.create.event.json - # for Interview - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.interview.requested < test/messages/taas.interview.requested.event.json - # for ResourceBooking - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.resourcebooking.create < test/messages/taas.resourcebooking.create.event.json - # for WorkPeriod - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiod.create < test/messages/taas.workperiod.create.event.json - # for WorkPeriodPayment - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiodpayment.create < test/messages/taas.workperiodpayment.create.event.json - # for Role - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.role.requested < test/messages/taas.role.create.event.json - ``` - -- Run `npm run view-data ` to see if documents were created. - -## Update documents in ES -- Run the following commands to update `Job`, `JobCandidate`, `Interview`, `ResourceBooking`, `WorkPeriod`, `WorkPeriodPayment`, `Role` documents in ES. - - ``` bash - # for Job - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.job.update < test/messages/taas.job.update.event.json - # for JobCandidate - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.jobcandidate.update < test/messages/taas.jobcandidate.update.event.json - # for Interview - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.interview.update < test/messages/taas.interview.update.event.json - # for ResourceBooking - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.resourcebooking.update < test/messages/taas.resourcebooking.update.event.json - # for WorkPeriod - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiod.update < test/messages/taas.workperiod.update.event.json - # for WorkPeriodPayment - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiodpayment.update < test/messages/taas.workperiodpayment.update.event.json - # for Role - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.role.update < test/messages/taas.role.update.event.json - ``` - -- Run `npm run view-data ` to see if documents were updated. - -## Delete documents in ES -- Run the following commands to delete `Job`, `JobCandidate`, `ResourceBooking`, `WorkPeriod`, `Role` documents in ES. - - ``` bash - # for Job - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.job.delete < test/messages/taas.job.delete.event.json - # for JobCandidate - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.jobcandidate.delete < test/messages/taas.jobcandidate.delete.event.json - # for ResourceBooking - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.resourcebooking.delete < test/messages/taas.resourcebooking.delete.event.json - # for WorkPeriod - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.workperiod.delete < test/messages/taas.workperiod.delete.event.json - # for Role - docker exec -i taas-es-processor_kafka /opt/kafka/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic taas.role.delete < test/messages/taas.role.delete.event.json - ``` - -- Run `npm run view-data ` to see if documents were deleted. diff --git a/config/default.js b/config/default.js index 059ecdc..c4d4b8d 100644 --- a/config/default.js +++ b/config/default.js @@ -18,46 +18,12 @@ module.exports = { KAFKA_MESSAGE_ORIGINATOR: process.env.KAFKA_MESSAGE_ORIGINATOR || 'taas-es-processor', topics: { - // The error topic at which bus api will publish any errors - KAFKA_ERROR_TOPIC: process.env.KAFKA_ERROR_TOPIC || 'common.error.reporting', // topics for job service TAAS_JOB_CREATE_TOPIC: process.env.TAAS_JOB_CREATE_TOPIC || 'taas.job.create', TAAS_JOB_UPDATE_TOPIC: process.env.TAAS_JOB_UPDATE_TOPIC || 'taas.job.update', - TAAS_JOB_DELETE_TOPIC: process.env.TAAS_JOB_DELETE_TOPIC || 'taas.job.delete', // topics for jobcandidate service - TAAS_JOB_CANDIDATE_CREATE_TOPIC: process.env.TAAS_JOB_CANDIDATE_CREATE_TOPIC || 'taas.jobcandidate.create', - TAAS_JOB_CANDIDATE_UPDATE_TOPIC: process.env.TAAS_JOB_CANDIDATE_UPDATE_TOPIC || 'taas.jobcandidate.update', - TAAS_JOB_CANDIDATE_DELETE_TOPIC: process.env.TAAS_JOB_CANDIDATE_DELETE_TOPIC || 'taas.jobcandidate.delete', - // topics for resource booking service - TAAS_RESOURCE_BOOKING_CREATE_TOPIC: process.env.TAAS_RESOURCE_BOOKING_CREATE_TOPIC || 'taas.resourcebooking.create', - TAAS_RESOURCE_BOOKING_UPDATE_TOPIC: process.env.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC || 'taas.resourcebooking.update', - TAAS_RESOURCE_BOOKING_DELETE_TOPIC: process.env.TAAS_RESOURCE_BOOKING_DELETE_TOPIC || 'taas.resourcebooking.delete', - // topics for work period service - TAAS_WORK_PERIOD_CREATE_TOPIC: process.env.TAAS_WORK_PERIOD_CREATE_TOPIC || 'taas.workperiod.create', - TAAS_WORK_PERIOD_UPDATE_TOPIC: process.env.TAAS_WORK_PERIOD_UPDATE_TOPIC || 'taas.workperiod.update', - TAAS_WORK_PERIOD_DELETE_TOPIC: process.env.TAAS_WORK_PERIOD_DELETE_TOPIC || 'taas.workperiod.delete', - // topics for work period payment service - TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC: process.env.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC || 'taas.workperiodpayment.create', - TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC: process.env.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC || 'taas.workperiodpayment.update', - // topics for interview service - TAAS_INTERVIEW_REQUEST_TOPIC: process.env.TAAS_INTERVIEW_REQUEST_TOPIC || 'taas.interview.requested', - TAAS_INTERVIEW_UPDATE_TOPIC: process.env.TAAS_INTERVIEW_UPDATE_TOPIC || 'taas.interview.update', - TAAS_INTERVIEW_BULK_UPDATE_TOPIC: process.env.TAAS_INTERVIEW_BULK_UPDATE_TOPIC || 'taas.interview.bulkUpdate', - // topics for role service - TAAS_ROLE_CREATE_TOPIC: process.env.TAAS_ROLE_CREATE_TOPIC || 'taas.role.requested', - TAAS_ROLE_UPDATE_TOPIC: process.env.TAAS_ROLE_UPDATE_TOPIC || 'taas.role.update', - TAAS_ROLE_DELETE_TOPIC: process.env.TAAS_ROLE_DELETE_TOPIC || 'taas.role.delete', - // special kafka topics - TAAS_ACTION_RETRY_TOPIC: process.env.TAAS_ACTION_RETRY_TOPIC || 'taas.action.retry' - + TAAS_JOB_CANDIDATE_UPDATE_TOPIC: process.env.TAAS_JOB_CANDIDATE_UPDATE_TOPIC || 'taas.jobcandidate.update' }, - // maximum allowed retry count for failed operations for sending `action.retry` message - MAX_RETRY: process.env.MAX_RETRY || 3, - // base amount of retry delay for failed operations - BASE_RETRY_DELAY: process.env.BASE_RETRY_DELAY || 500, - // Topcoder Bus API URL - BUSAPI_URL: process.env.BUSAPI_URL || 'https://api.topcoder-dev.com/v5', - esConfig: { HOST: process.env.ES_HOST || 'http://localhost:9200', @@ -69,10 +35,7 @@ module.exports = { AWS_REGION: process.env.AWS_REGION || 'us-east-1', // AWS Region to be used if we use AWS ES - ES_INDEX_JOB: process.env.ES_INDEX_JOB || 'job', - ES_INDEX_JOB_CANDIDATE: process.env.ES_INDEX_JOB_CANDIDATE || 'job_candidate', - ES_INDEX_RESOURCE_BOOKING: process.env.ES_INDEX_RESOURCE_BOOKING || 'resource_booking', - ES_INDEX_ROLE: process.env.ES_INDEX_ROLE || 'role' + ES_INDEX_JOB: process.env.ES_INDEX_JOB || 'job' }, auth0: { diff --git a/config/test.js b/config/test.js index c5b51db..c462fb0 100644 --- a/config/test.js +++ b/config/test.js @@ -6,7 +6,5 @@ module.exports = { zapier: { ZAPIER_SWITCH: process.env.ZAPIER_SWITCH || 'ON', ZAPIER_JOB_CANDIDATE_SWITCH: process.env.ZAPIER_JOB_CANDIDATE_SWITCH || 'ON' - }, - // don't retry actions during tests because tests for now don't expect it and should be updated first - MAX_RETRY: 0 + } } diff --git a/local/docker-compose.yml b/local/docker-compose.yml index 936f378..865289e 100644 --- a/local/docker-compose.yml +++ b/local/docker-compose.yml @@ -12,7 +12,7 @@ services: - "9092:9092" environment: KAFKA_ADVERTISED_HOST_NAME: localhost - KAFKA_CREATE_TOPICS: "taas.job.create:1:1,taas.jobcandidate.create:1:1,taas.interview.requested:1:1,taas.resourcebooking.create:1:1,taas.workperiod.create:1:1,taas.workperiodpayment.create:1:1,taas.job.update:1:1,taas.jobcandidate.update:1:1,taas.interview.update:1:1,taas.interview.bulkUpdate:1:1,taas.resourcebooking.update:1:1,taas.workperiod.update:1:1,taas.workperiodpayment.update:1:1,taas.job.delete:1:1,taas.jobcandidate.delete:1:1,taas.resourcebooking.delete:1:1,taas.workperiod.delete:1:1" + KAFKA_CREATE_TOPICS: "taas.job.create:1:1,taas.job.update:1:1,taas.jobcandidate.update:1:1" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 esearch: image: elasticsearch:7.7.1 diff --git a/package-lock.json b/package-lock.json index fec285f..0cc8073 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,155 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@babel/code-frame": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", - "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, - "requires": { - "@babel/highlight": "^7.0.0" - } - }, - "@babel/generator": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.5.0.tgz", - "integrity": "sha512-1TTVrt7J9rcG5PMjvO7VEG3FrEoEJNHxumRq66GemPmzboLWtIjjcJgk8rokuAS7IiRSpgVSu5Vb9lc99iJkOA==", - "dev": true, - "requires": { - "@babel/types": "^7.5.0", - "jsesc": "^2.5.1", - "lodash": "^4.17.11", - "source-map": "^0.5.0", - "trim-right": "^1.0.1" - } - }, - "@babel/helper-function-name": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", - "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", - "dev": true, - "requires": { - "@babel/helper-get-function-arity": "^7.0.0", - "@babel/template": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-get-function-arity": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", - "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", - "dev": true, - "requires": { - "@babel/types": "^7.0.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", - "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", - "dev": true, - "requires": { - "@babel/types": "^7.4.4" - } - }, - "@babel/highlight": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", - "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", - "dev": true, - "requires": { - "chalk": "^2.0.0", - "esutils": "^2.0.2", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.5.0.tgz", - "integrity": "sha512-I5nW8AhGpOXGCCNYGc+p7ExQIBxRFnS2fd/d862bNOKvmoEPjYPcfIjsfdy0ujagYOIYPczKgD9l3FsgTkAzKA==", - "dev": true - }, - "@babel/template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", - "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.4.4", - "@babel/types": "^7.4.4" - } - }, - "@babel/traverse": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.5.0.tgz", - "integrity": "sha512-SnA9aLbyOCcnnbQEGwdfBggnc142h/rbqqsXcaATj2hZcegCl903pUD/lfpsNBlBSuWow/YDfRyJuWi2EPR5cg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.5.0", - "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.4.4", - "@babel/parser": "^7.5.0", - "@babel/types": "^7.5.0", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.11" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "@babel/types": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.5.0.tgz", - "integrity": "sha512-UFpDVqRABKsW01bvw7/wSUe56uy6RXM5+VJibVVAybDGxEW25jdwiFJEf7ASvSaC7sN7rbE/l3cLp2izav+CtQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, "@elastic/elasticsearch": { "version": "7.9.1", "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.9.1.tgz", @@ -222,41 +73,6 @@ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", "dev": true }, - "@sinonjs/commons": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", - "integrity": "sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==", - "dev": true, - "requires": { - "type-detect": "4.0.8" - } - }, - "@sinonjs/fake-timers": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.0.4.tgz", - "integrity": "sha512-fW3SzjLF0sjI0x1Opc7cUG4J/Nr4U0TXPNnKNAgrxA4xXsQNk6nypZK0yJg5FNw5cCo2yC/ZMdaVhDTKeeF6zg==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "@sinonjs/samsam": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-6.0.1.tgz", - "integrity": "sha512-zJ+xzDBMETj/kFkagaZBG4G8e80Et182r6xpCzpubS7cavdTLwBKtCU3sgmPvZDC0u41gd87atcoUxcmiamBgw==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.6.0", - "lodash.get": "^4.4.2", - "type-detect": "^4.0.8" - } - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, "@szmarczak/http-timer": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", @@ -271,79 +87,6 @@ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, - "@topcoder-platform/topcoder-bus-api-wrapper": { - "version": "github:topcoder-platform/tc-bus-api-wrapper#f8cbd335a0e0b4d6edd7cae859473593271fd97f", - "from": "github:topcoder-platform/tc-bus-api-wrapper", - "requires": { - "joi": "^13.4.0", - "lodash": "^4.17.15", - "superagent": "^3.8.3", - "tc-core-library-js": "github:appirio-tech/tc-core-library-js#v2.6.4" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "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" - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - } - }, - "tc-core-library-js": { - "version": "github:appirio-tech/tc-core-library-js#df0b36c51cf80918194cbff777214b3c0cf5a151", - "from": "github:appirio-tech/tc-core-library-js#v2.6.4", - "requires": { - "axios": "^0.19.0", - "bunyan": "^1.8.12", - "jsonwebtoken": "^8.5.1", - "jwks-rsa": "^1.6.0", - "lodash": "^4.17.15", - "millisecond": "^0.1.2", - "r7insight_node": "^1.8.4", - "request": "^2.88.0" - } - } - } - }, "@types/bluebird": { "version": "3.5.0", "resolved": "https://registry.npm.taobao.org/@types/bluebird/download/@types/bluebird-3.5.0.tgz", @@ -538,12 +281,6 @@ } } }, - "ansi-colors": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", - "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", - "dev": true - }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", @@ -572,21 +309,6 @@ "picomatch": "^2.0.4" } }, - "append-transform": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", - "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -893,12 +615,6 @@ "fill-range": "^7.0.1" } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", @@ -967,18 +683,6 @@ } } }, - "caching-transform": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", - "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^2.0.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.4.2" - } - }, "caller-path": { "version": "0.1.0", "resolved": "https://registry.npm.taobao.org/caller-path/download/caller-path-0.1.0.tgz", @@ -1073,34 +777,6 @@ "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "clone-response": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", @@ -1118,12 +794,6 @@ } } }, - "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 - }, "codependency": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/codependency/-/codependency-0.1.4.tgz", @@ -1197,16 +867,11 @@ "delayed-stream": "~1.0.0" } }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/commondir/download/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true }, "concat-map": { "version": "0.0.1", @@ -1288,15 +953,6 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "cookie": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", @@ -1310,7 +966,8 @@ "cookiejar": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==", + "dev": true }, "core-js": { "version": "2.6.12", @@ -1322,71 +979,6 @@ "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "cp-file": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", - "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "make-dir": "^2.0.0", - "nested-error-stacks": "^2.0.0", - "pify": "^4.0.1", - "safe-buffer": "^5.0.1" - } - }, - "cross-env": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", - "integrity": "sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.1" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -1435,12 +1027,6 @@ "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, "decompress-response": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", @@ -1461,15 +1047,6 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "default-require-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/default-require-extensions/download/default-require-extensions-2.0.0.tgz", - "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, "defer-to-connect": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", @@ -1532,12 +1109,6 @@ "kuler": "1.0.x" } }, - "diff": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", - "dev": true - }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -1672,12 +1243,6 @@ "is-symbol": "^1.0.2" } }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", - "dev": true - }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -2143,21 +1708,6 @@ "resolved": "https://registry.npm.taobao.org/events/download/events-1.1.1.tgz", "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -2285,41 +1835,12 @@ "unpipe": "~1.0.0" } }, - "find-cache-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", - "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^2.0.0", - "pkg-dir": "^3.0.0" - } - }, "find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", "dev": true }, - "find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "flat": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", - "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", - "dev": true, - "requires": { - "is-buffer": "~2.0.3" - } - }, "flat-cache": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", @@ -2355,28 +1876,6 @@ } } }, - "foreground-child": { - "version": "1.5.6", - "resolved": "https://registry.npm.taobao.org/foreground-child/download/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - } - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -2386,6 +1885,7 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.0.tgz", "integrity": "sha512-WXieX3G/8side6VIqx44ablyULoGruSde5PNTxoUyo5CeyAMX6nVWUd0rgist/EuX655cjhUhTo1Fo3tRYqbcA==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -2395,7 +1895,8 @@ "formidable": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" + "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==", + "dev": true }, "forwarded": { "version": "0.1.2", @@ -2432,12 +1933,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, "get-parameter-names": { "version": "0.3.0", "resolved": "https://registry.npm.taobao.org/get-parameter-names/download/get-parameter-names-0.3.0.tgz", @@ -2546,12 +2041,6 @@ "integrity": "sha512-jpSvDPV4Cq/bgtpndIWbI5hmYxhQGHPC4d4cqBPb4DLniCfhJokdXhwhaDuLBGLQdvvRum/UiX6ECVIPvDXqdg==", "dev": true }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -2620,15 +2109,6 @@ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", "dev": true }, - "hasha": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/hasha/download/hasha-3.0.0.tgz", - "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, "hashring": { "version": "3.2.0", "resolved": "https://registry.npm.taobao.org/hashring/download/hashring-3.2.0.tgz", @@ -2638,29 +2118,12 @@ "simple-lru-cache": "0.0.x" } }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hoek": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-5.0.4.tgz", - "integrity": "sha512-Alr4ZQgoMlnere5FZJsIyfIjORBqZll5POhDsF4q64dPuJR6rNxXdDxtHSQq8OXRurhmx+PWYEE8bXRROY8h0w==" - }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, - "html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", @@ -2852,12 +2315,6 @@ } } }, - "invert-kv": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", - "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", - "dev": true - }, "ipaddr.js": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", @@ -2877,12 +2334,6 @@ "binary-extensions": "^2.0.0" } }, - "is-buffer": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", - "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", - "dev": true - }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", @@ -3010,21 +2461,6 @@ "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isemail": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/isemail/-/isemail-3.2.0.tgz", - "integrity": "sha512-zKqkK+O+dGqevc93KNsbZ/TqTUFd46MwWjYOoMrjIMZ51eU7DtQG3Wmd9SQQT7i7RVnuTPEiYEWHU3MSbxC1Tg==", - "requires": { - "punycode": "2.x.x" - }, - "dependencies": { - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - } - } - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", @@ -3036,120 +2472,11 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "istanbul-lib-coverage": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", - "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", - "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-instrument": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", - "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", - "dev": true, - "requires": { - "@babel/generator": "^7.4.0", - "@babel/parser": "^7.4.3", - "@babel/template": "^7.4.0", - "@babel/traverse": "^7.4.3", - "@babel/types": "^7.4.0", - "istanbul-lib-coverage": "^2.0.5", - "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.2.0.tgz", - "integrity": "sha512-jdFC1VdUGT/2Scgbimf7FSx9iJLXoqfglSF+gJeuNWVpiE37OIbc1jywR/GJyFdz3mnkz2/id0L0J/cr0izR5A==", - "dev": true - } - } - }, - "istanbul-lib-report": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", - "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "supports-color": "^6.1.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", - "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.5", - "make-dir": "^2.1.0", - "rimraf": "^2.6.3", - "source-map": "^0.6.1" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", - "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", - "dev": true, - "requires": { - "html-escaper": "^2.0.0" - } - }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npm.taobao.org/jmespath/download/jmespath-0.15.0.tgz", "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==", - "requires": { - "hoek": "5.x.x", - "isemail": "3.x.x", - "topo": "3.x.x" - } - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3171,12 +2498,6 @@ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", @@ -3256,12 +2577,6 @@ "object.assign": "^4.1.0" } }, - "just-extend": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz", - "integrity": "sha512-g3UB796vUFIY90VIv/WX3L2c8CS2MdWUww3CNrYmqza1Fg0DURc2K/O4YrnklBdQarSJ/y8JnJYDGc+1iumQjg==", - "dev": true - }, "jwa": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", @@ -3334,15 +2649,6 @@ "package-json": "^6.3.0" } }, - "lcid": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", - "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, "levn": { "version": "0.3.0", "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz?cache=0&sync_timestamp=1585966057564&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flevn%2Fdownload%2Flevn-0.3.0.tgz", @@ -3378,16 +2684,6 @@ } } }, - "locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, "lodash": { "version": "4.17.20", "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.20.tgz?cache=0&sync_timestamp=1597336224062&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.20.tgz", @@ -3398,18 +2694,6 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npm.taobao.org/lodash.flattendeep/download/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -3445,46 +2729,6 @@ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=" }, - "log-symbols": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", - "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", - "dev": true, - "requires": { - "chalk": "^2.4.2" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, "logform": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/logform/-/logform-2.1.2.tgz", @@ -3517,16 +2761,6 @@ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", "dev": true }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "lru-memoizer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/lru-memoizer/-/lru-memoizer-2.1.2.tgz", @@ -3547,63 +2781,16 @@ } } }, - "make-dir": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", - "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, - "requires": { - "pify": "^4.0.1", - "semver": "^5.6.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", - "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npm.taobao.org/media-typer/download/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "mem": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", - "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^2.0.0", - "p-is-promise": "^2.0.0" - } - }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npm.taobao.org/merge-descriptors/download/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "merge-source-map": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", - "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npm.taobao.org/methods/download/methods-1.1.2.tgz", @@ -3632,12 +2819,6 @@ "mime-db": "1.40.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", @@ -3664,189 +2845,50 @@ "minimist": "^1.2.5" } }, - "mocha": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.1.2.tgz", - "integrity": "sha512-o96kdRKMKI3E8U0bjnfqW4QMk12MwZ4mhdBTf+B5a1q9+aq2HRnj+3ZdJu0B/ZhJeK78MgYuv6L8d/rA5AeBJA==", - "dev": true, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "optional": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "murmur-hash-js": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/murmur-hash-js/download/murmur-hash-js-1.0.0.tgz", + "integrity": "sha1-UEEEkmnJZjPIZjhpYLL0KJ515bA=" + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "dev": true + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, "requires": { - "ansi-colors": "3.2.3", - "browser-stdout": "1.3.1", - "chokidar": "3.3.0", - "debug": "3.2.6", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "find-up": "3.0.0", - "glob": "7.1.3", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "3.13.1", - "log-symbols": "3.0.0", - "minimatch": "3.0.4", - "mkdirp": "0.5.5", - "ms": "2.1.1", - "node-environment-flags": "1.0.6", - "object.assign": "4.1.0", - "strip-json-comments": "2.0.1", - "supports-color": "6.0.0", - "which": "1.3.1", - "wide-align": "1.1.3", - "yargs": "13.3.2", - "yargs-parser": "13.1.2", - "yargs-unparser": "1.6.0" + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" }, "dependencies": { - "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 - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "string-width": { - "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", - "strip-ansi": "^5.1.0" - } - }, - "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" - } - }, - "supports-color": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", - "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - } - } - }, - "mocha-prepare": { - "version": "0.1.0", - "resolved": "https://registry.npm.taobao.org/mocha-prepare/download/mocha-prepare-0.1.0.tgz", - "integrity": "sha1-VRMidoEiLkNJSB7k5GJHLzHGu4I=", - "dev": true - }, - "moment": { - "version": "2.29.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", - "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", - "optional": true - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "murmur-hash-js": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/murmur-hash-js/download/murmur-hash-js-1.0.0.tgz", - "integrity": "sha1-UEEEkmnJZjPIZjhpYLL0KJ515bA=" - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npm.taobao.org/mute-stream/download/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "mv": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", - "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", - "optional": true, - "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" - }, - "dependencies": { - "glob": { - "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", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "rimraf": { @@ -3883,12 +2925,6 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, - "nested-error-stacks": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", - "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", - "dev": true - }, "nice-simple-logger": { "version": "1.0.1", "resolved": "https://registry.npm.taobao.org/nice-simple-logger/download/nice-simple-logger-1.0.1.tgz", @@ -3903,45 +2939,6 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, - "nise": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-5.0.1.tgz", - "integrity": "sha512-U6qdfulSDpEgx3WSoeMlKZ6hGaTMKtyW7CY3bjj0MK3uzHvmugyteB2zyHQRRvi5I91oErSUR595s7htS6IYRQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0", - "@sinonjs/fake-timers": "^6.0.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "path-to-regexp": "^1.7.0" - }, - "dependencies": { - "@sinonjs/fake-timers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz", - "integrity": "sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.7.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", - "dev": true, - "requires": { - "isarray": "0.0.1" - } - } - } - }, "no-kafka": { "version": "3.4.3", "resolved": "https://registry.npm.taobao.org/no-kafka/download/no-kafka-3.4.3.tgz", @@ -3966,39 +2963,6 @@ } } }, - "nock": { - "version": "12.0.3", - "resolved": "https://registry.npmjs.org/nock/-/nock-12.0.3.tgz", - "integrity": "sha512-QNb/j8kbFnKCiyqi9C5DD0jH/FubFGj5rt9NQFONXwQm3IPB0CULECg/eS3AU1KgZb/6SwUa4/DTRKhVxkGABw==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.13", - "propagate": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "node-environment-flags": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz", - "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==", - "dev": true, - "requires": { - "object.getownpropertydescriptors": "^2.0.3", - "semver": "^5.7.0" - } - }, "nodemon": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.7.tgz", @@ -4076,54 +3040,6 @@ "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", "dev": true }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "^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 - }, - "nyc": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", - "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", - "dev": true, - "requires": { - "archy": "^1.0.0", - "caching-transform": "^3.0.2", - "convert-source-map": "^1.6.0", - "cp-file": "^6.2.0", - "find-cache-dir": "^2.1.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.5", - "istanbul-lib-hook": "^2.0.7", - "istanbul-lib-instrument": "^3.3.0", - "istanbul-lib-report": "^2.0.8", - "istanbul-lib-source-maps": "^3.0.6", - "istanbul-reports": "^2.2.4", - "js-yaml": "^3.13.1", - "make-dir": "^2.1.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.2.3", - "uuid": "^3.3.2", - "yargs": "^13.2.2", - "yargs-parser": "^13.0.0" - } - }, "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -4135,12 +3051,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -4159,69 +3069,6 @@ "object-keys": "^1.0.11" } }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, "on-finished": { "version": "2.3.0", "resolved": "https://registry.npm.taobao.org/on-finished/download/on-finished-2.3.0.tgz", @@ -4282,23 +3129,6 @@ } } }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", - "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npm.taobao.org/os-tmpdir/download/os-tmpdir-1.0.2.tgz", @@ -4311,60 +3141,6 @@ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", "dev": true }, - "p-defer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", - "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", - "dev": true - }, - "p-limit": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", - "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", - "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, "package-json": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", @@ -4434,23 +3210,6 @@ "resolved": "https://registry.npm.taobao.org/path-to-regexp/download/path-to-regexp-0.1.7.tgz?cache=0&sync_timestamp=1601400247487&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fpath-to-regexp%2Fdownload%2Fpath-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", - "dev": true, - "requires": { - "pify": "^3.0.0" - }, - "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/pify/download/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true - } - } - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -4462,12 +3221,6 @@ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true - }, "pkg-conf": { "version": "2.1.0", "resolved": "https://registry.npm.taobao.org/pkg-conf/download/pkg-conf-2.1.0.tgz", @@ -4534,15 +3287,6 @@ "xtend": "^4.0.1" } }, - "pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, "pluralize": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", @@ -4588,12 +3332,6 @@ "react-is": "^16.8.1" } }, - "propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true - }, "protocol-buffers-schema": { "version": "3.4.0", "resolved": "https://registry.npm.taobao.org/protocol-buffers-schema/download/protocol-buffers-schema-3.4.0.tgz", @@ -4721,27 +3459,6 @@ "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", "dev": true }, - "read-pkg": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/read-pkg/download/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", - "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", @@ -4793,15 +3510,6 @@ "rc": "^1.2.8" } }, - "release-zalgo": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/release-zalgo/download/release-zalgo-1.0.0.tgz", - "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -4846,18 +3554,6 @@ } } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/require-directory/download/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npm.taobao.org/require-uncached/download/require-uncached-1.0.3.tgz", @@ -4885,12 +3581,6 @@ "path-parse": "^1.0.6" } }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, "responselike": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", @@ -5029,12 +3719,6 @@ "send": "0.17.1" } }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/set-blocking/download/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", @@ -5055,60 +3739,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "should": { - "version": "13.2.3", - "resolved": "https://registry.npmjs.org/should/-/should-13.2.3.tgz", - "integrity": "sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==", - "dev": true, - "requires": { - "should-equal": "^2.0.0", - "should-format": "^3.0.3", - "should-type": "^1.4.0", - "should-type-adaptors": "^1.0.1", - "should-util": "^1.0.0" - } - }, - "should-equal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", - "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", - "dev": true, - "requires": { - "should-type": "^1.4.0" - } - }, - "should-format": { - "version": "3.0.3", - "resolved": "https://registry.npm.taobao.org/should-format/download/should-format-3.0.3.tgz", - "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-type-adaptors": "^1.0.1" - } - }, - "should-type": { - "version": "1.4.0", - "resolved": "https://registry.npm.taobao.org/should-type/download/should-type-1.4.0.tgz", - "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", - "dev": true - }, - "should-type-adaptors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz", - "integrity": "sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==", - "dev": true, - "requires": { - "should-type": "^1.3.0", - "should-util": "^1.0.0" - } - }, - "should-util": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz", - "integrity": "sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -5123,46 +3753,9 @@ "simple-swizzle": { "version": "0.2.2", "resolved": "https://registry.npm.taobao.org/simple-swizzle/download/simple-swizzle-0.2.2.tgz", - "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", - "requires": { - "is-arrayish": "^0.3.1" - } - }, - "sinon": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-10.0.1.tgz", - "integrity": "sha512-1rf86mvW4Mt7JitEIgmNaLXaWnrWd/UrVKZZlL+kbeOujXVf9fmC4kQEQ/YeHoiIA23PLNngYWK+dngIx/AumA==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.8.1", - "@sinonjs/fake-timers": "^7.0.4", - "@sinonjs/samsam": "^6.0.1", - "diff": "^4.0.2", - "nise": "^5.0.1", - "supports-color": "^7.1.0" - }, - "dependencies": { - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", + "requires": { + "is-arrayish": "^0.3.1" } }, "slice-ansi": { @@ -5174,26 +3767,6 @@ "is-fullwidth-code-point": "^2.0.0" } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spawn-wrap": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", - "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", @@ -5314,260 +3887,6 @@ } } }, - "string.prototype.trimend": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz", - "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "string.prototype.trimleft": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", - "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimstart": "^1.0.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "string.prototype.trimright": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", - "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5", - "string.prototype.trimend": "^1.0.0" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, - "string.prototype.trimstart": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", - "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.5" - }, - "dependencies": { - "es-abstract": { - "version": "1.17.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", - "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - } - } - }, "string_decoder": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", @@ -5597,12 +3916,6 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npm.taobao.org/strip-json-comments/download/strip-json-comments-2.0.1.tgz", @@ -5729,18 +4042,6 @@ "integrity": "sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==", "dev": true }, - "test-exclude": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", - "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", - "dev": true, - "requires": { - "glob": "^7.1.3", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^2.0.0" - } - }, "text-hex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", @@ -5767,12 +4068,6 @@ "os-tmpdir": "~1.0.2" } }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/to-fast-properties/download/to-fast-properties-2.0.0.tgz", - "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", - "dev": true - }, "to-readable-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", @@ -5801,21 +4096,6 @@ "express": "^4.16.3" } }, - "topo": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/topo/-/topo-3.0.3.tgz", - "integrity": "sha512-IgpPtvD4kjrJ7CRA3ov2FhWQADwv+Tdqbsf1ZnPUSAtCJ9e1Z44MmoSGDXGk4IppoZA7jd/QRkNddlLJWlUZsQ==", - "requires": { - "hoek": "6.x.x" - }, - "dependencies": { - "hoek": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-6.1.3.tgz", - "integrity": "sha512-YXXAAhmF9zpQbC7LEcREFtXfGq5K1fmd+4PHkBq8NUqmzW3G+Dq10bI/i0KucLRwss3YYFQ0fSfoxBZYiGUqtQ==" - } - } - }, "touch": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", @@ -5841,12 +4121,6 @@ } } }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, "triple-beam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", @@ -5879,12 +4153,6 @@ "prelude-ls": "~1.1.2" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true - }, "type-fest": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", @@ -6092,21 +4360,6 @@ "isexe": "^2.0.0" } }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/which-module/download/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, "widest-line": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", @@ -6205,38 +4458,6 @@ } } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "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": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "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": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", @@ -6251,17 +4472,6 @@ "mkdirp": "^0.5.1" } }, - "write-file-atomic": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", - "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, "wrr-pool": { "version": "1.1.4", "resolved": "https://registry.npm.taobao.org/wrr-pool/download/wrr-pool-1.1.4.tgz", @@ -6296,161 +4506,10 @@ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", "dev": true }, - "y18n": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", - "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", - "dev": true - }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, - "yargs": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", - "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", - "dev": true, - "requires": { - "cliui": "^4.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "os-locale": "^3.1.0", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.0.0" - }, - "dependencies": { - "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 - }, - "string-width": { - "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", - "strip-ansi": "^5.1.0" - } - }, - "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" - } - } - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - }, - "yargs-unparser": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", - "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", - "dev": true, - "requires": { - "flat": "^4.1.0", - "lodash": "^4.17.15", - "yargs": "^13.3.0" - }, - "dependencies": { - "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 - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "cliui": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "string-width": { - "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", - "strip-ansi": "^5.1.0" - } - }, - "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" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - } - } } } } diff --git a/package.json b/package.json index 77228e9..df22721 100644 --- a/package.json +++ b/package.json @@ -10,23 +10,12 @@ "lint:fix": "standard --fix", "create-index": "node src/scripts/createIndex.js", "delete-index": "node src/scripts/deleteIndex.js", - "view-data": "node src/scripts/view-data.js", - "test": "cross-env NODE_ENV=test mocha test/unit/test.js --require test/unit/prepare.js --timeout 20000 --exit", - "test:cov": "cross-env NODE_ENV=test nyc --reporter=html --reporter=text mocha test/unit/test.js --require test/unit/prepare.js --timeout 20000 --exit", - "e2e": "cross-env NODE_ENV=test mocha test/e2e/test.js --timeout 20000 --exit", - "e2e:cov": "cross-env NODE_ENV=test nyc --reporter=html --reporter=text mocha test/e2e/test.js --timeout 20000 --exit" + "view-data": "node src/scripts/view-data.js" }, "author": "TCSCODER", "license": "none", "devDependencies": { - "cross-env": "^7.0.3", - "mocha": "^7.1.2", - "mocha-prepare": "^0.1.0", - "nock": "^12.0.3", "nodemon": "^2.0.7", - "nyc": "^14.1.1", - "should": "^13.2.3", - "sinon": "^10.0.1", "standard": "^12.0.1", "stringcase": "^4.3.1", "superagent": "^5.1.0" @@ -34,7 +23,6 @@ "dependencies": { "@elastic/elasticsearch": "^7.9.1", "@hapi/joi": "^15.1.0", - "@topcoder-platform/topcoder-bus-api-wrapper": "github:topcoder-platform/tc-bus-api-wrapper", "async-mutex": "^0.2.4", "aws-sdk": "^2.476.0", "bluebird": "^3.5.5", @@ -49,17 +37,5 @@ }, "engines": { "node": "8.x" - }, - "standard": { - "env": [ - "mocha" - ] - }, - "nyc": { - "exclude": [ - "test/common/*.js", - "test/unit/*.js", - "test/e2e/*.js" - ] } } diff --git a/src/app.js b/src/app.js index 534b155..0d20849 100644 --- a/src/app.js +++ b/src/app.js @@ -11,12 +11,6 @@ const logger = require('./common/logger') const helper = require('./common/helper') const JobProcessorService = require('./services/JobProcessorService') const JobCandidateProcessorService = require('./services/JobCandidateProcessorService') -// const ResourceBookingProcessorService = require('./services/ResourceBookingProcessorService') -// const WorkPeriodProcessorService = require('./services/WorkPeriodProcessorService') -// const InterviewProcessorService = require('./services/InterviewProcessorService') -// const WorkPeriodPaymentProcessorService = require('./services/WorkPeriodPaymentProcessorService') -// const RoleProcessorService = require('./services/RoleProcessorService') -const ActionProcessorService = require('./services/ActionProcessorService') const Mutex = require('async-mutex').Mutex const events = require('events') @@ -34,32 +28,7 @@ const topicServiceMapping = { // job [config.topics.TAAS_JOB_CREATE_TOPIC]: JobProcessorService.processCreate, [config.topics.TAAS_JOB_UPDATE_TOPIC]: JobProcessorService.processUpdate, - // [config.topics.TAAS_JOB_DELETE_TOPIC]: JobProcessorService.processDelete, - // job candidate - // [config.topics.TAAS_JOB_CANDIDATE_CREATE_TOPIC]: JobCandidateProcessorService.processCreate, - [config.topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC]: JobCandidateProcessorService.processUpdate, - // [config.topics.TAAS_JOB_CANDIDATE_DELETE_TOPIC]: JobCandidateProcessorService.processDelete, - // resource booking - // [config.topics.TAAS_RESOURCE_BOOKING_CREATE_TOPIC]: ResourceBookingProcessorService.processCreate, - // [config.topics.TAAS_RESOURCE_BOOKING_UPDATE_TOPIC]: ResourceBookingProcessorService.processUpdate, - // [config.topics.TAAS_RESOURCE_BOOKING_DELETE_TOPIC]: ResourceBookingProcessorService.processDelete, - // work period - // [config.topics.TAAS_WORK_PERIOD_CREATE_TOPIC]: WorkPeriodProcessorService.processCreate, - // [config.topics.TAAS_WORK_PERIOD_UPDATE_TOPIC]: WorkPeriodProcessorService.processUpdate, - // [config.topics.TAAS_WORK_PERIOD_DELETE_TOPIC]: WorkPeriodProcessorService.processDelete, - // work period payment - // [config.topics.TAAS_WORK_PERIOD_PAYMENT_CREATE_TOPIC]: WorkPeriodPaymentProcessorService.processCreate, - // [config.topics.TAAS_WORK_PERIOD_PAYMENT_UPDATE_TOPIC]: WorkPeriodPaymentProcessorService.processUpdate, - // interview - // [config.topics.TAAS_INTERVIEW_REQUEST_TOPIC]: InterviewProcessorService.processRequestInterview, - // [config.topics.TAAS_INTERVIEW_UPDATE_TOPIC]: InterviewProcessorService.processUpdateInterview, - // [config.topics.TAAS_INTERVIEW_BULK_UPDATE_TOPIC]: InterviewProcessorService.processBulkUpdateInterviews, - // role - // [config.topics.TAAS_ROLE_CREATE_TOPIC]: RoleProcessorService.processCreate, - // [config.topics.TAAS_ROLE_UPDATE_TOPIC]: RoleProcessorService.processUpdate, - // [config.topics.TAAS_ROLE_DELETE_TOPIC]: RoleProcessorService.processDelete, - // action - [config.topics.TAAS_ACTION_RETRY_TOPIC]: ActionProcessorService.processRetry + [config.topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC]: JobCandidateProcessorService.processUpdate } // Start kafka consumer diff --git a/src/bootstrap.js b/src/bootstrap.js index 0d46bf7..6929d7f 100644 --- a/src/bootstrap.js +++ b/src/bootstrap.js @@ -1,29 +1,18 @@ const Joi = require('@hapi/joi') const config = require('config') -const _ = require('lodash') -const { Interview } = require('../src/common/constants') const constants = require('./common/constants') -const allowedXAITemplates = _.values(Interview.XaiTemplate) -const allowedInterviewStatuses = _.values(Interview.Status) - global.Promise = require('bluebird') Joi.rateType = () => Joi.string().valid('hourly', 'daily', 'weekly', 'monthly', 'annual') Joi.jobStatus = () => Joi.string().valid('sourcing', 'in-review', 'assigned', 'closed', 'cancelled') -Joi.resourceBookingStatus = () => Joi.string().valid('placed', 'closed', 'cancelled') Joi.jobCandidateStatus = () => Joi.string().valid('open', 'placed', 'selected', 'client rejected - screening', 'client rejected - interview', 'rejected - other', 'cancelled', 'interview', 'topcoder-rejected', 'applied', 'rejected-pre-screen', 'skills-test', 'skills-test', 'phone-screen', 'job-closed', 'offered', 'withdrawn', 'withdrawn-prescreen') Joi.workload = () => Joi.string().valid('full-time', 'fractional') Joi.title = () => Joi.string().max(128) -Joi.paymentStatus = () => Joi.string().valid('pending', 'in-progress', 'partially-completed', 'completed', 'failed', 'no-days') -Joi.xaiTemplate = () => Joi.string().valid(...allowedXAITemplates) -Joi.interviewStatus = () => Joi.string().valid(...allowedInterviewStatuses) -Joi.workPeriodPaymentStatus = () => Joi.string().valid('completed', 'scheduled', 'in-progress', 'failed', 'cancelled') // Empty string is not allowed by Joi by default and must be enabled with allow(''). // See https://joi.dev/api/?v=17.3.0#string fro details why it's like this. // In many cases we would like to allow empty string to make it easier to create UI for editing data. Joi.stringAllowEmpty = () => Joi.string().allow('') -Joi.smallint = () => Joi.number().min(-32768).max(32767) const zapierSwitch = Joi.string().label('ZAPIER_SWITCH').valid(...Object.values(constants.Zapier.Switch)) diff --git a/src/common/constants.js b/src/common/constants.js index c2a154a..cc54bdf 100644 --- a/src/common/constants.js +++ b/src/common/constants.js @@ -3,8 +3,6 @@ */ module.exports = { - // possible values: wait_for, true, false - esRefreshOption: 'wait_for', Zapier: { Switch: { ON: 'ON', @@ -16,19 +14,5 @@ module.exports = { JobCandidateCreate: 'jobcandidate:create', JobCandidateUpdate: 'jobcandidate:update' } - }, - Interview: { - Status: { - Scheduling: 'Scheduling', - Scheduled: 'Scheduled', - RequestedForReschedule: 'Requested for reschedule', - Rescheduled: 'Rescheduled', - Completed: 'Completed', - Cancelled: 'Cancelled' - }, - XaiTemplate: { - '30MinInterview': 'interview-30', - '60MinInterview': 'interview-60' - } } } diff --git a/src/common/errors.js b/src/common/errors.js deleted file mode 100644 index 1fee2b6..0000000 --- a/src/common/errors.js +++ /dev/null @@ -1,40 +0,0 @@ -/** - * This file defines application errors - */ -const util = require('util') - -/** - * Helper function to create generic error object with http status code - * @param {String} name the error name - * @param {Number} statusCode the http status code - * @returns {Function} the error constructor - * @private - */ -function createError (name, statusCode) { - /** - * The error constructor - * @param {String} message the error message - * @param {String} [cause] the error cause - * @constructor - */ - function ErrorCtor (message, cause) { - Error.call(this) - Error.captureStackTrace(this) - this.message = message || name - this.cause = cause - this.httpStatus = statusCode - } - - util.inherits(ErrorCtor, Error) - ErrorCtor.prototype.name = name - return ErrorCtor -} - -module.exports = { - BadRequestError: createError('BadRequestError', 400), - UnauthorizedError: createError('UnauthorizedError', 401), - ForbiddenError: createError('ForbiddenError', 403), - NotFoundError: createError('NotFoundError', 404), - ConflictError: createError('ConflictError', 409), - InternalServerError: createError('InternalServerError', 500) -} diff --git a/src/common/helper.js b/src/common/helper.js index 78f78a0..d2f32c6 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -6,12 +6,10 @@ const AWS = require('aws-sdk') const config = require('config') const request = require('superagent') const logger = require('./logger') -const errors = require('./errors') const elasticsearch = require('@elastic/elasticsearch') const _ = require('lodash') const { Mutex } = require('async-mutex') const m2mAuth = require('tc-core-library-js').auth.m2m -const busApi = require('@topcoder-platform/topcoder-bus-api-wrapper') AWS.config.region = config.esConfig.AWS_REGION @@ -87,58 +85,6 @@ function getESClient () { } } - // create document or catch conflict error - esClient.createExtra = async function (data) { - try { - await esClient.create(data) - } catch (err) { - if (err.statusCode === 409) { - throw new errors.ConflictError(`id: ${data.id} "${data.index}" already exists`) - } - throw err - } - } - - // update document or catch not found error - esClient.updateExtra = async function (data) { - try { - await esClient.update(data) - } catch (err) { - if (err.statusCode === 404) { - throw new errors.NotFoundError(`id: ${data.id} "${data.index}" not found`) - } - throw err - } - } - - // get document or catch not found error - esClient.getExtra = async function (data) { - let doc - - try { - doc = await esClient.getSource(data) - } catch (err) { - if (err.statusCode === 404) { - throw new errors.NotFoundError(`id: ${data.id} "${data.index}" not found`) - } - throw err - } - - return doc - } - - // delete document or catch not found error - esClient.deleteExtra = async function (data) { - try { - await esClient.delete(data) - } catch (err) { - if (err.statusCode === 404) { - throw new errors.NotFoundError(`id: ${data.id} "${data.index}" not found`) - } - throw err - } - } - return esClient } @@ -180,68 +126,10 @@ async function postMessageViaWebhook (webhook, message) { await request.post(webhook).send(message) } -let busApiClient - -/** - * Get bus api client. - * - * @returns {Object} the bus api client - */ -function getBusApiClient () { - if (busApiClient) { - return busApiClient - } - busApiClient = busApi( - _.assign(_.pick(config.auth0, [ - 'AUTH0_URL', - 'AUTH0_AUDIENCE', - 'TOKEN_CACHE_TIME', - 'AUTH0_CLIENT_ID', - 'AUTH0_CLIENT_SECRET', - 'AUTH0_PROXY_SERVER_URL' - ]), _.pick(config, 'BUSAPI_URL'), - _.pick(config.topics, 'KAFKA_ERROR_TOPIC')) - - ) - return busApiClient -} - -/** - * Send Kafka event message - * @param {String} topic the topic name - * @param {Object} payload the payload - */ -async function postEvent (topic, payload) { - logger.debug({ component: 'helper', context: 'postEvent', message: `Posting event to Kafka topic ${topic}, ${JSON.stringify(payload)}` }) - - const client = getBusApiClient() - const message = { - topic, - originator: config.KAFKA_MESSAGE_ORIGINATOR, - timestamp: new Date().toISOString(), - 'mime-type': 'application/json', - payload - } - await client.postEvent(message) -} - -/** - * Sleep for a given number of milliseconds. - * - * @param {Number} milliseconds the sleep time - * @returns {undefined} - */ -async function sleep (milliseconds) { - return new Promise((resolve) => setTimeout(resolve, milliseconds)) -} - module.exports = { - sleep, getKafkaOptions, getESClient, checkEsMutexRelease, getM2MToken, - postMessageViaWebhook, - getBusApiClient, - postEvent + postMessageViaWebhook } diff --git a/src/scripts/createIndex.js b/src/scripts/createIndex.js index 7eb7620..f4effda 100644 --- a/src/scripts/createIndex.js +++ b/src/scripts/createIndex.js @@ -43,171 +43,6 @@ async function createIndex () { } } } - }, - { - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - body: { - mappings: { - properties: { - jobId: { type: 'keyword' }, - userId: { type: 'keyword' }, - status: { type: 'keyword' }, - viewedByCustomer: { type: 'boolean' }, - externalId: { type: 'keyword' }, - resume: { type: 'text' }, - remark: { type: 'keyword' }, - interviews: { - type: 'nested', - properties: { - id: { type: 'keyword' }, - xaiId: { type: 'keyword' }, - jobCandidateId: { type: 'keyword' }, - calendarEventId: { type: 'keyword' }, - templateUrl: { type: 'keyword' }, - templateId: { type: 'keyword' }, - templateType: { type: 'keyword' }, - title: { type: 'keyword' }, - locationDetails: { type: 'keyword' }, - duration: { type: 'integer' }, - startTimestamp: { type: 'date' }, - endTimestamp: { type: 'date' }, - hostName: { type: 'keyword' }, - hostEmail: { type: 'keyword' }, - guestNames: { type: 'keyword' }, - guestEmails: { type: 'keyword' }, - round: { type: 'integer' }, - status: { type: 'keyword' }, - rescheduleUrl: { type: 'keyword' }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' }, - deletedAt: { type: 'date' } - } - }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - } - } - }, - { - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - body: { - mappings: { - properties: { - projectId: { type: 'integer' }, - userId: { type: 'keyword' }, - jobId: { type: 'keyword' }, - status: { type: 'keyword' }, - startDate: { type: 'date', format: 'yyyy-MM-dd' }, - endDate: { type: 'date', format: 'yyyy-MM-dd' }, - sendWeeklySurvey: { type: 'boolean' }, - memberRate: { type: 'float' }, - customerRate: { type: 'float' }, - rateType: { type: 'keyword' }, - billingAccountId: { type: 'integer', null_value: 0 }, - workPeriods: { - type: 'nested', - properties: { - id: { type: 'keyword' }, - resourceBookingId: { type: 'keyword' }, - userHandle: { type: 'keyword', - normalizer: 'lowercaseNormalizer' }, - projectId: { type: 'integer' }, - userId: { type: 'keyword' }, - sentSurvey: { type: 'boolean' }, - sentSurveyError: { - type: 'nested', - properties: { - errorCode: { type: 'integer' }, - errorMessage: { type: 'keyword' } - } - }, - startDate: { type: 'date', format: 'yyyy-MM-dd' }, - endDate: { type: 'date', format: 'yyyy-MM-dd' }, - daysWorked: { type: 'integer' }, - daysPaid: { type: 'integer' }, - paymentTotal: { type: 'float' }, - paymentStatus: { type: 'keyword' }, - payments: { - type: 'nested', - properties: { - id: { type: 'keyword' }, - workPeriodId: { type: 'keyword' }, - challengeId: { type: 'keyword' }, - memberRate: { type: 'float' }, - customerRate: { type: 'float' }, - days: { type: 'integer' }, - amount: { type: 'float' }, - status: { type: 'keyword' }, - statusDetails: { - type: 'nested', - properties: { - errorMessage: { type: 'text' }, - errorCode: { type: 'integer' }, - retry: { type: 'integer' }, - step: { type: 'keyword' }, - challengeId: { type: 'keyword' } - } - }, - billingAccountId: { type: 'integer' }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - } - } - }, - { index: config.get('esConfig.ES_INDEX_ROLE'), - body: { - mappings: { - properties: { - name: { type: 'keyword', - normalizer: 'lowercaseNormalizer' }, - description: { type: 'keyword' }, - listOfSkills: { type: 'keyword', - normalizer: 'lowercaseNormalizer' }, - rates: { - properties: { - global: { type: 'integer' }, - inCountry: { type: 'integer' }, - offShore: { type: 'integer' }, - rate30Global: { type: 'integer' }, - rate30InCountry: { type: 'integer' }, - rate30OffShore: { type: 'integer' }, - rate20Global: { type: 'integer' }, - rate20InCountry: { type: 'integer' }, - rate20OffShore: { type: 'integer' } - } - }, - numberOfMembers: { type: 'integer' }, - numberOfMembersAvailable: { type: 'integer' }, - imageUrl: { type: 'keyword' }, - timeToCandidate: { type: 'integer' }, - timeToInterview: { type: 'integer' }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - } - } } ] diff --git a/src/scripts/deleteIndex.js b/src/scripts/deleteIndex.js index 84e15bc..842b1d4 100644 --- a/src/scripts/deleteIndex.js +++ b/src/scripts/deleteIndex.js @@ -9,10 +9,7 @@ const helper = require('../common/helper') async function deleteIndex () { logger.info({ component: 'deleteIndex', message: 'ES Index deletion started!' }) const esClient = helper.getESClient() - const indices = [config.get('esConfig.ES_INDEX_JOB'), - config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - config.get('esConfig.ES_INDEX_ROLE')] + const indices = [config.get('esConfig.ES_INDEX_JOB')] for (const index of indices) { await esClient.indices.delete({ index diff --git a/src/scripts/view-data.js b/src/scripts/view-data.js index c422c0c..889504b 100644 --- a/src/scripts/view-data.js +++ b/src/scripts/view-data.js @@ -9,10 +9,7 @@ const config = require('config') const esClient = helper.getESClient() const modelIndexMapping = { - Job: 'ES_INDEX_JOB', - JobCandidate: 'ES_INDEX_JOB_CANDIDATE', - ResourceBooking: 'ES_INDEX_RESOURCE_BOOKING', - Role: 'ES_INDEX_ROLE' + Job: 'ES_INDEX_JOB' } async function showESData () { diff --git a/src/services/ActionProcessorService.js b/src/services/ActionProcessorService.js deleted file mode 100644 index 662b0c7..0000000 --- a/src/services/ActionProcessorService.js +++ /dev/null @@ -1,83 +0,0 @@ -/** - * Action Processor Service - */ - -const Joi = require('@hapi/joi') -const logger = require('../common/logger') -const helper = require('../common/helper') -const config = require('config') - -const localLogger = { - debug: ({ context, message }) => logger.debug({ component: 'ActionProcessorService', context, message }) -} - -/** - * Process retry operation message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processRetry (message, transactionId) { - if (message.originator !== config.KAFKA_MESSAGE_ORIGINATOR) { - localLogger.debug({ context: 'processRetry', message: `originator: ${message.originator} does not match with ${config.KAFKA_MESSAGE_ORIGINATOR} - ignored` }) - return - } - const { topicServiceMapping } = require('../app') - const retry = message.payload.retry - message.topic = message.payload.originalTopic - message.payload = message.payload.originalPayload - await topicServiceMapping[message.topic](message, transactionId, { retry }) -} - -processRetry.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - payload: Joi.object().keys({ - originalTopic: Joi.string().required(), - originalPayload: Joi.object().required(), - retry: Joi.number().integer().min(1).required() - }).required() - }).required(), - transactionId: Joi.string().required() -} - -/** - * Analyzes the failed process and sends it to bus api to be received again. - * @param {String} originalTopic the failed topic name - * @param {Object} originalPayload the payload - * @param {Number} retry how many times has it been retried - * - * @returns {Promise|null} returns Promise which would be resolved when retry event sent to Kafka, - * or `null` if it would not be scheduled - */ -function scheduleRetry (originalTopic, originalPayload, retry) { - retry = retry + 1 - if (retry > config.MAX_RETRY) { - localLogger.debug({ context: 'scheduleRetry', message: `retry: ${retry} for topic: ${originalTopic} id: ${originalPayload.id} exceeds the max retry: ${config.MAX_RETRY} - ignored` }) - return - } - - localLogger.debug({ context: 'scheduleRetry', message: `retry: ${retry} for topic: ${originalTopic} id: ${originalPayload.id}` }) - - const payload = { - originalTopic, - originalPayload, - retry - } - - return helper.sleep(2 ** retry * config.BASE_RETRY_DELAY).then(() => - helper.postEvent(config.topics.TAAS_ACTION_RETRY_TOPIC, payload) - ) -} - -module.exports = { - processRetry -} - -logger.buildService(module.exports, 'ActionProcessorService') - -// we don't want to wrap this method into service wrappers -// because it would transform this method to `async` while we want to keep it sync -module.exports.scheduleRetry = scheduleRetry diff --git a/src/services/InterviewProcessorService.js b/src/services/InterviewProcessorService.js deleted file mode 100644 index 3af01a8..0000000 --- a/src/services/InterviewProcessorService.js +++ /dev/null @@ -1,202 +0,0 @@ -/** - * Interview Processor Service - */ - -const Joi = require('@hapi/joi') -const _ = require('lodash') -const logger = require('../common/logger') -const helper = require('../common/helper') -const constants = require('../common/constants') -const config = require('config') - -const esClient = helper.getESClient() - -/** - * Updates jobCandidate via a painless script - * - * @param {String} jobCandidateId job candidate id - * @param {String} script script definition - * @param {String} transactionId transaction id - */ -async function updateJobCandidateViaScript (jobCandidateId, script, transactionId) { - await esClient.updateExtra({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - id: jobCandidateId, - transactionId, - body: { script }, - refresh: constants.esRefreshOption - }) -} - -/** - * Process request interview entity message. - * Creates an interview record under jobCandidate. - * - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processRequestInterview (message, transactionId) { - const interview = message.payload - // add interview in collection if there's already an existing collection - // or initiate a new one with this interview - const script = { - source: ` - ctx._source.containsKey("interviews") - ? ctx._source.interviews.add(params.interview) - : ctx._source.interviews = [params.interview] - `, - params: { interview } - } - await updateJobCandidateViaScript(interview.jobCandidateId, script, transactionId) -} - -processRequestInterview.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required(), - xaiId: Joi.string().allow(null), - jobCandidateId: Joi.string().uuid().required(), - calendarEventId: Joi.string().allow(null), - templateUrl: Joi.xaiTemplate().required(), - templateId: Joi.string().allow(null), - templateType: Joi.string().allow(null), - title: Joi.string().allow(null), - locationDetails: Joi.string().allow(null), - round: Joi.number().integer().positive().required(), - duration: Joi.number().integer().positive().required(), - startTimestamp: Joi.date().allow(null), - endTimestamp: Joi.date().allow(null), - hostName: Joi.string().required(), - hostEmail: Joi.string().email().required(), - guestNames: Joi.array().items(Joi.string()).allow(null), - guestEmails: Joi.array().items(Joi.string().email()).allow(null), - status: Joi.interviewStatus().required(), - rescheduleUrl: Joi.string().allow(null), - createdAt: Joi.date().required(), - createdBy: Joi.string().uuid().required(), - updatedAt: Joi.date().allow(null), - updatedBy: Joi.string().uuid().allow(null), - deletedAt: Joi.date().allow(null) - }).required() - }).required(), - transactionId: Joi.string().required() -} - -/** - * Process update interview entity message - * Updates the interview record under jobCandidate. - * - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processUpdateInterview (message, transactionId) { - const interview = message.payload - // if there's an interview with this id, - // update it with the payload - const script = { - source: ` - if (ctx._source.containsKey("interviews")) { - def target = ctx._source.interviews.find(i -> i.id == params.interview.id); - if (target != null) { - for (prop in params.interview.entrySet()) { - target[prop.getKey()] = prop.getValue() - } - } - } - `, - params: { interview } - } - await updateJobCandidateViaScript(interview.jobCandidateId, script, transactionId) -} - -processUpdateInterview.schema = processRequestInterview.schema - -/** - * Process bulk (partially) update interviews entity message. - * Currently supports status, updatedAt and updatedBy fields. - * Update Joi schema to allow more fields. - * (implementation should already handle new fields - just updating Joi schema should be enough) - * - * payload format: - * { - * "jobCandidateId": { - * "interviewId": { ...fields }, - * "interviewId2": { ...fields }, - * ... - * }, - * "jobCandidateId2": { // like above... }, - * ... - * } - * - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processBulkUpdateInterviews (message, transactionId) { - const jobCandidates = message.payload - // script to update & params - const script = { - source: ` - def completedInterviews = params.jobCandidates[ctx._id]; - for (interview in completedInterviews.entrySet()) { - def interviewId = interview.getKey(); - def affectedFields = interview.getValue(); - def target = ctx._source.interviews.find(i -> i.id == interviewId); - if (target != null) { - for (field in affectedFields.entrySet()) { - target[field.getKey()] = field.getValue(); - } - } - } - `, - params: { jobCandidates } - } - // update interviews - await esClient.updateByQuery({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - transactionId, - body: { - script, - query: { - ids: { - values: _.keys(jobCandidates) - } - } - }, - refresh: true - }) -} - -processBulkUpdateInterviews.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().pattern( - Joi.string().uuid(), // key - jobCandidateId - Joi.object().pattern( - Joi.string().uuid(), // inner key - interviewId - Joi.object().keys({ - status: Joi.interviewStatus(), - updatedAt: Joi.date(), - updatedBy: Joi.string().uuid() - }) // inner value - affected fields of interview - ) // value - object containing interviews - ).min(1) // at least one key - i.e. don't allow empty object - }).required(), - transactionId: Joi.string().required() -} - -module.exports = { - processRequestInterview, - processUpdateInterview, - processBulkUpdateInterviews -} - -logger.buildService(module.exports, 'InterviewProcessorService') diff --git a/src/services/JobCandidateProcessorService.js b/src/services/JobCandidateProcessorService.js index 3f25882..d8b8def 100644 --- a/src/services/JobCandidateProcessorService.js +++ b/src/services/JobCandidateProcessorService.js @@ -20,20 +20,14 @@ const localLogger = { * @param {Object} message the message object * @returns {undefined} */ -async function updateCandidateStatus ({ type, payload, previousData }) { - // if (previousData.status === payload.status) { - // localLogger.debug({ context: 'updateCandidateStatus', message: `jobCandidate is already in status: ${payload.status}` }) - // return - // } +async function updateCandidateStatus ({ type, payload }) { // if (!['rejected', 'shortlist',].includes(payload.status)) { if (!['client rejected - screening', 'client rejected - interview', 'interview', 'selected', 'withdrawn', 'withdrawn-prescreen'].includes(payload.status)) { localLogger.debug({ context: 'updateCandidateStatus', message: `not interested status: ${payload.status}` }) return } - const { body: jobCandidate } = await esClient.getSource({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - id: payload.id - }) + const jobCandidate = payload + if (!jobCandidate.externalId) { localLogger.debug({ context: 'updateCandidateStatus', message: `id: ${jobCandidate.id} candidate without externalId - ignored` }) return @@ -57,35 +51,33 @@ async function updateCandidateStatus ({ type, payload, previousData }) { * @param {Object} message the message object * @returns {undefined} */ -async function postMessageToZapier ({ type, payload, previousData }) { +async function postMessageToZapier ({ type, payload }) { if (config.zapier.ZAPIER_JOB_CANDIDATE_SWITCH === constants.Zapier.Switch.OFF) { localLogger.debug({ context: 'postMessageToZapier', message: 'Zapier Switch off via config, no messages sent' }) return } if (type === constants.Zapier.MessageType.JobCandidateUpdate) { - await updateCandidateStatus({ type, payload, previousData }) + await updateCandidateStatus({ type, payload }) return } throw new Error(`unrecognized message type: ${type}`) } /** - * Process create entity message + * Process update entity message * @param {Object} message the kafka message * @param {String} transactionId */ -async function processCreate (message, transactionId) { - const jobcandidate = message.payload - await esClient.createExtra({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - id: jobcandidate.id, - transactionId, - body: jobcandidate, - refresh: constants.esRefreshOption +async function processUpdate (message, transactionId) { + const data = message.payload + + await postMessageToZapier({ + type: constants.Zapier.MessageType.JobCandidateUpdate, + payload: data }) } -processCreate.schema = { +processUpdate.schema = { message: Joi.object() .keys({ topic: Joi.string().required(), @@ -114,70 +106,8 @@ processCreate.schema = { transactionId: Joi.string().required() } -/** - * Process update entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processUpdate (message, transactionId) { - const data = message.payload - // save previous data for Zapier logic - // NOTE: ideally if we update Kafka event message to have both: pervious and updated value so we don't have to request it again - const { body: previousData } = await esClient.getExtra({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - id: data.id - }) - // await esClient.updateExtra({ - // index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - // id: data.id, - // transactionId, - // body: { - // doc: data - // }, - // refresh: constants.esRefreshOption - // }) - await postMessageToZapier({ - type: constants.Zapier.MessageType.JobCandidateUpdate, - payload: data, - previousData - }) -} - -processUpdate.schema = processCreate.schema - -/** - * Process delete entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processDelete (message, transactionId) { - const id = message.payload.id - await esClient.deleteExtra({ - index: config.get('esConfig.ES_INDEX_JOB_CANDIDATE'), - id, - transactionId, - refresh: constants.esRefreshOption - }) -} - -processDelete.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required() - }).required() - }).required(), - transactionId: Joi.string().required() -} - module.exports = { - // processCreate, processUpdate - // processDelete } logger.buildService(module.exports, 'JobCandidateProcessorService') diff --git a/src/services/JobProcessorService.js b/src/services/JobProcessorService.js index a1e6388..02f3b1d 100644 --- a/src/services/JobProcessorService.js +++ b/src/services/JobProcessorService.js @@ -8,8 +8,6 @@ const helper = require('../common/helper') const constants = require('../common/constants') const config = require('config') -const esClient = helper.getESClient() - const localLogger = { debug: ({ context, message }) => logger.debug({ component: 'JobProcessorService', context, message }) } @@ -46,13 +44,6 @@ async function postMessageToZapier ({ type, payload }) { */ async function processCreate (message, transactionId) { const job = message.payload - // await esClient.createExtra({ - // index: config.get('esConfig.ES_INDEX_JOB'), - // id: job.id, - // transactionId, - // body: job, - // refresh: constants.esRefreshOption - // }) await postMessageToZapier({ type: constants.Zapier.MessageType.JobCreate, payload: job @@ -110,15 +101,6 @@ processCreate.schema = { */ async function processUpdate (message, transactionId) { const data = message.payload - // await esClient.updateExtra({ - // index: config.get('esConfig.ES_INDEX_JOB'), - // id: data.id, - // transactionId, - // body: { - // doc: data - // }, - // refresh: constants.esRefreshOption - // }) await postMessageToZapier({ type: constants.Zapier.MessageType.JobUpdate, payload: data @@ -127,39 +109,9 @@ async function processUpdate (message, transactionId) { processUpdate.schema = processCreate.schema -/** - * Process delete entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processDelete (message, transactionId) { - const id = message.payload.id - await esClient.deleteExtra({ - index: config.get('esConfig.ES_INDEX_JOB'), - id, - transactionId, - refresh: constants.esRefreshOption - }) -} - -processDelete.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required() - }).required() - }).required(), - transactionId: Joi.string().required() -} - module.exports = { processCreate, - processUpdate, - processDelete + processUpdate } logger.buildService(module.exports, 'JobProcessorService') diff --git a/src/services/ResourceBookingProcessorService.js b/src/services/ResourceBookingProcessorService.js deleted file mode 100644 index f81c231..0000000 --- a/src/services/ResourceBookingProcessorService.js +++ /dev/null @@ -1,113 +0,0 @@ -/** - * ResourceBooking Processor Service - */ - -const Joi = require('@hapi/joi') -const logger = require('../common/logger') -const helper = require('../common/helper') -const constants = require('../common/constants') -const config = require('config') - -const esClient = helper.getESClient() - -/** - * Process create entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processCreate (message, transactionId) { - const resourcebooking = message.payload - await esClient.createExtra({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: resourcebooking.id, - transactionId, - body: resourcebooking, - refresh: constants.esRefreshOption - }) -} - -processCreate.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required(), - projectId: Joi.number().integer().required(), - userId: Joi.string().uuid().required(), - sendWeeklySurvey: Joi.boolean().required(), - jobId: Joi.string().uuid().allow(null), - startDate: Joi.string().regex(/^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).allow(null), - endDate: Joi.string().regex(/^(19|20)\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$/).allow(null), - memberRate: Joi.number().allow(null), - customerRate: Joi.number().allow(null), - rateType: Joi.rateType().required(), - createdAt: Joi.date().required(), - createdBy: Joi.string().uuid().required(), - updatedAt: Joi.date().allow(null), - updatedBy: Joi.string().uuid().allow(null), - status: Joi.resourceBookingStatus().required(), - billingAccountId: Joi.number().allow(null) - }).required() - }).required(), - transactionId: Joi.string().required() -} - -/** - * Process update entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processUpdate (message, transactionId) { - const data = message.payload - await esClient.updateExtra({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: data.id, - transactionId, - body: { - doc: data - }, - refresh: constants.esRefreshOption - }) -} - -processUpdate.schema = processCreate.schema - -/** - * Process delete entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processDelete (message, transactionId) { - const id = message.payload.id - await esClient.deleteExtra({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id, - transactionId, - refresh: constants.esRefreshOption - }) -} - -processDelete.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required() - }).required() - }).required(), - transactionId: Joi.string().required() -} - -module.exports = { - processCreate, - processUpdate, - processDelete -} - -logger.buildService(module.exports, 'ResourceBookingProcessorService') diff --git a/src/services/RoleProcessorService.js b/src/services/RoleProcessorService.js deleted file mode 100644 index 3ab5976..0000000 --- a/src/services/RoleProcessorService.js +++ /dev/null @@ -1,124 +0,0 @@ -/** - * Role Processor Service - */ - -const Joi = require('@hapi/joi') -const logger = require('../common/logger') -const helper = require('../common/helper') -const constants = require('../common/constants') -const config = require('config') - -const esClient = helper.getESClient() - -/** - * Process create entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processCreate (message, transactionId) { - const role = message.payload - await esClient.createExtra({ - index: config.get('esConfig.ES_INDEX_ROLE'), - id: role.id, - transactionId, - body: role, - refresh: constants.esRefreshOption - }) -} - -processCreate.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required(), - name: Joi.string().max(50).required(), - description: Joi.string().max(1000).allow(null), - listOfSkills: Joi.array().items(Joi.string().max(50).required()).allow(null), - rates: Joi.array().items(Joi.object().keys({ - global: Joi.smallint().required(), - inCountry: Joi.smallint().required(), - offShore: Joi.smallint().required(), - niche: Joi.smallint().allow(null), - rate30Global: Joi.smallint().allow(null), - rate30Niche: Joi.smallint().allow(null), - rate30InCountry: Joi.smallint().allow(null), - rate30OffShore: Joi.smallint().allow(null), - rate20Global: Joi.smallint().allow(null), - rate20Niche: Joi.smallint().allow(null), - rate20InCountry: Joi.smallint().allow(null), - rate20OffShore: Joi.smallint().allow(null) - }).required()).required(), - numberOfMembers: Joi.number().allow(null), - numberOfMembersAvailable: Joi.smallint().allow(null), - imageUrl: Joi.string().uri().max(255).allow(null), - timeToCandidate: Joi.smallint().allow(null), - timeToInterview: Joi.smallint().allow(null), - createdAt: Joi.date().required(), - createdBy: Joi.string().uuid().required(), - updatedAt: Joi.date().allow(null), - updatedBy: Joi.string().uuid().allow(null) - }).required() - }).required(), - transactionId: Joi.string().required() -} - -/** - * Process update entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processUpdate (message, transactionId) { - const data = message.payload - await esClient.updateExtra({ - index: config.get('esConfig.ES_INDEX_ROLE'), - id: data.id, - transactionId, - body: { - doc: data - }, - refresh: constants.esRefreshOption - }) -} - -processUpdate.schema = processCreate.schema - -/** - * Process delete entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processDelete (message, transactionId) { - const id = message.payload.id - await esClient.deleteExtra({ - index: config.get('esConfig.ES_INDEX_ROLE'), - id, - transactionId, - refresh: constants.esRefreshOption - }) -} - -processDelete.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required() - }).required() - }).required(), - transactionId: Joi.string().required() -} - -module.exports = { - processCreate, - processUpdate, - processDelete -} - -logger.buildService(module.exports, 'RoleProcessorService') diff --git a/src/services/WorkPeriodPaymentProcessorService.js b/src/services/WorkPeriodPaymentProcessorService.js deleted file mode 100644 index 709f94d..0000000 --- a/src/services/WorkPeriodPaymentProcessorService.js +++ /dev/null @@ -1,131 +0,0 @@ -/** - * WorkPeriodPayment Processor Service - */ - -const Joi = require('@hapi/joi') -const config = require('config') -const logger = require('../common/logger') -const helper = require('../common/helper') -const constants = require('../common/constants') - -const esClient = helper.getESClient() - -/** - * Process create entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processCreate (message, transactionId) { - const workPeriodPayment = message.payload - // find related resourceBooking - const resourceBooking = await esClient.search({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - body: { - query: { - nested: { - path: 'workPeriods', - query: { - match: { 'workPeriods.id': workPeriodPayment.workPeriodId } - } - } - } - } - }) - if (!resourceBooking.body.hits.total.value) { - throw new Error(`id: ${workPeriodPayment.workPeriodId} "WorkPeriod" not found`) - } - await esClient.update({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: resourceBooking.body.hits.hits[0]._id, - transactionId, - body: { - script: { - lang: 'painless', - source: 'def wp = ctx._source.workPeriods.find(workPeriod -> workPeriod.id == params.workPeriodPayment.workPeriodId); if(!wp.containsKey("payments") || wp.payments == null){wp["payments"]=[]}wp.payments.add(params.workPeriodPayment)', - params: { workPeriodPayment } - } - }, - refresh: constants.esRefreshOption - }) -} - -processCreate.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required(), - workPeriodId: Joi.string().uuid().required(), - challengeId: Joi.string().uuid().allow(null), - memberRate: Joi.number().required(), - customerRate: Joi.number().allow(null), - days: Joi.number().integer().min(0).max(10).required(), - amount: Joi.number().greater(0).allow(null), - status: Joi.workPeriodPaymentStatus().required(), - billingAccountId: Joi.number().allow(null), - statusDetails: Joi.object().keys({ - errorMessage: Joi.string().required(), - errorCode: Joi.number().integer().allow(null), - retry: Joi.number().integer().allow(null), - step: Joi.string().allow(null), - challengeId: Joi.string().uuid().allow(null) - }).unknown(true).allow(null), - createdAt: Joi.date().required(), - createdBy: Joi.string().uuid().required(), - updatedAt: Joi.date().allow(null), - updatedBy: Joi.string().uuid().allow(null) - }).required() - }).required(), - transactionId: Joi.string().required() -} - -/** - * Process update entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processUpdate (message, transactionId) { - const data = message.payload - // find workPeriodPayment in it's parent ResourceBooking - const resourceBooking = await esClient.search({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - body: { - query: { - nested: { - path: 'workPeriods.payments', - query: { - match: { 'workPeriods.payments.id': data.id } - } - } - } - } - }) - if (!resourceBooking.body.hits.total.value) { - throw new Error(`id: ${data.id} "WorkPeriodPayment" not found`) - } - await esClient.update({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: resourceBooking.body.hits.hits[0]._id, - transactionId, - body: { - script: { - lang: 'painless', - source: 'def wp = ctx._source.workPeriods.find(workPeriod -> workPeriod.id == params.data.workPeriodId); wp.payments.removeIf(payment -> payment.id == params.data.id); wp.payments.add(params.data)', - params: { data } - } - }, - refresh: constants.esRefreshOption - }) -} - -processUpdate.schema = processCreate.schema - -module.exports = { - processCreate, - processUpdate -} - -logger.buildService(module.exports, 'WorkPeriodPaymentProcessorService') diff --git a/src/services/WorkPeriodProcessorService.js b/src/services/WorkPeriodProcessorService.js deleted file mode 100644 index 89129a9..0000000 --- a/src/services/WorkPeriodProcessorService.js +++ /dev/null @@ -1,200 +0,0 @@ -/** - * WorkPeriod Processor Service - */ - -const Joi = require('@hapi/joi') -const logger = require('../common/logger') -const helper = require('../common/helper') -const constants = require('../common/constants') -const config = require('config') -const esClient = helper.getESClient() -const ActionProcessorService = require('../services/ActionProcessorService') - -/** - * Process create entity message - * @param {Object} message the kafka message - * @param {String} transactionId - * @param {Object} options - */ -async function processCreate (message, transactionId, options) { - const workPeriod = message.payload - // Find related resourceBooking - let resourceBooking - try { - resourceBooking = await esClient.getExtra({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - transactionId, - id: workPeriod.resourceBookingId - }) - } catch (err) { - // if resource booking was not found, it may be because - // it has not yet been created. We should send a retry request. - if (err.httpStatus === 404) { - const schedulePromise = ActionProcessorService.scheduleRetry(message.topic, workPeriod, options.retry) - if (schedulePromise) { - // as retry was scheduled, log this error as warning - logger.logFullWarning(err, { component: 'WorkPeriodProcessorService', context: 'processCreate' }) - } else { - // as retry was not scheduled, then log this error as error - logger.logFullError(err, { component: 'WorkPeriodProcessorService', context: 'processCreate' }) - } - return - } else { - throw err - } - } - await esClient.update({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: resourceBooking.body.id, - transactionId, - body: { - script: { - lang: 'painless', - source: 'if(!ctx._source.containsKey("workPeriods") || ctx._source.workPeriods == null){ctx._source["workPeriods"]=[]}ctx._source.workPeriods.add(params.workPeriod)', - params: { workPeriod } - } - }, - refresh: constants.esRefreshOption - }) -} - -processCreate.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required(), - resourceBookingId: Joi.string().uuid().required(), - userHandle: Joi.string().required(), - projectId: Joi.number().integer().required(), - startDate: Joi.string().required(), - endDate: Joi.string().required(), - sentSurvey: Joi.boolean().required(), - sentSurveyError: Joi.object().keys({ - errorCode: Joi.number().integer().min(0), - errorMessage: Joi.string() - }).allow(null), - daysWorked: Joi.number().integer().min(0).max(10).required(), - daysPaid: Joi.number().integer().min(0).max(10).required(), - paymentTotal: Joi.number().min(0).required(), - paymentStatus: Joi.paymentStatus().required(), - createdAt: Joi.date().required(), - createdBy: Joi.string().uuid().required(), - updatedAt: Joi.date().allow(null), - updatedBy: Joi.string().uuid().allow(null) - }).required() - }).required(), - transactionId: Joi.string().required(), - options: Joi.object().keys({ - retry: Joi.number().integer().min(0).default(0) - }).default({ - retry: 0 - }) -} - -/** - * Process update entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processUpdate (message, transactionId) { - const data = message.payload - // find workPeriod in it's parent ResourceBooking - const resourceBooking = await esClient.search({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - transactionId, - body: { - query: { - nested: { - path: 'workPeriods', - query: { - match: { 'workPeriods.id': data.id } - } - } - } - } - }) - if (!resourceBooking.body.hits.total.value) { - throw new Error(`id: ${data.id} "WorkPeriod" not found`) - } - await esClient.update({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: resourceBooking.body.hits.hits[0]._id, - transactionId, - body: { - script: { - lang: 'painless', - source: 'def wp = ctx._source.workPeriods.find(workPeriod -> workPeriod.id == params.data.id); ctx._source.workPeriods.removeIf(workPeriod -> workPeriod.id == params.data.id); params.data.payments = wp.payments; ctx._source.workPeriods.add(params.data)', - params: { data } - } - }, - refresh: constants.esRefreshOption - }) -} - -processUpdate.schema = processCreate.schema - -/** - * Process delete entity message - * @param {Object} message the kafka message - * @param {String} transactionId - */ -async function processDelete (message, transactionId) { - const data = message.payload - // Find related ResourceBooking - const resourceBooking = await esClient.search({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - transactionId, - body: { - query: { - nested: { - path: 'workPeriods', - query: { - match: { 'workPeriods.id': data.id } - } - } - } - } - }) - if (!resourceBooking.body.hits.total.value) { - throw new Error(`id: ${data.id} "WorkPeriod" not found`) - } - await esClient.update({ - index: config.get('esConfig.ES_INDEX_RESOURCE_BOOKING'), - id: resourceBooking.body.hits.hits[0]._id, - transactionId, - body: { - script: { - lang: 'painless', - source: 'ctx._source.workPeriods.removeIf(workPeriod -> workPeriod.id == params.data.id)', - params: { data } - } - }, - refresh: constants.esRefreshOption - }) -} - -processDelete.schema = { - message: Joi.object().keys({ - topic: Joi.string().required(), - originator: Joi.string().required(), - timestamp: Joi.date().required(), - 'mime-type': Joi.string().required(), - key: Joi.string().allow(null), - payload: Joi.object().keys({ - id: Joi.string().uuid().required() - }).required() - }).required(), - transactionId: Joi.string().required() -} - -module.exports = { - processCreate, - processUpdate, - processDelete -} - -logger.buildService(module.exports, 'WorkPeriodProcessorService') diff --git a/test/common/testData.js b/test/common/testData.js deleted file mode 100644 index 47a0dd1..0000000 --- a/test/common/testData.js +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Data for tests. - */ -const messages = { - Job: { - create: { topic: 'taas.job.create', message: require('../messages/taas.job.create.event.json') }, - update: { topic: 'taas.job.update', message: require('../messages/taas.job.update.event.json') }, - delete: { topic: 'taas.job.delete', message: require('../messages/taas.job.delete.event.json') } - }, - JobCandidate: { - create: { topic: 'taas.jobcandidate.create', message: require('../messages/taas.jobcandidate.create.event.json') }, - update: { topic: 'taas.jobcandidate.update', message: require('../messages/taas.jobcandidate.update.event.json') }, - delete: { topic: 'taas.jobcandidate.delete', message: require('../messages/taas.jobcandidate.delete.event.json') } - }, - ResourceBooking: { - create: { topic: 'taas.resourcebooking.create', message: require('../messages/taas.resourcebooking.create.event.json') }, - update: { topic: 'taas.resourcebooking.update', message: require('../messages/taas.resourcebooking.update.event.json') }, - delete: { topic: 'taas.resourcebooking.delete', message: require('../messages/taas.resourcebooking.delete.event.json') } - }, - WorkPeriod: { - create: { topic: 'taas.workperiod.create', message: require('../messages/taas.workperiod.create.event.json') }, - update: { topic: 'taas.workperiod.update', message: require('../messages/taas.workperiod.update.event.json') }, - delete: { topic: 'taas.workperiod.delete', message: require('../messages/taas.workperiod.delete.event.json') } - }, - WorkPeriodPayment: { - create: { topic: 'taas.workperiodpayment.create', message: require('../messages/taas.workperiodpayment.create.event.json') }, - update: { topic: 'taas.workperiodpayment.update', message: require('../messages/taas.workperiodpayment.update.event.json') } - }, - Role: { - create: { topic: 'taas.role.requested', message: require('../messages/taas.role.create.event.json') }, - update: { topic: 'taas.role.update', message: require('../messages/taas.role.update.event.json') }, - delete: { topic: 'taas.role.delete', message: require('../messages/taas.role.delete.event .json') } - }, - messageInvalid: '{ "topic": "taas.job.create", }' -} - -// used in unit tests to mock es storage -const esStorage = { content: {} } - -module.exports = { - messages, - esStorage -} diff --git a/test/common/testHelper.js b/test/common/testHelper.js deleted file mode 100644 index 6410492..0000000 --- a/test/common/testHelper.js +++ /dev/null @@ -1,53 +0,0 @@ -/** - * Contains generic helper methods for test - */ -const Kafka = require('no-kafka') -const _ = require('lodash') -const config = require('config') -const helper = require('../../src/common/helper') - -let producer -const esClient = helper.getESClient() - -/** - * Send message - * @param testMessage the test message - * @param topic the topic name; optional - */ -async function sendMessage (testMessage, topic) { - if (!producer) { - producer = new Kafka.Producer(helper.getKafkaOptions()) - await producer.init() - } - await producer.send({ - topic: topic || testMessage.topic, - message: { - value: (typeof testMessage) === 'string' ? testMessage : JSON.stringify(testMessage) - } - }) -} - -/** - * Delete all documents in ES. - * - * @returns {undefined} - */ -async function clearES () { - for (const index of Object.values(_.pick(config.esConfig, ['ES_INDEX_JOB', 'ES_INDEX_JOB_CANDIDATE', 'ES_INDEX_RESOURCE_BOOKING']))) { - await esClient.deleteByQuery({ - index, - body: { - query: { - match_all: {} - } - }, - refresh: true - }) - } -} - -module.exports = { - sendMessage, - clearES, - esClient -} diff --git a/test/e2e/test.js b/test/e2e/test.js deleted file mode 100644 index 020b060..0000000 --- a/test/e2e/test.js +++ /dev/null @@ -1,287 +0,0 @@ -/** - * E2E test of the Taas ES Processor. - */ - -const config = require('config') -const stringcase = require('stringcase') -const app = require('../../src/app') -const request = require('superagent') -const should = require('should') -const logger = require('../../src/common/logger') -const testData = require('../common/testData') -const testHelper = require('../common/testHelper') -const _ = require('lodash') - -describe('Taas ES Processor E2E Test', () => { - let infoLogs = [] - let errorLogs = [] - let debugLogs = [] - const info = logger.info - const error = logger.error - const debug = logger.debug - const waitForMessageHandled = () => new Promise((resolve) => { - app.eventEmitter.once('end_handling_message', () => resolve()) - }) - before(async () => { - // inject logger with log collector - logger.info = (message) => { - infoLogs.push(message.message || message) - info(message) - } - logger.debug = (message) => { - debugLogs.push(message.message || message) - debug(message) - } - logger.error = (message) => { - errorLogs.push(message.message || message) - error(message) - } - await app.initConsumer() - }) - - after(async () => { - // restore logger - logger.error = error - logger.info = info - logger.debug = debug - - await testHelper.clearES() - }) - - beforeEach(async () => { - // clear logs - infoLogs = [] - debugLogs = [] - errorLogs = [] - await testHelper.clearES() - }) - describe('General Logic Tests', () => { - it('Should setup healthcheck with check on kafka connection', async () => { - const healthcheckEndpoint = `http://localhost:${config.PORT}/health` - const result = await request.get(healthcheckEndpoint) - should.equal(result.status, 200) - should.deepEqual(result.body, { checksRun: 1 }) - }) - - it('Should handle invalid json message', async () => { - await testHelper.sendMessage(testData.messages.messageInvalid, config.topics.TAAS_JOB_CREATE_TOPIC) - await waitForMessageHandled() - errorLogs[0].should.match(/Invalid message JSON/) - }) - - it('Should handle incorrect topic field message', async () => { - await testHelper.sendMessage(testData.messages.Job.create.message, config.topics.TAAS_JOB_UPDATE_TOPIC) - await waitForMessageHandled() - should.equal(errorLogs[0], `The message topic ${testData.messages.Job.create.topic} doesn't match the Kafka topic ${config.topics.TAAS_JOB_UPDATE_TOPIC}.`) - }) - }) - describe('Job, JobCandidate, ResourceBooking tests', () => { - for (const [index, model] of [ - [config.esConfig.ES_INDEX_JOB, 'Job'], - [config.esConfig.ES_INDEX_JOB_CANDIDATE, 'JobCandidate'], - [config.esConfig.ES_INDEX_RESOURCE_BOOKING, 'ResourceBooking'] - ]) { - const modelInSpaceCase = stringcase.spacecase(model) - - it(`Should handle ${modelInSpaceCase} creation message`, async () => { - await testHelper.sendMessage(testData.messages[model].create.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[model].create.message.payload.id - }) - should.deepEqual(doc.body._source, testData.messages[model].create.message.payload, ['id']) - }) - - it(`Should handle ${modelInSpaceCase} updating message`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[model].create.message.payload.id, - body: testData.messages[model].create.message.payload, - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].update.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[model].update.message.payload.id - }) - should.deepEqual(doc.body._source, testData.messages[model].update.message.payload) - }) - - it(`Should handle ${modelInSpaceCase} deletion message`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[model].create.message.payload.id, - body: testData.messages[model].create.message.payload, - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].delete.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[model].delete.message.payload.id - }).catch(err => { - if (err.statusCode === 404) { - return - } - throw err - }) - should.not.exist(doc) - }) - - it(`Failure - creation message - ${modelInSpaceCase} already exists`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[model].create.message.payload.id, - body: testData.messages[model].create.message.payload, - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].create.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[model].create.message.payload.id} "${index}" already exists`) - }) - - it(`Failure - updating message - ${modelInSpaceCase} not found`, async () => { - await testHelper.sendMessage(testData.messages[model].update.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[model].update.message.payload.id} "${index}" not found`) - }) - - it(`Failure - deletion message - ${modelInSpaceCase} not found`, async () => { - await testHelper.sendMessage(testData.messages[model].delete.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[model].delete.message.payload.id} "${index}" not found`) - }) - } - }) - describe('Nested WorkPeriod tests', () => { - const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING - const model = 'WorkPeriod' - const parentModel = 'ResourceBooking' - const nestedName = 'workPeriods' - const modelInSpaceCase = stringcase.spacecase(model) - - it(`Should handle ${modelInSpaceCase} creation message`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[parentModel].create.message.payload.id, - body: testData.messages[parentModel].create.message.payload, - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].create.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[parentModel].create.message.payload.id - }) - should.deepEqual(doc.body._source, - _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })) - }) - - it(`Should handle ${modelInSpaceCase} updating message`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[parentModel].create.message.payload.id, - body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }), - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].update.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[parentModel].create.message.payload.id - }) - should.deepEqual(doc.body._source, - _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] })) - }) - - it(`Should handle ${modelInSpaceCase} deletion message`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[parentModel].create.message.payload.id, - body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }), - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].delete.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[parentModel].create.message.payload.id - }) - should.deepEqual(doc.body._source, - _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [] })) - }) - - it(`Failure - creation message - ${modelInSpaceCase} not found`, async () => { - await testHelper.sendMessage(testData.messages[model].create.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[parentModel].create.message.payload.id} "${index}" not found`) - }) - - it(`Failure - updating message - ${modelInSpaceCase} not found`, async () => { - await testHelper.sendMessage(testData.messages[model].update.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`) - }) - - it(`Failure - deletion message - ${modelInSpaceCase} not found`, async () => { - await testHelper.sendMessage(testData.messages[model].delete.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[model].delete.message.payload.id} "${model}" not found`) - }) - }) - describe('Nested WorkPeriodPayment tests', () => { - const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING - const model = 'WorkPeriodPayment' - const parentModel = 'WorkPeriod' - const rootModel = 'ResourceBooking' - const nestedName = 'payments' - const parentNestedName = 'workPeriods' - const modelInSpaceCase = stringcase.spacecase(model) - - it(`Should handle ${modelInSpaceCase} creation message`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[rootModel].create.message.payload.id, - body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [testData.messages[parentModel].create.message.payload] }), - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].create.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[rootModel].create.message.payload.id - }) - should.deepEqual(doc.body._source, _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] })) - }) - - it(`Should handle ${modelInSpaceCase} updating message`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[rootModel].create.message.payload.id, - body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] }), - refresh: 'true' - }) - await testHelper.sendMessage(testData.messages[model].update.message) - await waitForMessageHandled() - const doc = await testHelper.esClient.get({ - index, - id: testData.messages[rootModel].create.message.payload.id - }) - should.deepEqual(doc.body._source, _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] })] })) - }) - - it(`Failure - creation message - ${modelInSpaceCase} not found`, async () => { - await testHelper.sendMessage(testData.messages[model].create.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[parentModel].create.message.payload.id} "${parentModel}" not found`) - }) - - it(`Failure - updating message - ${modelInSpaceCase} not found`, async () => { - await testHelper.sendMessage(testData.messages[model].update.message) - await waitForMessageHandled() - should.equal(errorLogs[0], `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`) - }) - }) -}) diff --git a/test/messages/taas.job.create.event.json b/test/messages/taas.job.create.event.json deleted file mode 100644 index 0813259..0000000 --- a/test/messages/taas.job.create.event.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "topic": "taas.job.create", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:17.563Z", - "mime-type": "application/json", - "payload": { - "title": "Job Title", - "projectId": 21, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "duration": 17, - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": [ - "56fdc405-eccc-4189-9e83-c78abf844f50", - "f91ae184-aba2-4485-a8cb-9336988c05ab", - "edfc7b4f-636f-44bd-96fc-949ffc58e38b", - "4ca63bb6-f515-4ab0-a6bc-c2d8531e084f", - "ee03c041-d53b-4c08-b7d9-80d7461da3e4" - ], - "id": "ffbc24f7-301e-48d3-bf01-c056916056a2", - "createdAt": "2020-11-05T19:00:16.268Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "sourcing", - "isApplicationPageActive": false, - "minSalary": 100, - "maxSalary": 200, - "hoursPerWeek": 20, - "jobLocation": "Any location", - "jobTimezone": "GMT", - "currency": "USD", - "roleIds": [ - "e7b7e818-40d4-4102-b486-09bdd21400b8" - ] - } -} \ No newline at end of file diff --git a/test/messages/taas.job.delete.event.json b/test/messages/taas.job.delete.event.json deleted file mode 100644 index 9ad9844..0000000 --- a/test/messages/taas.job.delete.event.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "topic": "taas.job.delete", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:19.035Z", - "mime-type": "application/json", - "payload": { - "id": "ffbc24f7-301e-48d3-bf01-c056916056a2" - } -} \ No newline at end of file diff --git a/test/messages/taas.job.update.event.json b/test/messages/taas.job.update.event.json deleted file mode 100644 index 56a7b0d..0000000 --- a/test/messages/taas.job.update.event.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "topic": "taas.job.update", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:19.015Z", - "mime-type": "application/json", - "payload": { - "id": "ffbc24f7-301e-48d3-bf01-c056916056a2", - "title": "Job Title Updated", - "projectId": 21, - "externalId": "1212", - "description": "Dummy Description", - "startDate": "2020-09-27T04:17:23.131Z", - "duration": 19, - "numPositions": 13, - "resourceType": "Dummy Resource Type", - "rateType": "hourly", - "skills": [ - "3fa85f64-5717-4562-b3fc-2c963f66afa6", - "cc41ddc4-cacc-4570-9bdb-1229c12b9784" - ], - "status": "sourcing", - "updatedAt": "2020-11-05T19:00:17.612Z", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-05T19:00:16.268Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "isApplicationPageActive": false, - "minSalary": 100, - "maxSalary": 200, - "hoursPerWeek": 20, - "jobLocation": "Any location", - "jobTimezone": "GMT", - "currency": "USD", - "roleIds": [ - "e7b7e818-40d4-4102-b486-09bdd21400b8" - ] - } -} \ No newline at end of file diff --git a/test/messages/taas.jobcandidate.create.event.json b/test/messages/taas.jobcandidate.create.event.json deleted file mode 100644 index 28ba870..0000000 --- a/test/messages/taas.jobcandidate.create.event.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "topic": "taas.jobcandidate.create", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:21.597Z", - "mime-type": "application/json", - "payload": { - "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "id": "0cb99adb-8bcd-4952-9203-9867dd45ef6f", - "createdAt": "2020-11-05T19:00:19.052Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "open", - "remark": "excellent" - } -} \ No newline at end of file diff --git a/test/messages/taas.jobcandidate.delete.event.json b/test/messages/taas.jobcandidate.delete.event.json deleted file mode 100644 index 0aa13d5..0000000 --- a/test/messages/taas.jobcandidate.delete.event.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "topic": "taas.jobcandidate.delete", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:23.021Z", - "mime-type": "application/json", - "payload": { - "id": "0cb99adb-8bcd-4952-9203-9867dd45ef6f" - } -} \ No newline at end of file diff --git a/test/messages/taas.jobcandidate.update.event.json b/test/messages/taas.jobcandidate.update.event.json deleted file mode 100644 index cc6e506..0000000 --- a/test/messages/taas.jobcandidate.update.event.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "topic": "taas.jobcandidate.update", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:23.003Z", - "mime-type": "application/json", - "payload": { - "id": "0cb99adb-8bcd-4952-9203-9867dd45ef6f", - "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2", - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "selected", - "remark": "excellent", - "updatedAt": "2020-11-05T19:00:21.625Z", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-05T19:00:16.268Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a" - } -} \ No newline at end of file diff --git a/test/messages/taas.resourcebooking.create.event.json b/test/messages/taas.resourcebooking.create.event.json deleted file mode 100644 index 2d7fd00..0000000 --- a/test/messages/taas.resourcebooking.create.event.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "topic": "taas.resourcebooking.create", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:25.038Z", - "mime-type": "application/json", - "payload": { - "projectId": 21, - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2", - "startDate": "2020-09-27", - "endDate": "2020-09-27", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "id": "60d97713-8621-476e-b006-7cb9589c7777", - "createdAt": "2020-11-05T19:00:23.036Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "status": "placed", - "billingAccountId": 80000071 - } -} \ No newline at end of file diff --git a/test/messages/taas.resourcebooking.delete.event.json b/test/messages/taas.resourcebooking.delete.event.json deleted file mode 100644 index 644037e..0000000 --- a/test/messages/taas.resourcebooking.delete.event.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "topic": "taas.resourcebooking.delete", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:26.433Z", - "mime-type": "application/json", - "payload": { - "id": "60d97713-8621-476e-b006-7cb9589c7777" - } -} \ No newline at end of file diff --git a/test/messages/taas.resourcebooking.update.event.json b/test/messages/taas.resourcebooking.update.event.json deleted file mode 100644 index 036b6c6..0000000 --- a/test/messages/taas.resourcebooking.update.event.json +++ /dev/null @@ -1,23 +0,0 @@ -{ - "topic": "taas.resourcebooking.update", - "originator": "taas-api", - "timestamp": "2020-11-05T19:00:26.407Z", - "mime-type": "application/json", - "payload": { - "id": "60d97713-8621-476e-b006-7cb9589c7777", - "projectId": 21, - "userId": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "jobId": "ffbc24f7-301e-48d3-bf01-c056916056a2", - "startDate": "2020-09-27", - "endDate": "2020-09-27", - "memberRate": 13.23, - "customerRate": 13, - "rateType": "hourly", - "status": "placed", - "billingAccountId": 80000071, - "updatedAt": "2020-11-05T19:00:25.062Z", - "updatedBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a", - "createdAt": "2020-11-05T19:00:16.268Z", - "createdBy": "a55fe1bc-1754-45fa-9adc-cf3d6d7c377a" - } -} \ No newline at end of file diff --git a/test/messages/taas.role.create.event.json b/test/messages/taas.role.create.event.json deleted file mode 100644 index a45b6a8..0000000 --- a/test/messages/taas.role.create.event.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "topic": "taas.role.requested", - "originator": "taas-api", - "timestamp": "2021-05-27T21:43:09.388Z", - "mime-type": "application/json", - "payload": { - "name": "Salesforce Developer", - "description": "A Salesforce developer is a programmer who builds Salesforce applications across various PaaS (Platform as a Service) platforms.", - "listOfSkills": [ - "Docker", - ".NET", - "appcelerator", - "Flux" - ], - "rates": [ - { - "global": 50, - "inCountry": 20, - "offShore": 10, - "rate30Global": 20, - "rate30InCountry": 15, - "rate30OffShore": 35, - "rate20Global": 20, - "rate20InCountry": 15, - "rate20OffShore": 35 - }, - { - "global": 25, - "inCountry": 15, - "offShore": 5, - "rate30Global": 20, - "rate30InCountry": 15, - "rate30OffShore": 35, - "rate20Global": 20, - "rate20InCountry": 15, - "rate20OffShore": 35 - } - ], - "numberOfMembers": 10, - "numberOfMembersAvailable": 6, - "imageUrl": "http: //images.topcoder.com/member", - "timeToCandidate": 105, - "timeToInterview": 100, - "id": "e7b7e818-40d4-4102-b486-09bdd21400b8", - "createdBy": "00000000-0000-0000-0000-000000000000", - "updatedAt": "2021-05-27T21:43:09.342Z", - "createdAt": "2021-05-27T21:43:09.342Z", - "updatedBy": null - } -} \ No newline at end of file diff --git a/test/messages/taas.role.delete.event .json b/test/messages/taas.role.delete.event .json deleted file mode 100644 index 3bd7c32..0000000 --- a/test/messages/taas.role.delete.event .json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "topic": "taas.role.delete", - "originator": "taas-api", - "timestamp": "2021-05-27T21:45:09.388Z", - "mime-type": "application/json", - "payload": { - "id": "e7b7e818-40d4-4102-b486-09bdd21400b8" - } -} \ No newline at end of file diff --git a/test/messages/taas.role.update.event.json b/test/messages/taas.role.update.event.json deleted file mode 100644 index 5c2a482..0000000 --- a/test/messages/taas.role.update.event.json +++ /dev/null @@ -1,48 +0,0 @@ -{ - "topic": "taas.role.update", - "originator": "taas-api", - "timestamp": "2021-05-27T21:44:09.388Z", - "mime-type": "application/json", - "payload": { - "name": "Salesforce Developer", - "description": "A Salesforce developer is a programmer who builds Salesforce applications across various PaaS (Platform as a Service) platforms.", - "listOfSkills": [ - "Docker", - ".NET" - ], - "rates": [ - { - "global": 50, - "inCountry": 20, - "offShore": 10, - "rate30Global": 20, - "rate30InCountry": 15, - "rate30OffShore": 35, - "rate20Global": 20, - "rate20InCountry": 15, - "rate20OffShore": 35 - }, - { - "global": 25, - "inCountry": 15, - "offShore": 5, - "rate30Global": 20, - "rate30InCountry": 15, - "rate30OffShore": 35, - "rate20Global": 20, - "rate20InCountry": 15, - "rate20OffShore": 35 - } - ], - "numberOfMembers": 10, - "numberOfMembersAvailable": 6, - "imageUrl": "http: //images.topcoder.com/member", - "timeToCandidate": 105, - "timeToInterview": 100, - "id": "e7b7e818-40d4-4102-b486-09bdd21400b8", - "createdBy": "00000000-0000-0000-0000-000000000000", - "updatedAt": "2021-05-27T21:43:09.342Z", - "createdAt": "2021-05-27T21:43:09.342Z", - "updatedBy": "00000000-0000-0000-0000-000000000000" - } -} \ No newline at end of file diff --git a/test/messages/taas.workperiod.create.event.json b/test/messages/taas.workperiod.create.event.json deleted file mode 100644 index eb26743..0000000 --- a/test/messages/taas.workperiod.create.event.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "topic": "taas.workperiod.create", - "originator": "taas-api", - "timestamp": "2021-03-30T20:24:17.555Z", - "mime-type": "application/json", - "payload": { - "resourceBookingId": "60d97713-8621-476e-b006-7cb9589c7777", - "startDate": "2021-03-14", - "endDate": "2021-03-20", - "daysWorked": 3, - "memberRate": 13.13, - "customerRate": 13.13, - "paymentStatus": "cancelled", - "projectId": 111, - "userHandle": "pshah_manager", - "id": "926040c4-1709-4de2-b2b6-52adf6e5e72d", - "createdBy": "00000000-0000-0000-0000-000000000000", - "updatedAt": "2021-03-30T20:24:17.541Z", - "createdAt": "2021-03-30T20:24:17.541Z", - "updatedBy": null - } -} \ No newline at end of file diff --git a/test/messages/taas.workperiod.delete.event.json b/test/messages/taas.workperiod.delete.event.json deleted file mode 100644 index 3b3207c..0000000 --- a/test/messages/taas.workperiod.delete.event.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "topic": "taas.workperiod.delete", - "originator": "taas-api", - "timestamp": "2021-03-30T20:13:58.491Z", - "mime-type": "application/json", - "payload": { - "id": "926040c4-1709-4de2-b2b6-52adf6e5e72d" - } -} \ No newline at end of file diff --git a/test/messages/taas.workperiod.update.event.json b/test/messages/taas.workperiod.update.event.json deleted file mode 100644 index e8798dd..0000000 --- a/test/messages/taas.workperiod.update.event.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "topic": "taas.workperiod.update", - "originator": "taas-api", - "timestamp": "2021-03-30T20:13:53.179Z", - "mime-type": "application/json", - "payload": { - "resourceBookingId": "60d97713-8621-476e-b006-7cb9589c7777", - "startDate": "2021-03-21", - "endDate": "2021-03-28", - "daysWorked": 4, - "memberRate": 13.13, - "customerRate": 13.13, - "paymentStatus": "cancelled", - "projectId": 111, - "userHandle": "pshah_manager", - "id": "926040c4-1709-4de2-b2b6-52adf6e5e72d", - "createdBy": "00000000-0000-0000-0000-000000000000", - "updatedAt": "2021-03-30T20:24:17.541Z", - "createdAt": "2021-03-30T20:24:17.541Z", - "updatedBy": "00000000-0000-0000-0000-000000000000" - } -} \ No newline at end of file diff --git a/test/messages/taas.workperiodpayment.create.event.json b/test/messages/taas.workperiodpayment.create.event.json deleted file mode 100644 index 1ecbc84..0000000 --- a/test/messages/taas.workperiodpayment.create.event.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "topic": "taas.workperiodpayment.create", - "originator": "taas-api", - "timestamp": "2021-04-09T20:10:33.770Z", - "mime-type": "application/json", - "payload": { - "challengeId": "00000000-0000-0000-0000-000000000000", - "workPeriodId": "926040c4-1709-4de2-b2b6-52adf6e5e72d", - "amount": 600, - "status": "completed", - "id": "09c80ee6-21be-45a4-9c3c-7ec4c75ece79", - "billingAccountId": 80000071, - "createdBy": "57646ff9-1cd3-4d3c-88ba-eb09a395366c", - "updatedAt": "2021-04-09T20:10:33.755Z", - "createdAt": "2021-04-09T20:10:33.755Z", - "updatedBy": null - } -} \ No newline at end of file diff --git a/test/messages/taas.workperiodpayment.update.event.json b/test/messages/taas.workperiodpayment.update.event.json deleted file mode 100644 index ea1e859..0000000 --- a/test/messages/taas.workperiodpayment.update.event.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "topic": "taas.workperiodpayment.update", - "originator": "taas-api", - "timestamp": "2021-04-09T20:12:26.994Z", - "mime-type": "application/json", - "payload": { - "id": "09c80ee6-21be-45a4-9c3c-7ec4c75ece79", - "workPeriodId": "926040c4-1709-4de2-b2b6-52adf6e5e72d", - "challengeId": "00000000-0000-0000-0000-000000000000", - "amount": 1600, - "status": "completed", - "billingAccountId": 80000071, - "createdBy": "57646ff9-1cd3-4d3c-88ba-eb09a395366c", - "updatedBy": "57646ff9-1cd3-4d3c-88ba-eb09a395366c", - "createdAt": "2021-04-09T20:10:33.755Z", - "updatedAt": "2021-04-09T20:12:26.966Z" - } -} \ No newline at end of file diff --git a/test/unit/prepare.js b/test/unit/prepare.js deleted file mode 100644 index f7966ed..0000000 --- a/test/unit/prepare.js +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Setting up Mock for all tests - */ - -require('../../src/bootstrap') - -const _ = require('lodash') -const nock = require('nock') -const prepare = require('mocha-prepare') -const testData = require('../common/testData') - -// low-budget function to extract document id from uri -const idFromUri = (uri) => _.last(uri.split('/')).split('?')[0] - -prepare(function (done) { - // called before loading of test cases - nock(/.com|localhost/) - .persist() - .put(uri => uri.includes('_create')) - .query(true) - .reply((uri, body) => { - const id = idFromUri(uri) - if (testData.esStorage.content[id]) { - return [409] - } else { - testData.esStorage.content[id] = body - return [200] - } - }) - .post(uri => uri.includes('_update')) - .query(true) - .reply((uri, body) => { - const id = idFromUri(uri) - if (testData.esStorage.content[id]) { - _.assign(testData.esStorage.content[id], body.doc) - return [200] - } else { - return [404] - } - }) - .delete(() => true) - .query(true) - .reply(uri => { - const id = idFromUri(uri) - if (testData.esStorage.content[id]) { - _.unset(testData.esStorage.content, id) - return [204] - } else { - return [404] - } - }) - .get(uri => uri.includes('_source')) - .query(true) - .reply(uri => { - const id = idFromUri(uri) - if (testData.esStorage.content[id]) { - return [200, testData.esStorage.content[id]] - } else { - return [404] - } - }) - .post(uri => uri.includes('_search')) - .query(true) - .reply(uri => { - if (Object.keys(testData.esStorage.content).length > 0) { - return [200, { - hits: { - total: { - value: 1 - }, - hits: [{ - _source: testData.esStorage.content[Object.keys(testData.esStorage.content)[0]] - }] - } - } ] - } else { - return [200, { - hits: { - total: { - value: 0 - }, - hits: [] - } - } ] - } - }) - done() -}, function (done) { - nock.cleanAll() - done() -}) diff --git a/test/unit/test.js b/test/unit/test.js deleted file mode 100644 index b89a18c..0000000 --- a/test/unit/test.js +++ /dev/null @@ -1,428 +0,0 @@ -/** - * Mocha tests of the UBahn ES Processor. - */ - -const _ = require('lodash') -const should = require('should') -const config = require('config') -const stringcase = require('stringcase') -const testData = require('../common/testData') -const testHelper = require('../common/testHelper') -const sinon = require('sinon') -const logger = require('../../src/common/logger') -const helper = require('../../src/common/helper') -const constants = require('../../src/common/constants') -const services = { - JobProcessorService: require('../../src/services/JobProcessorService'), - JobCandidateProcessorService: require('../../src/services/JobCandidateProcessorService'), - ResourceBookingProcessorService: require('../../src/services/ResourceBookingProcessorService'), - WorkPeriodProcessorService: require('../../src/services/WorkPeriodProcessorService'), - WorkPeriodPaymentProcessorService: require('../../src/services/WorkPeriodPaymentProcessorService'), - ActionProcessorService: require('../../src/services/ActionProcessorService') -} - -// random transaction id here -const transactionId = '2023692c-a9d3-4250-86c4-b83f381a5d03' - -describe('General Logic Tests', () => { - let sandbox - - before(() => { - // mock helper methods - sandbox = sinon.createSandbox() - sandbox.stub(helper, 'postMessageViaWebhook').callsFake((webhook, message) => { - logger.debug({ component: 'helper', context: 'postMessageToZapier (stub)', message: `message: ${JSON.stringify({ webhook, message })}` }) - }) - sandbox.stub(helper, 'getM2MToken').callsFake(() => { - const token = 'dummy-token' - logger.debug({ component: 'helper', context: 'getM2MToken (stub)', message: token }) - return token - }) - }) - - beforeEach(() => { - // clear es storage - testData.esStorage.content = {} - }) - - after(() => { - // clear es storage - testData.esStorage.content = {} - - sandbox.restore() - }) - describe('Job, JobCandidate, ResourceBooking tests', () => { - for (const [index, model] of [ - [config.esConfig.ES_INDEX_JOB, 'Job'], - [config.esConfig.ES_INDEX_JOB_CANDIDATE, 'JobCandidate'], - [config.esConfig.ES_INDEX_RESOURCE_BOOKING, 'ResourceBooking'] - ]) { - const modelInSpaceCase = stringcase.spacecase(model) - it(`processCreate - ${modelInSpaceCase} success`, async () => { - await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId) - should.deepEqual( - testData.esStorage.content[testData.messages[model].create.message.payload.id], - testData.messages[model].create.message.payload - ) - }) - - it(`processUpdate - ${modelInSpaceCase} success`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[model].create.message.payload.id, - body: testData.messages[model].create.message.payload, - refresh: 'true' - }) - await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId) - should.deepEqual( - testData.esStorage.content[testData.messages[model].create.message.payload.id], - testData.messages[model].update.message.payload - ) - }) - - it(`processDelete - ${modelInSpaceCase} success`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[model].create.message.payload.id, - body: testData.messages[model].create.message.payload, - refresh: 'true' - }) - await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId) - should.not.exist(testData.esStorage.content[testData.messages[model].create.message.payload.id]) - }) - - it(`Failure - processCreate - ${modelInSpaceCase} already exists`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[model].create.message.payload.id, - body: testData.messages[model].create.message.payload, - refresh: 'true' - }) - try { - await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId) - throw new Error() - } catch (err) { - should.equal(err.message, `id: ${testData.messages[model].create.message.payload.id} "${index}" already exists`) - } - }) - - it(`Failure - processUpdate - ${modelInSpaceCase} not found`, async () => { - try { - await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId) - throw new Error() - } catch (err) { - should.equal(err.message, `id: ${testData.messages[model].update.message.payload.id} "${index}" not found`) - } - }) - - it(`Failure - processDelete - ${modelInSpaceCase} not found`, async () => { - try { - await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId) - throw new Error() - } catch (err) { - should.equal(err.message, `id: ${testData.messages[model].delete.message.payload.id} "${index}" not found`) - } - }) - } - }) - describe('Nested WorkPeriod tests', () => { - const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING - const model = 'WorkPeriod' - const parentModel = 'ResourceBooking' - const nestedName = 'workPeriods' - const modelInSpaceCase = stringcase.spacecase(model) - it(`processCreate - ${modelInSpaceCase} success`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[parentModel].create.message.payload.id, - body: testData.messages[parentModel].create.message.payload, - refresh: 'true' - }) - await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId) - should.deepEqual( - testData.esStorage.content[testData.messages[parentModel].create.message.payload.id], - _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }) - ) - }) - - it(`processUpdate - ${modelInSpaceCase} success`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[parentModel].create.message.payload.id, - body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }), - refresh: 'true' - }) - await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId) - should.deepEqual( - testData.esStorage.content[testData.messages[parentModel].create.message.payload.id], - _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] }) - ) - }) - - it(`processDelete - ${modelInSpaceCase} success`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[parentModel].create.message.payload.id, - body: _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] }), - refresh: 'true' - }) - await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId) - should.deepEqual( - testData.esStorage.content[testData.messages[parentModel].create.message.payload.id], - _.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [] }) - ) - }) - it(`Failure - processCreate - ${modelInSpaceCase} not found`, async () => { - const processCreateStub = sandbox.stub(services.ActionProcessorService, 'processCreate').callsFake(() => {}) - await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId) - should.equal(processCreateStub.getCall(0).args[0], testData.messages[model].create.topic) - }) - - it(`Failure - processUpdate - ${modelInSpaceCase} not found`, async () => { - try { - await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId) - throw new Error() - } catch (err) { - should.equal(err.message, `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`) - } - }) - - it(`Failure - processDelete - ${modelInSpaceCase} not found`, async () => { - try { - await services[`${model}ProcessorService`].processDelete(testData.messages[model].delete.message, transactionId) - throw new Error() - } catch (err) { - should.equal(err.message, `id: ${testData.messages[model].delete.message.payload.id} "${model}" not found`) - } - }) - }) - describe('Nested WorkPeriodPayment tests', () => { - const index = config.esConfig.ES_INDEX_RESOURCE_BOOKING - const model = 'WorkPeriodPayment' - const parentModel = 'WorkPeriod' - const rootModel = 'ResourceBooking' - const nestedName = 'payments' - const parentNestedName = 'workPeriods' - const modelInSpaceCase = stringcase.spacecase(model) - it(`processCreate - ${modelInSpaceCase} success`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[rootModel].create.message.payload.id, - body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [testData.messages[parentModel].create.message.payload] }), - refresh: 'true' - }) - await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId) - should.deepEqual( - testData.esStorage.content[testData.messages[rootModel].create.message.payload.id], - _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] }) - ) - }) - - it(`processUpdate - ${modelInSpaceCase} success`, async () => { - await testHelper.esClient.create({ - index, - id: testData.messages[rootModel].create.message.payload.id, - body: _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].create.message.payload] })] }), - refresh: 'true' - }) - await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId) - should.deepEqual( - testData.esStorage.content[testData.messages[rootModel].create.message.payload.id], - _.assign(testData.messages[rootModel].create.message.payload, { [parentNestedName]: [_.assign(testData.messages[parentModel].create.message.payload, { [nestedName]: [testData.messages[model].update.message.payload] })] }) - ) - }) - - it(`Failure - processCreate - ${modelInSpaceCase} not found`, async () => { - try { - await services[`${model}ProcessorService`].processCreate(testData.messages[model].create.message, transactionId) - throw new Error() - } catch (err) { - should.equal(err.message, `id: ${testData.messages[parentModel].create.message.payload.id} "${parentModel}" not found`) - } - }) - - it(`Failure - processUpdate - ${modelInSpaceCase} not found`, async () => { - try { - await services[`${model}ProcessorService`].processUpdate(testData.messages[model].update.message, transactionId) - throw new Error() - } catch (err) { - should.equal(err.message, `id: ${testData.messages[model].update.message.payload.id} "${model}" not found`) - } - }) - }) -}) - -describe('Zapier Logic Tests', () => { - let sandbox - - beforeEach(() => { - // clear es storage - testData.esStorage.content = {} - - // mock helper methods - sandbox = sinon.createSandbox() - sandbox.stub(helper, 'postMessageViaWebhook').callsFake((webhook, message) => { - logger.debug({ component: 'helper', context: 'postMessageToZapier (stub)', message: `message: ${JSON.stringify({ webhook, message })}` }) - }) - sandbox.stub(helper, 'getM2MToken').callsFake(() => { - const token = 'dummy-token' - logger.debug({ component: 'helper', context: 'getM2MToken (stub)', message: token }) - return token - }) - }) - - afterEach(() => { - // clear es storage - testData.esStorage.content = {} - - // reset mocked methods - sandbox.restore() - }) - - it('should have Zapier switched ON during testing Zapier logic', () => { - // to enable Job Candidates Zapier logic - should.equal(config.zapier.ZAPIER_JOB_CANDIDATE_SWITCH, constants.Zapier.Switch.ON) - // to enable Jobs Zapier logic - should.equal(config.zapier.ZAPIER_SWITCH, constants.Zapier.Switch.ON) - }) - - describe('Job Candidate Update', () => { - it('should post to Zapier if status is changed to "client rejected - screening"', async () => { - const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' }) - const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, { - payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'client rejected - screening', externalId: '123' }) - }) - - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB, - id: previousData.id, - body: previousData, - refresh: 'true' - }) - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB_CANDIDATE, - id: testData.messages.Job.create.message.payload.id, - body: testData.messages.Job.create.message.payload, - refresh: 'true' - }) - await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId) - - helper.postMessageViaWebhook.callCount.should.equal(1) - }) - - it('should post to Zapier if status is changed to "interview"', async () => { - const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' }) - const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, { - payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'interview', externalId: '123' }) - }) - - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB, - id: previousData.id, - body: previousData, - refresh: 'true' - }) - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB_CANDIDATE, - id: testData.messages.Job.create.message.payload.id, - body: testData.messages.Job.create.message.payload, - refresh: 'true' - }) - await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId) - - helper.postMessageViaWebhook.callCount.should.equal(1) - }) - - it('should not post to Zapier if status was already "client rejected - screening"', async () => { - const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'client rejected - screening', externalId: '123' }) - const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, { - payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'client rejected - screening', externalId: '123' }) - }) - - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB, - id: previousData.id, - body: previousData, - refresh: 'true' - }) - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB_CANDIDATE, - id: testData.messages.Job.create.message.payload.id, - body: testData.messages.Job.create.message.payload, - refresh: 'true' - }) - await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId) - - helper.postMessageViaWebhook.callCount.should.equal(0) - }) - - it('should not post to Zapier if status was already "interview"', async () => { - const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'interview', externalId: '123' }) - const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, { - payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'interview', externalId: '123' }) - }) - - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB, - id: previousData.id, - body: previousData, - refresh: 'true' - }) - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB_CANDIDATE, - id: testData.messages.Job.create.message.payload.id, - body: testData.messages.Job.create.message.payload, - refresh: 'true' - }) - await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId) - - helper.postMessageViaWebhook.callCount.should.equal(0) - }) - - it('should not post to Zapier if status is changed to "placed" (not "rejected" or "shortlist")', async () => { - const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' }) - const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, { - payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'placed', externalId: '123' }) - }) - - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB, - id: previousData.id, - body: previousData, - refresh: 'true' - }) - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB_CANDIDATE, - id: testData.messages.Job.create.message.payload.id, - body: testData.messages.Job.create.message.payload, - refresh: 'true' - }) - await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId) - - helper.postMessageViaWebhook.callCount.should.equal(0) - }) - - it('should not post to Zapier if status is changed to "topcoder-rejected" (not "rejected" or "shortlist")', async () => { - const previousData = _.assign({}, testData.messages.JobCandidate.create.message.payload, { status: 'open', externalId: '123' }) - const updateMessage = _.assign({}, testData.messages.JobCandidate.update.message, { - payload: _.assign({}, testData.messages.JobCandidate.update.message.payload, { status: 'topcoder-rejected', externalId: '123' }) - }) - - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB, - id: previousData.id, - body: previousData, - refresh: 'true' - }) - await testHelper.esClient.create({ - index: config.esConfig.ES_INDEX_JOB_CANDIDATE, - id: testData.messages.Job.create.message.payload.id, - body: testData.messages.Job.create.message.payload, - refresh: 'true' - }) - await services[`JobCandidateProcessorService`].processUpdate(updateMessage, transactionId) - - helper.postMessageViaWebhook.callCount.should.equal(0) - }) - }) -}) From 2289736a7e8cdbd6edc0b5ef01591724138c50c0 Mon Sep 17 00:00:00 2001 From: yoution Date: Thu, 2 Sep 2021 12:11:50 +0800 Subject: [PATCH 7/7] clean up for cqrs --- README.md | 32 ++--- config/default.js | 15 +-- config/test.js | 10 -- local/docker-compose.yml | 7 -- package-lock.json | 126 +------------------ package.json | 7 +- src/app.js | 1 - src/common/helper.js | 99 +++------------ src/scripts/createIndex.js | 81 ------------ src/scripts/deleteIndex.js | 24 ---- src/scripts/view-data.js | 39 ------ src/services/JobCandidateProcessorService.js | 9 +- 12 files changed, 32 insertions(+), 418 deletions(-) delete mode 100644 config/test.js delete mode 100644 src/scripts/createIndex.js delete mode 100644 src/scripts/deleteIndex.js delete mode 100644 src/scripts/view-data.js diff --git a/README.md b/README.md index 934c5d6..70d9634 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ ## Dependencies - Nodejs(v12+) -- ElasticSearch - Kafka ## Configuration @@ -25,13 +24,7 @@ The following parameters can be set in config files or in env variables: - `topics.TAAS_JOB_CREATE_TOPIC`: the create job entity Kafka message topic - `topics.TAAS_JOB_UPDATE_TOPIC`: the update job entity Kafka message topic - `topics.TAAS_JOB_CANDIDATE_UPDATE_TOPIC`: the update job candidate entity Kafka message topic -- `esConfig.HOST`: Elasticsearch host -- `esConfig.AWS_REGION`: The Amazon region to use when using AWS Elasticsearch service -- `esConfig.ELASTICCLOUD.id`: The elastic cloud id, if your elasticsearch instance is hosted on elastic cloud. DO NOT provide a value for ES_HOST if you are using this -- `esConfig.ELASTICCLOUD.username`: The elastic cloud username for basic authentication. Provide this only if your elasticsearch instance is hosted on elastic cloud -- `esConfig.ELASTICCLOUD.password`: The elastic cloud password for basic authentication. Provide this only if your elasticsearch instance is hosted on elastic cloud -- `esConfig.ES_INDEX_JOB`: the index name for job - +- `TAAS_API_URL`: the taas api url - `auth0.AUTH0_URL`: Auth0 URL, used to get TC M2M token - `auth0.AUTH0_AUDIENCE`: Auth0 audience, used to get TC M2M token - `auth0.AUTH0_CLIENT_ID`: Auth0 client id, used to get TC M2M token @@ -46,7 +39,7 @@ The following parameters can be set in config files or in env variables: - `zapier.ZAPIER_JOB_CANDIDATE_SWITCH`: decides whether posting job candidate related message to zapier or not; possible values are `ON` and `OFF`, default is `OFF` - `zapier.ZAPIER_JOB_CANDIDATE_WEBHOOK`: the remote zapier zap webhook url for posting job candidate related message -## Local Kafka and ElasticSearch setup +## Local Kafka setup 1. Navigate to the directory `local` @@ -56,30 +49,21 @@ The following parameters can be set in config files or in env variables: docker-compose up -d ``` -3. initialize Elasticsearch, create configured Elasticsearch index: - - ``` bash - npm run delete-index # run this if you already created index - npm run create-index - ``` - ## Local deployment -0. Make sure that Kafka and Elasticsearch is running as per instructions above. - -1. Make sure to use Node v12+ by command `node -v`. We recommend using [NVM](https://github.com/nvm-sh/nvm) to quickly switch to the right version: +0. Make sure to use Node v12+ by command `node -v`. We recommend using [NVM](https://github.com/nvm-sh/nvm) to quickly switch to the right version: ```bash nvm use ``` -2. From the project root directory, run the following command to install the dependencies +1. From the project root directory, run the following command to install the dependencies ```bash npm install ``` -3. To run linters if required +2. To run linters if required ```bash npm run lint @@ -91,7 +75,7 @@ The following parameters can be set in config files or in env variables: npm run lint:fix ``` -4. Local config +3. Local config In the `taas-es-processor` root directory create `.env` file with the next environment variables. Values for **Auth0 config** should be shared with you on the forum.
@@ -106,7 +90,7 @@ The following parameters can be set in config files or in env variables: - Values from this file would be automatically used by many `npm` commands. - ⚠️ Never commit this file or its copy to the repository! -5. Start the processor and health check dropin +4. Start the processor and health check dropin ```bash npm start @@ -120,7 +104,7 @@ To run the processor using docker, follow the below steps 2. Rename the file `sample.api.env` to `api.env` -3. Set the required Kafka url and ElasticSearch host in the file `api.env`. +3. Set the required Kafka url in the file `api.env`. Note that you can also add other variables to `api.env`, with `=` format per line. If using AWS ES you should add `AWS_ACCESS_KEY_ID` and `AWS_SECRET_ACCESS_KEY` variables as well. diff --git a/config/default.js b/config/default.js index c4d4b8d..a8dcf10 100644 --- a/config/default.js +++ b/config/default.js @@ -17,6 +17,8 @@ module.exports = { // The originator value for the kafka messages KAFKA_MESSAGE_ORIGINATOR: process.env.KAFKA_MESSAGE_ORIGINATOR || 'taas-es-processor', + TAAS_API_URL: process.env.TAAS_API_URL || 'https://api.topcoder-dev.com/v5', + topics: { // topics for job service TAAS_JOB_CREATE_TOPIC: process.env.TAAS_JOB_CREATE_TOPIC || 'taas.job.create', @@ -24,19 +26,6 @@ module.exports = { // topics for jobcandidate service TAAS_JOB_CANDIDATE_UPDATE_TOPIC: process.env.TAAS_JOB_CANDIDATE_UPDATE_TOPIC || 'taas.jobcandidate.update' }, - esConfig: { - HOST: process.env.ES_HOST || 'http://localhost:9200', - - ELASTICCLOUD: { - id: process.env.ELASTICCLOUD_ID, - username: process.env.ELASTICCLOUD_USERNAME, - password: process.env.ELASTICCLOUD_PASSWORD - }, - - AWS_REGION: process.env.AWS_REGION || 'us-east-1', // AWS Region to be used if we use AWS ES - - ES_INDEX_JOB: process.env.ES_INDEX_JOB || 'job' - }, auth0: { AUTH0_URL: process.env.AUTH0_URL, diff --git a/config/test.js b/config/test.js deleted file mode 100644 index c462fb0..0000000 --- a/config/test.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * The default configuration file. - */ - -module.exports = { - zapier: { - ZAPIER_SWITCH: process.env.ZAPIER_SWITCH || 'ON', - ZAPIER_JOB_CANDIDATE_SWITCH: process.env.ZAPIER_JOB_CANDIDATE_SWITCH || 'ON' - } -} diff --git a/local/docker-compose.yml b/local/docker-compose.yml index 865289e..8e00830 100644 --- a/local/docker-compose.yml +++ b/local/docker-compose.yml @@ -14,10 +14,3 @@ services: KAFKA_ADVERTISED_HOST_NAME: localhost KAFKA_CREATE_TOPICS: "taas.job.create:1:1,taas.job.update:1:1,taas.jobcandidate.update:1:1" KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 - esearch: - image: elasticsearch:7.7.1 - container_name: taas-es-processor_es - ports: - - "9200:9200" - environment: - - discovery.type=single-node diff --git a/package-lock.json b/package-lock.json index 0cc8073..39f9593 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,28 +4,6 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@elastic/elasticsearch": { - "version": "7.9.1", - "resolved": "https://registry.npmjs.org/@elastic/elasticsearch/-/elasticsearch-7.9.1.tgz", - "integrity": "sha512-NfPADbm9tRK/4ohpm9+aBtJ8WPKQqQaReyBKT225pi2oKQO1IzRlfM+OPplAvbhoH1efrSj1NKk27L+4BCrzXQ==", - "requires": { - "debug": "^4.1.1", - "decompress-response": "^4.2.0", - "ms": "^2.1.1", - "pump": "^3.0.0", - "secure-json-parse": "^2.1.0" - }, - "dependencies": { - "debug": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", - "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", - "requires": { - "ms": "2.1.2" - } - } - } - }, "@hapi/address": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.0.0.tgz", @@ -367,22 +345,6 @@ "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "aws-sdk": { - "version": "2.488.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.488.0.tgz", - "integrity": "sha512-9AP48tyF1E5+x1CKeiRlj0Sv1YF7KI0BdSW9JP8x3ClhPWNUHjDYNH2OwsALuG1BloeY2ZigYqfI2fB7g3rNHQ==", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "ieee754": "1.1.8", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.3.2", - "xml2js": "0.4.19" - } - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -441,11 +403,6 @@ "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -615,16 +572,6 @@ "fill-range": "^7.0.1" } }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4", - "isarray": "^1.0.0" - } - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npm.taobao.org/buffer-crc32/download/buffer-crc32-0.2.13.tgz", @@ -1027,14 +974,6 @@ "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", "dev": true }, - "decompress-response": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-4.2.1.tgz", - "integrity": "sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==", - "requires": { - "mimic-response": "^2.0.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -1192,6 +1131,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -1703,11 +1643,6 @@ "resolved": "https://registry.npm.taobao.org/etag/download/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/events/download/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" - }, "express": { "version": "4.17.1", "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", @@ -2199,11 +2134,6 @@ "safer-buffer": ">= 2.1.2 < 3" } }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -2472,11 +2402,6 @@ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npm.taobao.org/jmespath/download/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2819,11 +2744,6 @@ "mime-db": "1.40.0" } }, - "mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" - }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -3371,16 +3291,12 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" - }, "pupa": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", @@ -3395,11 +3311,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npm.taobao.org/querystring/download/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" - }, "r7insight_node": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/r7insight_node/-/r7insight_node-1.8.4.tgz", @@ -3649,16 +3560,6 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sax": { - "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.1.tgz", - "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" - }, - "secure-json-parse": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.1.0.tgz", - "integrity": "sha512-GckO+MS/wT4UogDyoI/H/S1L0MCcKS1XX/vp48wfmU7Nw4woBmb8mIpu4zPBQjKlRT88/bt9xdoV4111jPpNJA==" - }, "semver": { "version": "5.7.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", @@ -4293,15 +4194,6 @@ } } }, - "url": { - "version": "0.10.3", - "resolved": "https://registry.npm.taobao.org/url/download/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, "url-parse-lax": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", @@ -4486,20 +4378,6 @@ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true }, - "xml2js": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", - "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", - "requires": { - "sax": ">=0.6.0", - "xmlbuilder": "~9.0.1" - } - }, - "xmlbuilder": { - "version": "9.0.7", - "resolved": "https://registry.npm.taobao.org/xmlbuilder/download/xmlbuilder-9.0.7.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fxmlbuilder%2Fdownload%2Fxmlbuilder-9.0.7.tgz", - "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index df22721..0a2eb85 100644 --- a/package.json +++ b/package.json @@ -7,10 +7,7 @@ "start": "node src/app.js", "dev": "nodemon src/app.js", "lint": "standard", - "lint:fix": "standard --fix", - "create-index": "node src/scripts/createIndex.js", - "delete-index": "node src/scripts/deleteIndex.js", - "view-data": "node src/scripts/view-data.js" + "lint:fix": "standard --fix" }, "author": "TCSCODER", "license": "none", @@ -21,10 +18,8 @@ "superagent": "^5.1.0" }, "dependencies": { - "@elastic/elasticsearch": "^7.9.1", "@hapi/joi": "^15.1.0", "async-mutex": "^0.2.4", - "aws-sdk": "^2.476.0", "bluebird": "^3.5.5", "config": "^3.1.0", "dotenv": "^10.0.0", diff --git a/src/app.js b/src/app.js index 0d20849..555218d 100644 --- a/src/app.js +++ b/src/app.js @@ -93,7 +93,6 @@ const dataHandler = (messageSet, topic, partition) => Promise.each(messageSet, a } catch (err) { logger.logFullError(err, { component: 'app' }) } finally { - helper.checkEsMutexRelease(transactionId) localLogger.debug(`Commiting offset after processing message with count ${messageCount}`) // Commit offset regardless of error diff --git a/src/common/helper.js b/src/common/helper.js index d2f32c6..cc8633c 100644 --- a/src/common/helper.js +++ b/src/common/helper.js @@ -2,24 +2,13 @@ * Contains generic helper methods */ -const AWS = require('aws-sdk') const config = require('config') const request = require('superagent') const logger = require('./logger') -const elasticsearch = require('@elastic/elasticsearch') const _ = require('lodash') -const { Mutex } = require('async-mutex') const m2mAuth = require('tc-core-library-js').auth.m2m -AWS.config.region = config.esConfig.AWS_REGION - -// Elasticsearch client -let esClient -let transactionId let m2m -// Mutex to ensure that only one elasticsearch action is carried out at any given time -const esClientMutex = new Mutex() -const mutexReleaseMap = {} /** * Get Kafka options @@ -33,76 +22,6 @@ function getKafkaOptions () { return options } -/** - * Get ES Client - * @return {Object} Elasticsearch Client Instance - */ -function getESClient () { - if (esClient) { - return esClient - } - const host = config.esConfig.HOST - const cloudId = config.esConfig.ELASTICCLOUD.id - - if (cloudId) { - // Elastic Cloud configuration - esClient = new elasticsearch.Client({ - cloud: { - id: cloudId - }, - auth: { - username: config.esConfig.ELASTICCLOUD.username, - password: config.esConfig.ELASTICCLOUD.password - } - }) - } else { - esClient = new elasticsearch.Client({ - node: host - }) - } - - // Patch the transport to enable mutex - esClient.transport.originalRequest = esClient.transport.request - esClient.transport.request = async (params) => { - const tId = _.get(params.querystring, 'transactionId') - params.querystring = _.omit(params.querystring, 'transactionId') - if (!tId || tId !== transactionId) { - const release = await esClientMutex.acquire() - mutexReleaseMap[tId || 'noTransaction'] = release - transactionId = tId - } - try { - return await esClient.transport.originalRequest(params) - } finally { - if (params.method !== 'GET' || !tId) { - const release = mutexReleaseMap[tId || 'noTransaction'] - delete mutexReleaseMap[tId || 'noTransaction'] - transactionId = undefined - if (release) { - release() - } - } - } - } - - return esClient -} - -/** - * Ensure the esClient mutex is released - * @param {String} tId transactionId - */ -function checkEsMutexRelease (tId) { - if (tId === transactionId) { - const release = mutexReleaseMap[tId] - delete mutexReleaseMap[tId] - transactionId = undefined - if (release) { - release() - } - } -} - /* * Function to get M2M token * @returns {Promise} @@ -126,10 +45,24 @@ async function postMessageViaWebhook (webhook, message) { await request.post(webhook).send(message) } +/** + * Get job by jobId + * + * @param {String} jobId jobId + * @returns {undefined} + */ +async function getJobById (jobId) { + logger.debug({ component: 'helper', context: 'getJobById', message: `jobId: ${jobId}` }) + + const token = await getM2MToken() + const { body: job } = await request.get(`${config.TAAS_API_URL}/jobs/${jobId}`) + .set('Authorization', `Bearer ${token}`) + return job +} + module.exports = { getKafkaOptions, - getESClient, - checkEsMutexRelease, + getJobById, getM2MToken, postMessageViaWebhook } diff --git a/src/scripts/createIndex.js b/src/scripts/createIndex.js deleted file mode 100644 index f4effda..0000000 --- a/src/scripts/createIndex.js +++ /dev/null @@ -1,81 +0,0 @@ -/** - * Create index in Elasticsearch - */ - -const config = require('config') -const logger = require('../common/logger') -const helper = require('../common/helper') - -async function createIndex () { - const esClient = helper.getESClient() - - const indices = [ - { - index: config.get('esConfig.ES_INDEX_JOB'), - body: { - mappings: { - properties: { - projectId: { type: 'integer' }, - externalId: { type: 'keyword' }, - description: { type: 'text' }, - title: { type: 'text' }, - startDate: { type: 'date' }, - duration: { type: 'integer' }, - numPositions: { type: 'integer' }, - resourceType: { type: 'keyword' }, - rateType: { type: 'keyword' }, - workload: { type: 'keyword' }, - skills: { type: 'keyword' }, - roles: { type: 'keyword' }, - status: { type: 'keyword' }, - isApplicationPageActive: { type: 'boolean' }, - minSalary: { type: 'integer' }, - maxSalary: { type: 'integer' }, - hoursPerWeek: { type: 'integer' }, - jobLocation: { type: 'keyword' }, - jobTimezone: { type: 'keyword' }, - currency: { type: 'keyword' }, - roleIds: { type: 'keyword' }, - createdAt: { type: 'date' }, - createdBy: { type: 'keyword' }, - updatedAt: { type: 'date' }, - updatedBy: { type: 'keyword' } - } - } - } - } - ] - - for (const index of indices) { - await esClient.indices.create({ index: index.index }) - await esClient.indices.close({ index: index.index }) - await esClient.indices.putSettings({ - index: index.index, - body: { - settings: { - analysis: { - normalizer: { - lowercaseNormalizer: { - filter: ['lowercase'] - } - } - } - } - } - }) - await esClient.indices.open({ index: index.index }) - await esClient.indices.putMapping({ - index: index.index, - body: { - properties: index.body.mappings.properties - } - }) - logger.info({ component: 'createIndex', message: `ES Index ${index.index} creation succeeded!` }) - } - process.exit(0) -} - -createIndex().catch((err) => { - logger.logFullError(err, { component: 'createIndex' }) - process.exit(1) -}) diff --git a/src/scripts/deleteIndex.js b/src/scripts/deleteIndex.js deleted file mode 100644 index 842b1d4..0000000 --- a/src/scripts/deleteIndex.js +++ /dev/null @@ -1,24 +0,0 @@ -/** - * Delete index in Elasticsearch - */ - -const config = require('config') -const logger = require('../common/logger') -const helper = require('../common/helper') - -async function deleteIndex () { - logger.info({ component: 'deleteIndex', message: 'ES Index deletion started!' }) - const esClient = helper.getESClient() - const indices = [config.get('esConfig.ES_INDEX_JOB')] - for (const index of indices) { - await esClient.indices.delete({ - index - }) - logger.info({ component: 'deleteIndex', message: `ES Index ${index} deletion succeeded!` }) - } - process.exit(0) -} -deleteIndex().catch((err) => { - logger.logFullError(err, { component: 'deleteIndex' }) - process.exit(1) -}) diff --git a/src/scripts/view-data.js b/src/scripts/view-data.js deleted file mode 100644 index 889504b..0000000 --- a/src/scripts/view-data.js +++ /dev/null @@ -1,39 +0,0 @@ -/** - * View ES data. - */ - -const helper = require('../common/helper') -const logger = require('../common/logger') -const config = require('config') - -const esClient = helper.getESClient() - -const modelIndexMapping = { - Job: 'ES_INDEX_JOB' -} - -async function showESData () { - if (process.argv.length < 3) { - throw new Error('You must specify a model name. Usage: npm run view-data [modelName]') - } - const modelName = process.argv[2] - if (!modelIndexMapping[modelName]) { - throw new Error(`Model name must be one of ${Object.keys(modelIndexMapping)}`) - } - const result = await esClient.search({ - index: config.get(`esConfig.${modelIndexMapping[modelName]}`) - }) - return result.body.hits.hits.map((doc) => doc._source) -} - -showESData() - .then(result => { - console.log( - JSON.stringify(result, null, 2) - ) - process.exit() - }) - .catch(err => { - logger.logFullError(err, { component: 'view-data' }) - process.exit(1) - }) diff --git a/src/services/JobCandidateProcessorService.js b/src/services/JobCandidateProcessorService.js index d8b8def..c392d42 100644 --- a/src/services/JobCandidateProcessorService.js +++ b/src/services/JobCandidateProcessorService.js @@ -8,8 +8,6 @@ const helper = require('../common/helper') const constants = require('../common/constants') const config = require('config') -const esClient = helper.getESClient() - const localLogger = { debug: ({ context, message }) => logger.debug({ component: 'JobCandidateProcessorService', context, message }) } @@ -32,10 +30,9 @@ async function updateCandidateStatus ({ type, payload }) { localLogger.debug({ context: 'updateCandidateStatus', message: `id: ${jobCandidate.id} candidate without externalId - ignored` }) return } - const { body: job } = await esClient.getSource({ - index: config.get('esConfig.ES_INDEX_JOB'), - id: jobCandidate.jobId - }) + + const job = await helper.getJobById(jobCandidate.jobId) + const message = { type, status: jobCandidate.status,