postgraphile-plugin-connection-filter
Version:
Filtering on PostGraphile connections
123 lines • 5.72 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.PgConnectionArgFilterComputedAttributesPlugin = void 0;
const utils_1 = require("./utils");
const EXPORTABLE_1 = require("./EXPORTABLE");
const version_1 = require("./version");
const pgConnectionFilterApplyComputedAttribute = (0, EXPORTABLE_1.EXPORTABLE)(() => (PgCondition, computedAttributeResource, fieldName, functionResultCodec, $where, value) => {
if (typeof computedAttributeResource.from !== "function") {
throw new Error(`Unexpected...`);
}
// TODO: assertAllowed?
if (value == null)
return;
const expression = computedAttributeResource.from({
placeholder: $where.alias,
});
const $col = new PgCondition($where);
$col.extensions.pgFilterAttribute = {
fieldName,
codec: functionResultCodec,
expression,
};
return $col;
}, [], "pgConnectionFilterApplyComputedAttribute");
exports.PgConnectionArgFilterComputedAttributesPlugin = {
name: "PgConnectionArgFilterComputedAttributesPlugin",
version: version_1.version,
schema: {
behaviorRegistry: {
add: {
filterBy: {
description: "",
entities: ["pgResource"],
},
},
},
entityBehavior: {
pgResource: {
inferred(behavior, entity, build) {
if (build.options.connectionFilterComputedColumns &&
(0, utils_1.isComputedScalarAttributeResource)(entity)) {
return [behavior, "filterBy"];
}
else {
return behavior;
}
},
},
},
hooks: {
GraphQLInputObjectType_fields(inFields, build, context) {
let fields = inFields;
const { inflection, connectionFilterOperatorsDigest, dataplanPg: { TYPES, PgCondition }, EXPORTABLE, } = build;
const { fieldWithHooks, scope: { pgCodec: codec, isPgConnectionFilter }, } = context;
if (!isPgConnectionFilter ||
!codec ||
!codec.attributes ||
codec.isAnonymous) {
return fields;
}
// TODO: This may need to change once V5 fixes the need for it
const source = Object.values(build.input.pgRegistry.pgResources).find((s) => s.codec === codec && !s.parameters && !s.isUnique);
if (!source) {
return fields;
}
const computedAttributeResources = (0, utils_1.getComputedAttributeResources)(build, source);
for (const computedAttributeResource of computedAttributeResources) {
// Must return a scalar or an array
if (!computedAttributeResource.isUnique) {
continue;
}
if (computedAttributeResource.codec.attributes) {
continue;
}
if (computedAttributeResource.codec === TYPES.void) {
continue;
}
const digest = connectionFilterOperatorsDigest(computedAttributeResource.codec);
if (!digest) {
continue;
}
const OperatorsType = build.getTypeByName(digest.operatorsTypeName);
if (!OperatorsType) {
continue;
}
if (!build.behavior.pgResourceMatches(computedAttributeResource, "filterBy")) {
continue;
}
const { argDetails } = build.pgGetArgDetailsFromParameters(computedAttributeResource, computedAttributeResource.parameters.slice(1));
// Must have only one required argument
if (argDetails.some((a) => !a.optional)) {
continue;
}
// Looks good
const fieldName = inflection.computedAttributeField({
resource: computedAttributeResource,
});
const functionResultCodec = computedAttributeResource.codec;
fields = build.extend(fields, {
[fieldName]: fieldWithHooks({
fieldName,
isPgConnectionFilterField: true,
}, {
description: `Filter by the object’s \`${fieldName}\` field.`,
type: OperatorsType,
apply: EXPORTABLE((PgCondition, computedAttributeResource, fieldName, functionResultCodec, pgConnectionFilterApplyComputedAttribute) => function ($where, value) {
return pgConnectionFilterApplyComputedAttribute(PgCondition, computedAttributeResource, fieldName, functionResultCodec, $where, value);
}, [
PgCondition,
computedAttributeResource,
fieldName,
functionResultCodec,
pgConnectionFilterApplyComputedAttribute,
]),
}),
}, "");
}
return fields;
},
},
},
};
//# sourceMappingURL=PgConnectionArgFilterComputedAttributesPlugin.js.map