Source: redis_api.js

/**
 * @author IITII
 * @date 2020/9/23 12:41
 */
'use strict';
const
  config = require('../config.js'),
  path = require('path'),
  redis = require('redis'),
  client = redis.createClient(config.redis.connect),
  {logger} = require('./logger.js');

client.on("error", error => {
  logger.error(`Redis's error: ${error}`);
});
client.on('connect', () => {
  logger.info(`Redis is connected.`);
});
client.on('ready', () => {
  logger.info(`Redis is ready.`);
});
client.on("warning", warning => {
  logger.info(`Redis's warning: ${warning}`);
});
client.on('end', () => {
  logger.info(`Redis is connected.`);
});

/**
 * Remove duplicate url which was downloaded in the past
 * @param {Array} array origin array
 * @return {Array} removed array
 */
async function unique(array) {
  return await new Promise(async (resolve, reject) => {
    let tmp = [];
    for (let i = 0; i < array.length; i++) {
      let ele = array[i];
      // ┌─────────────────────┬────────────┐
      // │          dir        │    base    │
      // ├──────┬              ├──────┬─────┤
      // │ root │              │ name │ ext │
      // "  /    home/user/dir / file  .txt "
      // └──────┴──────────────┴──────┴─────┘
      const key = path.parse(ele).name;
      await get(key)
        .then(value => {
          if (value === 0) {
            tmp.push(ele);
            logger.info(`Pushing new daily url: ${ele}...`);
          } else {
            logger.info(`Aborting duplicate daily url: ${ele}...`);
            logger.info(`Duplicate count: ${value + 1}`);
          }
        })
        .catch(e => {
          return reject(e);
        });
    }
    return resolve(tmp);
  });
}

/**
 * Put data to redis
 * @param {Array} array origin array
 * @param value {Number} defa
 * @return {Array} removed array
 */
async function setRedis(array, value = 1) {
  return await new Promise(async (resolve, reject) => {
    for (let i = 0; i < array.length; i++) {
      let url = array[i];
      const key = path.parse(url).name;
      await set(key, value)
        .then(value => {
          logger.debug(`Set key: ${key}, value: ${value}`);
        })
        .catch(e => reject(e));
    }
    return resolve();
  })
}

/**
 * Set value for special key
 * @param key pid, task "https://www.pixiv.net/artworks/84521887" for instance,
 * the key of this url is 84521887
 * @param value stepper
 * @return {Number} duplicate times
 */
async function set(key, value = 1) {
  return await new Promise((resolve, reject) => {
    client.get(key, (err, res) => {
      if (err) {
        return reject(err);
      }
      if (res !== null) {
        value += parseInt(res);
      }
      client.set(key, value, (err1, res1) => {
        if (err1) {
          return reject(value);
        }
        if (res1 === 'OK') {
          return resolve(value);
        } else {
          return reject(`Unknown response: ${res1}`);
        }
      });
    });
  })
}

/**
 * Get value for special key
 * @param key pid, task "https://www.pixiv.net/artworks/84521887" for instance,
 * the key of this url is 84521887
 * @return {Number} duplicate times
 */
async function get(key) {
  return await new Promise((resolve, reject) => {
    client.get(key, (err, res) => {
      if (err) {
        return reject(err);
      }
      if (res !== null) {
        return resolve(parseInt(res));
      } else {
        return resolve(0);
      }
    });
  });
}

function quitRedis() {
  client.quit();
}

module.exports = {
  unique,
  setRedis,
  quitRedis,
}