@decaf-ts/db-decorators 0.1.6 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @category Managers
8
8
  */
9
- export interface CrudOperator<T> {
9
+ export interface CrudOperator<M> {
10
10
  /**
11
11
  * @summary Create a new model
12
12
  * @param {T} model
@@ -14,7 +14,7 @@ export interface CrudOperator<T> {
14
14
  *
15
15
  * @method
16
16
  */
17
- create(model: T, ...args: any[]): Promise<T>;
17
+ create(model: M, ...args: any[]): Promise<M>;
18
18
  /**
19
19
  * @summary Read a model
20
20
  * @param {string} key
@@ -22,7 +22,7 @@ export interface CrudOperator<T> {
22
22
  *
23
23
  * @method
24
24
  */
25
- read(key: string, ...args: any[]): Promise<T>;
25
+ read(key: string | number, ...args: any[]): Promise<M>;
26
26
  /**
27
27
  * @summary update a model
28
28
  * @param {T} model
@@ -30,7 +30,7 @@ export interface CrudOperator<T> {
30
30
  *
31
31
  * @method
32
32
  */
33
- update(model: T, ...args: any[]): Promise<T>;
33
+ update(model: M, ...args: any[]): Promise<M>;
34
34
  /**
35
35
  * @summary delete a model
36
36
  * @param {string} key
@@ -38,5 +38,5 @@ export interface CrudOperator<T> {
38
38
  *
39
39
  * @method
40
40
  */
41
- delete(key: string, ...args: any[]): Promise<T>;
41
+ delete(key: string | number, ...args: any[]): Promise<M>;
42
42
  }
@@ -1,13 +1,13 @@
1
1
  import { DBModel } from "../model/DBModel";
2
2
  import { DataCache } from "../repository/DataCache";
3
3
  import { Constructor } from "@decaf-ts/decorator-validation";
4
- import { CrudOperator } from "./CrudOperator";
4
+ import { BulkCrudOperator } from "./BulkCrudOperator";
5
5
  /**
6
6
  * @summary Interface holding basic CRUD APIs
7
7
  * @typedef T extends {@link DBModel}
8
8
  * @interface IRepository
9
9
  */
10
- export interface IRepository<T extends DBModel> extends CrudOperator<T> {
10
+ export interface IRepository<M extends DBModel> extends BulkCrudOperator<M> {
11
11
  readonly cache: DataCache;
12
- readonly class: Constructor<T>;
12
+ readonly class: Constructor<M>;
13
13
  }
@@ -1,2 +1,3 @@
1
+ export * from "./BulkCrudOperator";
1
2
  export * from "./CrudOperator";
2
3
  export * from "./IRepository";
@@ -1 +1 @@
1
- export*from"./CrudOperator";export*from"./IRepository";
1
+ export*from"./BulkCrudOperator";export*from"./CrudOperator";export*from"./IRepository";
@@ -2,23 +2,36 @@ import { IRepository } from "../interfaces/IRepository";
2
2
  import { DBModel } from "../model/DBModel";
3
3
  import { Constructor } from "@decaf-ts/decorator-validation";
4
4
  import { DataCache } from "./DataCache";
5
- export declare abstract class BaseRepository<T extends DBModel> implements IRepository<T> {
5
+ export declare abstract class BaseRepository<M extends DBModel> implements IRepository<M> {
6
6
  private readonly _class;
7
7
  private _cache?;
8
- get class(): Constructor<T>;
8
+ get class(): Constructor<M>;
9
9
  get cache(): DataCache;
10
- protected constructor(clazz?: Constructor<T>);
11
- create(model: T, ...args: any[]): Promise<T>;
12
- protected createPrefix(model: T, ...args: any[]): Promise<any[]>;
13
- protected createSuffix(model: T): Promise<T>;
14
- read(key: string, ...args: any[]): Promise<T>;
15
- protected readSuffix(model: T): Promise<T>;
10
+ protected constructor(clazz?: Constructor<M>);
11
+ create(model: M, ...args: any[]): Promise<M>;
12
+ createAll(models: M[], ...args: any[]): Promise<Awaited<M>[]>;
13
+ protected createPrefix(model: M, ...args: any[]): Promise<any[]>;
14
+ protected createSuffix(model: M): Promise<M>;
15
+ protected createAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
16
+ protected createAllSuffix(models: M[]): Promise<M[]>;
17
+ read(key: string | number, ...args: any[]): Promise<M>;
18
+ readAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
19
+ protected readSuffix(model: M): Promise<M>;
16
20
  protected readPrefix(key: string, ...args: any[]): Promise<any[]>;
17
- update(model: T, ...args: any[]): Promise<T>;
18
- protected updateSuffix(model: T): Promise<T>;
19
- protected updatePrefix(model: T, ...args: any[]): Promise<any[]>;
20
- delete(key: string, ...args: any[]): Promise<T>;
21
- protected deleteSuffix(model: T): Promise<T>;
21
+ protected readAllPrefix(keys: string[] | number[], ...args: any[]): Promise<any[]>;
22
+ protected readAllSuffix(models: M[]): Promise<M[]>;
23
+ update(model: M, ...args: any[]): Promise<M>;
24
+ updateAll(models: M[], ...args: any): Promise<M[]>;
25
+ protected updateSuffix(model: M): Promise<M>;
26
+ protected updatePrefix(model: M, ...args: any[]): Promise<any[]>;
27
+ protected updateAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
28
+ protected updateAllSuffix(models: M[]): Promise<M[]>;
29
+ delete(key: string | number, ...args: any[]): Promise<M>;
30
+ deleteAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
31
+ protected deleteSuffix(model: M): Promise<M>;
22
32
  protected deletePrefix(key: any, ...args: any[]): Promise<any[]>;
33
+ protected deleteAllPrefix(keys: string[] | number[], ...args: any[]): Promise<any[]>;
34
+ protected deleteAllSuffix(models: M[]): Promise<M[]>;
35
+ protected merge(oldModel: M, model: M): M;
23
36
  toString(): string;
24
37
  }
@@ -1 +1 @@
1
- import{sf}from"@decaf-ts/decorator-validation";import{enforceDBDecorators}from"./utils";import{OperationKeys}from"../operations/constants";import{InternalError}from"./errors";import{DataCache}from"./DataCache";import{wrapMethod}from"./wrappers";import{findModelId}from"../identity";class BaseRepository{get class(){if(this._class)return this._class;throw new InternalError("No class definition found for this repository")}get cache(){return this._cache||(this._cache=new DataCache),this._cache}constructor(e){e&&(this._class=e);const t=this;[this.create,this.read,this.update,this.delete].forEach(e=>{var r=e.name;wrapMethod(t,t[r+"Prefix"],e,t[r+"Suffix"])})}async create(e){throw new Error("Child classes must implement this.")}async createPrefix(e,...r){return e=new this.class(e),await enforceDBDecorators(this,e,OperationKeys.CREATE,OperationKeys.ON),[e,...r]}async createSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.CREATE,OperationKeys.AFTER),e}async read(e){throw new Error("Child classes must implement this")}async readSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.READ,OperationKeys.AFTER),e}async readPrefix(e,...r){var t=new this.class;return await enforceDBDecorators(this,t,OperationKeys.READ,OperationKeys.ON),[e,...r]}async update(e){throw new Error("Child classes must implement this")}async updateSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.UPDATE,OperationKeys.AFTER),e}async updatePrefix(e,...r){var t=findModelId(e),t=await this.read(t);return await enforceDBDecorators(this,e,OperationKeys.UPDATE,OperationKeys.ON,t),[e,...r]}async delete(e){throw new Error("Child classes must implement this")}async deleteSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.DELETE,OperationKeys.AFTER),e}async deletePrefix(e,...r){var t=await this.read(e,...r);return await enforceDBDecorators(this,t,OperationKeys.DELETE,OperationKeys.ON),[e,...r]}toString(){return sf("[{0}] - Repository for {1}",this.constructor.name,this.class.name)}}export{BaseRepository};
1
+ import{sf}from"@decaf-ts/decorator-validation";import{enforceDBDecorators}from"./utils";import{OperationKeys}from"../operations/constants";import{InternalError}from"./errors";import{DataCache}from"./DataCache";import{wrapMethod}from"./wrappers";import{findModelId,findPrimaryKey}from"../identity";class BaseRepository{get class(){if(this._class)return this._class;throw new InternalError("No class definition found for this repository")}get cache(){return this._cache||(this._cache=new DataCache),this._cache}constructor(e){e&&(this._class=e);const a=this;[this.create,this.read,this.update,this.delete].forEach(e=>{var r=e.name;wrapMethod(a,a[r+"Prefix"],e,a[r+"Suffix"])})}async create(e){throw new Error("Child classes must implement this.")}async createAll(e,...r){return Promise.all(e.map(e=>this.create(e,...r)))}async createPrefix(e,...r){return e=new this.class(e),await enforceDBDecorators(this,e,OperationKeys.CREATE,OperationKeys.ON),[e,...r]}async createSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.CREATE,OperationKeys.AFTER),e}async createAllPrefix(e,...r){return await Promise.all(e.map(e=>enforceDBDecorators(this,e,OperationKeys.CREATE,OperationKeys.ON))),[e,...r]}async createAllSuffix(e){return await Promise.all(e.map(e=>enforceDBDecorators(this,e,OperationKeys.CREATE,OperationKeys.AFTER))),e}async read(e){throw new Error("Child classes must implement this")}async readAll(e,...r){return Promise.all(e.map(e=>this.read(e,...r)))}async readSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.READ,OperationKeys.AFTER),e}async readPrefix(e,...r){var a=new this.class;return a[findPrimaryKey(a).id]=e,await enforceDBDecorators(this,a,OperationKeys.READ,OperationKeys.ON),[e,...r]}async readAllPrefix(e,...r){var a=new this.class;const t=findPrimaryKey(a).id;return await Promise.all(e.map(async e=>{var r=new this.class;return r[t]=e,enforceDBDecorators(this,r,OperationKeys.READ,OperationKeys.ON)})),[e,...r]}async readAllSuffix(e){return await Promise.all(e.map(e=>enforceDBDecorators(this,e,OperationKeys.READ,OperationKeys.AFTER))),e}async update(e){throw new Error("Child classes must implement this")}async updateAll(e,...r){return Promise.all(e.map(e=>this.update(e,...r)))}async updateSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.UPDATE,OperationKeys.AFTER),e}async updatePrefix(e,...r){var a=findModelId(e),a=await this.read(a);return await enforceDBDecorators(this,e,OperationKeys.UPDATE,OperationKeys.ON,a),[e,...r]}async updateAllPrefix(e,...r){return await Promise.all(e.map(e=>enforceDBDecorators(this,e,OperationKeys.UPDATE,OperationKeys.ON))),[e,...r]}async updateAllSuffix(e){return await Promise.all(e.map(e=>enforceDBDecorators(this,e,OperationKeys.UPDATE,OperationKeys.AFTER))),e}async delete(e){throw new Error("Child classes must implement this")}async deleteAll(e,...r){return Promise.all(e.map(e=>this.delete(e,...r)))}async deleteSuffix(e){return await enforceDBDecorators(this,e,OperationKeys.DELETE,OperationKeys.AFTER),e}async deletePrefix(e,...r){var a=await this.read(e,...r);return await enforceDBDecorators(this,a,OperationKeys.DELETE,OperationKeys.ON),[e,...r]}async deleteAllPrefix(e,...r){var a=await this.readAll(e,...r);return await Promise.all(a.map(async e=>enforceDBDecorators(this,e,OperationKeys.DELETE,OperationKeys.ON))),[e,...r]}async deleteAllSuffix(e){return await Promise.all(e.map(e=>enforceDBDecorators(this,e,OperationKeys.DELETE,OperationKeys.AFTER))),e}merge(e,r){var a=e=>Object.entries(e).reduce((e,[r,a])=>(void 0!==a&&(e[r]=a),e),{});return new this.class(Object.assign({},a(e),a(r)))}toString(){return sf("[{0}] - Repository for {1}",this.constructor.name,this.class.name)}}export{BaseRepository};
@@ -1,13 +1,13 @@
1
1
  import { DBModel } from "../model/DBModel";
2
2
  import { BaseRepository } from "./BaseRepository";
3
3
  import { Constructor } from "@decaf-ts/decorator-validation";
4
- export declare abstract class Repository<T extends DBModel> extends BaseRepository<T> {
5
- protected constructor(clazz?: Constructor<T>);
6
- create(model: T): Promise<T>;
7
- protected createPrefix(model: T, ...args: any[]): Promise<[T, ...any[]]>;
8
- delete(key: string | number): Promise<T>;
9
- protected deletePrefix(key: string | number, ...args: any[]): Promise<[string | number, ...any[]]>;
10
- read(key: string | number): Promise<T>;
11
- update(model: T): Promise<T>;
12
- protected updatePrefix(model: T, ...args: any[]): Promise<[T, ...args: any[]]>;
4
+ export declare abstract class Repository<M extends DBModel> extends BaseRepository<M> {
5
+ protected constructor(clazz?: Constructor<M>);
6
+ create(model: M): Promise<M>;
7
+ protected createPrefix(model: M, ...args: any[]): Promise<[M, ...any[]]>;
8
+ delete(key: string | number): Promise<M>;
9
+ read(key: string | number): Promise<M>;
10
+ update(model: M): Promise<M>;
11
+ protected updatePrefix(model: M, ...args: any[]): Promise<[M, ...args: any[]]>;
12
+ protected updateAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
13
13
  }
@@ -1 +1,2 @@
1
- import{enforceDBDecorators}from"./utils";import{OperationKeys}from"../operations/constants";import{ValidationError}from"./errors";import{BaseRepository}from"./BaseRepository";import{findModelId}from"../identity";class Repository extends BaseRepository{constructor(r){super(r)}async create(r){throw new Error("Child classes must implement this.")}async createPrefix(r,...e){r=new this.class(r),await enforceDBDecorators(this,r,OperationKeys.CREATE,OperationKeys.ON);var t=r.hasErrors();if(t)throw new ValidationError(t.toString());return[r,...e]}async delete(r){throw new Error("Child classes must implement this.")}async deletePrefix(r,...e){var t=new this.class;return await enforceDBDecorators(this,t,OperationKeys.DELETE,OperationKeys.ON),[r,...e]}async read(r){throw new Error("Child classes must implement this.")}async update(r){throw new Error("Child classes must implement this.")}async updatePrefix(r,...e){r=new this.class(r);var t=findModelId(r),t=await this.read(t),t=(await enforceDBDecorators(this,r,OperationKeys.UPDATE,OperationKeys.ON,t),r.hasErrors(t));if(t)throw new ValidationError(t.toString());return[r,...e]}}export{Repository};
1
+ import{enforceDBDecorators}from"./utils";import{OperationKeys}from"../operations/constants";import{ValidationError}from"./errors";import{BaseRepository}from"./BaseRepository";import{findModelId}from"../identity";class Repository extends BaseRepository{constructor(r){super(r)}async create(r){throw new Error("Child classes must implement this.")}async createPrefix(r,...e){r=new this.class(r),await enforceDBDecorators(this,r,OperationKeys.CREATE,OperationKeys.ON);var t=r.hasErrors();if(t)throw new ValidationError(t.toString());return[r,...e]}async delete(r){throw new Error("Child classes must implement this.")}async read(r){throw new Error("Child classes must implement this.")}async update(r){throw new Error("Child classes must implement this.")}async updatePrefix(r,...e){var t=findModelId(r),t=await this.read(t),t=(r=this.merge(t,r),await enforceDBDecorators(this,r,OperationKeys.UPDATE,OperationKeys.ON,t),r.hasErrors(t));if(t)throw new ValidationError(t.toString());return[r,...e]}async updateAllPrefix(r,...e){var t=r.map(r=>findModelId(r));const o=await this.readAll(t);r=r.map((r,e)=>this.merge(o[e],r)),await Promise.all(r.map((r,e)=>enforceDBDecorators(this,r,OperationKeys.UPDATE,OperationKeys.ON,o[e])));t=r.map((r,e)=>r.hasErrors(o[e],r)).reduce((r,e,t)=>r=e?"string"==typeof r?r+(`
2
+ - ${t}: `+e.toString()):` - ${t}: `+e.toString():r,void 0);if(t)throw new ValidationError(t);return[r,...e]}}export{Repository};
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});
@@ -0,0 +1,7 @@
1
+ import { CrudOperator } from "./CrudOperator";
2
+ export interface BulkCrudOperator<M> extends CrudOperator<M> {
3
+ createAll(models: M[], ...args: any[]): Promise<M[]>;
4
+ readAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
5
+ updateAll(models: M[], ...args: any[]): Promise<M[]>;
6
+ deleteAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
7
+ }
@@ -6,7 +6,7 @@
6
6
  *
7
7
  * @category Managers
8
8
  */
9
- export interface CrudOperator<T> {
9
+ export interface CrudOperator<M> {
10
10
  /**
11
11
  * @summary Create a new model
12
12
  * @param {T} model
@@ -14,7 +14,7 @@ export interface CrudOperator<T> {
14
14
  *
15
15
  * @method
16
16
  */
17
- create(model: T, ...args: any[]): Promise<T>;
17
+ create(model: M, ...args: any[]): Promise<M>;
18
18
  /**
19
19
  * @summary Read a model
20
20
  * @param {string} key
@@ -22,7 +22,7 @@ export interface CrudOperator<T> {
22
22
  *
23
23
  * @method
24
24
  */
25
- read(key: string, ...args: any[]): Promise<T>;
25
+ read(key: string | number, ...args: any[]): Promise<M>;
26
26
  /**
27
27
  * @summary update a model
28
28
  * @param {T} model
@@ -30,7 +30,7 @@ export interface CrudOperator<T> {
30
30
  *
31
31
  * @method
32
32
  */
33
- update(model: T, ...args: any[]): Promise<T>;
33
+ update(model: M, ...args: any[]): Promise<M>;
34
34
  /**
35
35
  * @summary delete a model
36
36
  * @param {string} key
@@ -38,5 +38,5 @@ export interface CrudOperator<T> {
38
38
  *
39
39
  * @method
40
40
  */
41
- delete(key: string, ...args: any[]): Promise<T>;
41
+ delete(key: string | number, ...args: any[]): Promise<M>;
42
42
  }
@@ -1,13 +1,13 @@
1
1
  import { DBModel } from "../model/DBModel";
2
2
  import { DataCache } from "../repository/DataCache";
3
3
  import { Constructor } from "@decaf-ts/decorator-validation";
4
- import { CrudOperator } from "./CrudOperator";
4
+ import { BulkCrudOperator } from "./BulkCrudOperator";
5
5
  /**
6
6
  * @summary Interface holding basic CRUD APIs
7
7
  * @typedef T extends {@link DBModel}
8
8
  * @interface IRepository
9
9
  */
10
- export interface IRepository<T extends DBModel> extends CrudOperator<T> {
10
+ export interface IRepository<M extends DBModel> extends BulkCrudOperator<M> {
11
11
  readonly cache: DataCache;
12
- readonly class: Constructor<T>;
12
+ readonly class: Constructor<M>;
13
13
  }
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&("get"in o?t.__esModule:!o.writable&&!o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,o)}:function(e,t,r,i){e[i=void 0===i?r:i]=t[r]}),__exportStar=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||__createBinding(t,e,r)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./CrudOperator.cjs"),exports),__exportStar(require("./IRepository.cjs"),exports);
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,r,t,o){void 0===o&&(o=t);var i=Object.getOwnPropertyDescriptor(r,t);i&&("get"in i?r.__esModule:!i.writable&&!i.configurable)||(i={enumerable:!0,get:function(){return r[t]}}),Object.defineProperty(e,o,i)}:function(e,r,t,o){e[o=void 0===o?t:o]=r[t]}),__exportStar=this&&this.__exportStar||function(e,r){for(var t in e)"default"===t||Object.prototype.hasOwnProperty.call(r,t)||__createBinding(r,e,t)};Object.defineProperty(exports,"__esModule",{value:!0}),__exportStar(require("./BulkCrudOperator.cjs"),exports),__exportStar(require("./CrudOperator.cjs"),exports),__exportStar(require("./IRepository.cjs"),exports);
@@ -1,2 +1,3 @@
1
+ export * from "./BulkCrudOperator";
1
2
  export * from "./CrudOperator";
2
3
  export * from "./IRepository";
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.BaseRepository=void 0;const decorator_validation_1=require("@decaf-ts/decorator-validation"),utils_1=require("./utils.cjs"),constants_1=require("../operations/constants.cjs"),errors_1=require("./errors.cjs"),DataCache_1=require("./DataCache.cjs"),wrappers_1=require("./wrappers.cjs"),identity_1=require("../identity/index.cjs");class BaseRepository{get class(){if(this._class)return this._class;throw new errors_1.InternalError("No class definition found for this repository")}get cache(){return this._cache||(this._cache=new DataCache_1.DataCache),this._cache}constructor(t){t&&(this._class=t);const s=this;[this.create,this.read,this.update,this.delete].forEach(t=>{var e=t.name;(0,wrappers_1.wrapMethod)(s,s[e+"Prefix"],t,s[e+"Suffix"])})}async create(t){throw new Error("Child classes must implement this.")}async createPrefix(t,...e){return t=new this.class(t),await(0,utils_1.enforceDBDecorators)(this,t,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.ON),[t,...e]}async createSuffix(t){return await(0,utils_1.enforceDBDecorators)(this,t,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.AFTER),t}async read(t){throw new Error("Child classes must implement this")}async readSuffix(t){return await(0,utils_1.enforceDBDecorators)(this,t,constants_1.OperationKeys.READ,constants_1.OperationKeys.AFTER),t}async readPrefix(t,...e){var s=new this.class;return await(0,utils_1.enforceDBDecorators)(this,s,constants_1.OperationKeys.READ,constants_1.OperationKeys.ON),[t,...e]}async update(t){throw new Error("Child classes must implement this")}async updateSuffix(t){return await(0,utils_1.enforceDBDecorators)(this,t,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.AFTER),t}async updatePrefix(t,...e){var s=(0,identity_1.findModelId)(t),s=await this.read(s);return await(0,utils_1.enforceDBDecorators)(this,t,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.ON,s),[t,...e]}async delete(t){throw new Error("Child classes must implement this")}async deleteSuffix(t){return await(0,utils_1.enforceDBDecorators)(this,t,constants_1.OperationKeys.DELETE,constants_1.OperationKeys.AFTER),t}async deletePrefix(t,...e){var s=await this.read(t,...e);return await(0,utils_1.enforceDBDecorators)(this,s,constants_1.OperationKeys.DELETE,constants_1.OperationKeys.ON),[t,...e]}toString(){return(0,decorator_validation_1.sf)("[{0}] - Repository for {1}",this.constructor.name,this.class.name)}}exports.BaseRepository=BaseRepository;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.BaseRepository=void 0;const decorator_validation_1=require("@decaf-ts/decorator-validation"),utils_1=require("./utils.cjs"),constants_1=require("../operations/constants.cjs"),errors_1=require("./errors.cjs"),DataCache_1=require("./DataCache.cjs"),wrappers_1=require("./wrappers.cjs"),identity_1=require("../identity/index.cjs");class BaseRepository{get class(){if(this._class)return this._class;throw new errors_1.InternalError("No class definition found for this repository")}get cache(){return this._cache||(this._cache=new DataCache_1.DataCache),this._cache}constructor(e){e&&(this._class=e);const s=this;[this.create,this.read,this.update,this.delete].forEach(e=>{var t=e.name;(0,wrappers_1.wrapMethod)(s,s[t+"Prefix"],e,s[t+"Suffix"])})}async create(e){throw new Error("Child classes must implement this.")}async createAll(e,...t){return Promise.all(e.map(e=>this.create(e,...t)))}async createPrefix(e,...t){return e=new this.class(e),await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.ON),[e,...t]}async createSuffix(e){return await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.AFTER),e}async createAllPrefix(e,...t){return await Promise.all(e.map(e=>(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.ON))),[e,...t]}async createAllSuffix(e){return await Promise.all(e.map(e=>(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.AFTER))),e}async read(e){throw new Error("Child classes must implement this")}async readAll(e,...t){return Promise.all(e.map(e=>this.read(e,...t)))}async readSuffix(e){return await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.READ,constants_1.OperationKeys.AFTER),e}async readPrefix(e,...t){var s=new this.class;return s[(0,identity_1.findPrimaryKey)(s).id]=e,await(0,utils_1.enforceDBDecorators)(this,s,constants_1.OperationKeys.READ,constants_1.OperationKeys.ON),[e,...t]}async readAllPrefix(e,...t){var s=new this.class;const a=(0,identity_1.findPrimaryKey)(s).id;return await Promise.all(e.map(async e=>{var t=new this.class;return t[a]=e,(0,utils_1.enforceDBDecorators)(this,t,constants_1.OperationKeys.READ,constants_1.OperationKeys.ON)})),[e,...t]}async readAllSuffix(e){return await Promise.all(e.map(e=>(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.READ,constants_1.OperationKeys.AFTER))),e}async update(e){throw new Error("Child classes must implement this")}async updateAll(e,...t){return Promise.all(e.map(e=>this.update(e,...t)))}async updateSuffix(e){return await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.AFTER),e}async updatePrefix(e,...t){var s=(0,identity_1.findModelId)(e),s=await this.read(s);return await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.ON,s),[e,...t]}async updateAllPrefix(e,...t){return await Promise.all(e.map(e=>(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.ON))),[e,...t]}async updateAllSuffix(e){return await Promise.all(e.map(e=>(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.AFTER))),e}async delete(e){throw new Error("Child classes must implement this")}async deleteAll(e,...t){return Promise.all(e.map(e=>this.delete(e,...t)))}async deleteSuffix(e){return await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.DELETE,constants_1.OperationKeys.AFTER),e}async deletePrefix(e,...t){var s=await this.read(e,...t);return await(0,utils_1.enforceDBDecorators)(this,s,constants_1.OperationKeys.DELETE,constants_1.OperationKeys.ON),[e,...t]}async deleteAllPrefix(e,...t){var s=await this.readAll(e,...t);return await Promise.all(s.map(async e=>(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.DELETE,constants_1.OperationKeys.ON))),[e,...t]}async deleteAllSuffix(e){return await Promise.all(e.map(e=>(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.DELETE,constants_1.OperationKeys.AFTER))),e}merge(e,t){var s=e=>Object.entries(e).reduce((e,[t,s])=>(void 0!==s&&(e[t]=s),e),{});return new this.class(Object.assign({},s(e),s(t)))}toString(){return(0,decorator_validation_1.sf)("[{0}] - Repository for {1}",this.constructor.name,this.class.name)}}exports.BaseRepository=BaseRepository;
@@ -2,23 +2,36 @@ import { IRepository } from "../interfaces/IRepository";
2
2
  import { DBModel } from "../model/DBModel";
3
3
  import { Constructor } from "@decaf-ts/decorator-validation";
4
4
  import { DataCache } from "./DataCache";
5
- export declare abstract class BaseRepository<T extends DBModel> implements IRepository<T> {
5
+ export declare abstract class BaseRepository<M extends DBModel> implements IRepository<M> {
6
6
  private readonly _class;
7
7
  private _cache?;
8
- get class(): Constructor<T>;
8
+ get class(): Constructor<M>;
9
9
  get cache(): DataCache;
10
- protected constructor(clazz?: Constructor<T>);
11
- create(model: T, ...args: any[]): Promise<T>;
12
- protected createPrefix(model: T, ...args: any[]): Promise<any[]>;
13
- protected createSuffix(model: T): Promise<T>;
14
- read(key: string, ...args: any[]): Promise<T>;
15
- protected readSuffix(model: T): Promise<T>;
10
+ protected constructor(clazz?: Constructor<M>);
11
+ create(model: M, ...args: any[]): Promise<M>;
12
+ createAll(models: M[], ...args: any[]): Promise<Awaited<M>[]>;
13
+ protected createPrefix(model: M, ...args: any[]): Promise<any[]>;
14
+ protected createSuffix(model: M): Promise<M>;
15
+ protected createAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
16
+ protected createAllSuffix(models: M[]): Promise<M[]>;
17
+ read(key: string | number, ...args: any[]): Promise<M>;
18
+ readAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
19
+ protected readSuffix(model: M): Promise<M>;
16
20
  protected readPrefix(key: string, ...args: any[]): Promise<any[]>;
17
- update(model: T, ...args: any[]): Promise<T>;
18
- protected updateSuffix(model: T): Promise<T>;
19
- protected updatePrefix(model: T, ...args: any[]): Promise<any[]>;
20
- delete(key: string, ...args: any[]): Promise<T>;
21
- protected deleteSuffix(model: T): Promise<T>;
21
+ protected readAllPrefix(keys: string[] | number[], ...args: any[]): Promise<any[]>;
22
+ protected readAllSuffix(models: M[]): Promise<M[]>;
23
+ update(model: M, ...args: any[]): Promise<M>;
24
+ updateAll(models: M[], ...args: any): Promise<M[]>;
25
+ protected updateSuffix(model: M): Promise<M>;
26
+ protected updatePrefix(model: M, ...args: any[]): Promise<any[]>;
27
+ protected updateAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
28
+ protected updateAllSuffix(models: M[]): Promise<M[]>;
29
+ delete(key: string | number, ...args: any[]): Promise<M>;
30
+ deleteAll(keys: string[] | number[], ...args: any[]): Promise<M[]>;
31
+ protected deleteSuffix(model: M): Promise<M>;
22
32
  protected deletePrefix(key: any, ...args: any[]): Promise<any[]>;
33
+ protected deleteAllPrefix(keys: string[] | number[], ...args: any[]): Promise<any[]>;
34
+ protected deleteAllSuffix(models: M[]): Promise<M[]>;
35
+ protected merge(oldModel: M, model: M): M;
23
36
  toString(): string;
24
37
  }
@@ -1 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Repository=void 0;const utils_1=require("./utils.cjs"),constants_1=require("../operations/constants.cjs"),errors_1=require("./errors.cjs"),BaseRepository_1=require("./BaseRepository.cjs"),identity_1=require("../identity/index.cjs");class Repository extends BaseRepository_1.BaseRepository{constructor(e){super(e)}async create(e){throw new Error("Child classes must implement this.")}async createPrefix(e,...r){e=new this.class(e),await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.ON);var s=e.hasErrors();if(s)throw new errors_1.ValidationError(s.toString());return[e,...r]}async delete(e){throw new Error("Child classes must implement this.")}async deletePrefix(e,...r){var s=new this.class;return await(0,utils_1.enforceDBDecorators)(this,s,constants_1.OperationKeys.DELETE,constants_1.OperationKeys.ON),[e,...r]}async read(e){throw new Error("Child classes must implement this.")}async update(e){throw new Error("Child classes must implement this.")}async updatePrefix(e,...r){e=new this.class(e);var s=(0,identity_1.findModelId)(e),s=await this.read(s),s=(await(0,utils_1.enforceDBDecorators)(this,e,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.ON,s),e.hasErrors(s));if(s)throw new errors_1.ValidationError(s.toString());return[e,...r]}}exports.Repository=Repository;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Repository=void 0;const utils_1=require("./utils.cjs"),constants_1=require("../operations/constants.cjs"),errors_1=require("./errors.cjs"),BaseRepository_1=require("./BaseRepository.cjs"),identity_1=require("../identity/index.cjs");class Repository extends BaseRepository_1.BaseRepository{constructor(r){super(r)}async create(r){throw new Error("Child classes must implement this.")}async createPrefix(r,...e){r=new this.class(r),await(0,utils_1.enforceDBDecorators)(this,r,constants_1.OperationKeys.CREATE,constants_1.OperationKeys.ON);var t=r.hasErrors();if(t)throw new errors_1.ValidationError(t.toString());return[r,...e]}async delete(r){throw new Error("Child classes must implement this.")}async read(r){throw new Error("Child classes must implement this.")}async update(r){throw new Error("Child classes must implement this.")}async updatePrefix(r,...e){var t=(0,identity_1.findModelId)(r),t=await this.read(t),t=(r=this.merge(t,r),await(0,utils_1.enforceDBDecorators)(this,r,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.ON,t),r.hasErrors(t));if(t)throw new errors_1.ValidationError(t.toString());return[r,...e]}async updateAllPrefix(r,...e){var t=r.map(r=>(0,identity_1.findModelId)(r));const s=await this.readAll(t);r=r.map((r,e)=>this.merge(s[e],r)),await Promise.all(r.map((r,e)=>(0,utils_1.enforceDBDecorators)(this,r,constants_1.OperationKeys.UPDATE,constants_1.OperationKeys.ON,s[e])));t=r.map((r,e)=>r.hasErrors(s[e],r)).reduce((r,e,t)=>r=e?"string"==typeof r?r+(`
2
+ - ${t}: `+e.toString()):` - ${t}: `+e.toString():r,void 0);if(t)throw new errors_1.ValidationError(t);return[r,...e]}}exports.Repository=Repository;
@@ -1,13 +1,13 @@
1
1
  import { DBModel } from "../model/DBModel";
2
2
  import { BaseRepository } from "./BaseRepository";
3
3
  import { Constructor } from "@decaf-ts/decorator-validation";
4
- export declare abstract class Repository<T extends DBModel> extends BaseRepository<T> {
5
- protected constructor(clazz?: Constructor<T>);
6
- create(model: T): Promise<T>;
7
- protected createPrefix(model: T, ...args: any[]): Promise<[T, ...any[]]>;
8
- delete(key: string | number): Promise<T>;
9
- protected deletePrefix(key: string | number, ...args: any[]): Promise<[string | number, ...any[]]>;
10
- read(key: string | number): Promise<T>;
11
- update(model: T): Promise<T>;
12
- protected updatePrefix(model: T, ...args: any[]): Promise<[T, ...args: any[]]>;
4
+ export declare abstract class Repository<M extends DBModel> extends BaseRepository<M> {
5
+ protected constructor(clazz?: Constructor<M>);
6
+ create(model: M): Promise<M>;
7
+ protected createPrefix(model: M, ...args: any[]): Promise<[M, ...any[]]>;
8
+ delete(key: string | number): Promise<M>;
9
+ read(key: string | number): Promise<M>;
10
+ update(model: M): Promise<M>;
11
+ protected updatePrefix(model: M, ...args: any[]): Promise<[M, ...args: any[]]>;
12
+ protected updateAllPrefix(models: M[], ...args: any[]): Promise<any[]>;
13
13
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@decaf-ts/db-decorators",
3
- "version": "0.1.6",
3
+ "version": "0.2.0",
4
4
  "description": "Agnostic database decorators and repository",
5
5
  "type": "module",
6
6
  "exports": {