Skip to content

Commit ff0d42c

Browse files
authored
Merge pull request #96 from konecty/refactor/konsistent
Refactor / Konsistent
2 parents d757e22 + 2590f43 commit ff0d42c

20 files changed

+1142
-1112
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@fastify/formbody": "^7.4.0",
2525
"@fastify/multipart": "^8.0.0",
2626
"@types/ua-parser-js": "^0.7.38",
27+
"@types/uuid": "^9.0.7",
2728
"async": "^3.2.4",
2829
"bcryptjs": "^2.4.3",
2930
"bluebird": "^3.7.2",

src/imports/data/data.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import { clearProjectionPathCollision, filterConditionToFn, parseFilterObject }
3333
import { parseSortArray } from './sortUtils';
3434

3535
import { getUserSafe } from '@imports/auth/getUser';
36+
import processIncomingChange from '@imports/konsistent/processIncomingChange';
3637
import { DEFAULT_PAGE_SIZE } from '../consts';
3738
import { dateToString, stringToDate } from '../data/dateParser';
3839
import { populateLookupsData } from '../data/populateLookupsData';
@@ -1151,6 +1152,13 @@ export async function create({ authTokenId, document, data, contextUser, upsert,
11511152
}
11521153

11531154
if (resultRecord != null) {
1155+
if (MetaObject.Namespace.useExternalKonsistent !== true) {
1156+
try {
1157+
await processIncomingChange(document, resultRecord, 'create', user);
1158+
} catch (e) {
1159+
logger.error(e, `Error on processIncomingChange ${document}: ${e.message}`);
1160+
}
1161+
}
11541162
return successReturn([dateToString(resultRecord)]);
11551163
}
11561164
}
@@ -1343,8 +1351,7 @@ export async function update({ authTokenId, document, data, contextUser }) {
13431351
Object.keys(data.data).forEach(fieldName => {
13441352
if (record.diffs[fieldName] != null) {
13451353
acc.push(
1346-
`[${document}] Record ${record.dataId} is out of date, field ${fieldName} was updated at ${DateTime.fromJSDate(record.createdAt).toISO()} by ${
1347-
record.createdBy.name
1354+
`[${document}] Record ${record.dataId} is out of date, field ${fieldName} was updated at ${DateTime.fromJSDate(record.createdAt).toISO()} by ${record.createdBy.name
13481355
}`,
13491356
);
13501357
}
@@ -1559,6 +1566,16 @@ export async function update({ authTokenId, document, data, contextUser }) {
15591566
await runScriptAfterSave({ script: metaObject.scriptAfterSave, data: updatedRecords, user, extraData: { original: existsRecords } });
15601567
}
15611568

1569+
if (MetaObject.Namespace.useExternalKonsistent !== true) {
1570+
try {
1571+
for await (const record of updatedRecords) {
1572+
await processIncomingChange(document, record, 'update', user);
1573+
}
1574+
} catch (e) {
1575+
logger.error(e, `Error on processIncomingChange ${document}: ${e.message}`);
1576+
}
1577+
}
1578+
15621579
const responseData = updatedRecords.map(record => removeUnauthorizedDataForRead(access, record)).map(record => dateToString(record));
15631580

15641581
if (emailsToSend.length > 0) {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import { MetaObject } from "@imports/model/MetaObject";
2+
import { logger } from "@imports/utils/logger";
3+
import get from "lodash/get";
4+
5+
export default async function createHistory(metaName, action, id, data, updatedBy, updatedAt, changeId) {
6+
// If data is empty or no update data is avaible then abort
7+
if (Object.keys(data).length === 0 || updatedAt == null || updatedBy == null) {
8+
return;
9+
}
10+
11+
const startTime = process.hrtime();
12+
13+
const historyData = {};
14+
15+
const meta = MetaObject.Meta[metaName];
16+
17+
// Remove fields that is marked to ignore history
18+
for (let key in data) {
19+
const value = data[key];
20+
const field = meta.fields[key];
21+
if (get(field, 'ignoreHistory', false) !== true) {
22+
historyData[key] = value;
23+
}
24+
}
25+
26+
// Get history collection
27+
const history = MetaObject.Collections[`${metaName}.History`];
28+
29+
// If can't get history collection terminate this method
30+
if (!history) {
31+
return logger.error(`Can't get History collection from ${metaName}`);
32+
}
33+
34+
const historyQuery = { _id: changeId };
35+
36+
// Define base data to history
37+
const historyItem = {
38+
dataId: id,
39+
createdAt: updatedAt,
40+
createdBy: updatedBy,
41+
data: historyData,
42+
type: action,
43+
};
44+
45+
// Create history!
46+
try {
47+
await history.updateOne(historyQuery, { $set: historyItem, $setOnInsert: historyQuery }, { upsert: true });
48+
49+
const updateTime = process.hrtime(startTime);
50+
// Log operation to shell
51+
let log = metaName;
52+
53+
switch (action) {
54+
case 'create':
55+
log = `${updateTime[0]}s ${updateTime[1] / 1000000}ms => Create history to create action over ${log}`;
56+
break;
57+
case 'update':
58+
log = `${updateTime[0]}s ${updateTime[1] / 1000000}ms => Create history to update action over ${log}`;
59+
break;
60+
case 'delete':
61+
log = `${updateTime[0]}s ${updateTime[1] / 1000000}ms => Create history to delete action over ${log}`;
62+
break;
63+
}
64+
65+
logger.debug(log);
66+
} catch (e) {
67+
logger.error(e, 'Error on create history');
68+
}
69+
}

0 commit comments

Comments
 (0)