diff --git a/README.md b/README.md index 8d66ea1..4dea34c 100755 --- a/README.md +++ b/README.md @@ -190,3 +190,39 @@ info: The data is not found. `{ "topic": "submission.notification.create", "originator": "submission-api", "timestamp": "2018-02-16T00:00:00", "mime-type": "application/json", "payload": { "resource": "reviewType", "id": "3333", "name": "some review type", "isActive": true } }` - reviewSummation: `{ "topic": "submission.notification.create", "originator": "submission-api", "timestamp": "2018-02-16T00:00:00", "mime-type": "application/json", "payload": { "resource": "reviewSummation", "id": "4444", "submissionId": "asdfasdf", "aggregateScore": 98, "scoreCardId": "abbccaaa", "isPassing": true, "created": "2018-01-02T00:00:00", "updated": "2018-02-03T00:00:00", "createdBy": "admin", "updatedBy": "user" } }` + + +### Verification for combining review and reviewSummation with Submission + +- From the `submissions-api` repository, Run the command `npm run create-index` to create index with specified data types + +- Run the command `npm run init-es` to load test data into ES + +- Now from the Kafka console producer, Write the below messages into topic `submission.notification.create` + +``` +{ "topic":"submission.notification.create", "originator":"submission-api", "timestamp":"2018-08-06T15:46:05.575Z", "mime-type":"application/json", "payload":{ "resource":"review", "id": "d34d4180-65aa-42ec-a945-5fd21dec0502", "score": 92.0, "typeId": "c56a4180-65aa-42ec-a945-5fd21dec0501", "reviewerId": "c23a4180-65aa-42ec-a945-5fd21dec0503", "scoreCardId": "b25a4180-65aa-42ec-a945-5fd21dec0503", "submissionId": "a12a4180-65aa-42ec-a945-5fd21dec0501", "created": "2018-05-20T07:00:30.123Z", "updated": "2018-06-01T07:36:28.178Z", "createdBy": "admin", "updatedBy": "admin" } } + + +{ "topic":"submission.notification.create", "originator":"submission-api", "timestamp":"2018-08-06T15:46:05.575Z", "mime-type":"application/json", "payload":{ "resource":"review", "id": "d34d4180-65aa-42ec-a945-5fd21dec0503", "score": 95.0, "typeId": "c56a4180-65aa-42ec-a945-5fd21dec0501", "reviewerId": "c23a4180-65aa-42ec-a945-5fd21dec0504", "scoreCardId": "b25a4180-65aa-42ec-a945-5fd21dec0503", "submissionId": "a12a4180-65aa-42ec-a945-5fd21dec0501", "created": "2018-05-20T07:00:30.123Z", "updated": "2018-06-01T07:36:28.178Z", "createdBy": "admin", "updatedBy": "admin" } } +``` + +- This will create two reviews as well as attach the reviews with a submission + +- To look at the updated submission in ES, Run the below command + +``` +npm run view-data a12a4180-65aa-42ec-a945-5fd21dec0501 +``` + +- To check the update of reviews, Write the below message into topic `submission.notification.update` and check data using above `view-data` command + +``` +{ "topic":"submission.notification.update", "originator":"submission-api", "timestamp":"2018-08-06T15:46:05.575Z", "mime-type":"application/json", "payload":{ "resource":"review", "id": "d34d4180-65aa-42ec-a945-5fd21dec0502", "score": 93.2, "updatedBy": "test" } } +``` + +- To check the deletion of reviews, Write the below message into topic `submission.notification.delete` and check data using above `view-data` command + +``` +{ "topic":"submission.notification.delete", "originator":"submission-api", "timestamp":"2018-08-06T15:46:05.575Z", "mime-type":"application/json", "payload":{ "resource":"review", "id": "d34d4180-65aa-42ec-a945-5fd21dec0503" } } +``` \ No newline at end of file diff --git a/config/default.js b/config/default.js index 16542b7..7e77087 100755 --- a/config/default.js +++ b/config/default.js @@ -20,7 +20,7 @@ module.exports = { HOST: process.env.ES_HOST, AWS_REGION: process.env.AWS_REGION || 'us-east-1', // AWS Region to be used if we use AWS ES API_VERSION: process.env.ES_API_VERSION || '6.3', - ES_INDEX: process.env.ES_INDEX || 'submission-test', + ES_INDEX: process.env.ES_INDEX || 'submission', ES_TYPE: process.env.ES_TYPE || '_doc' // ES 6.x accepts only 1 Type per index and it's mandatory to define it } } diff --git a/src/services/ProcessorService.js b/src/services/ProcessorService.js index 202f6ce..4732d62 100755 --- a/src/services/ProcessorService.js +++ b/src/services/ProcessorService.js @@ -2,6 +2,7 @@ * Service for submission processor. */ +const _ = require('lodash') const Joi = require('joi') const logger = require('../common/logger') const helper = require('../common/helper') @@ -9,6 +10,19 @@ const config = require('config') const client = helper.getESClient() +/** + * Get elastic search data. + * @param {String} id the Elastic search data id + * @returns {Object} Data from Elastic search + */ +function * getESData (id) { + return yield client.getSource({ + index: config.get('esConfig.ES_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id + }) +} + /** * Create message in Elasticsearch. * @param {Object} message the message @@ -20,6 +34,35 @@ function * create (message) { id: message.payload.id, body: message.payload }) + + // Add review / reviewSummation to submission + if (message.payload.resource === 'review') { + const submission = yield getESData(message.payload.submissionId) + let reviewArr = [] + reviewArr.push(_.omit(message.payload, ['resource'])) + if (submission.review) { + reviewArr = reviewArr.concat(submission.review) + } + yield client.update({ + index: config.get('esConfig.ES_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id: message.payload.submissionId, + body: { doc: {review: reviewArr} } + }) + } else if (message.payload.resource === 'reviewSummation') { + const submission = yield getESData(message.payload.submissionId) + let reviewSummationArr = [] + reviewSummationArr.push(_.omit(message.payload, ['resource'])) + if (submission.reviewSummationArr) { + reviewSummationArr = reviewSummationArr.concat(submission.review) + } + yield client.update({ + index: config.get('esConfig.ES_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id: message.payload.submissionId, + body: { doc: {reviewSummation: reviewSummationArr} } + }) + } } create.schema = { @@ -46,6 +89,34 @@ function * update (message) { id: message.payload.id, body: { doc: message.payload } }) + + if (message.payload.resource === 'review') { + const review = yield getESData(message.payload.id) + const submission = yield getESData(review.submissionId) + const reviewToBeUpdated = _.filter(submission.review, {id: message.payload.id})[0] + _.extend(reviewToBeUpdated, _.omit(message.payload, ['resource'])) + _.remove(submission.review, {id: message.payload.id}) + submission.review.push(reviewToBeUpdated) + yield client.update({ + index: config.get('esConfig.ES_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id: submission.id, + body: { doc: {review: submission.review} } + }) + } else if (message.payload.resource === 'reviewSummation') { + const reviewSummation = yield getESData(message.payload.id) + const submission = yield getESData(reviewSummation.submissionId) + const reviewSummationToBeUpdated = _.filter(submission.reviewSummation, {id: message.payload.id})[0] + _.extend(reviewSummationToBeUpdated, _.omit(message.payload, ['resource'])) + _.remove(submission.reviewSummation, {id: message.payload.id}) + submission.reviewSummation.push(reviewSummationToBeUpdated) + yield client.update({ + index: config.get('esConfig.ES_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id: submission.id, + body: { doc: {reviewSummation: submission.reviewSummation} } + }) + } } update.schema = create.schema @@ -55,6 +126,29 @@ update.schema = create.schema * @param {Object} message the message */ function * remove (message) { + // Remove review / reviewSummation from submission data + if (message.payload.resource === 'review') { + const review = yield getESData(message.payload.id) + const submission = yield getESData(review.submissionId) + _.remove(submission.review, {id: message.payload.id}) + yield client.update({ + index: config.get('esConfig.ES_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id: submission.id, + body: { doc: {review: submission.review} } + }) + } else if (message.payload.resource === 'reviewSummation') { + const reviewSummation = yield getESData(message.payload.id) + const submission = yield getESData(reviewSummation.submissionId) + _.remove(submission.reviewSummation, {id: message.payload.id}) + yield client.update({ + index: config.get('esConfig.ES_INDEX'), + type: config.get('esConfig.ES_TYPE'), + id: submission.id, + body: { doc: {reviewSummation: submission.reviewSummation} } + }) + } + yield client.delete({ index: config.get('esConfig.ES_INDEX'), type: config.get('esConfig.ES_TYPE'),