@stewartmcgown/apollo-response-cache
Version:
Caching and invalidation mechanisms (plugins, directives) of Apollo GraphQL
50 lines (49 loc) • 2.12 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PurgeCacheDirective = 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.PurgeCacheDirective = ({ extraNodesPath, typeResolver, idResolver, }) => {
class BasePurgeCacheDirective extends graphql_tools_1.SchemaDirectiveVisitor {
visitFieldDefinition(field) {
const { resolve = graphql_1.defaultFieldResolver } = field;
field.resolve = async (...args) => {
const { type, identifier } = this.args;
const [root, _, { __redis }] = args;
const result = await resolve.apply(this, args);
if (!__redis) {
return result;
}
// parse results
const results = Array.isArray(result) ? [...result] : [result];
const parsedResults = [];
results.map((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;
}
parsedResults.push({ type: nodeType, id: nodeId });
});
// merge results and extras
const extraNodes = extraNodesPath
? lodash_1.get(result, extraNodesPath, [])
: [];
const nodes = [...extraNodes, ...parsedResults];
// invalidate
nodes.forEach((node) => {
utils_1.invalidateFQC({
node,
redis: __redis,
});
});
return result;
};
}
}
return BasePurgeCacheDirective;
};