Cleanup old graphql code

Signed-off-by: Alexandre Bodin <bodin.alex@gmail.com>
This commit is contained in:
Alexandre Bodin 2020-02-10 14:19:54 +01:00
parent 3ce852af61
commit f1cbc014da
4 changed files with 78 additions and 77 deletions

View File

@ -9,8 +9,7 @@ const pluralize = require('pluralize');
const { convertRestQueryParams, buildQuery } = require('strapi-utils'); const { convertRestQueryParams, buildQuery } = require('strapi-utils');
const Schema = require('./Schema.js'); const Schema = require('./Schema.js');
const GraphQLQuery = require('./Query.js'); const { convertToParams, convertToQuery } = require('./utils');
/* eslint-disable no-unused-vars */
/** /**
* Returns all fields of type primitive * Returns all fields of type primitive
@ -86,7 +85,7 @@ const fieldResolver = (field, key) => {
return object => { return object => {
const resolver = const resolver =
field.resolve || field.resolve ||
function resolver(obj, options, context) { function resolver(obj) {
// eslint-disable-line no-unused-vars // eslint-disable-line no-unused-vars
return obj[key]; return obj[key];
}; };
@ -179,8 +178,8 @@ const createAggregationFieldsResolver = function(
fields, fields,
async (obj, options, context, fieldResolver, fieldKey) => { async (obj, options, context, fieldResolver, fieldKey) => {
const filters = convertRestQueryParams({ const filters = convertRestQueryParams({
...GraphQLQuery.convertToParams(_.omit(obj, 'where')), ...convertToParams(_.omit(obj, 'where')),
...GraphQLQuery.convertToQuery(obj.where), ...convertToQuery(obj.where),
}); });
return buildQuery({ model, filters, aggregate: true }) return buildQuery({ model, filters, aggregate: true })
@ -198,7 +197,7 @@ const createAggregationFieldsResolver = function(
/** /**
* Correctly format the data returned by the group by * Correctly format the data returned by the group by
*/ */
const preProcessGroupByData = function({ result, fieldKey, filters, model }) { const preProcessGroupByData = function({ result, fieldKey, filters }) {
const _result = _.toArray(result); const _result = _.toArray(result);
return _.map(_result, value => { return _.map(_result, value => {
return { return {
@ -237,7 +236,7 @@ const preProcessGroupByData = function({ result, fieldKey, filters, model }) {
* email: function emailResolver() { .... } * email: function emailResolver() { .... }
* } * }
*/ */
const createGroupByFieldsResolver = function(model, fields, name) { const createGroupByFieldsResolver = function(model, fields) {
const resolver = async ( const resolver = async (
filters, filters,
options, options,
@ -246,8 +245,8 @@ const createGroupByFieldsResolver = function(model, fields, name) {
fieldKey fieldKey
) => { ) => {
const params = { const params = {
...GraphQLQuery.convertToParams(_.omit(filters, 'where')), ...convertToParams(_.omit(filters, 'where')),
...GraphQLQuery.convertToQuery(filters.where), ...convertToQuery(filters.where),
}; };
const result = await buildQuery({ const result = await buildQuery({
@ -262,7 +261,6 @@ const createGroupByFieldsResolver = function(model, fields, name) {
result, result,
fieldKey, fieldKey,
filters, filters,
model,
}); });
}; };
@ -296,7 +294,7 @@ const generateConnectionFieldsTypes = function(fields, model) {
.join('\n\n'); .join('\n\n');
}; };
const formatConnectionGroupBy = function(fields, model, name) { const formatConnectionGroupBy = function(fields, model) {
const { globalId } = model; const { globalId } = model;
const groupByGlobalId = `${globalId}GroupBy`; const groupByGlobalId = `${globalId}GroupBy`;
@ -318,11 +316,7 @@ const formatConnectionGroupBy = function(fields, model, name) {
globalId: groupByGlobalId, globalId: groupByGlobalId,
type: groupByTypes, type: groupByTypes,
resolver: { resolver: {
[groupByGlobalId]: createGroupByFieldsResolver( [groupByGlobalId]: createGroupByFieldsResolver(model, groupByFields),
model,
groupByFields,
name
),
}, },
}; };
}; };
@ -354,8 +348,8 @@ const formatConnectionAggregator = function(fields, model, modelName) {
let resolvers = { let resolvers = {
[aggregatorGlobalId]: { [aggregatorGlobalId]: {
count(obj, options, context) { count(obj) {
const opts = GraphQLQuery.convertToQuery(obj.where); const opts = convertToQuery(obj.where);
if (opts._q) { if (opts._q) {
// allow search param // allow search param
@ -363,7 +357,7 @@ const formatConnectionAggregator = function(fields, model, modelName) {
} }
return strapi.query(modelName, model.plugin).count(opts); return strapi.query(modelName, model.plugin).count(opts);
}, },
totalCount(obj, options, context) { totalCount() {
return strapi.query(modelName, model.plugin).count({}); return strapi.query(modelName, model.plugin).count({});
}, },
}, },
@ -372,7 +366,7 @@ const formatConnectionAggregator = function(fields, model, modelName) {
// Only add the aggregator's operations types and resolver if there are some numeric fields // Only add the aggregator's operations types and resolver if there are some numeric fields
if (!_.isEmpty(numericFields)) { if (!_.isEmpty(numericFields)) {
// Returns the actual object and handle aggregation in the query resolvers // Returns the actual object and handle aggregation in the query resolvers
const defaultAggregatorFunc = (obj, options, context) => { const defaultAggregatorFunc = obj => {
// eslint-disable-line no-unused-vars // eslint-disable-line no-unused-vars
return obj; return obj;
}; };
@ -471,19 +465,13 @@ const formatConnectionAggregator = function(fields, model, modelName) {
* } * }
* *
*/ */
const formatModelConnectionsGQL = function({ const formatModelConnectionsGQL = function({ fields, model, name, resolver }) {
fields,
model,
name,
resolver,
plugin,
}) {
const { globalId } = model; const { globalId } = model;
const connectionGlobalId = `${globalId}Connection`; const connectionGlobalId = `${globalId}Connection`;
const aggregatorFormat = formatConnectionAggregator(fields, model, name); const aggregatorFormat = formatConnectionAggregator(fields, model, name);
const groupByFormat = formatConnectionGroupBy(fields, model, name); const groupByFormat = formatConnectionGroupBy(fields, model);
const connectionFields = { const connectionFields = {
values: `[${globalId}]`, values: `[${globalId}]`,
groupBy: `${globalId}GroupBy`, groupBy: `${globalId}GroupBy`,
@ -518,7 +506,7 @@ const formatModelConnectionsGQL = function({
Query: { Query: {
[connectionQueryName]: Schema.buildQuery(connectionQueryName, { [connectionQueryName]: Schema.buildQuery(connectionQueryName, {
resolverOf: resolver.resolverOf || resolver.resolver, resolverOf: resolver.resolverOf || resolver.resolver,
resolver(obj, options, { context }) { resolver(obj, options) {
return options; return options;
}, },
}), }),
@ -527,10 +515,10 @@ const formatModelConnectionsGQL = function({
values(obj, options, gqlCtx) { values(obj, options, gqlCtx) {
return connectionResolver(obj, obj, gqlCtx); return connectionResolver(obj, obj, gqlCtx);
}, },
groupBy(obj, options, context) { groupBy(obj) {
return obj; return obj;
}, },
aggregate(obj, options, context) { aggregate(obj) {
return obj; return obj;
}, },
}, },

View File

@ -11,11 +11,15 @@ const _ = require('lodash');
const DynamicZoneScalar = require('../types/dynamiczoneScalar'); const DynamicZoneScalar = require('../types/dynamiczoneScalar');
const Aggregator = require('./Aggregator'); const Aggregator = require('./Aggregator');
const Query = require('./Query.js');
const Types = require('./Types.js'); const Types = require('./Types.js');
const Schema = require('./Schema.js'); const Schema = require('./Schema.js');
const {
mergeSchemas,
convertToParams,
convertToQuery,
amountLimiting,
} = require('./utils');
const { toSingular, toPlural } = require('./naming'); const { toSingular, toPlural } = require('./naming');
const { mergeSchemas } = require('./utils');
const isQueryEnabled = (schema, name) => { const isQueryEnabled = (schema, name) => {
return _.get(schema, ['resolver', 'Query', name]) !== false; return _.get(schema, ['resolver', 'Query', name]) !== false;
@ -181,11 +185,11 @@ const buildAssocResolvers = model => {
obj[association.alias] obj[association.alias]
); );
} else { } else {
const queryParams = Query.amountLimiting(options); const queryParams = amountLimiting(options);
queryOpts = { queryOpts = {
...queryOpts, ...queryOpts,
...Query.convertToParams(_.omit(queryParams, 'where')), // Convert filters (sort, limit and start/skip) ...convertToParams(_.omit(queryParams, 'where')), // Convert filters (sort, limit and start/skip)
...Query.convertToQuery(queryParams.where), ...convertToQuery(queryParams.where),
}; };
if ( if (

View File

@ -11,7 +11,14 @@ const _ = require('lodash');
const graphql = require('graphql'); const graphql = require('graphql');
const Types = require('./Types.js'); const Types = require('./Types.js');
const Resolvers = require('./Resolvers.js'); const Resolvers = require('./Resolvers.js');
const { mergeSchemas, createDefaultSchema, diffResolvers } = require('./utils'); const {
mergeSchemas,
createDefaultSchema,
diffResolvers,
convertToParams,
convertToQuery,
amountLimiting,
} = require('./utils');
const policyUtils = require('strapi-utils').policy; const policyUtils = require('strapi-utils').policy;
const compose = require('koa-compose'); const compose = require('koa-compose');
@ -288,7 +295,6 @@ const buildResolvers = resolvers => {
}, {}); }, {});
}; };
// TODO: implement
const buildMutation = (mutationName, config) => { const buildMutation = (mutationName, config) => {
const { resolver, resolverOf, transformOutput = _.identity } = config; const { resolver, resolverOf, transformOutput = _.identity } = config;
@ -432,45 +438,6 @@ const buildQueryContext = ({ options, graphqlContext }) => {
return { ctx, opts }; return { ctx, opts };
}; };
const convertToParams = params => {
return Object.keys(params).reduce((acc, current) => {
const key = current === 'id' ? 'id' : `_${current}`;
acc[key] = params[current];
return acc;
}, {});
};
const convertToQuery = params => {
const result = {};
_.forEach(params, (value, key) => {
if (_.isPlainObject(value)) {
const flatObject = convertToQuery(value);
_.forEach(flatObject, (_value, _key) => {
result[`${key}.${_key}`] = _value;
});
} else {
result[key] = value;
}
});
return result;
};
const amountLimiting = (params = {}) => {
const { amountLimit } = strapi.plugins.graphql.config;
if (!amountLimit) return params;
if (!params.limit || params.limit === -1 || params.limit > amountLimit) {
params.limit = amountLimit;
} else if (params.limit < 0) {
params.limit = 0;
}
return params;
};
const getAction = resolver => { const getAction = resolver => {
if (!_.isString(resolver)) { if (!_.isString(resolver)) {
throw new Error(`Error building query. Expected a string, got ${resolver}`); throw new Error(`Error building query. Expected a string, got ${resolver}`);

View File

@ -40,8 +40,50 @@ const diffResolvers = (object, base) => {
return newObj; return newObj;
}; };
const convertToParams = params => {
return Object.keys(params).reduce((acc, current) => {
const key = current === 'id' ? 'id' : `_${current}`;
acc[key] = params[current];
return acc;
}, {});
};
const convertToQuery = params => {
const result = {};
_.forEach(params, (value, key) => {
if (_.isPlainObject(value)) {
const flatObject = convertToQuery(value);
_.forEach(flatObject, (_value, _key) => {
result[`${key}.${_key}`] = _value;
});
} else {
result[key] = value;
}
});
return result;
};
const amountLimiting = (params = {}) => {
const { amountLimit } = strapi.plugins.graphql.config;
if (!amountLimit) return params;
if (!params.limit || params.limit === -1 || params.limit > amountLimit) {
params.limit = amountLimit;
} else if (params.limit < 0) {
params.limit = 0;
}
return params;
};
module.exports = { module.exports = {
diffResolvers, diffResolvers,
mergeSchemas, mergeSchemas,
createDefaultSchema, createDefaultSchema,
convertToParams,
convertToQuery,
amountLimiting,
}; };