From 5f3e1d00e3d447cf2ce09534fb9a3a9ff4293d0f Mon Sep 17 00:00:00 2001 From: dengzikun Date: Mon, 16 Dec 2019 22:56:26 +0800 Subject: [PATCH] fix project data in DB --- src/routes/admin/es-fix-projects-for-es.js | 61 ++++++++++++++++++++++ src/routes/index.js | 2 + src/utils/fixProjectsForES.js | 45 ++++++++++++++++ 3 files changed, 108 insertions(+) create mode 100644 src/routes/admin/es-fix-projects-for-es.js create mode 100644 src/utils/fixProjectsForES.js diff --git a/src/routes/admin/es-fix-projects-for-es.js b/src/routes/admin/es-fix-projects-for-es.js new file mode 100644 index 00000000..44987fc7 --- /dev/null +++ b/src/routes/admin/es-fix-projects-for-es.js @@ -0,0 +1,61 @@ +/** + * Admin endpoint to fix project in DB to be indexed in ES. + * + * Waits until the operation is completed and returns result. + */ +import { middleware as tcMiddleware } from 'tc-core-library-js'; +import fixProjectsForES from '../../utils/fixProjectsForES'; + +const permissions = tcMiddleware.permissions; + +/** + * Create a simple logger to log into an array. + * + * @param {Object} defaultLogger default logger which should be used apart from logging to array + * + * @returns {Object} logger + */ +const createArrayLogger = (defaultLogger) => { + const loggerMethods = ['trace', 'debug', 'info', 'warn', 'error']; + const log = []; + const logger = {}; + + loggerMethods.forEach((method) => { + logger[method] = (message) => { + // log directly with the default logger first + defaultLogger[method](message); + // save the same message to the array + log.push({ + level: method, + message, + }); + }; + }); + + logger.getLog = () => log; + + return logger; +}; + +module.exports = [ + permissions('project.admin'), + (req, res, next) => { + try { + const logger = req.log; + logger.debug('Entered Admin#fixProjectsForEs'); + + // this logger would use the default `logger` to log into console + // while saving the same log messages to an array, so we can return it in response + const arrayLogger = createArrayLogger(logger); + + fixProjectsForES(arrayLogger) + .then(() => { + arrayLogger.info('Data has been successfully fixed in DB.'); + res.status(200).json(arrayLogger.getLog()); + }) + .catch(next); + } catch (err) { + next(err); + } + }, +]; diff --git a/src/routes/index.js b/src/routes/index.js index 8421d718..275ce470 100644 --- a/src/routes/index.js +++ b/src/routes/index.js @@ -101,6 +101,8 @@ router.route('/v5/projects/admin/es/migrateFromDb') .patch(require('./admin/es-migrate-from-db')); router.route('/v5/projects/admin/es/fixMetadataForEs') .patch(require('./admin/es-fix-metadata-for-es')); +router.route('/v5/projects/admin/es/fixProjectsForEs') + .patch(require('./admin/es-fix-projects-for-es')); router.route('/v5/projects/admin/es/project/index') .post(require('./admin/project-index-create')); router.route('/v5/projects/admin/es/project/remove') diff --git a/src/utils/fixProjectsForES.js b/src/utils/fixProjectsForES.js new file mode 100644 index 00000000..7bade608 --- /dev/null +++ b/src/utils/fixProjectsForES.js @@ -0,0 +1,45 @@ +/* eslint-disable no-param-reassign, no-restricted-syntax, no-await-in-loop */ +/** + * Temporary script to fix project in DB to be indexed in ES + * + * Update all records in the Project table. + */ +import _ from 'lodash'; +import models from '../models'; + +/** + * Fix all projects. + * + * @param {Object} logger logger + * + * @returns {Promise} resolved when dene + */ +async function fixProjects(logger) { + const path = 'taasDefinition.team.skills'; + const projects = await models.Project.findAll(); + for (const project of projects) { + if (_.has(project, 'details')) { + const details = JSON.parse(JSON.stringify(project.details)); + const skills = _.get(details, path); + if (skills && !_.isArray(skills)) { + _.set(details, path, []); + project.details = details; + await project.save(); + logger.info(`updated record of Project with id ${project.id}`); + } + } + } +} + +/** + * Fix project model. + * + * @param {Object} logger logger + * + * @returns {undefined} + */ +async function fixProjectsForES(logger) { + await fixProjects(logger); +} + +module.exports = fixProjectsForES;