@stewartmcgown/apollo-response-cache
Version:
Caching and invalidation mechanisms (plugins, directives) of Apollo GraphQL
41 lines (40 loc) • 1.75 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.LogCacheDirective = void 0;
const graphql_1 = require("graphql");
const graphql_tools_1 = require("graphql-tools");
const lodash_1 = require("lodash");
const utils_1 = require("../utils");
exports.LogCacheDirective = ({ typeResolver, idResolver, }) => {
class BaseLogCacheDirective extends graphql_tools_1.SchemaDirectiveVisitor {
visitFieldDefinition(field) {
const { resolve = graphql_1.defaultFieldResolver } = field;
field.resolve = async (...args) => {
const { type, identifier } = this.args;
const [root, _, { __nodeFQCKeySet, __redis }] = args;
const result = await resolve.apply(this, args);
if (!__redis || !__nodeFQCKeySet) {
return result;
}
const nodes = Array.isArray(result) ? result : [result];
nodes.forEach((node) => {
const nodeType = typeResolver ? typeResolver(type, node) : type;
const nodeId = idResolver
? idResolver(type, node)
: lodash_1.get(node, identifier) || lodash_1.get(node, 'id') || lodash_1.get(node, '_id');
if (!nodeType || !nodeId) {
return;
}
try {
__nodeFQCKeySet.add(utils_1.toNodeFQCKey({ type: nodeType, id: nodeId }));
}
catch (error) {
console.warn(error);
}
});
return result;
};
}
}
return BaseLogCacheDirective;
};