@sera4/essentia 1.1.17 → 1.1.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/package.tar.gz +0 -0
- package/paper-trail/index.js +98 -17
package/package.json
CHANGED
package/package.tar.gz
CHANGED
|
Binary file
|
package/paper-trail/index.js
CHANGED
|
@@ -2,10 +2,11 @@ import * as jsdiff from 'diff';
|
|
|
2
2
|
import _ from 'lodash';
|
|
3
3
|
import helpers from './helpers.js';
|
|
4
4
|
import paginator from "../paginator/sql-pagination.js";
|
|
5
|
+
import { utils } from "../utils/index.js"
|
|
5
6
|
|
|
6
7
|
let failHard = false;
|
|
7
8
|
let als;
|
|
8
|
-
let Sequelize = null
|
|
9
|
+
let Sequelize = null;
|
|
9
10
|
|
|
10
11
|
const paperTrail = {};
|
|
11
12
|
|
|
@@ -28,11 +29,15 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
28
29
|
'deleted_at',
|
|
29
30
|
'revision',
|
|
30
31
|
],
|
|
32
|
+
// additional fields to exclude on a global basis
|
|
33
|
+
excludeExtras: [],
|
|
31
34
|
revisionAttribute: 'revision',
|
|
32
35
|
revisionModel: 'Revision',
|
|
33
36
|
revisionChangeModel: 'RevisionChange',
|
|
34
37
|
enableRevisionChangeModel: false,
|
|
35
38
|
UUID: false,
|
|
39
|
+
// does this project use int's and UUIDs for some references (postgres)
|
|
40
|
+
mixedDocumentReference: false,
|
|
36
41
|
underscored: false,
|
|
37
42
|
underscoredAttributes: false,
|
|
38
43
|
defaultAttributes: {
|
|
@@ -52,10 +57,22 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
52
57
|
mysql: false,
|
|
53
58
|
};
|
|
54
59
|
|
|
60
|
+
if (optsArg.mixedDocumentReference)
|
|
61
|
+
defaultOptions.defaultAttributes.documentUuid = "documentUuid";
|
|
62
|
+
|
|
55
63
|
if (optsArg.underscoredAttributes) {
|
|
56
64
|
helpers.toUnderscored(defaultOptions.defaultAttributes);
|
|
57
65
|
}
|
|
58
66
|
|
|
67
|
+
// deals with not wanting to overwrite the initial ones, just add some
|
|
68
|
+
if (optsArg.excludeExtras) {
|
|
69
|
+
if (optsArg.exclude) {
|
|
70
|
+
optsArg.exclude = [...optsArg.exclude, ...optsArg.excludeExtras ]
|
|
71
|
+
} else {
|
|
72
|
+
optsArg.exclude = [...defaultOptions.exclude, ...optsArg.excludeExtras ]
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
59
76
|
const options = _.defaults(optsArg, defaultOptions);
|
|
60
77
|
|
|
61
78
|
const log = options.log || console.log;
|
|
@@ -305,7 +322,11 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
305
322
|
query[options.userModelAttribute] =
|
|
306
323
|
(store && store.get(options.continuationKey)) || opt.userId;
|
|
307
324
|
|
|
308
|
-
|
|
325
|
+
if (options.mixedDocumentReference && utils.isValidUuidV4(instance.id)) {
|
|
326
|
+
query[options.defaultAttributes.documentUuid] = instance.id;
|
|
327
|
+
} else {
|
|
328
|
+
query[options.defaultAttributes.documentId] = instance.id;
|
|
329
|
+
}
|
|
309
330
|
|
|
310
331
|
const revision = Revision.build(query);
|
|
311
332
|
|
|
@@ -313,7 +334,6 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
313
334
|
options.revisionAttribute,
|
|
314
335
|
);
|
|
315
336
|
|
|
316
|
-
// Save revision(
|
|
317
337
|
return revision
|
|
318
338
|
.save({ transaction: opt.transaction })
|
|
319
339
|
.then(objectRevision => {
|
|
@@ -462,13 +482,29 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
462
482
|
this.addHook('afterUpdate', createAfterHook('update'));
|
|
463
483
|
|
|
464
484
|
// create association
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
485
|
+
if (options.mixedDocumentReference) {
|
|
486
|
+
this.hasMany(sequelize.models[options.revisionModel], {
|
|
487
|
+
constraints: false,
|
|
488
|
+
foreignKey: options.defaultAttributes.documentUuid,
|
|
489
|
+
});
|
|
490
|
+
this.hasMany(sequelize.models[options.revisionModel], {
|
|
491
|
+
foreignKey: options.defaultAttributes.documentId,
|
|
492
|
+
constraints: false,
|
|
493
|
+
scope: {
|
|
494
|
+
model: this.name,
|
|
495
|
+
},
|
|
496
|
+
});
|
|
497
|
+
} else {
|
|
498
|
+
return this.hasMany(sequelize.models[options.revisionModel], {
|
|
499
|
+
foreignKey: options.defaultAttributes.documentId,
|
|
500
|
+
constraints: false,
|
|
501
|
+
scope: {
|
|
502
|
+
model: this.name,
|
|
503
|
+
},
|
|
504
|
+
});
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
|
|
472
508
|
},
|
|
473
509
|
});
|
|
474
510
|
|
|
@@ -521,17 +557,40 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
521
557
|
type: Sequelize.UUID,
|
|
522
558
|
defaultValue: Sequelize.UUIDV4,
|
|
523
559
|
};
|
|
524
|
-
attributes[options.defaultAttributes.documentId].type =
|
|
525
|
-
Sequelize.UUID;
|
|
526
560
|
|
|
527
|
-
|
|
561
|
+
if (!options.mixedDocumentReference)
|
|
562
|
+
attributes[options.defaultAttributes.documentId].type = Sequelize.UUID;
|
|
563
|
+
|
|
528
564
|
attributes[options.userModelAttribute].type = Sequelize.UUID;
|
|
529
565
|
}
|
|
530
566
|
|
|
567
|
+
if (options.mixedDocumentReference) {
|
|
568
|
+
attributes[options.defaultAttributes.documentId].allowNull = true;
|
|
569
|
+
attributes[options.defaultAttributes.documentUuid] = {
|
|
570
|
+
type: Sequelize.UUID,
|
|
571
|
+
allowNull: true
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
|
|
531
575
|
if (options.debug) {
|
|
532
576
|
log('attributes', attributes);
|
|
533
577
|
}
|
|
534
578
|
|
|
579
|
+
let indexes = [{
|
|
580
|
+
name: "document_reference_id",
|
|
581
|
+
fields: [options.defaultAttributes.documentId]
|
|
582
|
+
}];
|
|
583
|
+
|
|
584
|
+
if (options.userModel)
|
|
585
|
+
indexes.push({ fields: [options.userModelAttribute]});
|
|
586
|
+
|
|
587
|
+
if (options.mixedDocumentReference) {
|
|
588
|
+
indexes.push({
|
|
589
|
+
name: "document_reference_uuid",
|
|
590
|
+
fields: [options.defaultAttributes.documentUuid]
|
|
591
|
+
})
|
|
592
|
+
}
|
|
593
|
+
|
|
535
594
|
// Revision model
|
|
536
595
|
const Revision = sequelize.define(
|
|
537
596
|
options.revisionModel,
|
|
@@ -539,8 +598,27 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
539
598
|
{
|
|
540
599
|
underscored: options.underscored,
|
|
541
600
|
tableName: options.tableName,
|
|
601
|
+
timestamps: true,
|
|
602
|
+
createdAt: options.underscored ? "created_at" : "createdAt",
|
|
603
|
+
updatedAt: options.underscored ? "updated_at" : "updatedAt",
|
|
604
|
+
indexes
|
|
542
605
|
},
|
|
543
606
|
);
|
|
607
|
+
|
|
608
|
+
// safely prune down values
|
|
609
|
+
Revision.prototype.toJSON = function() {
|
|
610
|
+
let values = this.get();
|
|
611
|
+
const excludedFields = ["updated_at"];
|
|
612
|
+
|
|
613
|
+
// ensure that we always reference the id as document_id
|
|
614
|
+
values.document_id = values.document_id || values.document_uuid;
|
|
615
|
+
delete values.document_uuid;
|
|
616
|
+
|
|
617
|
+
return _.omitBy(values, function(value, key) {
|
|
618
|
+
return (excludedFields.includes(key) || (value === null));
|
|
619
|
+
});
|
|
620
|
+
};
|
|
621
|
+
|
|
544
622
|
Revision.associate = function associate(models) {
|
|
545
623
|
if (options.debug) {
|
|
546
624
|
log('models', models);
|
|
@@ -615,10 +693,13 @@ paperTrail.init = (sequelize, sequelizePackage, optionsArg) => {
|
|
|
615
693
|
* association through the associate call above.
|
|
616
694
|
*/
|
|
617
695
|
if (options.userModel) {
|
|
618
|
-
Revision.belongsTo(
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
696
|
+
Revision.belongsTo(sequelize.model(options.userModel), {
|
|
697
|
+
as: "account",
|
|
698
|
+
foreignKey: {
|
|
699
|
+
fieldName: options.userModelAttribute
|
|
700
|
+
},
|
|
701
|
+
onDelete: "CASCADE"
|
|
702
|
+
});
|
|
622
703
|
}
|
|
623
704
|
|
|
624
705
|
return Revision;
|