Skip to content

Commit 17ca11c

Browse files
committed
feat: admin endpoint to fix metadata for ES
1 parent 4fa958d commit 17ca11c

File tree

3 files changed

+86
-17
lines changed

3 files changed

+86
-17
lines changed

migrations/fixMetadataForES.js

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,19 @@ function updateScope(scope) {
6161
/**
6262
* Fix all projectTemplates.
6363
*
64-
* @returns {undefined}
64+
* @param {Object} logger logger
65+
*
66+
* @returns {Promise} resolved when dene
6567
*/
66-
async function fixProjectTemplates() {
68+
async function fixProjectTemplates(logger) {
6769
const projectTemplates = await models.ProjectTemplate.findAll();
6870
for (const projectTemplate of projectTemplates) {
6971
if (projectTemplate.scope) {
7072
const updatedScope = updateScope(JSON.parse(JSON.stringify(projectTemplate.scope)));
7173
if (!_.isEqual(updatedScope, projectTemplate.scope)) {
7274
projectTemplate.scope = updatedScope;
7375
await projectTemplate.save();
74-
console.log(`updated record of ProjectTemplate with id ${projectTemplate.id}`);
76+
logger.info(`updated record of ProjectTemplate with id ${projectTemplate.id}`);
7577
}
7678
}
7779
}
@@ -81,6 +83,7 @@ async function fixProjectTemplates() {
8183
* Update the required property of an object.
8284
*
8385
* @param {Object} data any object
86+
*
8487
* @returns {undefined}
8588
*/
8689
function updateRequiredProperty(data) {
@@ -125,9 +128,11 @@ function updateTemplate(template) {
125128
/**
126129
* Fix all productTemplates.
127130
*
128-
* @returns {undefined}
131+
* @param {Object} logger logger
132+
*
133+
* @returns {Promise} resolved when dene
129134
*/
130-
async function fixProductTemplates() {
135+
async function fixProductTemplates(logger) {
131136
const productTemplates = await models.ProductTemplate.findAll();
132137

133138
for (const productTemplate of productTemplates) {
@@ -136,7 +141,7 @@ async function fixProductTemplates() {
136141
if (!_.isEqual(updatedTemplate, productTemplate.template)) {
137142
productTemplate.template = updatedTemplate;
138143
await productTemplate.save();
139-
console.log(`updated record of ProductTemplate with id ${productTemplate.id}`);
144+
logger.info(`updated record of ProductTemplate with id ${productTemplate.id}`);
140145
}
141146
}
142147
}
@@ -145,18 +150,26 @@ async function fixProductTemplates() {
145150
/**
146151
* Fix all metadata models.
147152
*
153+
* @param {Object} logger logger
154+
*
148155
* @returns {undefined}
149156
*/
150-
async function fixMetadataForES() {
151-
await fixProjectTemplates();
152-
await fixProductTemplates();
157+
async function fixMetadataForES(logger) {
158+
await fixProjectTemplates(logger);
159+
await fixProductTemplates(logger);
160+
}
161+
162+
if (!module.parent) {
163+
fixMetadataForES(console)
164+
.then(() => {
165+
console.log('done!');
166+
process.exit();
167+
}).catch((err) => {
168+
console.error('Error syncing database', err);
169+
process.exit(1);
170+
});
153171
}
154172

155-
fixMetadataForES()
156-
.then(() => {
157-
console.log('done!');
158-
process.exit();
159-
}).catch((err) => {
160-
console.error('Error syncing database', err);
161-
process.exit(1);
162-
});
173+
module.exports = {
174+
fixMetadataForES,
175+
};
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/**
2+
* Admin endpoint to fix metadata in DB to be indexed in ES.
3+
*
4+
* Waits until the operation is completed and returns result.
5+
*/
6+
import { middleware as tcMiddleware } from 'tc-core-library-js';
7+
import { fixMetadataForES } from '../../../migrations/fixMetadataForES';
8+
9+
const permissions = tcMiddleware.permissions;
10+
11+
/**
12+
* Create a simple logger to log into an array.
13+
*
14+
* @returns {Object} logger
15+
*/
16+
const createArrayLogger = () => {
17+
const loggerMethods = ['trace', 'debug', 'info', 'warn', 'error'];
18+
const log = [];
19+
const logger = {};
20+
21+
loggerMethods.forEach((method) => {
22+
logger[method] = (message) => {
23+
log.push({
24+
level: method,
25+
message,
26+
});
27+
};
28+
});
29+
30+
logger.getLog = () => log;
31+
32+
return logger;
33+
};
34+
35+
module.exports = [
36+
permissions('project.admin'),
37+
(req, res, next) => {
38+
try {
39+
const logger = req.log;
40+
logger.debug('Entered Admin#fixMetadataForEs');
41+
42+
const arrayLogger = createArrayLogger();
43+
44+
fixMetadataForES(arrayLogger)
45+
.then(() => {
46+
arrayLogger.info('Data has been successfully fixed in DB.');
47+
res.status(200).json(arrayLogger.getLog());
48+
})
49+
.catch(next);
50+
} catch (err) {
51+
next(err);
52+
}
53+
},
54+
];

src/routes/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ router.route('/v5/projects/admin/es/deleteIndex')
8787
.delete(require('./admin/es-delete-index'));
8888
router.route('/v5/projects/admin/es/migrateFromDb')
8989
.patch(require('./admin/es-migrate-from-db'));
90+
router.route('/v5/projects/admin/es/fixMetadataForEs')
91+
.patch(require('./admin/es-fix-metadata-for-es'));
9092
router.route('/v5/projects/admin/es/project/index')
9193
.post(require('./admin/project-index-create'));
9294
router.route('/v5/projects/admin/es/project/remove')

0 commit comments

Comments
 (0)