From 97ce674b9f8665c1fafdb4d7bdb4a6f7d7b89ed7 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 10 Jan 2020 16:21:23 +0800 Subject: [PATCH 1/3] fix: create phase topics on project create --- src/events/index.js | 2 +- src/events/projects/index.js | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/events/index.js b/src/events/index.js index c4c121b8..7c0b5a23 100644 --- a/src/events/index.js +++ b/src/events/index.js @@ -39,7 +39,7 @@ const voidRabbitHandler = (logger, msg, channel) => { // we should completely remove the handlers for this events. export const rabbitHandlers = { 'project.initial': projectCreatedHandler, // is only used `seedElasticsearchIndex.js` and can be removed - [EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: voidRabbitHandler, // DISABLED + [EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: projectCreatedHandler, // we have to call it, because it triggers topics creating for phases [EVENT.ROUTING_KEY.PROJECT_UPDATED]: voidRabbitHandler, // DISABLED [EVENT.ROUTING_KEY.PROJECT_DELETED]: voidRabbitHandler, // DISABLED [EVENT.ROUTING_KEY.PROJECT_MEMBER_ADDED]: voidRabbitHandler, // DISABLED diff --git a/src/events/projects/index.js b/src/events/projects/index.js index ab53c704..daac1d24 100644 --- a/src/events/projects/index.js +++ b/src/events/projects/index.js @@ -21,7 +21,7 @@ const eClient = util.getElasticSearchClient(); * @param {Object} msg event payload which is essentially a project in JSON format * @returns {undefined} */ -const indexProject = Promise.coroutine(function* (logger, msg) { // eslint-disable-line func-names +const indexProject = Promise.coroutine(function* (logger, msg) { // eslint-disable-line func-names, no-unused-vars const data = JSON.parse(msg.content.toString()); const userIds = data.members ? data.members.map(single => `userId:${single.userId}`) : []; try { @@ -65,7 +65,9 @@ const indexProject = Promise.coroutine(function* (logger, msg) { // eslint-disab const projectCreatedHandler = Promise.coroutine(function* (logger, msg, channel) { // eslint-disable-line func-names const project = JSON.parse(msg.content.toString()); try { - yield indexProject(logger, msg); + // we don't have to call indexing, as it's now handled by `project-processor-es` + // yield indexProject(logger, msg); + // we call this handle only for the sake of creating topics for the phases if (project.phases && project.phases.length > 0) { logger.debug('Phases found for the project, trying to create topics for each phase.'); const topicPromises = _.map(project.phases, phase => createPhaseTopic(logger, phase)); From 2ef9ad06adf5e3bf84c84c89e7bf1fa6a8821223 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 10 Jan 2020 16:27:46 +0800 Subject: [PATCH 2/3] fix: keep `seedElasticsearchIndex.js` working - we change the previous fix and keep projectCreatedHandler as it is, as `seedElasticsearchIndex.js` relies on it - for out needs we create a copy of `projectCreatedHandler` called `projectCreatedHandlerForPhases` which only take care about topics for phases --- src/events/index.js | 3 ++- src/events/projects/index.js | 30 +++++++++++++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/events/index.js b/src/events/index.js index 7c0b5a23..1ddcd82c 100644 --- a/src/events/index.js +++ b/src/events/index.js @@ -1,6 +1,7 @@ import { EVENT, CONNECT_NOTIFICATION_EVENT } from '../constants'; import { projectCreatedHandler, + projectCreatedHandlerForPhases, projectUpdatedKafkaHandler } from './projects'; import { projectPhaseAddedHandler, projectPhaseRemovedHandler, projectPhaseUpdatedHandler } from './projectPhases'; @@ -39,7 +40,7 @@ const voidRabbitHandler = (logger, msg, channel) => { // we should completely remove the handlers for this events. export const rabbitHandlers = { 'project.initial': projectCreatedHandler, // is only used `seedElasticsearchIndex.js` and can be removed - [EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: projectCreatedHandler, // we have to call it, because it triggers topics creating for phases + [EVENT.ROUTING_KEY.PROJECT_DRAFT_CREATED]: projectCreatedHandlerForPhases, // we have to call it, because it triggers topics creating for phases [EVENT.ROUTING_KEY.PROJECT_UPDATED]: voidRabbitHandler, // DISABLED [EVENT.ROUTING_KEY.PROJECT_DELETED]: voidRabbitHandler, // DISABLED [EVENT.ROUTING_KEY.PROJECT_MEMBER_ADDED]: voidRabbitHandler, // DISABLED diff --git a/src/events/projects/index.js b/src/events/projects/index.js index daac1d24..d0f5c48b 100644 --- a/src/events/projects/index.js +++ b/src/events/projects/index.js @@ -65,9 +65,32 @@ const indexProject = Promise.coroutine(function* (logger, msg) { // eslint-disab const projectCreatedHandler = Promise.coroutine(function* (logger, msg, channel) { // eslint-disable-line func-names const project = JSON.parse(msg.content.toString()); try { - // we don't have to call indexing, as it's now handled by `project-processor-es` - // yield indexProject(logger, msg); - // we call this handle only for the sake of creating topics for the phases + yield indexProject(logger, msg); + if (project.phases && project.phases.length > 0) { + logger.debug('Phases found for the project, trying to create topics for each phase.'); + const topicPromises = _.map(project.phases, phase => createPhaseTopic(logger, phase)); + yield Promise.all(topicPromises); + } + channel.ack(msg); + } catch (error) { + logger.error(`Error processing event (projectId: ${project.id})`, error); + channel.nack(msg, false, !msg.fields.redelivered); + } +}); + +/** + * Handler for project creation event + * + * we call this handle only for the sake of creating topics for the phases + * + * @param {Object} logger logger to log along with trace id + * @param {Object} msg event payload + * @param {Object} channel channel to ack, nack + * @returns {undefined} + */ +const projectCreatedHandlerForPhases = Promise.coroutine(function* (logger, msg, channel) { // eslint-disable-line func-names + const project = JSON.parse(msg.content.toString()); + try { if (project.phases && project.phases.length > 0) { logger.debug('Phases found for the project, trying to create topics for each phase.'); const topicPromises = _.map(project.phases, phase => createPhaseTopic(logger, phase)); @@ -192,6 +215,7 @@ async function projectUpdatedKafkaHandler(app, topic, payload) { module.exports = { projectCreatedHandler, + projectCreatedHandlerForPhases, projectUpdatedHandler, projectDeletedHandler, projectUpdatedKafkaHandler, From e24e4d3c6b2f93c7981a25ee8155fe137c033b22 Mon Sep 17 00:00:00 2001 From: Maksym Mykhailenko Date: Fri, 10 Jan 2020 16:29:41 +0800 Subject: [PATCH 3/3] chore: don't disable lint relu --- src/events/projects/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/events/projects/index.js b/src/events/projects/index.js index d0f5c48b..7b89eb92 100644 --- a/src/events/projects/index.js +++ b/src/events/projects/index.js @@ -21,7 +21,7 @@ const eClient = util.getElasticSearchClient(); * @param {Object} msg event payload which is essentially a project in JSON format * @returns {undefined} */ -const indexProject = Promise.coroutine(function* (logger, msg) { // eslint-disable-line func-names, no-unused-vars +const indexProject = Promise.coroutine(function* (logger, msg) { // eslint-disable-line func-names const data = JSON.parse(msg.content.toString()); const userIds = data.members ? data.members.map(single => `userId:${single.userId}`) : []; try {