All files / modules/category index.js

100% Statements 35/35
100% Branches 14/14
100% Functions 6/6
100% Lines 35/35

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88      3x 3x 3x               3x 2x 1x   1x 1x 1x                     3x 4x 2x 2x 2x 2x 2x 4x 3x     2x   2x 2x                       3x 2x 1x 1x 1x 2x 1x     1x   1x 1x               3x 1x 1x     3x            
/**
 * @module category
 */
const categoryRepo = require("../../repositories/category");
const cache = require("../cache");
const _ = require('lodash');
 
/**
 * Fetch all categories. If cached,
 * return from cache, otherwise, fetch from
 * database and cache the values.
 * @return {Array} all category objects
 */
const fetchAll = async () => {
    if (cache.has("categories")) {
        return cache.get("categories");
    } else {
        const findResult = await categoryRepo.findAll();
        cache.set("categories", findResult.rows);
        return findResult.rows;
    }
};
 
/**
 * Fetch categories based on input keyword.
 * If categories are cached, return from cache,
 * otherwise, fetch from database.
 * @param {String} keyword
 * @return {Array} matching category objects
 */
const fetchByKeyword = async (keyword) => {
    if (cache.has("categories")) {
        const cachedVal = cache.get("categories");
        const safeKey = _.escapeRegExp(keyword);
        const regex = RegExp(safeKey ? safeKey : '', 'i');
        const matching = [];
        cachedVal.forEach(e => {
            if (regex.test(e.title)) {
                matching.push(e);
            }
        });
        return matching;
    }
    const findResult = await categoryRepo.findByKeyword(keyword ? keyword : '');
    return findResult.rows;
};
 
/**
 * Fetch all categories based on input parent id.
 * If categories are cached, return from cache,
 * otherwise, fetch from database.
 * A parent of a category refers to the higher level
 * grouping: 'capabilities'.
 * @param {Number} parentId
 * @return {Array} matching category objects
 */
const fetchAllByParent = async (parentId) => {
    if (cache.has("categories")) {
        const cachedVal = cache.get("categories");
        const matching = [];
        cachedVal.forEach(e => {
            if (e.parentId === parentId) {
                matching.push(e);
            }
        });
        return matching;
    }
    const findResult = await categoryRepo.findAllByParent(parentId);
    return findResult.rows;
};
 
/**
 * Fetch a category object by id from database.
 * @param {Number} id
 * @return {Object} category object
 */
const fetchById = async (id) => {
    const findResult = await categoryRepo.findById(id);
    return findResult.rows[0];
};
 
module.exports = {
    fetchAll,
    fetchByKeyword,
    fetchAllByParent,
    fetchById,
};