-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
127 lines (111 loc) · 3.39 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
const express = require('express');
const bodyParser = require('body-parser');
const _ = require('lodash');
const axios = require('axios');
const path = require('path');
const fs = require('fs');
const deepDiff = require('deep-diff');
const fuse = require('fuse.js')
const { getFileParameters, resolveConfigUrl } = require('./myresolve');
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(express.static('public'));
app.use('/node_modules', express.static(path.join(__dirname, 'node_modules')));
let fuseInstance = new fuse([], {
keys: ['path'],
includeScore: true
});
let baseJsonData = {};
let changes = [];
app.get('/fileParameters', async (req, res) => {
try {
const parameters = await getFileParameters(req);
res.json(parameters);
} catch (err) {
res.status(400).send(err.message);
}
});
app.get('/loadConfigFile', async (req, res) => {
const queryParameters = req.query;
try {
const url = await resolveConfigUrl(queryParameters);
const response = await axios.get(url);
baseJsonData = response.data;
// Prepare data for Fuse.js
const flattenedData = [];
const flattenObject = (obj, prefix = '') => {
for (const [key, value] of Object.entries(obj)) {
const newKey = prefix ? `${prefix}.${key}` : key;
if (_.isObject(value)) {
flattenObject(value, newKey);
} else {
flattenedData.push({ path: newKey, value });
}
}
};
flattenObject(baseJsonData);
// Initialize Fuse with the prepared data
fuseInstance = new fuse(flattenedData, {
keys: ['path'],
includeScore: true
});
res.json({ "url": url });
} catch (err) {
res.status(400).send(err.message);
}
});
app.post('/validateKey', (req, res) => {
const { key } = req.body;
const existingNode = _.get(baseJsonData, key, undefined);
const isExisting = existingNode !== undefined;
res.json({ isExisting, existingNode });
});
app.post('/mostLikelyTargets', (req, res) => {
const { key } = req.body;
const results = fuseInstance.search(key);
const mostLikelyTargets = results.map(r => r.item.path).slice(0, 10);
res.json({ mostLikelyTargets });
});
app.post('/update', (req, res) => {
const keyValuePairs = req.body.keyValuePairs;
try {
changes = [];
keyValuePairs.forEach(({ key, value }) => {
changes.push({ key, value });
});
res.sendStatus(200);
} catch (err) {
return res.status(400).send(err.message);
}
});
app.get('/diff', (req, res) => {
let modifiedJsonData = _.cloneDeep(baseJsonData);
changes.forEach(({ key, value }) => {
_.set(modifiedJsonData, key, value);
});
const differences = deepDiff(baseJsonData, modifiedJsonData) || [];
const diffResult = differences.map(diff => {
return {
path: diff.path.join('.'),
kind: diff.kind,
lhs: diff.lhs,
rhs: diff.rhs
};
});
res.json({ diff: diffResult });
});
app.get('/modified.json', (req, res) => {
let modifiedJsonData = _.cloneDeep(baseJsonData);
changes.forEach(({ key, value }) => {
_.set(modifiedJsonData, key, value);
});
res.json(modifiedJsonData);
});
app.get('/makeChanges', (req, res) => {
const makeChanges = changes.map(({ key, value }) => `file.set('${key}', ${JSON.stringify(value)})`);
res.json({ makeChanges });
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000/');
});