@spinajs/orm 1.0.60 → 1.2.32

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.
Files changed (91) hide show
  1. package/README.md +11 -2
  2. package/lib/builders.d.ts +30 -23
  3. package/lib/builders.js +74 -195
  4. package/lib/builders.js.map +1 -1
  5. package/lib/decorators.d.ts +18 -19
  6. package/lib/decorators.js +30 -30
  7. package/lib/decorators.js.map +1 -1
  8. package/lib/driver.d.ts +10 -9
  9. package/lib/driver.js +10 -20
  10. package/lib/driver.js.map +1 -1
  11. package/lib/exceptions.d.ts +6 -0
  12. package/lib/exceptions.js +11 -0
  13. package/lib/exceptions.js.map +1 -0
  14. package/lib/helpers.js +2 -2
  15. package/lib/helpers.js.map +1 -1
  16. package/lib/hydrators.d.ts +4 -4
  17. package/lib/hydrators.js +6 -6
  18. package/lib/hydrators.js.map +1 -1
  19. package/lib/index.d.ts +0 -1
  20. package/lib/index.js +1 -2
  21. package/lib/index.js.map +1 -1
  22. package/lib/interfaces.d.ts +19 -27
  23. package/lib/interfaces.js +14 -14
  24. package/lib/interfaces.js.map +1 -1
  25. package/lib/log-common/src/index.d.ts +180 -0
  26. package/lib/log-common/src/index.js +49 -0
  27. package/lib/log-common/src/index.js.map +1 -0
  28. package/lib/model.d.ts +55 -53
  29. package/lib/model.js +132 -149
  30. package/lib/model.js.map +1 -1
  31. package/lib/orm/src/builders.d.ts +429 -0
  32. package/lib/orm/src/builders.js +1082 -0
  33. package/lib/orm/src/builders.js.map +1 -0
  34. package/lib/orm/src/cli.d.ts +1 -0
  35. package/lib/orm/src/cli.js +2 -0
  36. package/lib/orm/src/cli.js.map +1 -0
  37. package/lib/orm/src/converters.d.ts +9 -0
  38. package/lib/orm/src/converters.js +22 -0
  39. package/lib/orm/src/converters.js.map +1 -0
  40. package/lib/orm/src/decorators.d.ts +122 -0
  41. package/lib/orm/src/decorators.js +380 -0
  42. package/lib/orm/src/decorators.js.map +1 -0
  43. package/lib/orm/src/driver.d.ts +77 -0
  44. package/lib/orm/src/driver.js +84 -0
  45. package/lib/orm/src/driver.js.map +1 -0
  46. package/lib/orm/src/enums.d.ts +111 -0
  47. package/lib/orm/src/enums.js +122 -0
  48. package/lib/orm/src/enums.js.map +1 -0
  49. package/lib/orm/src/exceptions.d.ts +6 -0
  50. package/lib/orm/src/exceptions.js +11 -0
  51. package/lib/orm/src/exceptions.js.map +1 -0
  52. package/lib/orm/src/hydrators.d.ts +16 -0
  53. package/lib/orm/src/hydrators.js +70 -0
  54. package/lib/orm/src/hydrators.js.map +1 -0
  55. package/lib/orm/src/index.d.ts +12 -0
  56. package/lib/orm/src/index.js +25 -0
  57. package/lib/orm/src/index.js.map +1 -0
  58. package/lib/orm/src/interfaces.d.ts +615 -0
  59. package/lib/orm/src/interfaces.js +186 -0
  60. package/lib/orm/src/interfaces.js.map +1 -0
  61. package/lib/orm/src/model.d.ts +135 -0
  62. package/lib/orm/src/model.js +449 -0
  63. package/lib/orm/src/model.js.map +1 -0
  64. package/lib/orm/src/orm.d.ts +59 -0
  65. package/lib/orm/src/orm.js +278 -0
  66. package/lib/orm/src/orm.js.map +1 -0
  67. package/lib/orm/src/relations.d.ts +96 -0
  68. package/lib/orm/src/relations.js +503 -0
  69. package/lib/orm/src/relations.js.map +1 -0
  70. package/lib/orm/src/statements.d.ts +132 -0
  71. package/lib/orm/src/statements.js +257 -0
  72. package/lib/orm/src/statements.js.map +1 -0
  73. package/lib/orm/src/types.d.ts +2 -0
  74. package/lib/orm/src/types.js +3 -0
  75. package/lib/orm/src/types.js.map +1 -0
  76. package/lib/orm/src/wrappers.d.ts +5 -0
  77. package/lib/orm/src/wrappers.js +13 -0
  78. package/lib/orm/src/wrappers.js.map +1 -0
  79. package/lib/orm.d.ts +9 -9
  80. package/lib/orm.js +69 -47
  81. package/lib/orm.js.map +1 -1
  82. package/lib/relations.d.ts +14 -13
  83. package/lib/relations.js +60 -81
  84. package/lib/relations.js.map +1 -1
  85. package/lib/statements.d.ts +1 -1
  86. package/lib/statements.js +19 -21
  87. package/lib/statements.js.map +1 -1
  88. package/lib/wrappers.d.ts +1 -1
  89. package/lib/wrappers.js.map +1 -1
  90. package/package.json +37 -61
  91. package/LICENSE +0 -674
package/lib/model.d.ts CHANGED
@@ -1,9 +1,9 @@
1
1
  import { IModelDescrtiptor, InsertBehaviour } from './interfaces';
2
2
  import { WhereFunction } from './types';
3
- import { RawQuery, UpdateQueryBuilder, SelectQueryBuilder, DeleteQueryBuilder, InsertQueryBuilder } from './builders';
3
+ import { RawQuery, UpdateQueryBuilder, SelectQueryBuilder, InsertQueryBuilder } from './builders';
4
4
  import { WhereOperators } from './enums';
5
5
  export declare function extractModelDescriptor(targetOrForward: any): IModelDescrtiptor;
6
- export declare abstract class ModelBase<T> {
6
+ export declare class ModelBase {
7
7
  /**
8
8
  * Gets descriptor for this model. It contains information about relations, orm driver, connection properties,
9
9
  * db table attached, column information and others.
@@ -15,119 +15,121 @@ export declare abstract class ModelBase<T> {
15
15
  /**
16
16
  * Get all data from db
17
17
  */
18
- static all<T>(_page?: number, _perPage?: number): SelectQueryBuilder<T>;
18
+ static all<T extends typeof ModelBase>(this: T, _page?: number, _perPage?: number): SelectQueryBuilder<Array<InstanceType<T>>>;
19
19
  /**
20
- * Inserts data to DB
20
+ * Inserts data to DB.
21
21
  *
22
- * @param _data data to insert
22
+ * @param _data - data to insert
23
23
  */
24
- static insert<T extends ModelBase<T>>(_data: T | object): InsertQueryBuilder;
24
+ static insert<T extends typeof ModelBase>(this: T, _data: InstanceType<T> | Partial<InstanceType<T>> | Array<InstanceType<T>> | Array<Partial<InstanceType<T>>>): InsertQueryBuilder;
25
25
  /**
26
- * Inserts multiple data at once to DB
26
+ * Search entities in db
27
27
  *
28
- * @param _data data to insert
28
+ * @param column - column to search or function
29
+ * @param operator - boolean operator
30
+ * @param value - value to compare
29
31
  */
30
- static insertBulk<T extends ModelBase<T>>(_data: T[] | object[]): Promise<void>;
32
+ static where<T extends typeof ModelBase>(this: T, _column: string | boolean | WhereFunction | RawQuery | object, _operator?: WhereOperators | any, _value?: any): SelectQueryBuilder<Array<InstanceType<T>>>;
31
33
  /**
32
- * Search entities in db
34
+ * Updates single or multiple records at once with provided value based on condition
33
35
  *
34
- * @param column column to search or function
35
- * @param operator boolean operator
36
- * @param value value to compare
36
+ * @param _data - data to set
37
+ */
38
+ static update<T extends typeof ModelBase>(this: T, _data: Partial<InstanceType<T>>): UpdateQueryBuilder;
39
+ /**
40
+ * Tries to find all models with given primary keys
41
+ */
42
+ static find<T extends typeof ModelBase>(this: T, _pks: any[]): Promise<Array<InstanceType<T>>>;
43
+ /**
44
+ * Tries to find all models in db. If not all exists, throws exception
45
+ */
46
+ static findOrFail<T extends typeof ModelBase>(this: T, _pks: any[]): Promise<Array<InstanceType<T>>>;
47
+ /**
48
+ * gets model by specified pk, if not exists, returns null
37
49
  *
38
- * @returns {SelectQueryBuilder} fluent query builder to add more conditions if needed
39
50
  */
40
- static where<T>(_column: string | boolean | WhereFunction | RawQuery | {}, _operator?: WhereOperators | any, _value?: any): SelectQueryBuilder<T>;
51
+ static get<T extends typeof ModelBase>(this: T, _pk: any): Promise<InstanceType<T>>;
41
52
  /**
42
- * Updates single or multiple records at once with provided value based on condition
53
+ * Finds model by specified pk. If model not exists in db throws exception
43
54
  *
44
- * @param _data data to set
45
55
  */
46
- static update(_data: object): UpdateQueryBuilder;
47
- static find<T>(pks: any[]): Promise<T[]>;
48
- static find<T>(pks: any): Promise<T>;
56
+ static getOrFail<T extends typeof ModelBase>(this: T, _pk: any): Promise<InstanceType<T>>;
49
57
  /**
50
- * Finds model by specified pk
51
58
  *
52
- * @param _pk pk to find
59
+ * Checks if model with pk key or unique fields exists and if not creates one AND NOT save in db
60
+ * NOTE: it checks for unique fields constraint
53
61
  */
54
- static findOrFail<T>(_pk: any): Promise<T>;
62
+ static getOrNew<T extends typeof ModelBase>(this: T, _pk?: any, _data?: Partial<InstanceType<T>>): Promise<InstanceType<T>>;
55
63
  /**
56
64
  * Creates raw query on this model. used for quering db for partial data or to perform some kind of operations
57
65
  * that dont need full ORM model to involve
58
66
  */
59
- static query<T>(): SelectQueryBuilder<T>;
67
+ static query<T>(this: T): SelectQueryBuilder<T>;
60
68
  /**
61
69
  *
62
70
  * Checks if model with pk key / unique fields exists and if not creates one and saves to db
63
71
  * NOTE: it checks for unique fields too.
64
72
  *
65
- * @param {any} data - model width data to check
73
+ * @param data - model width data to check
66
74
  */
67
- static firstOrCreate<T>(_pk: any, _data?: any): Promise<T>;
75
+ static getOrCreate<T extends typeof ModelBase>(this: T, _pk: any, _data?: Partial<InstanceType<T>>): Promise<InstanceType<T>>;
68
76
  /**
69
77
  * Creates new model & saves is to db
70
78
  *
71
- * @param {any} data - initial model data
72
- */
73
- static create<T>(_data?: any): Promise<T>;
74
- /**
75
- *
76
- * Checks if model with pk key or unique fields exists and if not creates one AND NOT save in db
77
- * NOTE: it checks for unique fields constraint
78
- *
79
- * @param {any} data - model to check
79
+ * @param data - initial model data
80
80
  */
81
- static firstOrNew<T>(_data?: any): Promise<T>;
81
+ static create<T extends typeof ModelBase>(this: T, _data: Partial<InstanceType<T>>): Promise<InstanceType<T>>;
82
82
  /**
83
83
  * Deletes model from db
84
84
  *
85
- * @param pk? primary key
85
+ * @param pk - primary key
86
86
  */
87
- static destroy(): DeleteQueryBuilder;
87
+ static destroy(_pk?: any | any[]): Promise<void>;
88
88
  constructor(data?: any);
89
89
  /**
90
90
  * Fills model with data. It only fills properties that exists in database
91
91
  *
92
- * @param data data to fill
92
+ * @param data - data to fill
93
93
  */
94
- hydrate(data: any): void;
94
+ hydrate(data: Partial<this>): void;
95
95
  /**
96
96
  * Extracts all data from model. It takes only properties that exists in DB
97
97
  */
98
- dehydrate(): {};
98
+ dehydrate(): Partial<this>;
99
99
  /**
100
100
  * deletes enitt from db. If model have SoftDelete decorator, model is marked as deleted
101
101
  */
102
102
  destroy(): Promise<void>;
103
+ update(): Promise<void>;
103
104
  /**
104
105
  * Save all changes to db. It creates new entry id db or updates existing one if
105
106
  * primary key exists
106
107
  */
107
- save(insertBehaviour?: InsertBehaviour): Promise<void>;
108
+ insert(insertBehaviour?: InsertBehaviour): Promise<void>;
108
109
  /**
109
110
  * Gets model data from database and returns as fresh instance.
110
111
  */
111
- fresh(): Promise<T>;
112
+ fresh(): Promise<this>;
112
113
  /**
113
114
  * sets default values for model. values are taken from DB default column prop
114
115
  */
115
- protected defaults(): void;
116
+ protected setDefaults(): void;
116
117
  }
117
118
  export declare const MODEL_STATIC_MIXINS: {
118
119
  query(): SelectQueryBuilder;
119
120
  where(column: string | boolean | WhereFunction | RawQuery | {}, operator?: WhereOperators | any, value?: any): SelectQueryBuilder;
120
- update(data: object): UpdateQueryBuilder;
121
+ update<T extends typeof ModelBase>(data: Partial<InstanceType<T>>): UpdateQueryBuilder;
121
122
  all(page: number, perPage: number): SelectQueryBuilder;
122
- insertBulk<T>(data: (object | ModelBase<T>)[]): InsertQueryBuilder;
123
123
  /**
124
124
  * Try to insert new value
125
125
  */
126
- insert<T_1>(data: object | ModelBase<T_1>): InsertQueryBuilder;
127
- find(pks: any | any[]): Promise<any>;
128
- findOrFail<T_2>(pks: any | any[]): Promise<T_2 | T_2[]>;
129
- destroy(pks?: any | any[]): Promise<any> | DeleteQueryBuilder | UpdateQueryBuilder;
130
- create(data?: any): Promise<any>;
131
- firstOrCreate(data?: any): Promise<any>;
132
- firstOrNew(data?: any): Promise<any>;
126
+ insert<T_1 extends typeof ModelBase>(this: T_1, data: InstanceType<T_1> | Partial<InstanceType<T_1>> | InstanceType<T_1>[] | Partial<InstanceType<T_1>>[]): InsertQueryBuilder;
127
+ find<T_2 extends typeof ModelBase>(this: T_2, pks: any[]): Promise<InstanceType<T_2>[]>;
128
+ findOrFail<T_3 extends typeof ModelBase>(this: T_3, pks: any[]): Promise<InstanceType<T_3>[]>;
129
+ get<T_4 extends typeof ModelBase>(this: T_4, pk: any): Promise<InstanceType<T_4>>;
130
+ getOrFail<T_5 extends typeof ModelBase>(this: T_5, pk: any): Promise<InstanceType<T_5>>;
131
+ destroy(pks: any | any[]): Promise<void>;
132
+ create<T_6 extends typeof ModelBase>(this: T_6, data: Partial<InstanceType<T_6>>): Promise<InstanceType<T_6>>;
133
+ getOrCreate<T_7 extends typeof ModelBase>(this: T_7, pk: any, data: Partial<InstanceType<T_7>>): Promise<InstanceType<T_7>>;
134
+ getOrNew<T_8 extends typeof ModelBase>(this: T_8, pk: any, data?: Partial<InstanceType<T_8>>): Promise<InstanceType<T_8>>;
133
135
  };
package/lib/model.js CHANGED
@@ -1,25 +1,7 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
- }) : (function(o, m, k, k2) {
6
- if (k2 === undefined) k2 = k;
7
- o[k2] = m[k];
8
- }));
9
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
- Object.defineProperty(o, "default", { enumerable: true, value: v });
11
- }) : function(o, v) {
12
- o["default"] = v;
13
- });
14
- var __importStar = (this && this.__importStar) || function (mod) {
15
- if (mod && mod.__esModule) return mod;
16
- var result = {};
17
- if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
- __setModuleDefault(result, mod);
19
- return result;
20
- };
21
2
  Object.defineProperty(exports, "__esModule", { value: true });
22
3
  exports.MODEL_STATIC_MIXINS = exports.ModelBase = exports.extractModelDescriptor = void 0;
4
+ /* eslint-disable prettier/prettier */
23
5
  const relations_1 = require("./relations");
24
6
  const decorators_1 = require("./decorators");
25
7
  const interfaces_1 = require("./interfaces");
@@ -27,10 +9,11 @@ const builders_1 = require("./builders");
27
9
  const di_1 = require("@spinajs/di");
28
10
  const orm_1 = require("./orm");
29
11
  const hydrators_1 = require("./hydrators");
30
- const _ = __importStar(require("lodash"));
12
+ const _ = require("lodash");
31
13
  const uuid_1 = require("uuid");
14
+ const exceptions_1 = require("./exceptions");
32
15
  function extractModelDescriptor(targetOrForward) {
33
- const target = !di_1.isConstructor(targetOrForward) && targetOrForward ? targetOrForward() : targetOrForward;
16
+ const target = !(0, di_1.isConstructor)(targetOrForward) && targetOrForward ? targetOrForward() : targetOrForward;
34
17
  if (!target) {
35
18
  return null;
36
19
  }
@@ -82,51 +65,63 @@ class ModelBase {
82
65
  throw Error('Not implemented');
83
66
  }
84
67
  /**
85
- * Inserts data to DB
68
+ * Inserts data to DB.
86
69
  *
87
- * @param _data data to insert
70
+ * @param _data - data to insert
88
71
  */
89
72
  static insert(_data) {
90
73
  throw Error('Not implemented');
91
74
  }
92
75
  /**
93
- * Inserts multiple data at once to DB
76
+ * Search entities in db
94
77
  *
95
- * @param _data data to insert
78
+ * @param column - column to search or function
79
+ * @param operator - boolean operator
80
+ * @param value - value to compare
96
81
  */
97
- static insertBulk(_data) {
82
+ static where(_column, _operator, _value) {
98
83
  throw Error('Not implemented');
99
84
  }
100
85
  /**
101
- * Search entities in db
102
- *
103
- * @param column column to search or function
104
- * @param operator boolean operator
105
- * @param value value to compare
86
+ * Updates single or multiple records at once with provided value based on condition
106
87
  *
107
- * @returns {SelectQueryBuilder} fluent query builder to add more conditions if needed
88
+ * @param _data - data to set
108
89
  */
109
- static where(_column, _operator, _value) {
90
+ static update(_data) {
110
91
  throw Error('Not implemented');
111
92
  }
112
93
  /**
113
- * Updates single or multiple records at once with provided value based on condition
94
+ * Tries to find all models with given primary keys
95
+ */
96
+ static find(_pks) {
97
+ throw Error('Not implemented');
98
+ }
99
+ /**
100
+ * Tries to find all models in db. If not all exists, throws exception
101
+ */
102
+ static findOrFail(_pks) {
103
+ throw Error('Not implemented');
104
+ }
105
+ /**
106
+ * gets model by specified pk, if not exists, returns null
114
107
  *
115
- * @param _data data to set
116
108
  */
117
- static update(_data) {
109
+ static get(_pk) {
118
110
  throw Error('Not implemented');
119
111
  }
120
- // @ts-ignore
121
- static find(pks) {
112
+ /**
113
+ * Finds model by specified pk. If model not exists in db throws exception
114
+ *
115
+ */
116
+ static getOrFail(_pk) {
122
117
  throw Error('Not implemented');
123
118
  }
124
119
  /**
125
- * Finds model by specified pk
126
120
  *
127
- * @param _pk pk to find
121
+ * Checks if model with pk key or unique fields exists and if not creates one AND NOT save in db
122
+ * NOTE: it checks for unique fields constraint
128
123
  */
129
- static findOrFail(_pk) {
124
+ static getOrNew(_pk, _data) {
130
125
  throw Error('Not implemented');
131
126
  }
132
127
  /**
@@ -141,34 +136,29 @@ class ModelBase {
141
136
  * Checks if model with pk key / unique fields exists and if not creates one and saves to db
142
137
  * NOTE: it checks for unique fields too.
143
138
  *
144
- * @param {any} data - model width data to check
139
+ * @param data - model width data to check
145
140
  */
146
- static firstOrCreate(_pk, _data) {
141
+ static getOrCreate(_pk, _data) {
147
142
  throw Error('Not implemented');
148
143
  }
149
144
  /**
150
145
  * Creates new model & saves is to db
151
146
  *
152
- * @param {any} data - initial model data
147
+ * @param data - initial model data
153
148
  */
154
149
  static create(_data) {
155
150
  throw Error('Not implemented');
156
151
  }
157
152
  /**
153
+ * Deletes model from db
158
154
  *
159
- * Checks if model with pk key or unique fields exists and if not creates one AND NOT save in db
160
- * NOTE: it checks for unique fields constraint
161
- *
162
- * @param {any} data - model to check
155
+ * @param pk - primary key
163
156
  */
164
- static firstOrNew(_data) {
165
- throw Error('Not implemented');
166
- }
167
157
  static destroy(_pk) {
168
158
  throw Error('Not implemented');
169
159
  }
170
160
  constructor(data) {
171
- this.defaults();
161
+ this.setDefaults();
172
162
  if (data) {
173
163
  Object.assign(this, data);
174
164
  }
@@ -176,10 +166,10 @@ class ModelBase {
176
166
  /**
177
167
  * Fills model with data. It only fills properties that exists in database
178
168
  *
179
- * @param data data to fill
169
+ * @param data - data to fill
180
170
  */
181
171
  hydrate(data) {
182
- di_1.DI.resolve(Array.ofType(hydrators_1.ModelHydrator)).forEach(h => h.hydrate(this, data));
172
+ di_1.DI.resolve(Array.ofType(hydrators_1.ModelHydrator)).forEach((h) => h.hydrate(this, data));
183
173
  }
184
174
  /**
185
175
  * Extracts all data from model. It takes only properties that exists in DB
@@ -187,8 +177,11 @@ class ModelBase {
187
177
  dehydrate() {
188
178
  var _a;
189
179
  const obj = {};
190
- (_a = this.ModelDescriptor.Columns) === null || _a === void 0 ? void 0 : _a.forEach(c => {
180
+ (_a = this.ModelDescriptor.Columns) === null || _a === void 0 ? void 0 : _a.forEach((c) => {
191
181
  const val = this[c.Name];
182
+ if (!c.Nullable && (val === null || val === undefined || val === '')) {
183
+ throw new exceptions_1.OrmException(`Field ${c.Name} cannot be null`);
184
+ }
192
185
  obj[c.Name] = c.Converter ? c.Converter.toDB(val) : val;
193
186
  });
194
187
  for (const [, val] of this.ModelDescriptor.Relations) {
@@ -209,62 +202,60 @@ class ModelBase {
209
202
  }
210
203
  await this.constructor.destroy(this.PrimaryKeyValue);
211
204
  }
205
+ async update() {
206
+ const { query } = _createQuery(this.constructor, builders_1.UpdateQueryBuilder);
207
+ if (this.ModelDescriptor.Timestamps.UpdatedAt) {
208
+ this[this.ModelDescriptor.Timestamps.UpdatedAt] = new Date();
209
+ }
210
+ await query.update(this.dehydrate()).where(this.PrimaryKeyName, this.PrimaryKeyValue);
211
+ }
212
212
  /**
213
213
  * Save all changes to db. It creates new entry id db or updates existing one if
214
214
  * primary key exists
215
215
  */
216
- async save(insertBehaviour = interfaces_1.InsertBehaviour.None) {
216
+ async insert(insertBehaviour = interfaces_1.InsertBehaviour.None) {
217
217
  const self = this;
218
- if (this.PrimaryKeyValue) {
219
- const { query } = _createQuery(this.constructor, builders_1.UpdateQueryBuilder);
220
- if (this.ModelDescriptor.Timestamps.UpdatedAt) {
221
- this[this.ModelDescriptor.Timestamps.UpdatedAt] = new Date();
222
- }
223
- await query.update(this.dehydrate()).where(this.PrimaryKeyName, this.PrimaryKeyValue);
218
+ const { query, description } = _createQuery(this.constructor, builders_1.InsertQueryBuilder);
219
+ switch (insertBehaviour) {
220
+ case interfaces_1.InsertBehaviour.OnDuplicateIgnore:
221
+ query.ignore();
222
+ break;
223
+ case interfaces_1.InsertBehaviour.OnDuplicateUpdate:
224
+ query.onDuplicate().update(description.Columns.filter((c) => !c.PrimaryKey).map((c) => c.Name));
225
+ break;
226
+ }
227
+ const id = await query.values(this.dehydrate());
228
+ // ignore fired, we dont have insert ID
229
+ if (insertBehaviour !== interfaces_1.InsertBehaviour.None && id === 0 && !this.PrimaryKeyValue) {
230
+ const { query, description } = _createQuery(this.constructor, builders_1.SelectQueryBuilder, false);
231
+ const idRes = await query
232
+ .columns([this.PrimaryKeyName])
233
+ .where(function () {
234
+ description.Columns.filter((c) => c.Unique).forEach((c) => {
235
+ this.where(c, self[c.Name]);
236
+ });
237
+ })
238
+ .first();
239
+ this.PrimaryKeyValue = idRes[this.PrimaryKeyName];
224
240
  }
225
241
  else {
226
- const { query, description } = _createQuery(this.constructor, builders_1.InsertQueryBuilder);
227
- switch (insertBehaviour) {
228
- case interfaces_1.InsertBehaviour.OnDuplicateIgnore:
229
- query.ignore();
230
- break;
231
- case interfaces_1.InsertBehaviour.OnDuplicateUpdate:
232
- query.onDuplicate().update(description.Columns.filter(c => !c.PrimaryKey).map(c => c.Name));
233
- break;
234
- }
235
- const id = await query.values(this.dehydrate());
236
- // ignore fired, we dont have insert ID
237
- if (insertBehaviour !== interfaces_1.InsertBehaviour.None && id === 0 && !this.PrimaryKeyValue) {
238
- const { query, description } = _createQuery(this.constructor, builders_1.SelectQueryBuilder, false);
239
- const idRes = await query
240
- .columns([this.PrimaryKeyName])
241
- .where(function () {
242
- description.Columns.filter(c => c.Unique).forEach(c => {
243
- this.where(c, self[c.Name]);
244
- });
245
- })
246
- .first();
247
- this.PrimaryKeyValue = idRes[this.PrimaryKeyName];
248
- }
249
- else {
250
- this.PrimaryKeyValue = id;
251
- }
242
+ this.PrimaryKeyValue = id;
252
243
  }
253
244
  }
254
245
  /**
255
246
  * Gets model data from database and returns as fresh instance.
256
247
  */
257
248
  async fresh() {
258
- return this.constructor.find(this.PrimaryKeyValue);
249
+ return this.constructor.get(this.PrimaryKeyValue);
259
250
  }
260
251
  /**
261
252
  * sets default values for model. values are taken from DB default column prop
262
253
  */
263
- defaults() {
254
+ setDefaults() {
264
255
  var _a;
265
- (_a = this.ModelDescriptor.Columns) === null || _a === void 0 ? void 0 : _a.forEach(c => {
256
+ (_a = this.ModelDescriptor.Columns) === null || _a === void 0 ? void 0 : _a.forEach((c) => {
266
257
  if (c.Uuid) {
267
- this[c.Name] = uuid_1.v4();
258
+ this[c.Name] = (0, uuid_1.v4)();
268
259
  }
269
260
  else {
270
261
  this[c.Name] = c.DefaultValue;
@@ -329,31 +320,32 @@ exports.MODEL_STATIC_MIXINS = {
329
320
  },
330
321
  all(page, perPage) {
331
322
  const { query } = _createQuery(this, builders_1.SelectQueryBuilder);
332
- query.select("*");
323
+ query.select('*');
333
324
  if (page >= 0 && perPage > 0) {
334
325
  query.take(perPage).skip(page * perPage);
335
326
  }
336
327
  return query;
337
328
  },
338
- insertBulk(data) {
339
- const { query } = _createQuery(this, builders_1.InsertQueryBuilder);
340
- return query.values(data.map(d => {
341
- if (d instanceof ModelBase) {
342
- return d.dehydrate();
343
- }
344
- return d;
345
- }));
346
- },
347
329
  /**
348
330
  * Try to insert new value
349
331
  */
350
332
  insert(data) {
351
333
  const { query } = _createQuery(this, builders_1.InsertQueryBuilder);
352
- if (data instanceof ModelBase) {
353
- query.values(data.dehydrate());
334
+ if (Array.isArray(data)) {
335
+ query.values(data.map((d) => {
336
+ if (d instanceof ModelBase) {
337
+ return d.dehydrate();
338
+ }
339
+ return d;
340
+ }));
354
341
  }
355
342
  else {
356
- query.values(data);
343
+ if (data instanceof ModelBase) {
344
+ query.values(data.dehydrate());
345
+ }
346
+ else {
347
+ query.values(data);
348
+ }
357
349
  }
358
350
  return query;
359
351
  },
@@ -361,7 +353,8 @@ exports.MODEL_STATIC_MIXINS = {
361
353
  const { query, description } = _createQuery(this, builders_1.SelectQueryBuilder);
362
354
  const pkey = description.PrimaryKey;
363
355
  query.select('*');
364
- return (await Array.isArray(pks)) ? query.whereIn(pkey, pks) : query.where(pkey, pks).first();
356
+ query.whereIn(pkey, pks);
357
+ return await query;
365
358
  },
366
359
  async findOrFail(pks) {
367
360
  const { query, description } = _createQuery(this, builders_1.SelectQueryBuilder);
@@ -380,80 +373,70 @@ exports.MODEL_STATIC_MIXINS = {
380
373
  async afterHydration(_data) { },
381
374
  };
382
375
  query.select('*');
383
- if (Array.isArray(pks)) {
384
- query.whereIn(pkey, pks);
385
- query.middleware(middleware);
386
- return await query;
387
- }
388
- else {
389
- return await query.where(pkey, pks).firstOrFail();
390
- }
376
+ query.whereIn(pkey, pks);
377
+ query.middleware(middleware);
378
+ return await query;
391
379
  },
392
- destroy(pks) {
393
- var _a, _b;
380
+ async get(pk) {
381
+ const { query, description } = _createQuery(this, builders_1.SelectQueryBuilder);
382
+ const pkey = description.PrimaryKey;
383
+ query.select('*');
384
+ query.where(pkey, pk);
385
+ return await query.first();
386
+ },
387
+ async getOrFail(pk) {
388
+ const { query, description } = _createQuery(this, builders_1.SelectQueryBuilder);
389
+ const pkey = description.PrimaryKey;
390
+ query.select('*');
391
+ query.where(pkey, pk);
392
+ return await query.firstOrFail();
393
+ },
394
+ async destroy(pks) {
395
+ var _a;
394
396
  const description = _descriptor(this);
395
397
  const orm = di_1.DI.get(orm_1.Orm);
396
398
  const driver = orm.Connections.get(description.Connection);
397
399
  const converter = driver.Container.resolve(interfaces_1.DatetimeValueConverter);
398
- if (!pks) {
399
- if ((_a = description.SoftDelete) === null || _a === void 0 ? void 0 : _a.DeletedAt) {
400
- const { query } = _createQuery(this, builders_1.UpdateQueryBuilder);
401
- query.update({
402
- [description.SoftDelete.DeletedAt]: converter.toDB(new Date()),
403
- });
404
- return query;
405
- }
406
- else {
407
- const { query } = _createQuery(this, builders_1.DeleteQueryBuilder);
408
- return query;
409
- }
410
- }
411
- if ((_b = description.SoftDelete) === null || _b === void 0 ? void 0 : _b.DeletedAt) {
412
- const data = Array.isArray(pks) ? pks : [pks];
400
+ const data = Array.isArray(pks) ? pks : [pks];
401
+ if ((_a = description.SoftDelete) === null || _a === void 0 ? void 0 : _a.DeletedAt) {
413
402
  const { query } = _createQuery(this, builders_1.UpdateQueryBuilder);
414
- return query
415
- .whereIn(description.PrimaryKey, data)
416
- .update({
403
+ await query.whereIn(description.PrimaryKey, data).update({
417
404
  [description.SoftDelete.DeletedAt]: converter.toDB(new Date()),
418
405
  });
419
406
  }
420
407
  else {
421
408
  const { query } = _createQuery(this, builders_1.DeleteQueryBuilder);
422
- return query.whereIn(description.PrimaryKey, Array.isArray(pks) ? pks : [pks]);
409
+ await query.whereIn(description.PrimaryKey, data);
423
410
  }
424
411
  },
425
412
  async create(data) {
426
413
  const entity = new (Function.prototype.bind.apply(this))(data);
427
- await entity.save();
414
+ await entity.insert();
428
415
  return entity;
429
416
  },
430
- async firstOrCreate(data) {
417
+ async getOrCreate(pk, data) {
431
418
  const { query, description } = _createQuery(this, builders_1.SelectQueryBuilder);
432
419
  // pk constrain
433
- if (data[description.PrimaryKey]) {
434
- query.where(description.PrimaryKey, data[description.PrimaryKey]);
435
- }
420
+ query.where(description.PrimaryKey, pk);
436
421
  // check for all unique columns ( unique constrain )
437
- description.Columns.filter(c => c.Unique).forEach(c => {
438
- query.orWhere(c, data[c.Name]);
422
+ description.Columns.filter((c) => c.Unique).forEach((c) => {
423
+ query.andWhere(c, data[c.Name]);
439
424
  });
440
425
  let entity = (await query.first());
441
426
  if (!entity) {
442
427
  entity = new (Function.prototype.bind.apply(this))(data);
443
- await entity.save();
428
+ await entity.insert();
444
429
  return entity;
445
430
  }
446
431
  return entity;
447
432
  },
448
- async firstOrNew(data) {
433
+ async getOrNew(pk, data) {
449
434
  const { query, description } = _createQuery(this, builders_1.SelectQueryBuilder);
450
435
  // pk constrain
451
- if (data[description.PrimaryKey]) {
452
- query.where(description.PrimaryKey, data[description.PrimaryKey]);
453
- }
436
+ query.where(description.PrimaryKey, pk);
454
437
  // check for all unique columns ( unique constrain )
455
- description.Columns.filter(c => c.Unique).forEach(c => {
456
- query.orWhere(c, data[c.Name]);
438
+ description.Columns.filter((c) => c.Unique).forEach((c) => {
439
+ query.andWhere(c, data[c.Name]);
457
440
  });
458
441
  let entity = (await query.first());
459
442
  if (!entity) {