@autofleet/matmon 2.0.0-beta-46 → 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);
@@ -113,7 +97,7 @@ class SequelizeAdapter {
113
97
  }
114
98
  const dependencyKeys = modelOptions.associations
115
99
  .filter(association => instance[association.alias])
116
- .map(association => generateDependencyKey(modelOptions.name, association.name, instance[association.alias].id));
100
+ .map(association => generateDependencyKey(modelName, association.name, instance[association.alias].id));
117
101
  dependencyKeys.reduce((multi, key) => multi.srem(key, instanceKey), removeMulti);
118
102
  removeMulti.del(instanceKey);
119
103
  return dependencyKeys;
@@ -122,11 +106,11 @@ class SequelizeAdapter {
122
106
  return removeMultiAsync();
123
107
  });
124
108
  const model = this.getModel(modelOptions.name);
125
- 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))));
126
110
  BULK_HOOKS.map(hook => model.addHook(hook, options => options.individualHook = true));
127
111
  modelOptions.associations.map(association => {
128
112
  const associationModel = this.getModel(association.name);
129
- INVALIDATION_HOOKS.map(hook => associationModel.addHook(hook, (instance, options) => handleTransactionHook(instance, options, ({ id }) => invalidateModelInstanceByAssociation(association.name, id))));
113
+ INVALIDATION_HOOKS.map(hook => associationModel.addHook(hook, (instance, options) => handleTransactionHook(instance, options, ({ id }) => invalidateModelInstanceByAssociation(modelOptions.name, association.name, id))));
130
114
  BULK_HOOKS.map(hook => associationModel.addHook(hook, options => options.individualHook = true));
131
115
  });
132
116
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/matmon",
3
- "version": "2.0.0-beta-46",
3
+ "version": "2.0.0",
4
4
  "description": "manage cache",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",