atlantis-cache
Version:
Server-side caching solution for graphQL
51 lines • 2.16 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseDataFromCache = void 0;
/*ParseDataFromCache traverses redis's cache and filters object properties by keys from prototype object*/
function parseDataFromCache(cacheObj, fieldObj) {
const result = {};
Object.keys(cacheObj).forEach((key) => {
//get the value of cacheObj and FieldObj based on key
const subCacheObj = cacheObj[key];
const subFieldObj = fieldObj[key];
//if subCacheObj is an array, iterate through ele and trigger ObjectFilter
if (Array.isArray(subCacheObj)) {
result[key] = subCacheObj.map((obj) => {
return ObjectFilter(obj, subFieldObj);
});
}
else if (typeof subCacheObj === 'object') {
result[key] = ObjectFilter(subCacheObj, subFieldObj);
}
});
return result;
}
exports.parseDataFromCache = parseDataFromCache;
/*helper function filters out object properties on current layer and invoke rescursive call if there are nested fields */
const ObjectFilter = (cacheObj, fieldObj) => {
let resultObj = {};
//iterate thorugh fieldObj
fieldObj.forEach((field) => {
//if cur field is a string, store the the properites to resultObj based on fields
if (typeof field === 'string') {
resultObj[field] = cacheObj[field];
}
else {
//if cur field is an object, invoke rescurive call on ObjectFilter based on value
const fieldName = Object.keys(field)[0];
if (cacheObj[fieldName] === null) {
resultObj[fieldName] = null;
}
else if (Array.isArray(cacheObj[fieldName])) {
resultObj[fieldName] = cacheObj[fieldName].map((obj) => {
return ObjectFilter(obj, field[fieldName]);
});
}
else if (typeof cacheObj[fieldName] === 'object') {
resultObj[fieldName] = ObjectFilter(cacheObj[fieldName], field[fieldName]);
}
}
});
return resultObj;
};
//# sourceMappingURL=parseDataFromCache.js.map