@autofleet/matmon 2.0.0-beta-47 → 2.0.0

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.
@@ -1,13 +1,10 @@
1
1
  import RedisCache from '../redis';
2
2
  export interface ModelOptions {
3
3
  name: string;
4
- associations: AssociationOptions[];
5
- }
6
- export interface AssociationOptions {
7
- name: string;
8
- alias: string;
9
- accessKey?: string;
10
- associations?: AssociationOptions[];
4
+ associations: {
5
+ name: string;
6
+ alias: string;
7
+ }[];
11
8
  }
12
9
  export interface Adapter {
13
10
  ormInstance: any;
@@ -19,26 +19,6 @@ const INVALIDATION_HOOKS = ['afterSave', 'afterUpdate', 'afterDestroy'];
19
19
  const BULK_HOOKS = ['beforeBulkUpdate', 'beforeBulkDestroy'];
20
20
  const generateInstanceKey = (modelOptions, id) => `${AF_SERVICE_NAME}:${modelOptions.name}_${id}_INCLUDING_${modelOptions.associations.map(a => a.name).join('_')}`;
21
21
  const generateDependencyKey = (modelName, associationName, associationId) => `${AF_SERVICE_NAME}:${modelName}_${associationName}_${associationId}_DEPENDENCIES`;
22
- const getAssociation = (instance, associationOptions, associationId) => {
23
- const accessKey = associationOptions.accessKey || 'id';
24
- if (Array.isArray(instance[associationOptions.alias])) {
25
- return instance[associationOptions.alias].find(association => association[accessKey] === associationId);
26
- }
27
- return instance[associationOptions.alias];
28
- };
29
- const getInstanceDependencyKeys = (modelOptions, instance) => {
30
- const keys = modelOptions.associations
31
- .filter((association) => instance[association.alias])
32
- .map((associationOptions) => {
33
- const accessKey = associationOptions.accessKey || 'id';
34
- if (Array.isArray(instance[associationOptions.alias])) {
35
- return instance[associationOptions.alias]
36
- .map(associationInstance => generateDependencyKey(modelOptions.name, associationOptions.name, associationInstance[accessKey]));
37
- }
38
- return [generateDependencyKey(modelOptions.name, associationOptions.name, instance[associationOptions.alias][accessKey])];
39
- });
40
- return keys.reduce((flattenArray, array) => flattenArray.concat(array), []);
41
- };
42
22
  const handleTransactionHook = (instance, options, func) => {
43
23
  const { transaction } = options;
44
24
  if (transaction) {
@@ -62,8 +42,10 @@ class SequelizeAdapter {
62
42
  }
63
43
  }
64
44
  injectGetWithCacheFunction(cache, modelOptions) {
65
- const addDependencies = (instance) => __awaiter(this, void 0, void 0, function* () {
66
- const dependencyKeys = getInstanceDependencyKeys(modelOptions, instance);
45
+ const addDependencies = (modelName, instance) => __awaiter(this, void 0, void 0, function* () {
46
+ const dependencyKeys = modelOptions.associations
47
+ .filter(association => instance[association.alias])
48
+ .map(association => generateDependencyKey(modelName, association.name, instance[association.alias].id));
67
49
  const instanceKey = generateInstanceKey(modelOptions, instance.id);
68
50
  this.debug('Adding dependencies', { instanceKey, dependencyKeys });
69
51
  const addDependenciesMulti = cache.getClient().multi();
@@ -81,7 +63,7 @@ class SequelizeAdapter {
81
63
  this.debug('Value from DB', { value: value || 'not found', cacheKey });
82
64
  const [setRes] = yield Promise.all([
83
65
  cache.getClient().setAsync(cacheKey, JSON.stringify(value)),
84
- value && addDependencies(value),
66
+ value && addDependencies(modelOptions.name, value),
85
67
  ]);
86
68
  }
87
69
  else {
@@ -91,8 +73,10 @@ class SequelizeAdapter {
91
73
  });
92
74
  }
93
75
  addInvalidationHooks(cache, modelOptions) {
94
- const invalidateModelInstance = (instance) => __awaiter(this, void 0, void 0, function* () {
95
- const dependencyKeys = getInstanceDependencyKeys(modelOptions, instance);
76
+ const invalidateModelInstance = (modelName, instance) => __awaiter(this, void 0, void 0, function* () {
77
+ const dependencyKeys = modelOptions.associations
78
+ .filter(association => instance[association.alias])
79
+ .map(association => generateDependencyKey(modelName, association.name, instance[association.alias].id));
96
80
  const instanceKey = generateInstanceKey(modelOptions, instance.id);
97
81
  this.debug('Removing dependencies', { instance, instanceKey, dependencyKeys });
98
82
  const removeMulti = cache.getClient().multi();
@@ -101,8 +85,8 @@ class SequelizeAdapter {
101
85
  removeMulti.del(instanceKey);
102
86
  return removeMultiAsync();
103
87
  });
104
- const invalidateModelInstanceByAssociation = (association, associationId) => __awaiter(this, void 0, void 0, function* () {
105
- const dependentInstancesKeys = yield cache.getClient().smembersAsync(generateDependencyKey(modelOptions.name, association, associationId));
88
+ const invalidateModelInstanceByAssociation = (modelName, association, associationId) => __awaiter(this, void 0, void 0, function* () {
89
+ const dependentInstancesKeys = yield cache.getClient().smembersAsync(generateDependencyKey(modelName, association, associationId));
106
90
  this.debug('Invalidating dependent instances', { dependentInstancesKeys });
107
91
  const removeMulti = cache.getClient().multi();
108
92
  const removeMultiAsync = util_1.promisify(removeMulti.exec).bind(removeMulti);
@@ -111,7 +95,9 @@ class SequelizeAdapter {
111
95
  if (!instance) {
112
96
  return [];
113
97
  }
114
- const dependencyKeys = getInstanceDependencyKeys(modelOptions, instance);
98
+ const dependencyKeys = modelOptions.associations
99
+ .filter(association => instance[association.alias])
100
+ .map(association => generateDependencyKey(modelName, association.name, instance[association.alias].id));
115
101
  dependencyKeys.reduce((multi, key) => multi.srem(key, instanceKey), removeMulti);
116
102
  removeMulti.del(instanceKey);
117
103
  return dependencyKeys;
@@ -120,11 +106,11 @@ class SequelizeAdapter {
120
106
  return removeMultiAsync();
121
107
  });
122
108
  const model = this.getModel(modelOptions.name);
123
- INVALIDATION_HOOKS.map(hook => model.addHook(hook, (instance, options) => handleTransactionHook(instance, options, instance => invalidateModelInstance(instance))));
109
+ INVALIDATION_HOOKS.map(hook => model.addHook(hook, (instance, options) => handleTransactionHook(instance, options, instance => invalidateModelInstance(modelOptions.name, instance))));
124
110
  BULK_HOOKS.map(hook => model.addHook(hook, options => options.individualHook = true));
125
- modelOptions.associations.map((associationOptions) => {
126
- const associationModel = this.getModel(associationOptions.name);
127
- INVALIDATION_HOOKS.map(hook => associationModel.addHook(hook, (instance, options) => handleTransactionHook(instance, options, associationInstance => invalidateModelInstanceByAssociation(associationOptions.name, associationInstance[associationOptions.accessKey || 'id']))));
111
+ modelOptions.associations.map(association => {
112
+ const associationModel = this.getModel(association.name);
113
+ INVALIDATION_HOOKS.map(hook => associationModel.addHook(hook, (instance, options) => handleTransactionHook(instance, options, ({ id }) => invalidateModelInstanceByAssociation(modelOptions.name, association.name, id))));
128
114
  BULK_HOOKS.map(hook => associationModel.addHook(hook, options => options.individualHook = true));
129
115
  });
130
116
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/matmon",
3
- "version": "2.0.0-beta-47",
3
+ "version": "2.0.0",
4
4
  "description": "manage cache",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",