monguito
Version:
MongoDB Abstract Repository implementation for Node.js
3 lines (2 loc) • 12.6 kB
JavaScript
import t,{Schema as e}from"mongoose";import{Optional as n}from"typescript-optional";function r(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=Array(e);n<e;n++)r[n]=t[n];return r}function i(t,e){var n="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(n)return(n=n.call(t)).next.bind(n);if(Array.isArray(t)||(n=function(t,e){if(t){if("string"==typeof t)return r(t,e);var n={}.toString.call(t).slice(8,-1);return"Object"===n&&t.constructor&&(n=t.constructor.name),"Map"===n||"Set"===n?Array.from(t):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){n&&(t=n);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function o(){return o=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)({}).hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},o.apply(null,arguments)}function u(t){return u=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},u(t)}function s(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,c(t,e)}function a(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(a=function(){return!!t})()}function c(t,e){return c=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},c(t,e)}function l(t){var e="function"==typeof Map?new Map:void 0;return l=function(t){if(null===t||!function(t){try{return-1!==Function.toString.call(t).indexOf("[native code]")}catch(e){return"function"==typeof t}}(t))return t;if("function"!=typeof t)throw new TypeError("Super expression must either be null or a function");if(void 0!==e){if(e.has(t))return e.get(t);e.set(t,n)}function n(){return function(t,e,n){if(a())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,e);var i=new(t.bind.apply(t,r));return n&&c(i,n.prototype),i}(t,arguments,u(this).constructor)}return n.prototype=Object.create(t.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),c(n,t)},l(t)}var d=function(t){this.createdAt=void 0,this.createdBy=void 0,this.updatedAt=void 0,this.updatedBy=void 0,this.version=void 0,this.createdAt=t.createdAt?new Date(t.createdAt):void 0,this.createdBy=t.createdBy,this.updatedAt=t.updatedAt?new Date(t.updatedAt):void 0,this.updatedBy=t.updatedBy,this.version=t.version},f=function(t){return t&&"createdAt"in t&&"updatedAt"in t&&"createdBy"in t&&"updatedBy"in t},h=/*#__PURE__*/function(t){function e(e,n){var r;return(r=t.call(this,e,{cause:n})||this).name=r.constructor.name,Error.captureStackTrace&&Error.captureStackTrace(r,r.constructor),r}return s(e,t),e}(/*#__PURE__*/l(Error)),v=/*#__PURE__*/function(t){function e(e,n){return t.call(this,e,n)||this}return s(e,t),e}(h),p=/*#__PURE__*/function(t){function e(e,n){return t.call(this,e,n)||this}return s(e,t),e}(h),y=/*#__PURE__*/function(t){function e(e,n){return t.call(this,e,n)||this}return s(e,t),e}(h),m=/*#__PURE__*/function(t){function e(e,n){var r;return(r=t.call(this,e,n)||this).cause=void 0,r.cause=n,r}s(e,t);var n=e.prototype;return n.getInvalidFields=function(){return Object.keys(this.cause.errors)},n.getInvalidRequiredFields=function(){return this.getInvalidFieldsOfKind("required")},n.getInvalidUniqueFields=function(){return this.getInvalidFieldsOfKind("unique")},n.getInvalidFieldsOfKind=function(t){var e=[];for(var n in this.cause.errors){var r=this.cause.errors[n];r.kind===t&&e.push(r.path)}return e},e}(h),b=/*#__PURE__*/function(){function t(e){if(this.type=void 0,this.schema=void 0,this.subtypes=void 0,!e.type||!e.schema)throw new v("The given domain model must specify a type and a schema");this.type=e.type,this.schema=e.schema,this.subtypes=[];for(var n,r=i(null!=(o=e.subtypes)?o:[]);!(n=r()).done;){var o;this.subtypes.push(new t(n.value))}}var e=t.prototype;return e.getSubtypeTree=function(){return this.subtypes||[]},e.getSubtypeData=function(t){var e;return null==(e=this.subtypes)?void 0:e.find(function(e){return e.type.name===t})},e.getSubtypeConstructor=function(t){var e=this.getSubtypeData(t);return null==e?void 0:e.type},e.getSupertypeConstructor=function(){return this.type},e.getSupertypeName=function(){return this.type.name},e.has=function(t){return t===this.getSupertypeName()||!!this.getSubtypeData(t)},t}();function g(t,e){try{var n=t()}catch(t){return e(t)}return n&&n.then?n.then(void 0,e):n}var w=/*#__PURE__*/function(){function e(t,e){this.connection=void 0,this.domainTree=void 0,this.entityModel=void 0,this.connection=e,this.domainTree=new b(t),this.entityModel=this.createEntityModel(e)}var r=e.prototype;return r.createEntityModel=function(e){var n;n=e?e.model(this.domainTree.type.name,this.domainTree.schema):t.model(this.domainTree.type.name,this.domainTree.schema);for(var r,o=i(this.domainTree.getSubtypeTree());!(r=o()).done;){var u=r.value;n.discriminator(u.type.name,u.schema)}return n},r.findById=function(t,e){try{var r,i=this;if(!t)throw new v("The given ID must be valid");return Promise.resolve(i.entityModel.findById(t).session(null!=(r=null==e?void 0:e.session)?r:null).exec()).then(function(t){return n.ofNullable(i.instantiateFrom(t))})}catch(t){return Promise.reject(t)}},r.findOne=function(t){try{var e,r,i=this;return Promise.resolve(i.entityModel.findOne(null!=(e=null==t?void 0:t.filters)?e:void 0).session(null!=(r=null==t?void 0:t.session)?r:null).exec()).then(function(t){return n.ofNullable(i.instantiateFrom(t))})}catch(t){return Promise.reject(t)}},r.findAll=function(t){try{var e,n,r,i,o,u,s,a,c=this;if(null!=t&&null!=(e=t.pageable)&&e.pageNumber&&(null==t||null==(n=t.pageable)?void 0:n.pageNumber)<0)throw new v("The given page number must be a positive number");if(null!=t&&null!=(r=t.pageable)&&r.offset&&(null==t||null==(i=t.pageable)?void 0:i.offset)<0)throw new v("The given page offset must be a positive number");var l=null!=(o=null==t||null==(u=t.pageable)?void 0:u.offset)?o:0,d=null!=(s=null==t||null==(a=t.pageable)?void 0:a.pageNumber)?s:0;return Promise.resolve(g(function(){var e;return Promise.resolve(c.entityModel.find(null==t?void 0:t.filters).skip(d>0?(d-1)*l:0).limit(l).sort(null==t?void 0:t.sortBy).session(null!=(e=null==t?void 0:t.session)?e:null).exec()).then(function(t){return t.map(function(t){return c.instantiateFrom(t)})})},function(t){throw new v("The given optional parameters must be valid",t)}))}catch(t){return Promise.reject(t)}},r.save=function(t,e){try{if(!t)throw new v("The given entity cannot be null or undefined");return Promise.resolve(t.id?this.update(t,e):this.insert(t,e))}catch(t){return Promise.reject(t)}},r.insert=function(e,n){try{var r=this;if(!e)throw new v("The given entity cannot be null or undefined");return Promise.resolve(g(function(){var t=r.createDocumentForInsertion(e,n);return Promise.resolve(t.save({session:null==n?void 0:n.session})).then(function(t){return r.instantiateFrom(t)})},function(e){throw e instanceof t.Error.ValidationError?new m("One or more fields of the given entity do not specify valid values",e):e}))}catch(t){return Promise.reject(t)}},r.createDocumentForInsertion=function(t,e){this.setDiscriminatorKeyOnEntity(t);var n=new this.entityModel(t);return this.setAuditableDataOnDocumentToInsert(n,t,null==e?void 0:e.userId),n},r.setDiscriminatorKeyOnEntity=function(t){var e=t.constructor.name;if(!this.domainTree.has(e))throw new v("The entity with name "+e+" is not included in the setup of the custom repository");e!==this.domainTree.getSupertypeName()&&!("__t"in t)&&(t.__t=e)},r.setAuditableDataOnDocumentToInsert=function(t,e,n){f(e)&&(n&&(t.$locals.userId=n),t.__v=0)},r.update=function(e,n){try{var r,i=this;if(!e)throw new v("The given entity must be valid");return Promise.resolve(i.entityModel.findById(e.id).session(null!=(r=null==n?void 0:n.session)?r:null)).then(function(r){var o;function u(t){if(o)return t;throw new v("There is no document matching the given ID '"+e.id+"'")}var s=function(){if(r)return g(function(){return r.set(e),i.setAuditableDataOnDocumentToUpdate(r,null==n?void 0:n.userId),Promise.resolve(r.save({session:null==n?void 0:n.session})).then(function(t){var e=i.instantiateFrom(t);return o=1,e})},function(e){throw e instanceof t.Error.ValidationError?new m("One or more fields of the given entity do not specify valid values",e):e})}();return s&&s.then?s.then(u):u(s)})}catch(t){return Promise.reject(t)}},r.setAuditableDataOnDocumentToUpdate=function(t,e){var n;t.isNew=!1,f(t)&&(e&&(t.$locals.userId=e),t.__v=(null!=(n=t.__v)?n:0)+1)},r.deleteById=function(t,e){try{if(!t)throw new v("The given ID must be valid");return Promise.resolve(this.entityModel.findByIdAndDelete(t,{session:null==e?void 0:e.session})).then(function(t){return!!t})}catch(t){return Promise.reject(t)}},r.instantiateFrom=function(t){if(!t)return null;var e=t.get("__t"),n=e?this.domainTree.getSubtypeConstructor(e):this.domainTree.getSupertypeConstructor();if(n)try{return new n(t.toObject())}catch(e){throw new p("An error occurred while instantiating an entity with ID "+t.id,e)}throw new y("There is no registered instance constructor for the document with ID "+t.id+" or the corresponding entity type is abstract")},e}(),P=function(e,n,r){return Promise.resolve(function(e){try{return Promise.resolve(e?e.startSession():t.connection.startSession())}catch(t){return Promise.reject(t)}}(r)).then(function(t){return t.startTransaction(),function(i,o){try{var u=function(n,r){try{var i=Promise.resolve(e(t)).then(function(e){return Promise.resolve(t.commitTransaction()).then(function(){return e})})}catch(t){return r(t)}return i&&i.then?i.then(void 0,r):i}(0,function(i){return Promise.resolve(t.abortTransaction()).then(function(){if(function(t){return t.message.includes("does not match any in-progress transactions")}(i)&&n<I)return P(e,++n,r);throw i})})}catch(t){return o(!0,t)}return u&&u.then?u.then(o.bind(null,!1),o.bind(null,!0)):o(!1,u)}(0,function(e,n){if(t.endSession(),e)throw n;return n})})},T=function(t,e){try{return Promise.resolve(null!=e&&e.session?t(e.session):P(t,0,null==e?void 0:e.connection))}catch(t){return Promise.reject(t)}},I=3,O=/*#__PURE__*/function(t){function e(e,n){return t.call(this,e,n)||this}s(e,t);var n=e.prototype;return n.saveAll=function(t,e){try{var n=this;return Promise.resolve(T(function(r){try{return Promise.resolve(Promise.all(t.map(function(t){try{return Promise.resolve(n.save(t,{userId:null==e?void 0:e.userId,session:r}))}catch(t){return Promise.reject(t)}})))}catch(t){return Promise.reject(t)}},o({},e,{connection:n.connection})))}catch(t){return Promise.reject(t)}},n.deleteAll=function(t){try{var e=this;return Promise.resolve(T(function(n){try{return Promise.resolve(e.entityModel.deleteMany(null==t?void 0:t.filters,{session:n})).then(function(t){return t.deletedCount})}catch(t){return Promise.reject(t)}},o({},t,{connection:e.connection})))}catch(t){return Promise.reject(t)}},n.update=function(e,n){try{var r=t.prototype.update.bind(this);return Promise.resolve(T(function(t){try{var i;return Promise.resolve(r(e,{userId:null==n?void 0:n.userId,session:null!=(i=null==n?void 0:n.session)?i:t}))}catch(t){return Promise.reject(t)}},{connection:this.connection}))}catch(t){return Promise.reject(t)}},e}(w),j=new e({},{toObject:{transform:function(t,e){e.id=t.id,delete e._id}}}),S=_(j,{createdBy:{type:String},updatedBy:{type:String}},{timestamps:!0,toObject:{transform:function(t,e){e.id=t.id,e.version=t.__v,delete e._id,delete e.__v}},plugins:[{fn:function(t){t.pre("save",function(t){this.$locals.userId&&(this.createdBy||(this.createdBy=this.$locals.userId),this.updatedBy=this.$locals.userId),delete this.$locals.userId,t()})}}]});function _(t,n,r){var i=n instanceof e,u=new e(o({},t.obj,i?n.obj:n),o({},t.options,i?n.options:r));return function(t,n,r,i){n.plugins.forEach(function(e){t.plugin(e.fn,e.options)}),r instanceof e&&r.plugins.forEach(function(e){t.plugin(e.fn,e.options)}),null!=i&&i.plugins&&i.plugins.forEach(function(e){t.plugin(e.fn,e.options)})}(u,t,n,r),u}export{d as AuditableClass,S as AuditableSchema,j as BaseSchema,v as IllegalArgumentException,w as MongooseRepository,O as MongooseTransactionalRepository,y as UndefinedConstructorException,m as ValidationException,_ as extendSchema,f as isAuditable,T as runInTransaction};
//# sourceMappingURL=repo.module.js.map