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

219 lines (186 loc) 7.64 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 _graphql = require('graphql'); var _defaults = require('defaults'); var _defaults2 = _interopRequireDefault(_defaults); var _camelcase = require('camelcase'); var _camelcase2 = _interopRequireDefault(_camelcase); var _lodash = require('lodash'); var _lodash2 = _interopRequireDefault(_lodash); var _utils = require('../utils'); var _transformer = require('../transformer'); var _query = require('../query'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var associationFields = function associationFields(_ref) { var model = _ref.model, modelTypes = _ref.modelTypes; var fields = {}; var associations = model.associations; for (var associationKey in associations) { var connectionName = _utils.utils.connectionNameForAssociation(model, associationKey); fields[(0, _camelcase2.default)(associationKey)] = modelTypes[connectionName]; } return fields; }; // relay connection var connectionModel = function connectionModel(_ref2) { var model = _ref2.model, schemaConfig = _ref2.schemaConfig, modelType = _ref2.modelType, connectionName = _ref2.connectionName; var modelConfig = _utils.utils.getModelGrapqhQLConfig(model); var connectionWrapper = (0, _defaults2.default)(modelConfig.connection, {}); connectionName = connectionName || model.name; var connectionWrapperFunction = connectionWrapper[connectionName] || function (obj) { return obj; }; var orderBy = {}; // console.log('attributes', _.keys(model.attributes)) // 所有字段设置排序条件 _lodash2.default.forOwn(model.rawAttributes || model.target.rawAttributes, function (value, key) { var _$assign; _lodash2.default.assign(orderBy, (_$assign = {}, (0, _defineProperty3.default)(_$assign, (key + '_asc').toUpperCase(), { value: [key, 'ASC'] }), (0, _defineProperty3.default)(_$assign, (key + '_desc').toUpperCase(), { value: [key, 'DESC'] }), _$assign)); }); // console.log('orderBy', orderBy) return schemaConfig.sequelizeConnection(connectionWrapperFunction({ name: connectionName, nodeType: modelType, target: model, orderBy: new _graphql.GraphQLEnumType({ name: connectionName + 'OrderBy', values: orderBy }), connectionFields: { count: { type: _graphql.GraphQLInt, resolve: function resolve(_ref3) { var source = _ref3.source, edges = _ref3.edges, fullCount = _ref3.fullCount; return fullCount || edges.length; } } }, where: function where(key, value, currentWhere) { // 查询条件覆盖, args: { condition: { gender: 1 } } if (key === 'condition' && value) { _lodash2.default.assign(currentWhere, _query.attributesToFindOptions.generateWhere(value)); } // return {[key]: value}; }, before: function before(findOptions, args, context) { // args的orderBy覆盖findOptions的,支持多个order by if (args.orderBy && args.orderBy.length > 0) { findOptions.order = args.orderBy; } else { // 默认id降序 findOptions.order = [['id', 'DESC']]; } // 增加group by的支持 if (args.groupBy) findOptions.group = args.groupBy; // 获取手动添加的include args: { include: [ { model: Order, where: {} } ] } var include = _lodash2.default.get(args, 'include', []); // 获取graphql接口的条件 var whereInclude = _lodash2.default.get(findOptions, 'where.include', {}); if (!_lodash2.default.isEmpty(whereInclude)) { // TODO: 更深层次的关联查询 _lodash2.default.forOwn(whereInclude, function (value, key) { var model = context.models[key]; if (model) { if (!_lodash2.default.isEmpty(value)) { include.push({ model: model, where: value }); } } }); delete findOptions.where.include; } _lodash2.default.assign(findOptions, { include: include }); return findOptions; } })); }; var generateLinks = function generateLinks(modelConfig, modelTypes) { var returnLinks = {}; // 自定义links var links = _lodash2.default.get(modelConfig, 'links', null); if (links) { _lodash2.default.assign(returnLinks, (0, _transformer.toGraphqlType)({ obj: links, modelTypes: modelTypes, useRoot: true })); } return returnLinks; }; exports.default = function (_ref4) { var models = _ref4.models, schemaConfig = _ref4.schemaConfig; var modelTypes = {}; // setup modelTypes var _loop = function _loop(modelName) { var model = models[modelName]; var config = model.config || {}; var modelConfig = _utils.utils.getModelGrapqhQLConfig(model); var modelType = new _graphql.GraphQLObjectType(modelConfig.modelType({ name: _utils.utils.getTableName(model), description: config.description, fields: function fields() { var defaultFields = (0, _transformer.toAttributesFields)(model, (0, _defaults2.default)(modelConfig.fieldConfig, { globalId: true, commentToDescription: true })); var defaultAssociationFields = associationFields({ model: model, modelTypes: modelTypes }); var returnLinks = generateLinks(modelConfig, modelTypes); return (0, _extends3.default)({}, defaultFields, defaultAssociationFields, returnLinks); }, interfaces: function interfaces() { return []; } })); // connection var connectionName = _utils.utils.connectionName(model); modelTypes[connectionName] = connectionModel({ model: model, schemaConfig: schemaConfig, modelType: modelType }); modelTypes[_utils.utils.getTableName(model)] = modelType; }; for (var modelName in models) { _loop(modelName); } // setup connectionType // TODO: need to customize here for (var modelName in models) { var _model = models[modelName]; var _modelConfig = _utils.utils.getModelGrapqhQLConfig(_model); var connectionWrapper = (0, _defaults2.default)(_modelConfig.connection, {}); var associations = _model.associations; for (var associationKey in associations) { var association = associations[associationKey]; var associationType = association.associationType, target = association.target; var targetType = modelTypes[target.name]; var connectionName = _utils.utils.connectionNameForAssociation(_model, associationKey); var connectionWrapperFunction = connectionWrapper[connectionName] || function (obj) { return obj; }; if (associationType === 'BelongsTo') { modelTypes[connectionName] = connectionWrapperFunction({ type: targetType, resolve: schemaConfig.resolver(association) }); } else { var connection = connectionModel({ model: association, schemaConfig: schemaConfig, modelType: targetType, connectionName: connectionName }); modelTypes[connectionName] = { description: connectionName + '...', type: connection.connectionType, args: connection.connectionArgs, resolve: connection.resolve }; } } } return modelTypes; };