HEX
Server: nginx/1.24.0
System: Linux nowruzgan 6.8.0-57-generic #59-Ubuntu SMP PREEMPT_DYNAMIC Sat Mar 15 17:40:59 UTC 2025 x86_64
User: babak (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/dev/nowruzgan/rest/api/helpers/cache.js
module.exports = {

  friendlyName: 'Cache',
  description: 'Cache something.',

  inputs: {
    action: {
      type: 'string'
    },
    key: {
      type: 'string'
    },
    value: {
      type: 'ref'
    },
    EX: {
      type: 'number'
    }
  },

  exits: {
  },

  fn: async (inputs, exits) => {
    inputs.key = 'nwz:'+inputs.key;
    var read = key =>
      new Promise(resolve =>
        sails.getDatastore('cache').leaseConnection((cache, proceed) => {
          if (!cache) return proceed('no redis');
          cache.get(key, (error, data) => {
            if(error) return proceed(error);
            var obj = false;
            try{
              obj = JSON.parse(data);
            }catch(error){}
            return proceed(undefined, obj);
          });
        }).exec((error, obj) => {
          if(error) return resolve(-1);
          resolve(obj);
        })
      );

    var hashRead = (hash, key) =>
      new Promise(resolve =>
        sails.getDatastore('cache').leaseConnection((cache, proceed) => {
          if (!cache) return proceed('no redis');
          cache.hget(hash, key, (error, data) => {
            if(error) return proceed(error);
            var obj = data;
            try{
              obj = JSON.parse(data);
            }catch(error){}
            return proceed(undefined, obj);
          });
        }).exec((error, obj) => {
          if(error) return resolve(-1);
          resolve(obj);
        })
      );

    var hashReadAll = hash =>
      new Promise(resolve =>
        sails.getDatastore('cache').leaseConnection((cache, proceed) => {
          if (!cache) return proceed('no redis');
          cache.hgetall(hash, (error, data) => {
            if(error) return proceed(error);
            var obj = data;
            for (let key in obj) try{ obj[key] = JSON.parse(data[key]); }catch(error){}
            return proceed(undefined, obj);
          });
        }).exec((error, obj) => {
          if(error) return resolve(-1);
          resolve(obj);
        })
      );

    var write = async (key, value, EX) =>
      new Promise(resolve =>
        sails.getDatastore('cache').leaseConnection((cache, proceed) => {
          if (!cache) return proceed('no redis');
          if(EX)
            cache.set(key, JSON.stringify(value), 'EX', EX, error => {
              if(error) return proceed(error);
              return proceed(undefined);
            });
          else
            cache.set(key, JSON.stringify(value), error => {
              if(error) return proceed(error);
              return proceed(undefined);
            });
        }).exec((error) => {
          if(error) return resolve(-1);
          resolve(0);
        })
      );

    var hashWrite = async (key, value, EX) => {
      for(let index in value)
        value[index] = JSON.stringify(value[index]);
      return new Promise(resolve =>
        sails.getDatastore('cache').leaseConnection((cache, proceed) => {
          if (!cache) return proceed('no redis');
          if(EX)
            cache.HMSET(key, value, 'EX', EX, error => {
              if(error) return proceed(error);
              return proceed(undefined);
            });
          else
            cache.HMSET(key, value, error => {
              if(error) return proceed(error);
              return proceed(undefined);
            });
        }).exec((error) => {
          if(error) return resolve(-1);
          resolve(0);
        })
      );
    };

    var remove = async (key) =>
      new Promise(resolve =>
        sails.getDatastore('cache').leaseConnection((cache, proceed) => {
          if (!cache) return proceed('no redis');
          cache.del(key, error => {
            if(error) return proceed(error);
            return proceed(undefined);
          });
        }).exec((error) => {
          if(error) return resolve(-1);
          resolve(null);
        })
      );

    if(!inputs.EX) inputs.EX = 0;
    var res = null;
    switch(inputs.action) {
      case 'get':
        res = exits.success(await read(inputs.key));
        break;

      case 'hget':
        res = exits.success(await hashRead(inputs.key, inputs.value));
        break;

      case 'hgetall':
        res = exits.success(await hashReadAll(inputs.key));
        break;

      case 'set':
        res = exits.success(await write(inputs.key, inputs.value, inputs.EX));
        break;

      case 'hmset':
        res = exits.success(await hashWrite(inputs.key, inputs.value, inputs.EX));
        break;

      case 'del':
        res = exits.success(await remove(inputs.key));
    }

    return res;
  },
};