UNPKG

graphql-sequelize-helper

Version:

graphql-sequelize-helper transform Sequelize models to GraphQL schemas that is compatible with Relay. * <a href="http://docs.sequelizejs.com/">Sequelize</a> is a promise-based Node.js ORM for Postgres, MySQL, SQLite and Microsoft SQL Server. It features s

156 lines (125 loc) 4.5 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _defineProperty2 = require('babel-runtime/helpers/defineProperty'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _graphql = require('graphql'); var graphql = _interopRequireWildcard(_graphql); var _camelcase = require('camelcase'); var _camelcase2 = _interopRequireDefault(_camelcase); var _type2 = require('../type'); var _type3 = _interopRequireDefault(_type2); var _index = require('../utils/index'); var _transformer = require('../transformer'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // TODO: 操作符 and or,关联model查询 var options = ['eq', 'neq', 'gt', 'gte', 'lt', 'lte', 'like', 'in']; var generateAttributes = function generateAttributes(model) { var findFields = {}; var attributes = _lodash2.default.assign((0, _transformer.toAttributesFields)(model, { allowNull: true, exclude: ['id'] }), { id: { type: _type3.default.GraphQLScalarTypes.globalIdInputType(model.name) } }); _lodash2.default.forOwn(attributes, function (value, key) { findFields[key] = value; options.map(function (oKey) { switch (oKey) { case 'in': value = { type: new graphql.GraphQLList(value.type) }; break; default: break; } findFields[key + '_' + oKey] = value; }); }); return findFields; }; /** * model的所有字段自动生成相应的查询操作 * @param model * @return {{type: GraphQLInputObjectType}} */ var toWhereFields = function toWhereFields(model) { // const attributes = model.rawAttributes var findFields = {}; _lodash2.default.assign(findFields, generateAttributes(model)); var include = {}; _lodash2.default.forOwn(model.associations, function (value, key) { if (value.associationType === 'HasMany') { var target = value.target; var targetFields = generateAttributes(target); include[target.name] = { type: new graphql.GraphQLInputObjectType({ name: _index.StringHelper.toInitialUpperCase((0, _camelcase2.default)(model.name + '_' + key + '_Condition')), fields: targetFields }) }; } }); // 关联查询 if (!_lodash2.default.isEmpty(include)) { _lodash2.default.assign(findFields, { include: { type: new graphql.GraphQLInputObjectType({ name: model.name + 'Include', fields: include }) } }); } return { type: new graphql.GraphQLInputObjectType({ name: model.name + 'Condition', fields: findFields }) }; }; /** * 单个条件的映射 * @param value eg: "%bob%" * @param name eg: "username_like" * @return {username: {like: "%bob%"}} */ var fieldToWhere = function fieldToWhere(value, name) { var nameArr = name.split('_'); var word = nameArr[nameArr.length - 1]; var op = options.indexOf(word) === -1 ? '' : word; name = op ? name.replace('_' + op, '') : name; value = op ? (0, _defineProperty3.default)({}, op, value) : value; return (0, _defineProperty3.default)({}, name, value); }; /** * where条件重组 * @param value eg: {username_like: "%bob%"} * @return eg: {username: {like: "%bob%"}} */ var generateWhere = function generateWhere(value) { var returnValue = {}; _lodash2.default.forOwn(value, function (field, fieldName) { if (fieldName === 'include') { _lodash2.default.forOwn(field, function (includeField, includeName) { var includeFields = (0, _defineProperty3.default)({}, includeName, generateWhere(includeField)); // TODO: 更深层次的关联查询 returnValue.include = (0, _extends3.default)({}, returnValue.include, includeFields); }); } else { _lodash2.default.assign(returnValue, fieldToWhere(field, fieldName)); } }); return returnValue; }; exports.default = { toWhereFields: toWhereFields, generateWhere: generateWhere };