From 13c912196a314198f27d94e9b73e16f1cf1072ab Mon Sep 17 00:00:00 2001 From: Julien Michel Date: Thu, 24 Nov 2016 11:04:29 +0100 Subject: [PATCH 1/2] add inheritence --- build/app.js | 248 ++++++++++++++++-- dest/temp/ActiveRecord.js | 4 + dest/temp/DaoHelper.js | 9 + dest/temp/Discriminator.js | 64 +++++ dest/temp/GenericDao.js | 28 +- dest/temp/app.js | 7 +- dest/temp/managers/tstManager4.js | 53 ++++ dest/temp/models/tstModel4.js | 54 ++++ .../specs/angular-dao-discriminators.specs.js | 58 ++++ package.json | 2 +- src/ActiveRecord.js | 1 + src/DaoHelper.js | 8 + src/Discriminator.js | 24 ++ src/GenericDao.js | 28 +- tst/app.js | 4 +- tst/managers/tstManager4.js | 14 + tst/models/tstModel4.js | 24 ++ tst/specs/angular-dao-discriminators.specs.js | 59 +++++ 18 files changed, 663 insertions(+), 26 deletions(-) create mode 100644 dest/temp/Discriminator.js create mode 100644 dest/temp/managers/tstManager4.js create mode 100644 dest/temp/models/tstModel4.js create mode 100644 dest/temp/specs/angular-dao-discriminators.specs.js create mode 100644 src/Discriminator.js create mode 100644 tst/managers/tstManager4.js create mode 100644 tst/models/tstModel4.js create mode 100644 tst/specs/angular-dao-discriminators.specs.js diff --git a/build/app.js b/build/app.js index 7339b79..094e573 100644 --- a/build/app.js +++ b/build/app.js @@ -18,6 +18,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _Discriminator = require('./Discriminator'); + +var _Discriminator2 = _interopRequireDefault(_Discriminator); + var _ServiceLocator = require('./ServiceLocator'); var _ServiceLocator2 = _interopRequireDefault(_ServiceLocator); @@ -479,7 +483,7 @@ function ActiveRecord(model, name) { } module.exports = exports['default']; -},{"./ServiceLocator":5,"./SessionManager":6,"deep-diff":14}],2:[function(require,module,exports){ +},{"./Discriminator":3,"./ServiceLocator":6,"./SessionManager":7,"deep-diff":17}],2:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -531,6 +535,15 @@ var DaoHelper = (function () { value: function setRootUrl(url) { this.dao.url = url; } + }, { + key: 'setDiscriminatorUrl', + value: function setDiscriminatorUrl(type, url) { + _.each(this.dao.discriminators, function (discriminator) { + if (discriminator.type === type) { + discriminator.discriminatorUrl = url; + } + }); + } }, { key: '$get', value: function $get() { @@ -555,7 +568,72 @@ var DaoHelper = (function () { exports['default'] = DaoHelper; module.exports = exports['default']; -},{"./ServiceLocator":5}],3:[function(require,module,exports){ +},{"./ServiceLocator":6}],3:[function(require,module,exports){ +//_ = require('lodash'); +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +// istanbul ignore next + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +// istanbul ignore next + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +exports['default'] = Discriminator; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +// istanbul ignore next + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _ServiceLocator = require('./ServiceLocator'); + +var _ServiceLocator2 = _interopRequireDefault(_ServiceLocator); + +var _SessionManager = require('./SessionManager'); + +var _SessionManager2 = _interopRequireDefault(_SessionManager); + +function Discriminator(Model, type, url) { + + var Discriminator = (function (_Model) { + _inherits(Discriminator, _Model); + + _createClass(Discriminator, null, [{ + key: 'type', + get: function get() { + return type; + } + }]); + + function Discriminator($injector, rootUrl, options) { + _classCallCheck(this, Discriminator); + + _get(Object.getPrototypeOf(Discriminator.prototype), 'constructor', this).call(this, $injector, rootUrl, options); + this.rootUrl = url; + } + + // static get discriminatorUrl(){ + // return url + // } + return Discriminator; + })(Model); + + return Discriminator; +} + +module.exports = exports['default']; +},{"./ServiceLocator":6,"./SessionManager":7}],4:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -582,7 +660,7 @@ var _QueryBuilder = require('./QueryBuilder'); var _QueryBuilder2 = _interopRequireDefault(_QueryBuilder); -function GenericDao(model, qb) { +function GenericDao(model, qb, discriminators) { var sl = _ServiceLocator2['default'].instance; sl.registerModel(model.getName(), model); var myClass = (function () { @@ -593,6 +671,7 @@ function GenericDao(model, qb) { // this.$http = $injector.get('$http'); this.url = url; this.model = model; + this.discriminators = discriminators; } _createClass(myClass, [{ @@ -652,7 +731,15 @@ function GenericDao(model, qb) { if (Array.isArray(data)) { return data.map(this.build, this); } - return new model(this.$injector, this.url, data); + var url = this.url; + if (data.__t) { + _.each(this.discriminators, function (discriminator) { + if (discriminator.type == data.__t) { + url = discriminator.discriminatorUrl; + } + }); + } + return new model(this.$injector, url, data); } }, { key: 'post', @@ -687,8 +774,21 @@ function GenericDao(model, qb) { }, { key: 'create', value: function create(params) { - return new this.model(this.$injector, this.url, params); + var url = this.url; + if (params.__t) { + _.each(this.discriminators, function (discriminator) { + if (discriminator.type == params.__t) { + + url = discriminator.discriminatorUrl; + } + }); + } + return new this.model(this.$injector, url, params); } + + // get discriminators(){ + // return discriminators + // } }, { key: '$http', get: function get() { @@ -761,7 +861,7 @@ function GenericDao(model, qb) { } module.exports = exports['default']; -},{"./QueryBuilder":4,"./ServiceLocator":5}],4:[function(require,module,exports){ +},{"./QueryBuilder":5,"./ServiceLocator":6}],5:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -923,7 +1023,7 @@ var QueryBuilder = (function () { exports['default'] = QueryBuilder; module.exports = exports['default']; -},{}],5:[function(require,module,exports){ +},{}],6:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -993,7 +1093,7 @@ var ServiceLocator = (function () { exports["default"] = ServiceLocator; module.exports = exports["default"]; -},{}],6:[function(require,module,exports){ +},{}],7:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -1054,7 +1154,7 @@ function SessionManager(model) { } module.exports = exports['default']; -},{"./ServiceLocator":5}],7:[function(require,module,exports){ +},{"./ServiceLocator":6}],8:[function(require,module,exports){ 'use strict'; // istanbul ignore next @@ -1077,12 +1177,17 @@ var _managersTstManager3 = require('./managers/tstManager3'); var _managersTstManager32 = _interopRequireDefault(_managersTstManager3); +var _managersTstManager4 = require('./managers/tstManager4'); + +var _managersTstManager42 = _interopRequireDefault(_managersTstManager4); + var _module = angular.module('tstModule', []); _DaoHelper2['default'].registerService(_module, 'ModelManager', _managersTstManager12['default']); _DaoHelper2['default'].registerService(_module, 'ModelManager2', _managersTstManager22['default']); _DaoHelper2['default'].registerService(_module, 'ModelManager3', _managersTstManager32['default']); -},{"./DaoHelper":2,"./managers/tstManager1":8,"./managers/tstManager2":9,"./managers/tstManager3":10}],8:[function(require,module,exports){ +_DaoHelper2['default'].registerService(_module, 'ModelManager4', _managersTstManager42['default']); +},{"./DaoHelper":2,"./managers/tstManager1":9,"./managers/tstManager2":10,"./managers/tstManager3":11,"./managers/tstManager4":12}],9:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -1133,7 +1238,7 @@ var ModelManager = (function (_DAO) { exports['default'] = ModelManager; ; module.exports = exports['default']; -},{"../GenericDao":3,"../QueryBuilder":4,"./../models/tstModel1.js":11}],9:[function(require,module,exports){ +},{"../GenericDao":4,"../QueryBuilder":5,"./../models/tstModel1.js":13}],10:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -1184,7 +1289,7 @@ var ModelManager2 = (function (_DAO) { exports['default'] = ModelManager2; ; module.exports = exports['default']; -},{"../GenericDao":3,"../QueryBuilder":4,"./../models/tstModel2.js":12}],10:[function(require,module,exports){ +},{"../GenericDao":4,"../QueryBuilder":5,"./../models/tstModel2.js":14}],11:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -1235,7 +1340,61 @@ var ModelManager3 = (function (_DAO) { exports['default'] = ModelManager3; ; module.exports = exports['default']; -},{"../GenericDao":3,"../QueryBuilder":4,"./../models/tstModel3.js":13}],11:[function(require,module,exports){ +},{"../GenericDao":4,"../QueryBuilder":5,"./../models/tstModel3.js":15}],12:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +// istanbul ignore next + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +// istanbul ignore next + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _modelsTstModel4Js = require('./../models/tstModel4.js'); + +var _modelsTstModel4Js2 = _interopRequireDefault(_modelsTstModel4Js); + +var _GenericDao = require('../GenericDao'); + +var _GenericDao2 = _interopRequireDefault(_GenericDao); + +var _Discriminator = require('../Discriminator'); + +var _Discriminator2 = _interopRequireDefault(_Discriminator); + +var D1 = (0, _Discriminator2['default'])(_modelsTstModel4Js2['default'], 'Type1'); +var D2 = (0, _Discriminator2['default'])(_modelsTstModel4Js2['default'], 'Type2'); + +var DAO = (0, _GenericDao2['default'])(_modelsTstModel4Js2['default'], undefined, [D1, D2]); + +var ModelManager4 = (function (_DAO) { + _inherits(ModelManager4, _DAO); + + function ModelManager4() { + _classCallCheck(this, ModelManager4); + + _get(Object.getPrototypeOf(ModelManager4.prototype), 'constructor', this).apply(this, arguments); + } + + return ModelManager4; +})(DAO); + +exports['default'] = ModelManager4; +; +module.exports = exports['default']; +},{"../Discriminator":3,"../GenericDao":4,"./../models/tstModel4.js":16}],13:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -1312,7 +1471,7 @@ var Model = (function (_AR) { exports['default'] = Model; module.exports = exports['default']; -},{"../ActiveRecord":1}],12:[function(require,module,exports){ +},{"../ActiveRecord":1}],14:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -1365,7 +1524,7 @@ var Model2 = (function (_AR) { exports['default'] = Model2; module.exports = exports['default']; -},{"../ActiveRecord":1}],13:[function(require,module,exports){ +},{"../ActiveRecord":1}],15:[function(require,module,exports){ 'use strict'; Object.defineProperty(exports, '__esModule', { @@ -1418,7 +1577,62 @@ var Model3 = (function (_AR) { exports['default'] = Model3; module.exports = exports['default']; -},{"../ActiveRecord":1}],14:[function(require,module,exports){ +},{"../ActiveRecord":1}],16:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +// istanbul ignore next + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +// istanbul ignore next + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _ActiveRecord = require('../ActiveRecord'); + +var _ActiveRecord2 = _interopRequireDefault(_ActiveRecord); + +var model = { + + _id: { + type: String, + unique: true + }, + + //private: true + name: String, + + __t: String +}; + +var AR = (0, _ActiveRecord2['default'])(model, 'Model4'); + +var Model4 = (function (_AR) { + _inherits(Model4, _AR); + + function Model4() { + _classCallCheck(this, Model4); + + _get(Object.getPrototypeOf(Model4.prototype), 'constructor', this).apply(this, arguments); + } + + return Model4; +})(AR); + +exports['default'] = Model4; +module.exports = exports['default']; +},{"../ActiveRecord":1}],17:[function(require,module,exports){ (function (global){ /*! * deep-diff. @@ -1844,4 +2058,4 @@ module.exports = exports['default']; })); }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}]},{},[7]); +},{}]},{},[8]); diff --git a/dest/temp/ActiveRecord.js b/dest/temp/ActiveRecord.js index 39ad685..2dac47a 100644 --- a/dest/temp/ActiveRecord.js +++ b/dest/temp/ActiveRecord.js @@ -17,6 +17,10 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'd function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } +var _Discriminator = require('./Discriminator'); + +var _Discriminator2 = _interopRequireDefault(_Discriminator); + var _ServiceLocator = require('./ServiceLocator'); var _ServiceLocator2 = _interopRequireDefault(_ServiceLocator); diff --git a/dest/temp/DaoHelper.js b/dest/temp/DaoHelper.js index e654d49..9eb7518 100644 --- a/dest/temp/DaoHelper.js +++ b/dest/temp/DaoHelper.js @@ -49,6 +49,15 @@ var DaoHelper = (function () { value: function setRootUrl(url) { this.dao.url = url; } + }, { + key: 'setDiscriminatorUrl', + value: function setDiscriminatorUrl(type, url) { + _.each(this.dao.discriminators, function (discriminator) { + if (discriminator.type === type) { + discriminator.discriminatorUrl = url; + } + }); + } }, { key: '$get', value: function $get() { diff --git a/dest/temp/Discriminator.js b/dest/temp/Discriminator.js new file mode 100644 index 0000000..0c8974f --- /dev/null +++ b/dest/temp/Discriminator.js @@ -0,0 +1,64 @@ +//_ = require('lodash'); +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +// istanbul ignore next + +var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); + +// istanbul ignore next + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +exports['default'] = Discriminator; +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +// istanbul ignore next + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _ServiceLocator = require('./ServiceLocator'); + +var _ServiceLocator2 = _interopRequireDefault(_ServiceLocator); + +var _SessionManager = require('./SessionManager'); + +var _SessionManager2 = _interopRequireDefault(_SessionManager); + +function Discriminator(Model, type, url) { + + var Discriminator = (function (_Model) { + _inherits(Discriminator, _Model); + + _createClass(Discriminator, null, [{ + key: 'type', + get: function get() { + return type; + } + }]); + + function Discriminator($injector, rootUrl, options) { + _classCallCheck(this, Discriminator); + + _get(Object.getPrototypeOf(Discriminator.prototype), 'constructor', this).call(this, $injector, rootUrl, options); + this.rootUrl = url; + } + + // static get discriminatorUrl(){ + // return url + // } + return Discriminator; + })(Model); + + return Discriminator; +} + +module.exports = exports['default']; \ No newline at end of file diff --git a/dest/temp/GenericDao.js b/dest/temp/GenericDao.js index 01c57a4..3421232 100644 --- a/dest/temp/GenericDao.js +++ b/dest/temp/GenericDao.js @@ -24,7 +24,7 @@ var _QueryBuilder = require('./QueryBuilder'); var _QueryBuilder2 = _interopRequireDefault(_QueryBuilder); -function GenericDao(model, qb) { +function GenericDao(model, qb, discriminators) { var sl = _ServiceLocator2['default'].instance; sl.registerModel(model.getName(), model); var myClass = (function () { @@ -35,6 +35,7 @@ function GenericDao(model, qb) { // this.$http = $injector.get('$http'); this.url = url; this.model = model; + this.discriminators = discriminators; } _createClass(myClass, [{ @@ -94,7 +95,15 @@ function GenericDao(model, qb) { if (Array.isArray(data)) { return data.map(this.build, this); } - return new model(this.$injector, this.url, data); + var url = this.url; + if (data.__t) { + _.each(this.discriminators, function (discriminator) { + if (discriminator.type == data.__t) { + url = discriminator.discriminatorUrl; + } + }); + } + return new model(this.$injector, url, data); } }, { key: 'post', @@ -129,8 +138,21 @@ function GenericDao(model, qb) { }, { key: 'create', value: function create(params) { - return new this.model(this.$injector, this.url, params); + var url = this.url; + if (params.__t) { + _.each(this.discriminators, function (discriminator) { + if (discriminator.type == params.__t) { + + url = discriminator.discriminatorUrl; + } + }); + } + return new this.model(this.$injector, url, params); } + + // get discriminators(){ + // return discriminators + // } }, { key: '$http', get: function get() { diff --git a/dest/temp/app.js b/dest/temp/app.js index 5f03486..6375294 100644 --- a/dest/temp/app.js +++ b/dest/temp/app.js @@ -20,8 +20,13 @@ var _managersTstManager3 = require('./managers/tstManager3'); var _managersTstManager32 = _interopRequireDefault(_managersTstManager3); +var _managersTstManager4 = require('./managers/tstManager4'); + +var _managersTstManager42 = _interopRequireDefault(_managersTstManager4); + var _module = angular.module('tstModule', []); _DaoHelper2['default'].registerService(_module, 'ModelManager', _managersTstManager12['default']); _DaoHelper2['default'].registerService(_module, 'ModelManager2', _managersTstManager22['default']); -_DaoHelper2['default'].registerService(_module, 'ModelManager3', _managersTstManager32['default']); \ No newline at end of file +_DaoHelper2['default'].registerService(_module, 'ModelManager3', _managersTstManager32['default']); +_DaoHelper2['default'].registerService(_module, 'ModelManager4', _managersTstManager42['default']); \ No newline at end of file diff --git a/dest/temp/managers/tstManager4.js b/dest/temp/managers/tstManager4.js new file mode 100644 index 0000000..7e718b0 --- /dev/null +++ b/dest/temp/managers/tstManager4.js @@ -0,0 +1,53 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +// istanbul ignore next + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +// istanbul ignore next + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _modelsTstModel4Js = require('./../models/tstModel4.js'); + +var _modelsTstModel4Js2 = _interopRequireDefault(_modelsTstModel4Js); + +var _GenericDao = require('../GenericDao'); + +var _GenericDao2 = _interopRequireDefault(_GenericDao); + +var _Discriminator = require('../Discriminator'); + +var _Discriminator2 = _interopRequireDefault(_Discriminator); + +var D1 = (0, _Discriminator2['default'])(_modelsTstModel4Js2['default'], 'Type1'); +var D2 = (0, _Discriminator2['default'])(_modelsTstModel4Js2['default'], 'Type2'); + +var DAO = (0, _GenericDao2['default'])(_modelsTstModel4Js2['default'], undefined, [D1, D2]); + +var ModelManager4 = (function (_DAO) { + _inherits(ModelManager4, _DAO); + + function ModelManager4() { + _classCallCheck(this, ModelManager4); + + _get(Object.getPrototypeOf(ModelManager4.prototype), 'constructor', this).apply(this, arguments); + } + + return ModelManager4; +})(DAO); + +exports['default'] = ModelManager4; +; +module.exports = exports['default']; \ No newline at end of file diff --git a/dest/temp/models/tstModel4.js b/dest/temp/models/tstModel4.js new file mode 100644 index 0000000..3ff267d --- /dev/null +++ b/dest/temp/models/tstModel4.js @@ -0,0 +1,54 @@ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +// istanbul ignore next + +var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; + +// istanbul ignore next + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } + +// istanbul ignore next + +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } + +// istanbul ignore next + +function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } + +var _ActiveRecord = require('../ActiveRecord'); + +var _ActiveRecord2 = _interopRequireDefault(_ActiveRecord); + +var model = { + + _id: { + type: String, + unique: true + }, + + //private: true + name: String, + + __t: String +}; + +var AR = (0, _ActiveRecord2['default'])(model, 'Model4'); + +var Model4 = (function (_AR) { + _inherits(Model4, _AR); + + function Model4() { + _classCallCheck(this, Model4); + + _get(Object.getPrototypeOf(Model4.prototype), 'constructor', this).apply(this, arguments); + } + + return Model4; +})(AR); + +exports['default'] = Model4; +module.exports = exports['default']; \ No newline at end of file diff --git a/dest/temp/specs/angular-dao-discriminators.specs.js b/dest/temp/specs/angular-dao-discriminators.specs.js new file mode 100644 index 0000000..39d45fb --- /dev/null +++ b/dest/temp/specs/angular-dao-discriminators.specs.js @@ -0,0 +1,58 @@ +'use strict'; + +describe('Angular DAO', function () { + + var ModelManager, ModelManager3, httpBackend, $rootScope, $timeout; + + beforeEach(function () { + + module('tstModule', function (ModelManager4Provider) { + ModelManager4Provider.setRootUrl('http://MOCKURL.com/model2'); + ModelManager4Provider.setDiscriminatorUrl('Type1', 'http://fakeurl/type1'); + ModelManager4Provider.setDiscriminatorUrl('Type2', 'http://fakeurl/type2'); + }); + + inject(function (_ModelManager4_, $httpBackend, _$rootScope_, _$timeout_) { + ModelManager4 = _ModelManager4_; + httpBackend = $httpBackend; + $rootScope = _$rootScope_; + $timeout = _$timeout_; + }); + }); + + it('should be possible to instantiate discriminators', function () { + expect(ModelManager4.discriminators.length).toEqual(2); + expect(ModelManager4.discriminators[0].type).toEqual('Type1'); + expect(ModelManager4.discriminators[1].type).toEqual('Type2'); + expect(ModelManager4.discriminators[0].discriminatorUrl).toEqual('http://fakeurl/type1'); + expect(ModelManager4.discriminators[1].discriminatorUrl).toEqual('http://fakeurl/type2'); + }); + + it('should make GET queries on parent url', function () { + httpBackend.expectGET('http://MOCKURL.com/model2').respond(); + ModelManager4.get(); + httpBackend.flush(); + }); + + it('should instanciate discriminators according to __t value', function () { + // TODO : make a GET request, respond with two types, and check their urls + httpBackend.expectGET('http://MOCKURL.com/model2').respond([{ _id: 123, name: 'Type1', __t: 'Type1' }, { _id: 321, name: 'Type2', __t: 'Type2' }]); + + ModelManager4.get().then(function (data) { + expect(data.data[0].rootUrl).toEqual('http://fakeurl/type1'); + expect(data.data[1].rootUrl).toEqual('http://fakeurl/type2'); + }); + httpBackend.flush(); + }); + + it('should make POST queries on correct discriminator URL', function () { + var obj = ModelManager4.createModel({ _id: 123456, name: '12345', __t: 'Type1' }); + obj.name = '23456'; + httpBackend.expectPUT('http://fakeurl/type1/123456', { name: '23456' }).respond(); + obj.save(); + }); + + afterEach(function () { + httpBackend.verifyNoOutstandingExpectation(); + }); +}); \ No newline at end of file diff --git a/package.json b/package.json index d7d0c57..c06a2b8 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "author": "flogou ", "name": "angular-orm", - "version": "2.0.0-alpha-11", + "version": "2.0.0-alpha-12", "description": "", "homepage": "", "dependencies": { diff --git a/src/ActiveRecord.js b/src/ActiveRecord.js index 23acb43..37f7cd5 100644 --- a/src/ActiveRecord.js +++ b/src/ActiveRecord.js @@ -1,4 +1,5 @@ //_ = require('lodash'); +import Discriminator from './Discriminator' import ServiceLocator from './ServiceLocator' import SessionManager from './SessionManager' var deep = require('deep-diff').diff diff --git a/src/DaoHelper.js b/src/DaoHelper.js index d971d33..cabfef4 100644 --- a/src/DaoHelper.js +++ b/src/DaoHelper.js @@ -24,6 +24,14 @@ export default class DaoHelper{ this.dao.url = url; } + setDiscriminatorUrl(type, url) { + _.each(this.dao.discriminators, (discriminator) => { + if (discriminator.type === type) { + discriminator.discriminatorUrl = url + } + }) + } + $get(){ return this.dao; } diff --git a/src/Discriminator.js b/src/Discriminator.js new file mode 100644 index 0000000..f2a8588 --- /dev/null +++ b/src/Discriminator.js @@ -0,0 +1,24 @@ +//_ = require('lodash'); +import ServiceLocator from './ServiceLocator' +import SessionManager from './SessionManager' + + +export default function Discriminator (Model, type, url) { + + let Discriminator = class extends Model{ + static get type (){ + return type + } + + constructor ($injector, rootUrl, options) { + super($injector, rootUrl, options); + this.rootUrl = url + } + + // static get discriminatorUrl(){ + // return url + // } + }; + + return Discriminator; +} diff --git a/src/GenericDao.js b/src/GenericDao.js index f4a7372..e4e440e 100644 --- a/src/GenericDao.js +++ b/src/GenericDao.js @@ -1,7 +1,7 @@ import ServiceLocator from './ServiceLocator'; import QueryBuilder from './QueryBuilder'; -export default function GenericDao(model, qb){ +export default function GenericDao(model, qb, discriminators){ let sl = ServiceLocator.instance; sl.registerModel(model.getName(), model); let myClass = class { @@ -10,6 +10,7 @@ export default function GenericDao(model, qb){ // this.$http = $injector.get('$http'); this.url = url; this.model = model + this.discriminators = discriminators } get $http(){ @@ -58,7 +59,15 @@ export default function GenericDao(model, qb){ if (Array.isArray(data)){ return data.map(this.build, this); } - return new model(this.$injector, this.url, data); + let url = this.url; + if (data.__t) { + _.each(this.discriminators, function (discriminator) { + if (discriminator.type == data.__t) { + url = discriminator.discriminatorUrl + } + }); + } + return new model(this.$injector, url, data); } post(qb = this.query()){ @@ -85,8 +94,21 @@ export default function GenericDao(model, qb){ } create(params){ - return new this.model(this.$injector, this.url, params); + let url = this.url; + if (params.__t) { + _.each(this.discriminators, function (discriminator) { + if (discriminator.type == params.__t) { + + url = discriminator.discriminatorUrl + } + }); + } + return new this.model(this.$injector, url, params); } + + // get discriminators(){ + // return discriminators + // } }; diff --git a/tst/app.js b/tst/app.js index 1ab3a14..1249e7e 100644 --- a/tst/app.js +++ b/tst/app.js @@ -4,6 +4,7 @@ import DaoHelper from './DaoHelper'; import ModelManager from './managers/tstManager1'; import ModelManager2 from './managers/tstManager2'; import ModelManager3 from './managers/tstManager3'; +import ModelManager4 from './managers/tstManager4'; var module = angular @@ -11,4 +12,5 @@ var module = angular DaoHelper.registerService(module, 'ModelManager', ModelManager); DaoHelper.registerService(module, 'ModelManager2', ModelManager2); -DaoHelper.registerService(module, 'ModelManager3', ModelManager3); \ No newline at end of file +DaoHelper.registerService(module, 'ModelManager3', ModelManager3); +DaoHelper.registerService(module, 'ModelManager4', ModelManager4); \ No newline at end of file diff --git a/tst/managers/tstManager4.js b/tst/managers/tstManager4.js new file mode 100644 index 0000000..a94e810 --- /dev/null +++ b/tst/managers/tstManager4.js @@ -0,0 +1,14 @@ +'use strict'; + +import Model4 from './../models/tstModel4.js'; +import GenericDao from '../GenericDao'; +import Discriminator from '../Discriminator' + +var D1 = Discriminator(Model4, 'Type1') +var D2 = Discriminator(Model4, 'Type2') + + +var DAO = GenericDao(Model4, undefined, [D1, D2]); + +export default class ModelManager4 extends DAO { +}; diff --git a/tst/models/tstModel4.js b/tst/models/tstModel4.js new file mode 100644 index 0000000..f0e0432 --- /dev/null +++ b/tst/models/tstModel4.js @@ -0,0 +1,24 @@ +'use strict'; + + +import ActiveRecord from '../ActiveRecord' + + +var model = { + + _id: { + type : String, + unique: true, + //private: true + }, +  + name: String, + + __t: String +}; + + +var AR = ActiveRecord(model, 'Model4'); + +export default class Model4 extends AR {} + diff --git a/tst/specs/angular-dao-discriminators.specs.js b/tst/specs/angular-dao-discriminators.specs.js new file mode 100644 index 0000000..d09eee6 --- /dev/null +++ b/tst/specs/angular-dao-discriminators.specs.js @@ -0,0 +1,59 @@ +describe('Angular DAO', function () { + + var ModelManager, ModelManager3, httpBackend, $rootScope, $timeout; + + beforeEach(function () { + + module('tstModule', function (ModelManager4Provider) { + ModelManager4Provider.setRootUrl('http://MOCKURL.com/model2'); + ModelManager4Provider.setDiscriminatorUrl('Type1', 'http://fakeurl/type1'); + ModelManager4Provider.setDiscriminatorUrl('Type2', 'http://fakeurl/type2'); + }); + + inject(function (_ModelManager4_, $httpBackend, _$rootScope_, _$timeout_) { + ModelManager4 = _ModelManager4_; + httpBackend = $httpBackend; + $rootScope = _$rootScope_; + $timeout = _$timeout_; + }) + }); + + it ('should be possible to instantiate discriminators', function(){ + expect(ModelManager4.discriminators.length).toEqual(2) + expect(ModelManager4.discriminators[0].type).toEqual('Type1') + expect(ModelManager4.discriminators[1].type).toEqual('Type2') + expect(ModelManager4.discriminators[0].discriminatorUrl).toEqual('http://fakeurl/type1') + expect(ModelManager4.discriminators[1].discriminatorUrl).toEqual('http://fakeurl/type2') + }) + + it ('should make GET queries on parent url', function(){ + httpBackend.expectGET('http://MOCKURL.com/model2').respond(); + ModelManager4.get(); + httpBackend.flush(); + }) + + it ('should instanciate discriminators according to __t value', function(){ + // TODO : make a GET request, respond with two types, and check their urls + httpBackend.expectGET('http://MOCKURL.com/model2').respond([{_id: 123, name: 'Type1', __t: 'Type1'}, {_id: 321, name: 'Type2', __t: 'Type2'}]); + + ModelManager4.get().then(function (data) { + expect(data.data[0].rootUrl).toEqual('http://fakeurl/type1'); + expect(data.data[1].rootUrl).toEqual('http://fakeurl/type2'); + }); + httpBackend.flush(); + }) + + it ('should make POST queries on correct discriminator URL', function () { + var obj = ModelManager4.createModel({_id: 123456, name: '12345', __t: 'Type1'}) + obj.name = '23456' + httpBackend.expectPUT('http://fakeurl/type1/123456', {name: '23456'}).respond() + obj.save() + }) + + + + afterEach(function () { + httpBackend.verifyNoOutstandingExpectation() + }); + +}); From c34372460f556706af8e9089f0c41ba6a3325597 Mon Sep 17 00:00:00 2001 From: Julien Michel Date: Thu, 24 Nov 2016 11:32:14 +0100 Subject: [PATCH 2/2] instanciate correct discriminator --- build/app.js | 47 +++++++++++++++----------------------- dest/temp/Discriminator.js | 18 ++++++--------- dest/temp/GenericDao.js | 29 ++++++++++------------- src/Discriminator.js | 11 +-------- src/GenericDao.js | 29 ++++++++++------------- 5 files changed, 51 insertions(+), 83 deletions(-) diff --git a/build/app.js b/build/app.js index 094e573..5c61ad0 100644 --- a/build/app.js +++ b/build/app.js @@ -604,11 +604,17 @@ var _SessionManager = require('./SessionManager'); var _SessionManager2 = _interopRequireDefault(_SessionManager); -function Discriminator(Model, type, url) { +function Discriminator(Model, type) { var Discriminator = (function (_Model) { _inherits(Discriminator, _Model); + function Discriminator() { + _classCallCheck(this, Discriminator); + + _get(Object.getPrototypeOf(Discriminator.prototype), 'constructor', this).apply(this, arguments); + } + _createClass(Discriminator, null, [{ key: 'type', get: function get() { @@ -616,16 +622,6 @@ function Discriminator(Model, type, url) { } }]); - function Discriminator($injector, rootUrl, options) { - _classCallCheck(this, Discriminator); - - _get(Object.getPrototypeOf(Discriminator.prototype), 'constructor', this).call(this, $injector, rootUrl, options); - this.rootUrl = url; - } - - // static get discriminatorUrl(){ - // return url - // } return Discriminator; })(Model); @@ -731,15 +727,13 @@ function GenericDao(model, qb, discriminators) { if (Array.isArray(data)) { return data.map(this.build, this); } - var url = this.url; - if (data.__t) { - _.each(this.discriminators, function (discriminator) { - if (discriminator.type == data.__t) { - url = discriminator.discriminatorUrl; - } - }); + if (this.discriminators && data.__t) { + var disc = _.find(this.discriminators, { type: data.__t }); + if (disc) { + return new disc(this.$injector, disc.discriminatorUrl, data); + } } - return new model(this.$injector, url, data); + return new model(this.$injector, this.url, data); } }, { key: 'post', @@ -774,16 +768,13 @@ function GenericDao(model, qb, discriminators) { }, { key: 'create', value: function create(params) { - var url = this.url; - if (params.__t) { - _.each(this.discriminators, function (discriminator) { - if (discriminator.type == params.__t) { - - url = discriminator.discriminatorUrl; - } - }); + if (this.discriminators && params.__t) { + var disc = _.find(this.discriminators, { type: params.__t }); + if (disc) { + return new disc(this.$injector, disc.discriminatorUrl, params); + } } - return new this.model(this.$injector, url, params); + return new this.model(this.$injector, this.url, params); } // get discriminators(){ diff --git a/dest/temp/Discriminator.js b/dest/temp/Discriminator.js index 0c8974f..120325a 100644 --- a/dest/temp/Discriminator.js +++ b/dest/temp/Discriminator.js @@ -33,11 +33,17 @@ var _SessionManager = require('./SessionManager'); var _SessionManager2 = _interopRequireDefault(_SessionManager); -function Discriminator(Model, type, url) { +function Discriminator(Model, type) { var Discriminator = (function (_Model) { _inherits(Discriminator, _Model); + function Discriminator() { + _classCallCheck(this, Discriminator); + + _get(Object.getPrototypeOf(Discriminator.prototype), 'constructor', this).apply(this, arguments); + } + _createClass(Discriminator, null, [{ key: 'type', get: function get() { @@ -45,16 +51,6 @@ function Discriminator(Model, type, url) { } }]); - function Discriminator($injector, rootUrl, options) { - _classCallCheck(this, Discriminator); - - _get(Object.getPrototypeOf(Discriminator.prototype), 'constructor', this).call(this, $injector, rootUrl, options); - this.rootUrl = url; - } - - // static get discriminatorUrl(){ - // return url - // } return Discriminator; })(Model); diff --git a/dest/temp/GenericDao.js b/dest/temp/GenericDao.js index 3421232..5475d52 100644 --- a/dest/temp/GenericDao.js +++ b/dest/temp/GenericDao.js @@ -95,15 +95,13 @@ function GenericDao(model, qb, discriminators) { if (Array.isArray(data)) { return data.map(this.build, this); } - var url = this.url; - if (data.__t) { - _.each(this.discriminators, function (discriminator) { - if (discriminator.type == data.__t) { - url = discriminator.discriminatorUrl; - } - }); + if (this.discriminators && data.__t) { + var disc = _.find(this.discriminators, { type: data.__t }); + if (disc) { + return new disc(this.$injector, disc.discriminatorUrl, data); + } } - return new model(this.$injector, url, data); + return new model(this.$injector, this.url, data); } }, { key: 'post', @@ -138,16 +136,13 @@ function GenericDao(model, qb, discriminators) { }, { key: 'create', value: function create(params) { - var url = this.url; - if (params.__t) { - _.each(this.discriminators, function (discriminator) { - if (discriminator.type == params.__t) { - - url = discriminator.discriminatorUrl; - } - }); + if (this.discriminators && params.__t) { + var disc = _.find(this.discriminators, { type: params.__t }); + if (disc) { + return new disc(this.$injector, disc.discriminatorUrl, params); + } } - return new this.model(this.$injector, url, params); + return new this.model(this.$injector, this.url, params); } // get discriminators(){ diff --git a/src/Discriminator.js b/src/Discriminator.js index f2a8588..75837f7 100644 --- a/src/Discriminator.js +++ b/src/Discriminator.js @@ -3,21 +3,12 @@ import ServiceLocator from './ServiceLocator' import SessionManager from './SessionManager' -export default function Discriminator (Model, type, url) { +export default function Discriminator (Model, type) { let Discriminator = class extends Model{ static get type (){ return type } - - constructor ($injector, rootUrl, options) { - super($injector, rootUrl, options); - this.rootUrl = url - } - - // static get discriminatorUrl(){ - // return url - // } }; return Discriminator; diff --git a/src/GenericDao.js b/src/GenericDao.js index e4e440e..56ca287 100644 --- a/src/GenericDao.js +++ b/src/GenericDao.js @@ -59,15 +59,13 @@ export default function GenericDao(model, qb, discriminators){ if (Array.isArray(data)){ return data.map(this.build, this); } - let url = this.url; - if (data.__t) { - _.each(this.discriminators, function (discriminator) { - if (discriminator.type == data.__t) { - url = discriminator.discriminatorUrl - } - }); + if (this.discriminators && data.__t) { + let disc = _.find(this.discriminators, {type: data.__t}); + if (disc) { + return new disc(this.$injector, disc.discriminatorUrl, data); + } } - return new model(this.$injector, url, data); + return new model(this.$injector, this.url, data); } post(qb = this.query()){ @@ -94,16 +92,13 @@ export default function GenericDao(model, qb, discriminators){ } create(params){ - let url = this.url; - if (params.__t) { - _.each(this.discriminators, function (discriminator) { - if (discriminator.type == params.__t) { - - url = discriminator.discriminatorUrl - } - }); + if (this.discriminators && params.__t) { + let disc = _.find(this.discriminators,{type: params.__t}); + if (disc) { + return new disc(this.$injector, disc.discriminatorUrl, params); + } } - return new this.model(this.$injector, url, params); + return new this.model(this.$injector, this.url, params); } // get discriminators(){