Commit 13406285 authored by Fauzi Fadhillah's avatar Fauzi Fadhillah
Browse files

perf(invalidation): improve invalidationfor bulk hook

parent 0fa4f6ab
Loading
Loading
Loading
Loading
+42 −30
Original line number Diff line number Diff line
@@ -36,32 +36,7 @@ async function invalidationCache(previousModel, modelClass) {
            return await invalidation({ key: usedKey });
    }));
}
function Cache(cacheOptions) {
    return (target) => {
        const options = Object.assign({}, {
            hooks: {
                afterUpdate: async (instance, options) => {
                    invalidateCache(instance, options, target);
                    return instance;
                },
                afterDestroy: async (instance, options) => {
                    invalidateCache(instance, options, target);
                    return instance;
                },
                beforeBulkUpdate: async (options) => {
                    if (options.where?.id?.length || (options?.where?.id && typeof options?.where?.id !== 'object')) {
                        return;
                    }
                    const { transaction, ...customOptions } = options || { transaction: undefined };
                    target?.['findAll']?.(customOptions).then(async (models) => {
                        await Promise.all((models || []).map(async (model) => {
                            if (model) {
                                invalidateCache(model, options, target);
                            }
                        }));
                    });
                },
                AfterBulkUpdate: async (options) => {
async function afterBulkInvalidation(options, modelClass) {
    const id = options.where?.id;
    if (!id) {
        return;
@@ -70,18 +45,55 @@ function Cache(cacheOptions) {
        const ids = [...new Set(id)];
        Promise.all(ids?.map((i) => {
            invalidationCache({
                                [target['primaryKeyAttribute']]: i,
                            }, target);
                [modelClass['primaryKeyAttribute']]: i,
            }, modelClass);
        }));
        return;
    }
    if (typeof id !== 'object') {
        invalidationCache({
                            [target['primaryKeyAttribute']]: id,
                        }, target);
            [modelClass['primaryKeyAttribute']]: id,
        }, modelClass);
    }
    return;
}
async function beforeBulkInvalidation(options, modelClass) {
    if (options.where?.id?.length || (options?.where?.id && typeof options?.where?.id !== 'object')) {
        return;
    }
    const { transaction, ...customOptions } = options || { transaction: undefined };
    modelClass?.['findAll']?.(customOptions).then(async (models) => {
        await Promise.all((models || []).map(async (model) => {
            if (model) {
                invalidateCache(model, options, modelClass);
            }
        }));
    });
}
function Cache(cacheOptions) {
    return (target) => {
        const options = Object.assign({}, {
            hooks: {
                afterUpdate: async (instance, options) => {
                    invalidateCache(instance, options, target);
                    return instance;
                },
                afterDestroy: async (instance, options) => {
                    invalidateCache(instance, options, target);
                    return instance;
                },
                beforeBulkUpdate: async (options) => {
                    beforeBulkInvalidation(options, target);
                },
                AfterBulkUpdate: async (options) => {
                    return afterBulkInvalidation(options, target);
                },
                beforeBulkDestroy: async (options) => {
                    beforeBulkInvalidation(options, target);
                },
                AfterBulkDestroy: async (options) => {
                    return afterBulkInvalidation(options, target);
                }
            },
        });
        target[`modelTTL`] = cacheOptions?.ttl || 0;
+1 −1
Original line number Diff line number Diff line
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/sequelize-cache/cache.ts"],"names":[],"mappings":";;;AAAA,wCAAyC;AACzC,uDAAmD;AACnD,+DAAmE;AAGnE,KAAK,UAAU,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU;IACvD,IAAI,gCAAc,CAAC,OAAO,EAAE;QAC1B,MAAM,aAAa,GAAG,EAAE,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,GAAG,IAAA,wBAAc,EAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAA;QACjG,gCAAc,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;KACtC;IAED,IAAI,OAAO,EAAE,WAAW,EAAE;QACxB,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,GAAG,EAAE;YACnC,iBAAiB,CAAC;gBAChB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;aACvG,EAAE,UAAU,CAAC,CAAA;QAChB,CAAC,CAAC,CAAA;QACF,gCAAc,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAA;QACxD,OAAO,KAAK,CAAA;KACb;IACD,iBAAiB,CAAC;QAChB,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,EAAE,KAAK,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC;KACvG,EAAE,UAAU,CAAC,CAAA;IACd,gCAAc,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC5C,OAAO,KAAK,CAAA;AAEd,CAAC;AAED,SAAS,QAAQ,CAAC,MAAM,EAAE,OAAkB;IAC1C,IAAA,iCAAU,EAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AACvC,CAAC;AACD,KAAK,UAAU,iBAAiB,CAAC,aAAa,EAAE,UAAU;IACxD,MAAM,IAAI,GAAa,MAAM,gCAAc,CAAC,cAAc,CAAC,EAAE,UAAU,EAAE,KAAK,UAAU,CAAC,IAAI,MAAM,aAAa,CAAC,UAAU,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;IACxJ,MAAM,YAAY,GAAG,gCAAc,CAAC,eAAe,CAAC;IACpD,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACxC,MAAM,OAAO,GAAG,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAA;QACjD,IAAG,OAAO;YACR,OAAO,MAAM,YAAY,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAC,CAAA;AACL,CAAC;AAED,SAAgB,KAAK,CAAC,YAA+B;IACnD,OAAO,CAAC,MAAM,EAAE,EAAE;QAChB,MAAM,OAAO,GAAc,MAAM,CAAC,MAAM,CAAC,EAAE,EACzC;YACE,KAAK,EAAE;gBACL,WAAW,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;oBACvC,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;oBAC1C,OAAO,QAAQ,CAAA;gBACjB,CAAC;gBACD,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE;oBACxC,eAAe,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;oBAC1C,OAAO,QAAQ,CAAA;gBACjB,CAAC;gBACD,gBAAgB,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBAClC,IAAI,OAAO,CAAC,KAAK,EAAE,EAAE,EAAE,MAAM,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,OAAO,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE;wBAC/F,OAAO;qBACR;oBACD,MAAM,EAAE,WAAW,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,CAAA;oBAC/E,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,MAAa,EAAE,EAAE;wBAChE,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,EAAC,KAAK,EAAE,EAAE;4BAClD,IAAG,KAAK,EAAE;gCACR,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;6BACxC;wBACH,CAAC,CAAC,CAAC,CAAA;oBACL,CAAC,CAAC,CAAC;gBACL,CAAC;gBACD,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE;oBACjC,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;oBAC7B,IAAI,CAAC,EAAE,EAAE;wBACP,OAAO;qBACR;oBAED,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;wBACrB,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;wBAC7B,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;4BACzB,iBAAiB,CAAC;gCAChB,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,CAAC;6BACnC,EAAE,MAAM,CAAC,CAAA;wBACZ,CAAC,CAAC,CAAC,CAAA;wBACH,OAAO;qBACR;oBAED,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE;wBAC1B,iBAAiB,CAAC;4BAChB,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,EAAE,EAAE;yBACpC,EAAE,MAAM,CAAC,CAAA;qBACX;oBAED,OAAO;gBACT,CAAC;aACF;SACF,CAAC,CAAC;QAGL,MAAM,CAAC,UAAU,CAAC,GAAG,YAAY,EAAE,GAAG,IAAI,CAAC,CAAA;QAC3C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC,CAAA;AAEH,CAAC;AA1DD,sBA0DC"}
 No newline at end of file
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/sequelize-cache/cache.ts"],"names":[],"mappings":"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"}
 No newline at end of file
+1 −1

File changed.

Preview size limit exceeded, changes collapsed.

+46 −34
Original line number Diff line number Diff line
@@ -39,33 +39,7 @@ async function invalidationCache(previousModel, modelClass) {
  }))
}

export function Cache(cacheOptions?: { ttl?: number }) {
  return (target) => {
    const options: { hooks } = Object.assign({},
      {
        hooks: {
          afterUpdate: async (instance, options) => {
            invalidateCache(instance, options, target)
            return instance
          },
          afterDestroy: async (instance, options) => {
            invalidateCache(instance, options, target)
            return instance
          },
          beforeBulkUpdate: async (options) => {
            if (options.where?.id?.length || (options?.where?.id && typeof options?.where?.id !== 'object')) {
              return;
            }
            const { transaction, ...customOptions } = options || { transaction: undefined }
            target?.['findAll']?.(customOptions).then(async (models: any[]) => {
              await Promise.all((models || []).map(async(model) => {
                if(model) {
                  invalidateCache(model, options, target)
                }
              }))
            });
          },
          AfterBulkUpdate: async (options) => {
async function afterBulkInvalidation(options, modelClass) {
  const id = options.where?.id;
  if (!id) {
    return;
@@ -75,20 +49,59 @@ export function Cache(cacheOptions?: { ttl?: number }) {
    const ids = [...new Set(id)];
    Promise.all(ids?.map((i) => {
      invalidationCache({
                  [target['primaryKeyAttribute']]: i,
                }, target)
        [modelClass['primaryKeyAttribute']]: i,
      }, modelClass)
    }))
    return;
  }

  if (typeof id !== 'object') {
    invalidationCache({
                [target['primaryKeyAttribute']]: id,
              }, target)
      [modelClass['primaryKeyAttribute']]: id,
    }, modelClass)
  }
  return;
}

async function beforeBulkInvalidation(options, modelClass) {
  if (options.where?.id?.length || (options?.where?.id && typeof options?.where?.id !== 'object')) {
    return;
  }
  const { transaction, ...customOptions } = options || { transaction: undefined }
  modelClass?.['findAll']?.(customOptions).then(async (models: any[]) => {
    await Promise.all((models || []).map(async(model) => {
      if(model) {
        invalidateCache(model, options, modelClass)
      }
    }))
  });
}

export function Cache(cacheOptions?: { ttl?: number }) {
  return (target) => {
    const options: { hooks } = Object.assign({},
      {
        hooks: {
          afterUpdate: async (instance, options) => {
            invalidateCache(instance, options, target)
            return instance
          },
          afterDestroy: async (instance, options) => {
            invalidateCache(instance, options, target)
            return instance
          },
          beforeBulkUpdate: async (options) => {
            beforeBulkInvalidation(options, target)
          },
          AfterBulkUpdate: async (options) => {
            return afterBulkInvalidation(options, target)
          },
          beforeBulkDestroy: async (options) => {
            beforeBulkInvalidation(options, target)
          },
          AfterBulkDestroy: async (options) => {
            return afterBulkInvalidation(options, target)
          }
        },
      });

@@ -96,5 +109,4 @@ export function Cache(cacheOptions?: { ttl?: number }) {
    target[`modelTTL`] = cacheOptions?.ttl || 0
    annotate(target, options);
  }

}
 No newline at end of file