@goatlab/fluent 0.6.22 → 0.6.30

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 (240) hide show
  1. package/dist/BaseConnector.d.ts +49 -82
  2. package/dist/BaseConnector.js +219 -319
  3. package/dist/Fluent.d.ts +2 -21
  4. package/dist/Fluent.js +0 -33
  5. package/dist/FluentEntity.d.ts +7 -0
  6. package/dist/FluentEntity.js +28 -0
  7. package/dist/TypeOrmConnector/TypeOrmConnector.d.ts +34 -27
  8. package/dist/TypeOrmConnector/TypeOrmConnector.js +599 -343
  9. package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.d.ts +0 -0
  10. package/dist/TypeOrmConnector/test/advanced/advancedTestSuite.js +182 -48
  11. package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.d.ts +103 -3
  12. package/dist/TypeOrmConnector/test/advanced/typeOrm.entity.js +30 -13
  13. package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.d.ts +5 -0
  14. package/dist/TypeOrmConnector/test/advanced/typeOrm.mongo.repository.js +17 -0
  15. package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.d.ts +5 -0
  16. package/dist/TypeOrmConnector/test/advanced/typeOrm.mysql.repository.js +17 -0
  17. package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.d.ts +3 -3
  18. package/dist/TypeOrmConnector/test/advanced/typeOrm.repository.js +8 -3
  19. package/dist/TypeOrmConnector/test/basic/basicTestSuite.d.ts +1 -1
  20. package/dist/TypeOrmConnector/test/basic/basicTestSuite.js +42 -16
  21. package/dist/TypeOrmConnector/test/basic/goat.entity.d.ts +43 -0
  22. package/dist/TypeOrmConnector/test/basic/goat.entity.js +19 -8
  23. package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.d.ts +5 -0
  24. package/dist/TypeOrmConnector/test/basic/goat.mongo.repository.js +16 -0
  25. package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.d.ts +5 -0
  26. package/dist/TypeOrmConnector/test/basic/goat.mysql.repository.js +16 -0
  27. package/dist/TypeOrmConnector/test/basic/goat.repository.d.ts +3 -4
  28. package/dist/TypeOrmConnector/test/basic/goat.repository.js +7 -3
  29. package/dist/TypeOrmConnector/test/dbEntities.d.ts +6 -6
  30. package/dist/TypeOrmConnector/test/dbEntities.js +0 -0
  31. package/dist/TypeOrmConnector/test/docker/docker.d.ts +35 -0
  32. package/dist/TypeOrmConnector/test/docker/docker.js +149 -0
  33. package/dist/TypeOrmConnector/test/docker/mysql.d.ts +17 -0
  34. package/dist/TypeOrmConnector/test/docker/mysql.js +132 -0
  35. package/dist/TypeOrmConnector/test/flock.d.ts +0 -0
  36. package/dist/TypeOrmConnector/test/flock.js +0 -0
  37. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.d.ts +8 -0
  38. package/dist/TypeOrmConnector/test/mongo/car.mongo.repository.js +23 -0
  39. package/dist/TypeOrmConnector/test/mongo/mongo.memory.d.ts +4 -0
  40. package/dist/TypeOrmConnector/test/mongo/mongo.memory.js +43 -0
  41. package/dist/TypeOrmConnector/test/mongo/mongoDatasource.d.ts +2 -0
  42. package/dist/TypeOrmConnector/test/mongo/mongoDatasource.js +12 -0
  43. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.d.ts +8 -0
  44. package/dist/TypeOrmConnector/test/mongo/roles.mongo.repository.js +23 -0
  45. package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.d.ts +6 -0
  46. package/dist/TypeOrmConnector/test/mongo/roles_user.mongo.repository.js +17 -0
  47. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.d.ts +10 -0
  48. package/dist/TypeOrmConnector/test/mongo/user.mongo.repository.js +31 -0
  49. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.d.ts +6 -0
  50. package/dist/TypeOrmConnector/test/mysql/car.mysql.repository.js +17 -0
  51. package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.d.ts +2 -0
  52. package/dist/TypeOrmConnector/test/mysql/mysqlDataSource.js +16 -0
  53. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.d.ts +8 -0
  54. package/dist/TypeOrmConnector/test/mysql/roles.mysql.repository.js +23 -0
  55. package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.d.ts +6 -0
  56. package/dist/TypeOrmConnector/test/mysql/roles_user.mysql.repository.js +17 -0
  57. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.d.ts +10 -0
  58. package/dist/TypeOrmConnector/test/mysql/user.mysql.repository.js +32 -0
  59. package/dist/TypeOrmConnector/test/relations/car/car.entity.d.ts +1 -0
  60. package/dist/TypeOrmConnector/test/relations/car/car.entity.js +13 -5
  61. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.d.ts +3 -3
  62. package/dist/TypeOrmConnector/test/relations/car/car.repositoryTypeOrm.js +11 -4
  63. package/dist/TypeOrmConnector/test/relations/car/car.schema.d.ts +38 -0
  64. package/dist/TypeOrmConnector/test/relations/car/car.schema.js +14 -0
  65. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.d.ts +0 -0
  66. package/dist/TypeOrmConnector/test/relations/relationsTestsSuite.js +85 -32
  67. package/dist/TypeOrmConnector/test/relations/roles/role.schema.d.ts +35 -0
  68. package/dist/TypeOrmConnector/test/relations/roles/role.schema.js +16 -0
  69. package/dist/TypeOrmConnector/test/relations/roles/roles.entity.d.ts +0 -0
  70. package/dist/TypeOrmConnector/test/relations/roles/roles.entity.js +4 -4
  71. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.d.ts +3 -3
  72. package/dist/TypeOrmConnector/test/relations/roles/roles.repositoryTypeOrm.js +12 -4
  73. package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.d.ts +2 -2
  74. package/dist/TypeOrmConnector/test/relations/roles/roles_user.entity.js +4 -4
  75. package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.d.ts +15 -0
  76. package/dist/TypeOrmConnector/test/relations/roles/roles_user.schema.js +9 -0
  77. package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.d.ts +3 -3
  78. package/dist/TypeOrmConnector/test/relations/roles/roles_users.repositoryTypeOrm.js +8 -3
  79. package/dist/TypeOrmConnector/test/relations/user/user.entity.d.ts +0 -0
  80. package/dist/TypeOrmConnector/test/relations/user/user.entity.js +10 -10
  81. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.d.ts +3 -3
  82. package/dist/TypeOrmConnector/test/relations/user/user.repositoryTypeOrm.js +17 -5
  83. package/dist/TypeOrmConnector/test/relations/user/user.schema.d.ts +150 -0
  84. package/dist/TypeOrmConnector/test/relations/user/user.schema.js +18 -0
  85. package/dist/TypeOrmConnector/test/{memoryDataSource.d.ts → sqlite/memoryDataSource.d.ts} +0 -0
  86. package/dist/TypeOrmConnector/test/{memoryDataSource.js → sqlite/memoryDataSource.js} +1 -1
  87. package/dist/cache.d.ts +0 -0
  88. package/dist/cache.js +0 -0
  89. package/dist/core/Loopback/build-schema.d.ts +0 -0
  90. package/dist/core/Loopback/build-schema.js +1 -3
  91. package/dist/core/Loopback/common-types.d.ts +0 -0
  92. package/dist/core/Loopback/common-types.js +0 -0
  93. package/dist/core/Loopback/json-to-schema.d.ts +0 -0
  94. package/dist/core/Loopback/json-to-schema.js +6 -6
  95. package/dist/core/Loopback/mapValues.d.ts +2 -0
  96. package/dist/core/Loopback/mapValues.js +835 -0
  97. package/dist/core/Loopback/metadata.d.ts +0 -0
  98. package/dist/core/Loopback/metadata.js +0 -0
  99. package/dist/core/Loopback/model.d.ts +0 -0
  100. package/dist/core/Loopback/model.js +0 -0
  101. package/dist/core/Loopback/query.d.ts +0 -0
  102. package/dist/core/Loopback/query.js +6 -4
  103. package/dist/core/Loopback/relation.types.d.ts +0 -0
  104. package/dist/core/Loopback/relation.types.js +0 -0
  105. package/dist/core/Loopback/type-resolver.d.ts +1 -1
  106. package/dist/core/Loopback/type-resolver.js +0 -0
  107. package/dist/core/Loopback/type.d.ts +0 -0
  108. package/dist/core/Loopback/type.js +0 -0
  109. package/dist/core/Nestjs/applyDecorators.d.ts +1 -1
  110. package/dist/core/Nestjs/applyDecorators.js +0 -0
  111. package/dist/core/Nestjs/types/common.d.ts +0 -0
  112. package/dist/core/Nestjs/types/common.js +3 -1
  113. package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.d.ts +0 -0
  114. package/dist/core/Nestjs/types/decorators/api-hide-property.decorator.js +0 -0
  115. package/dist/core/Nestjs/types/decorators/api-property.decorator.d.ts +0 -0
  116. package/dist/core/Nestjs/types/decorators/api-property.decorator.js +0 -0
  117. package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.d.ts +1 -1
  118. package/dist/core/Nestjs/types/decorators/apply-is-optional.decorator.js +0 -0
  119. package/dist/core/Nestjs/types/decorators/args-type.decorator.d.ts +0 -0
  120. package/dist/core/Nestjs/types/decorators/args-type.decorator.js +0 -0
  121. package/dist/core/Nestjs/types/decorators/create-property.decorator.d.ts +0 -0
  122. package/dist/core/Nestjs/types/decorators/create-property.decorator.js +9 -4
  123. package/dist/core/Nestjs/types/decorators/directive.decorator.d.ts +0 -0
  124. package/dist/core/Nestjs/types/decorators/directive.decorator.js +0 -0
  125. package/dist/core/Nestjs/types/decorators/extensions.decorator.d.ts +0 -0
  126. package/dist/core/Nestjs/types/decorators/extensions.decorator.js +0 -0
  127. package/dist/core/Nestjs/types/decorators/field.decorator.d.ts +1 -1
  128. package/dist/core/Nestjs/types/decorators/field.decorator.js +6 -6
  129. package/dist/core/Nestjs/types/decorators/input-type.decorator.d.ts +0 -0
  130. package/dist/core/Nestjs/types/decorators/input-type.decorator.js +0 -0
  131. package/dist/core/Nestjs/types/decorators/interface-type.decorator.d.ts +0 -0
  132. package/dist/core/Nestjs/types/decorators/interface-type.decorator.js +0 -0
  133. package/dist/core/Nestjs/types/decorators/partial-type.helper.d.ts +0 -0
  134. package/dist/core/Nestjs/types/decorators/partial-type.helper.js +0 -0
  135. package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.d.ts +0 -0
  136. package/dist/core/Nestjs/types/errors/cannot-determine-host-type.error.js +0 -0
  137. package/dist/core/Nestjs/types/errors/directive-parsing.error.d.ts +0 -0
  138. package/dist/core/Nestjs/types/errors/directive-parsing.error.js +0 -0
  139. package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.d.ts +0 -0
  140. package/dist/core/Nestjs/types/errors/unable-to-find-fields.error.js +0 -0
  141. package/dist/core/Nestjs/types/errors/undefined-type.error.d.ts +0 -0
  142. package/dist/core/Nestjs/types/errors/undefined-type.error.js +0 -0
  143. package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.d.ts +0 -0
  144. package/dist/core/Nestjs/types/interfaces/add-class-type-metadata.util.js +0 -0
  145. package/dist/core/Nestjs/types/interfaces/base-type-options.interface.d.ts +0 -0
  146. package/dist/core/Nestjs/types/interfaces/base-type-options.interface.js +0 -0
  147. package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.d.ts +0 -0
  148. package/dist/core/Nestjs/types/interfaces/class-decorator-factory.interface.js +0 -0
  149. package/dist/core/Nestjs/types/interfaces/complexity.interface.d.ts +0 -0
  150. package/dist/core/Nestjs/types/interfaces/complexity.interface.js +0 -0
  151. package/dist/core/Nestjs/types/interfaces/field-middleware.interface.d.ts +0 -0
  152. package/dist/core/Nestjs/types/interfaces/field-middleware.interface.js +0 -0
  153. package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.d.ts +0 -0
  154. package/dist/core/Nestjs/types/interfaces/open-api-spec.interface.js +0 -0
  155. package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.d.ts +0 -0
  156. package/dist/core/Nestjs/types/interfaces/resolve-type-fn.interface.js +0 -0
  157. package/dist/core/Nestjs/types/interfaces/return-type-func.interface.d.ts +0 -0
  158. package/dist/core/Nestjs/types/interfaces/return-type-func.interface.js +0 -0
  159. package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.d.ts +0 -0
  160. package/dist/core/Nestjs/types/interfaces/schema-object-metadata.interface.js +0 -0
  161. package/dist/core/Nestjs/types/interfaces/type-options.interface.d.ts +0 -0
  162. package/dist/core/Nestjs/types/interfaces/type-options.interface.js +0 -0
  163. package/dist/core/Nestjs/types/lazy-metadata.storage.d.ts +0 -0
  164. package/dist/core/Nestjs/types/lazy-metadata.storage.js +3 -3
  165. package/dist/core/Nestjs/types/metadata/class.metadata.d.ts +0 -0
  166. package/dist/core/Nestjs/types/metadata/class.metadata.js +0 -0
  167. package/dist/core/Nestjs/types/metadata/directive.metadata.d.ts +0 -0
  168. package/dist/core/Nestjs/types/metadata/directive.metadata.js +0 -0
  169. package/dist/core/Nestjs/types/metadata/enum.metadata.d.ts +0 -0
  170. package/dist/core/Nestjs/types/metadata/enum.metadata.js +0 -0
  171. package/dist/core/Nestjs/types/metadata/extensions.metadata.d.ts +0 -0
  172. package/dist/core/Nestjs/types/metadata/extensions.metadata.js +0 -0
  173. package/dist/core/Nestjs/types/metadata/index.d.ts +0 -0
  174. package/dist/core/Nestjs/types/metadata/index.js +0 -0
  175. package/dist/core/Nestjs/types/metadata/interface.metadata.d.ts +0 -0
  176. package/dist/core/Nestjs/types/metadata/interface.metadata.js +0 -0
  177. package/dist/core/Nestjs/types/metadata/object-type.metadata.d.ts +0 -0
  178. package/dist/core/Nestjs/types/metadata/object-type.metadata.js +0 -0
  179. package/dist/core/Nestjs/types/metadata/param.metadata.d.ts +0 -0
  180. package/dist/core/Nestjs/types/metadata/param.metadata.js +0 -0
  181. package/dist/core/Nestjs/types/metadata/property.metadata.d.ts +0 -0
  182. package/dist/core/Nestjs/types/metadata/property.metadata.js +0 -0
  183. package/dist/core/Nestjs/types/metadata/resolver.metadata.d.ts +0 -0
  184. package/dist/core/Nestjs/types/metadata/resolver.metadata.js +0 -0
  185. package/dist/core/Nestjs/types/metadata/union.metadata.d.ts +0 -0
  186. package/dist/core/Nestjs/types/metadata/union.metadata.js +0 -0
  187. package/dist/core/Nestjs/types/object-type.decorator.d.ts +0 -0
  188. package/dist/core/Nestjs/types/object-type.decorator.js +0 -0
  189. package/dist/core/Nestjs/types/omit-type.d.ts +0 -0
  190. package/dist/core/Nestjs/types/omit-type.js +6 -2
  191. package/dist/core/Nestjs/types/reflection.utils.d.ts +1 -1
  192. package/dist/core/Nestjs/types/reflection.utils.js +9 -2
  193. package/dist/core/Nestjs/types/set-metadata.decorator.d.ts +0 -0
  194. package/dist/core/Nestjs/types/set-metadata.decorator.js +0 -0
  195. package/dist/core/Nestjs/types/type-metadata.storage.d.ts +0 -0
  196. package/dist/core/Nestjs/types/type-metadata.storage.js +4 -4
  197. package/dist/core/Nestjs/types/utils/enum.utils.d.ts +0 -0
  198. package/dist/core/Nestjs/types/utils/enum.utils.js +0 -0
  199. package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.d.ts +1 -11
  200. package/dist/core/Nestjs/types/utils/get-fields-and-decorator.util.js +0 -0
  201. package/dist/core/Nestjs/types/utils/mapped-types.utils.d.ts +0 -0
  202. package/dist/core/Nestjs/types/utils/mapped-types.utils.js +2 -2
  203. package/dist/core/Nestjs/types/utils/model-properties-accessor.d.ts +0 -0
  204. package/dist/core/Nestjs/types/utils/model-properties-accessor.js +0 -0
  205. package/dist/core/Nestjs/types/utils/type-helpers.utils.d.ts +0 -0
  206. package/dist/core/Nestjs/types/utils/type-helpers.utils.js +0 -0
  207. package/dist/core/types.d.ts +0 -0
  208. package/dist/core/types.js +0 -0
  209. package/dist/decorators.d.ts +25 -21
  210. package/dist/decorators.js +76 -70
  211. package/dist/generatorDatasource.d.ts +0 -0
  212. package/dist/generatorDatasource.js +0 -0
  213. package/dist/index.d.ts +6 -7
  214. package/dist/index.js +5 -7
  215. package/dist/loadRelations.d.ts +0 -0
  216. package/dist/loadRelations.js +108 -68
  217. package/dist/outputKeys.d.ts +0 -0
  218. package/dist/outputKeys.js +0 -0
  219. package/dist/tsconfig.tsbuildinfo +1 -1
  220. package/dist/types.d.ts +104 -60
  221. package/dist/types.js +20 -0
  222. package/package.json +12 -101
  223. package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.d.ts +0 -1
  224. package/dist/TypeOrmConnector/TypeOrmMongoConnector._bypass.js +0 -52
  225. package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.d.ts +0 -1
  226. package/dist/TypeOrmConnector/TypeOrmMysqlConnector._bypass.js +0 -55
  227. package/dist/TypeOrmConnector/test/basic/goat.dto.d.ts +0 -8
  228. package/dist/TypeOrmConnector/test/basic/goat.dto.js +0 -18
  229. package/dist/TypeOrmConnector/test/relations/car/car.dto.d.ts +0 -5
  230. package/dist/TypeOrmConnector/test/relations/car/car.dto.js +0 -12
  231. package/dist/TypeOrmConnector/test/relations/roles/role.dto.d.ts +0 -5
  232. package/dist/TypeOrmConnector/test/relations/roles/role.dto.js +0 -12
  233. package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.d.ts +0 -5
  234. package/dist/TypeOrmConnector/test/relations/roles/roles_user.dto.js +0 -12
  235. package/dist/TypeOrmConnector/test/relations/user/user.dto.d.ts +0 -5
  236. package/dist/TypeOrmConnector/test/relations/user/user.dto.js +0 -12
  237. package/dist/core/dtos/access.dto.d.ts +0 -4
  238. package/dist/core/dtos/access.dto.js +0 -21
  239. package/dist/core/dtos/pagination.dto.d.ts +0 -13
  240. package/dist/core/dtos/pagination.dto.js +0 -62
@@ -1,22 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TypeOrmConnector = exports.getRelations = void 0;
3
+ exports.TypeOrmConnector = exports.getRelationsFromModelGenerator = void 0;
4
+ const types_1 = require("./../types");
4
5
  const typeorm_1 = require("typeorm");
5
- const mongodb_1 = require("mongodb");
6
6
  const js_utils_1 = require("@goatlab/js-utils");
7
- const loadRelations_1 = require("../loadRelations");
8
7
  const BaseConnector_1 = require("../BaseConnector");
9
8
  const outputKeys_1 = require("../outputKeys");
10
9
  const generatorDatasource_1 = require("../generatorDatasource");
11
- const getRelations = typeOrmRepo => {
10
+ const getRelationsFromModelGenerator = (typeOrmRepo) => {
12
11
  const relations = {};
13
12
  for (const relation of typeOrmRepo.metadata.relations) {
13
+ const pPath = relation.inverseRelation?.joinColumns[0];
14
14
  relations[relation.propertyName] = {
15
15
  isOneToMany: relation.isOneToMany,
16
16
  isManyToOne: relation.isManyToOne,
17
17
  isManyToMany: relation.isManyToMany,
18
- inverseSidePropertyPath: relation.inverseSidePropertyPath,
19
- propertyPath: relation.propertyName,
18
+ inverseSidePropertyRelationPath: relation.inverseSidePropertyPath,
19
+ inverseSidePropertyPath: pPath?.propertyPath,
20
+ propertyName: relation.propertyName,
20
21
  entityName: relation.inverseEntityMetadata.name,
21
22
  tableName: relation.inverseEntityMetadata.tableName,
22
23
  targetClass: relation.inverseEntityMetadata.target,
@@ -28,489 +29,744 @@ const getRelations = typeOrmRepo => {
28
29
  relations
29
30
  };
30
31
  };
31
- exports.getRelations = getRelations;
32
+ exports.getRelationsFromModelGenerator = getRelationsFromModelGenerator;
32
33
  class TypeOrmConnector extends BaseConnector_1.BaseConnector {
33
- constructor(entity, dataSource, relationQuery) {
34
+ constructor({ entity, dataSource, inputSchema, outputSchema }) {
34
35
  super();
35
36
  this.dataSource = dataSource;
36
- this.relationQuery = relationQuery;
37
+ this.inputSchema = inputSchema;
38
+ this.outputSchema =
39
+ outputSchema || inputSchema;
40
+ this.entity = entity;
37
41
  this.repository = this.dataSource.getRepository(entity);
38
- const relationShipBuilder = generatorDatasource_1.modelGeneratorDataSource.getRepository(entity);
39
- const { relations } = (0, exports.getRelations)(relationShipBuilder);
40
- this.modelRelations = relations;
41
- this.outputKeys = (0, outputKeys_1.getOutputKeys)(relationShipBuilder) || [];
42
42
  this.isMongoDB =
43
43
  this.repository.metadata.connection.driver.options.type === 'mongodb';
44
- }
45
- async get() {
46
- const query = this.getGeneratedQuery();
47
- const result = await this.repository.find(query);
48
- let data = this.jsApplySelect(result);
49
- data = await (0, loadRelations_1.loadRelations)({
50
- data,
51
- relations: this.relations,
52
- modelRelations: this.modelRelations,
53
- dataSource: this.dataSource,
54
- provider: 'typeorm',
55
- self: this
56
- });
57
- this.reset();
58
- return data;
59
- }
60
- async getPaginated() {
61
- const response = await this.get();
62
- const results = {
63
- current_page: response[0].meta.currentPage,
64
- data: response[0].data,
65
- first_page_url: response[0].meta.firstPageUrl,
66
- next_page_url: response[0].meta.nextPageUrl,
67
- path: response[0].meta.path,
68
- per_page: response[0].meta.itemsPerPage,
69
- prev_page_url: response[0].meta.previousPageUrl,
70
- total: response[0].meta.totalItemCount
71
- };
72
- if (results && results.data && this.selectArray.length > 0) {
73
- results.data = this.jsApplySelect(results.data);
74
- return results;
75
- }
76
- return results;
77
- }
78
- async all() {
79
- return this.get();
80
- }
81
- async find(filter = {}) {
82
- const stringFilter = filter;
83
- let parsedFilter = {};
84
- try {
85
- parsedFilter = JSON.parse(stringFilter);
86
- }
87
- catch (error) {
88
- parsedFilter = {};
89
- }
90
- this.selectArray = (parsedFilter && parsedFilter.fields) || [];
91
- this.whereArray =
92
- (parsedFilter && parsedFilter.where && parsedFilter.where.and) || [];
93
- this.orWhereArray =
94
- (parsedFilter && parsedFilter.where && parsedFilter.where.or) || [];
95
- this.limit((parsedFilter && (parsedFilter.limit || parsedFilter.take)) || 100);
96
- this.offset((parsedFilter && (parsedFilter.offset || parsedFilter.skip)) || 0);
97
- if (parsedFilter && parsedFilter.order) {
98
- const orderB = [
99
- parsedFilter.order.field,
100
- parsedFilter.order.asc ? 'asc' : 'desc',
101
- parsedFilter.order.type || 'string'
102
- ];
103
- this.chainReference.push({ method: 'orderBy', orderB });
104
- this.orderByArray = orderB;
105
- }
106
- return this.get();
107
- }
108
- async paginate(paginator) {
109
- if (!paginator) {
110
- throw new Error('Paginator cannot be empty');
44
+ if (this.isMongoDB) {
45
+ this.repository = this.dataSource.getMongoRepository(entity);
111
46
  }
112
- this.paginator = paginator;
113
- const response = await this.getPaginated();
114
- return response;
115
- }
116
- raw() {
117
- return this.repository;
47
+ const relationShipBuilder = generatorDatasource_1.modelGeneratorDataSource.getRepository(entity);
48
+ const { relations } = (0, exports.getRelationsFromModelGenerator)(relationShipBuilder);
49
+ this.modelRelations = relations;
50
+ this.outputKeys = (0, outputKeys_1.getOutputKeys)(relationShipBuilder) || [];
118
51
  }
119
52
  async insert(data) {
120
- const datum = await this.repository.save(data);
121
- const result = this.jsApplySelect([datum]);
122
- this.reset();
123
- return result[0];
53
+ const validatedData = this.inputSchema.parse(data);
54
+ let datum = await this.repository.save(validatedData);
55
+ if (this.isMongoDB) {
56
+ datum['id'] = datum['id'].toString();
57
+ }
58
+ return this.outputSchema.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(datum)));
124
59
  }
125
60
  async insertMany(data) {
126
- const inserted = await this.repository.save(data, {
61
+ const validatedData = this.inputSchema.array().parse(data);
62
+ const inserted = await this.repository.save(validatedData, {
127
63
  chunk: data.length / 300
128
64
  });
129
- this.reset();
130
- const result = this.jsApplySelect(inserted);
131
- return result;
132
- }
133
- async updateById(id, data) {
134
- const parsedId = this.isMongoDB
135
- ? new mongodb_1.ObjectId(id)
136
- : id;
137
- const dataToInsert = this.outputKeys.includes('updated')
138
- ? {
139
- ...data,
140
- ...{ updated: new Date() }
65
+ return this.outputSchema.array().parse(inserted.map(d => {
66
+ if (this.isMongoDB) {
67
+ d['id'] = d['id'].toString();
141
68
  }
142
- : data;
143
- await this.repository.update(id, dataToInsert);
144
- const dbResult = await this.repository.findBy({
145
- id: (0, typeorm_1.In)([parsedId])
146
- });
147
- const result = this.jsApplySelect(dbResult);
148
- this.reset();
149
- return result[0];
69
+ return this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
70
+ }));
150
71
  }
151
- async replaceById(id, data) {
152
- const parsedId = this.isMongoDB
153
- ? new mongodb_1.ObjectId(id)
154
- : id;
155
- const value = await this.repository.findOneOrFail({
156
- where: { id: parsedId }
157
- });
158
- const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
159
- Object.keys(flatValue).forEach(key => {
160
- flatValue[key] = null;
161
- });
162
- const nullObject = js_utils_1.Objects.nest(flatValue);
163
- const newValue = { ...nullObject, ...data };
164
- delete newValue._id;
165
- delete newValue.id;
166
- delete newValue.created;
167
- delete newValue.updated;
168
- const dataToInsert = this.outputKeys.includes('updated')
169
- ? {
170
- ...data,
171
- ...{ updated: new Date() }
172
- }
173
- : data;
174
- await this.repository.update(id, dataToInsert);
175
- const val = await this.repository.findOneOrFail({
176
- where: {
177
- id: parsedId
178
- }
179
- });
180
- const returnValue = this.jsApplySelect([val]);
181
- this.reset();
182
- return returnValue[0];
183
- }
184
- async clear({ sure }) {
185
- if (!sure || sure !== true) {
186
- throw new Error('Clear() method will delete everything!, you must set the "sure" parameter "clear({sure:true})" to continue');
187
- }
188
- await this.repository.clear();
189
- this.reset();
190
- return true;
191
- }
192
- async deleteById(id) {
193
- const parsedId = this.isMongoDB
194
- ? new mongodb_1.ObjectId(id)
195
- : id;
196
- await this.repository.delete(parsedId);
197
- this.reset();
198
- return id;
72
+ raw() {
73
+ return this.repository;
199
74
  }
200
- async findById(id) {
201
- const parsedId = this.isMongoDB
202
- ? new mongodb_1.ObjectId(id)
203
- : id;
204
- const data = await this.repository.findBy({
205
- id: (0, typeorm_1.In)([parsedId])
206
- });
207
- const result = this.jsApplySelect(data);
208
- this.reset();
209
- return result[0];
75
+ mongoRaw() {
76
+ return this.repository;
210
77
  }
211
- async findByIds(ids) {
212
- const parsedIds = [...ids];
213
- if (this.isMongoDB) {
214
- parsedIds.map(id => new mongodb_1.ObjectId(id));
78
+ async findMany(query) {
79
+ if (this.isMongoDB && query?.include) {
80
+ const mongoRelationResult = this.customMongoRelatedSearch(query);
81
+ return mongoRelationResult;
215
82
  }
216
- const data = await this.repository.findBy({
217
- id: (0, typeorm_1.In)(parsedIds)
83
+ const generatedQuery = this.generateTypeOrmQuery(query);
84
+ let [found, count] = await this.repository.findAndCount(generatedQuery);
85
+ found.map(d => {
86
+ if (this.isMongoDB) {
87
+ d['id'] = d['id'].toString();
88
+ }
89
+ this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
218
90
  });
219
- const result = this.jsApplySelect(data);
220
- return result;
221
- }
222
- getPage() {
223
- const page = 'page=';
224
- if (this.paginator && this.paginator.page) {
225
- return `${page + this.paginator.page}&`;
91
+ if (query?.paginated) {
92
+ const paginationInfo = {
93
+ total: count,
94
+ perPage: query.paginated.perPage,
95
+ currentPage: query.paginated.page,
96
+ nextPage: query.paginated.page + 1,
97
+ firstPage: 1,
98
+ lastPage: Math.ceil(count / query.paginated.perPage),
99
+ prevPage: query.paginated.page === 1 ? null : query.paginated.page - 1,
100
+ from: (query.paginated.page - 1) * query.paginated.perPage + 1,
101
+ to: query.paginated.perPage * query.paginated.page,
102
+ data: found
103
+ };
104
+ return paginationInfo;
226
105
  }
227
- return '';
228
- }
229
- getPaginatorLimit(filter) {
230
- if (this.paginator && this.paginator.perPage) {
231
- return { ...filter, limit: this.paginator.perPage };
106
+ if (query?.select) {
107
+ return found;
232
108
  }
233
- return filter;
109
+ return this.outputSchema?.array().parse(found);
234
110
  }
235
- getPopulate() {
236
- const populate = [];
237
- this.populateArray.forEach(relation => {
238
- if (typeof relation === 'string') {
239
- populate.push({ relation });
111
+ getMongoSelect(select) {
112
+ const selected = js_utils_1.Objects.flatten(select || {});
113
+ for (const k of Object.keys(selected)) {
114
+ if (k === 'id') {
115
+ delete selected[k];
116
+ selected['_id'] = 1;
117
+ continue;
240
118
  }
241
- else if (Array.isArray(relation)) {
242
- relation.forEach(nestedRelation => {
243
- if (typeof nestedRelation === 'string') {
244
- populate.push({ relation: nestedRelation });
245
- }
246
- else if (typeof nestedRelation === 'object') {
247
- populate.push(nestedRelation);
119
+ const containsId = k.lastIndexOf('.id');
120
+ if (containsId >= 0 && containsId + 3 === k.length) {
121
+ selected[`${k.replace('.id', '')}._id`] = 1;
122
+ delete selected[k];
123
+ continue;
124
+ }
125
+ selected[k] = 1;
126
+ }
127
+ return selected;
128
+ }
129
+ getMongoLookup(include) {
130
+ if (!include) {
131
+ return [];
132
+ }
133
+ const lookUps = [];
134
+ for (const relation of Object.keys(include)) {
135
+ if (this.modelRelations[relation]) {
136
+ const dbRelation = this.modelRelations[relation];
137
+ if (dbRelation.isManyToOne) {
138
+ const localField = dbRelation.joinColumns[0].propertyPath;
139
+ lookUps.push({
140
+ $addFields: {
141
+ [`${localField}_object`]: { $toObjectId: `$${localField}` }
142
+ }
143
+ });
144
+ lookUps.push({ $addFields: { id: { $toString: '$_id' } } });
145
+ lookUps.push({
146
+ $lookup: {
147
+ from: dbRelation.tableName,
148
+ localField: `${localField}_object`,
149
+ foreignField: '_id',
150
+ as: dbRelation.propertyName,
151
+ pipeline: [
152
+ { $addFields: { id: { $toString: '$_id' } } }
153
+ ]
154
+ }
155
+ });
156
+ lookUps.push({ $unwind: `$${dbRelation.propertyName}` });
157
+ }
158
+ if (dbRelation.isOneToMany) {
159
+ lookUps.push({ $addFields: { string_id: { $toString: '$_id' } } });
160
+ lookUps.push({ $addFields: { id: { $toString: '$_id' } } });
161
+ lookUps.push({
162
+ $lookup: {
163
+ from: dbRelation.tableName,
164
+ localField: 'string_id',
165
+ foreignField: dbRelation.inverseSidePropertyPath,
166
+ as: dbRelation.propertyName,
167
+ pipeline: [
168
+ { $addFields: { id: { $toString: '$_id' } } }
169
+ ]
170
+ }
171
+ });
172
+ }
173
+ if (dbRelation.isManyToMany) {
174
+ const relatedTableName = dbRelation.tableName;
175
+ const pivotTableName = dbRelation.joinColumns[0].relationMetadata.joinTableName;
176
+ const pivotForeignField = dbRelation.joinColumns[0].propertyPath;
177
+ const inverseForeignField = dbRelation.inverseJoinColumns[0].propertyPath;
178
+ if (!relatedTableName ||
179
+ !pivotTableName ||
180
+ !pivotForeignField ||
181
+ !inverseForeignField) {
182
+ throw new Error(`Your many to many relation is not properly set up. Please check both your models and schema for relation: ${relation}`);
248
183
  }
249
- });
184
+ lookUps.push({ $addFields: { id: { $toString: '$_id' } } });
185
+ lookUps.push({
186
+ $addFields: { parent_string_id: { $toString: '$_id' } }
187
+ });
188
+ lookUps.push({
189
+ $lookup: {
190
+ from: pivotTableName,
191
+ localField: 'parent_string_id',
192
+ foreignField: pivotForeignField,
193
+ as: dbRelation.propertyName,
194
+ pipeline: [
195
+ { $addFields: { id: { $toString: '$_id' } } },
196
+ {
197
+ $addFields: {
198
+ [`${inverseForeignField}_object`]: {
199
+ $toObjectId: `$${inverseForeignField}`
200
+ }
201
+ }
202
+ },
203
+ {
204
+ $lookup: {
205
+ from: relatedTableName,
206
+ localField: `${inverseForeignField}_object`,
207
+ foreignField: '_id',
208
+ pipeline: [
209
+ { $addFields: { id: { $toString: '$_id' } } }
210
+ ],
211
+ as: dbRelation.propertyName
212
+ }
213
+ },
214
+ { $unwind: `$${dbRelation.propertyName}` },
215
+ {
216
+ $project: {
217
+ [dbRelation.propertyName]: `$${dbRelation.propertyName}`,
218
+ pivot: '$$ROOT'
219
+ }
220
+ },
221
+ {
222
+ $replaceRoot: {
223
+ newRoot: {
224
+ $mergeObjects: ['$$ROOT', `$${dbRelation.propertyName}`]
225
+ }
226
+ }
227
+ },
228
+ { $project: { [dbRelation.propertyName]: 0 } }
229
+ ]
230
+ }
231
+ });
232
+ }
250
233
  }
251
- else if (typeof relation === 'object') {
252
- populate.push(relation);
234
+ }
235
+ return lookUps;
236
+ }
237
+ async customMongoRelatedSearch(query) {
238
+ const where = this.getTypeOrmMongoWhere(query?.where);
239
+ const selected = this.getMongoSelect(query?.select);
240
+ const lookups = this.getMongoLookup(query?.include);
241
+ const aggregate = [
242
+ {
243
+ $match: where
253
244
  }
254
- });
255
- return populate;
245
+ ];
246
+ if (query?.limit) {
247
+ aggregate.push({ $limit: query.limit });
248
+ }
249
+ for (const lookup of lookups) {
250
+ aggregate.push(lookup);
251
+ }
252
+ if (selected && Object.keys(selected).length) {
253
+ aggregate.push({
254
+ $project: selected
255
+ });
256
+ }
257
+ let raw = await this.mongoRaw().aggregate(aggregate).toArray();
258
+ return this.outputSchema?.array().parse(raw);
256
259
  }
257
- getGeneratedQuery() {
260
+ generateTypeOrmQuery(query) {
258
261
  let filter = {};
259
- filter = this.isMongoDB
260
- ? this.getMongoFilters(filter)
261
- : this.getFilters(filter);
262
- filter = this.getLimit(filter);
263
- filter = this.getSkip(filter);
264
- filter = this.getSelect(filter);
265
- filter = this.getOrderBy(filter);
266
- filter = this.getPaginatorLimit(filter);
267
- const page = this.getPage();
268
- const populate = this.getPopulate();
269
- if (this.rawQuery) {
270
- filter.relations = populate || this.rawQuery.populate;
271
- filter.take = filter.take || this.rawQuery.limit;
272
- filter.skip = filter.skip || this.rawQuery.skip;
273
- filter.order = filter.order || this.rawQuery.order;
274
- filter.select = { ...filter.select, ...this.rawQuery.fields };
275
- filter.where = { ...this.rawQuery.where };
262
+ filter.where = this.isMongoDB
263
+ ? this.getTypeOrmMongoWhere(query?.where)
264
+ : this.getTypeOrmWhere(query?.where);
265
+ filter.take = query?.limit;
266
+ filter.skip = query?.offset;
267
+ if (query?.paginated) {
268
+ filter.take = query.paginated.perPage;
269
+ filter.skip = (query.paginated?.page - 1) * query?.paginated.perPage;
276
270
  }
271
+ filter.select = js_utils_1.Objects.flatten(query?.select || {});
272
+ filter.order = this.getOrderBy(query?.orderBy);
273
+ filter.relations = query?.include;
277
274
  return filter;
278
275
  }
279
- getFilters(filters) {
280
- const andFilters = this.whereArray;
281
- const orFilters = this.orWhereArray;
282
- if (this.relationQuery && this.relationQuery.data) {
283
- const ids = this.relationQuery.data.map(d => d.id);
284
- andFilters.push([
285
- this.relationQuery.relation.inverseSidePropertyPath,
286
- 'in',
287
- ids
288
- ]);
289
- }
290
- if (!andFilters || andFilters.length === 0) {
291
- return filters;
276
+ getTypeOrmWhere(where) {
277
+ if (!where || Object.keys(where).length === 0) {
278
+ return {};
292
279
  }
293
280
  const Filters = { where: [{}] };
294
- andFilters.forEach(condition => {
295
- const element = condition[0];
296
- const operator = condition[1];
297
- const value = condition[2];
281
+ const orConditions = this.extractConditions(where['OR']);
282
+ const andConditions = this.extractConditions(where['AND']);
283
+ const copy = js_utils_1.Objects.clone(where);
284
+ if (!!copy['AND']) {
285
+ delete copy['AND'];
286
+ }
287
+ if (!!copy['OR']) {
288
+ delete copy['OR'];
289
+ }
290
+ const rootLevelConditions = this.extractConditions([copy]);
291
+ for (const condition of andConditions) {
292
+ const { element, operator, value } = condition;
298
293
  switch (operator) {
299
- case '=':
294
+ case types_1.LogicOperator.equals:
300
295
  Filters.where[0] = js_utils_1.Objects.nest({
301
296
  ...Filters.where[0],
302
297
  ...{ [element]: (0, typeorm_1.Equal)(value) }
303
298
  });
304
299
  break;
305
- case '!=':
300
+ case types_1.LogicOperator.isNot:
306
301
  Filters.where[0] = js_utils_1.Objects.nest({
307
302
  ...Filters.where[0],
308
303
  ...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) }
309
304
  });
310
305
  break;
311
- case '>':
306
+ case types_1.LogicOperator.greaterThan:
312
307
  Filters.where[0] = js_utils_1.Objects.nest({
313
308
  ...Filters.where[0],
314
309
  ...{ [element]: (0, typeorm_1.MoreThan)(value) }
315
310
  });
316
311
  break;
317
- case '>=':
312
+ case types_1.LogicOperator.greaterOrEqualThan:
318
313
  Filters.where[0] = js_utils_1.Objects.nest({
319
314
  ...Filters.where[0],
320
315
  ...{ [element]: (0, typeorm_1.MoreThanOrEqual)(value) }
321
316
  });
322
317
  break;
323
- case '<':
318
+ case types_1.LogicOperator.lessThan:
324
319
  Filters.where[0] = js_utils_1.Objects.nest({
325
320
  ...Filters.where[0],
326
321
  ...{ [element]: (0, typeorm_1.LessThan)(value) }
327
322
  });
328
323
  break;
329
- case '<=':
324
+ case types_1.LogicOperator.lessOrEqualThan:
330
325
  Filters.where[0] = js_utils_1.Objects.nest({
331
326
  ...Filters.where[0],
332
327
  ...{ [element]: (0, typeorm_1.LessThanOrEqual)(value) }
333
328
  });
334
329
  break;
335
- case 'in':
330
+ case types_1.LogicOperator.in:
336
331
  Filters.where[0] = js_utils_1.Objects.nest({
337
332
  ...Filters.where[0],
338
333
  ...{ [element]: (0, typeorm_1.In)(value) }
339
334
  });
340
335
  break;
341
- case 'nin':
336
+ case types_1.LogicOperator.notIn:
342
337
  Filters.where[0] = js_utils_1.Objects.nest({
343
338
  ...Filters.where[0],
344
339
  ...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) }
345
340
  });
346
341
  break;
347
- case 'exists':
342
+ case types_1.LogicOperator.exists:
348
343
  Filters.where[0] = js_utils_1.Objects.nest({
349
344
  ...Filters.where[0],
350
345
  ...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) }
351
346
  });
352
347
  break;
353
- case '!exists':
348
+ case types_1.LogicOperator.notExists:
354
349
  Filters.where[0] = js_utils_1.Objects.nest({
355
350
  ...Filters.where[0],
356
351
  ...{ [element]: (0, typeorm_1.IsNull)() }
357
352
  });
358
353
  break;
359
- case 'regexp':
354
+ case types_1.LogicOperator.regexp:
360
355
  Filters.where[0] = js_utils_1.Objects.nest({
361
356
  ...Filters.where[0],
362
357
  ...{ [element]: (0, typeorm_1.Like)(value) }
363
358
  });
364
359
  break;
365
360
  }
366
- });
367
- orFilters.forEach(condition => {
368
- const element = condition[0];
369
- const operator = condition[1];
370
- const value = condition[2];
361
+ }
362
+ for (const condition of rootLevelConditions) {
363
+ const { element, operator, value } = condition;
364
+ switch (operator) {
365
+ case types_1.LogicOperator.equals:
366
+ Filters.where[0] = js_utils_1.Objects.nest({
367
+ ...Filters.where[0],
368
+ ...{ [element]: (0, typeorm_1.Equal)(value) }
369
+ });
370
+ break;
371
+ case types_1.LogicOperator.isNot:
372
+ Filters.where[0] = js_utils_1.Objects.nest({
373
+ ...Filters.where[0],
374
+ ...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) }
375
+ });
376
+ break;
377
+ case types_1.LogicOperator.greaterThan:
378
+ Filters.where[0] = js_utils_1.Objects.nest({
379
+ ...Filters.where[0],
380
+ ...{ [element]: (0, typeorm_1.MoreThan)(value) }
381
+ });
382
+ break;
383
+ case types_1.LogicOperator.greaterOrEqualThan:
384
+ Filters.where[0] = js_utils_1.Objects.nest({
385
+ ...Filters.where[0],
386
+ ...{ [element]: (0, typeorm_1.MoreThanOrEqual)(value) }
387
+ });
388
+ break;
389
+ case types_1.LogicOperator.lessThan:
390
+ Filters.where[0] = js_utils_1.Objects.nest({
391
+ ...Filters.where[0],
392
+ ...{ [element]: (0, typeorm_1.LessThan)(value) }
393
+ });
394
+ break;
395
+ case types_1.LogicOperator.lessOrEqualThan:
396
+ Filters.where[0] = js_utils_1.Objects.nest({
397
+ ...Filters.where[0],
398
+ ...{ [element]: (0, typeorm_1.LessThanOrEqual)(value) }
399
+ });
400
+ break;
401
+ case types_1.LogicOperator.in:
402
+ Filters.where[0] = js_utils_1.Objects.nest({
403
+ ...Filters.where[0],
404
+ ...{ [element]: (0, typeorm_1.In)(value) }
405
+ });
406
+ break;
407
+ case types_1.LogicOperator.notIn:
408
+ Filters.where[0] = js_utils_1.Objects.nest({
409
+ ...Filters.where[0],
410
+ ...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) }
411
+ });
412
+ break;
413
+ case types_1.LogicOperator.exists:
414
+ Filters.where[0] = js_utils_1.Objects.nest({
415
+ ...Filters.where[0],
416
+ ...{ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) }
417
+ });
418
+ break;
419
+ case types_1.LogicOperator.notExists:
420
+ Filters.where[0] = js_utils_1.Objects.nest({
421
+ ...Filters.where[0],
422
+ ...{ [element]: (0, typeorm_1.IsNull)() }
423
+ });
424
+ break;
425
+ case types_1.LogicOperator.regexp:
426
+ Filters.where[0] = js_utils_1.Objects.nest({
427
+ ...Filters.where[0],
428
+ ...{ [element]: (0, typeorm_1.Like)(value) }
429
+ });
430
+ break;
431
+ }
432
+ }
433
+ for (const condition of orConditions) {
434
+ const { element, operator, value } = condition;
371
435
  switch (operator) {
372
- case '=':
436
+ case types_1.LogicOperator.equals:
373
437
  Filters.where.push({ [element]: (0, typeorm_1.Equal)(value) });
374
438
  break;
375
- case '!=':
439
+ case types_1.LogicOperator.isNot:
376
440
  Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.Equal)(value)) });
377
441
  break;
378
- case '>':
442
+ case types_1.LogicOperator.greaterThan:
379
443
  Filters.where.push({ [element]: (0, typeorm_1.MoreThan)(value) });
380
444
  break;
381
- case '>=':
382
- Filters.where.push(js_utils_1.Objects.nest({ [element]: (0, typeorm_1.MoreThanOrEqual)(value) }));
445
+ case types_1.LogicOperator.greaterOrEqualThan:
446
+ Filters.where.push({ [element]: (0, typeorm_1.MoreThanOrEqual)(value) });
383
447
  break;
384
- case '<':
448
+ case types_1.LogicOperator.lessThan:
385
449
  Filters.where.push({ [element]: (0, typeorm_1.LessThan)(value) });
386
450
  break;
387
- case '<=':
451
+ case types_1.LogicOperator.lessOrEqualThan:
388
452
  Filters.where.push({ [element]: (0, typeorm_1.LessThanOrEqual)(value) });
389
453
  break;
390
- case 'in':
454
+ case types_1.LogicOperator.in:
391
455
  Filters.where.push({ [element]: (0, typeorm_1.In)(value) });
392
456
  break;
393
- case 'nin':
457
+ case types_1.LogicOperator.notIn:
394
458
  Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.In)(value)) });
395
459
  break;
396
- case 'exists':
460
+ case types_1.LogicOperator.exists:
397
461
  Filters.where.push({ [element]: (0, typeorm_1.Not)((0, typeorm_1.IsNull)()) });
398
462
  break;
399
- case '!exists':
463
+ case types_1.LogicOperator.notExists:
400
464
  Filters.where.push({ [element]: (0, typeorm_1.IsNull)() });
401
465
  break;
402
- case 'regexp':
466
+ case types_1.LogicOperator.regexp:
403
467
  Filters.where.push({ [element]: (0, typeorm_1.Like)(value) });
404
468
  break;
405
469
  }
406
- });
407
- return Filters;
470
+ }
471
+ const filtered = this.clearEmpties(Filters.where);
472
+ return filtered;
408
473
  }
409
- getMongoFilters(filters) {
410
- const andFilters = this.whereArray;
411
- const orFilters = this.orWhereArray;
412
- if (this.relationQuery && this.relationQuery.data) {
413
- const ids = this.relationQuery.data.map(d => js_utils_1.Ids.objectID(d.id));
414
- andFilters.push([
415
- this.relationQuery.relation.inverseSidePropertyPath,
416
- 'in',
417
- ids
418
- ]);
474
+ getTypeOrmMongoWhere(where) {
475
+ if (!where || Object.keys(where).length === 0) {
476
+ return {};
477
+ }
478
+ const Filters = {
479
+ where: { $or: [{ $and: [] }] }
480
+ };
481
+ const orConditions = this.extractConditions(where['OR']);
482
+ const andConditions = this.extractConditions(where['AND']);
483
+ const copy = js_utils_1.Objects.clone(where);
484
+ if (!!copy['AND']) {
485
+ delete copy['AND'];
419
486
  }
420
- if (!andFilters || andFilters.length === 0) {
421
- return filters;
487
+ if (!!copy['OR']) {
488
+ delete copy['OR'];
422
489
  }
423
- const Filters = { where: { $and: [] } };
424
- andFilters.forEach(condition => {
425
- let element = condition[0];
426
- const operator = condition[1];
427
- let value = condition[2];
490
+ const rootLevelConditions = this.extractConditions([copy]);
491
+ for (const condition of andConditions) {
492
+ let { element, operator, value } = condition;
428
493
  if (element === 'id') {
429
494
  element = '_id';
430
- value = Array.isArray(value)
495
+ value = (Array.isArray(value)
431
496
  ? value.map(v => js_utils_1.Ids.objectID(v))
432
- : js_utils_1.Ids.objectID(value);
497
+ : js_utils_1.Ids.objectID(value));
433
498
  }
434
499
  switch (operator) {
435
- case '=':
436
- Filters.where.$and.push({ [element]: { $eq: value } });
500
+ case types_1.LogicOperator.equals:
501
+ Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
437
502
  break;
438
- case '!=':
439
- Filters.where.$and.push({ [element]: { $neq: value } });
503
+ case types_1.LogicOperator.isNot:
504
+ Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
440
505
  break;
441
- case '>':
442
- Filters.where.$and.push({ [element]: { $gt: value } });
506
+ case types_1.LogicOperator.greaterThan:
507
+ Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
443
508
  break;
444
- case '>=':
445
- Filters.where.$and.push({ [element]: { $gte: value } });
509
+ case types_1.LogicOperator.greaterOrEqualThan:
510
+ Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
446
511
  break;
447
- case '<':
448
- Filters.where.$and.push({ [element]: { $lt: value } });
512
+ case types_1.LogicOperator.lessThan:
513
+ Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
449
514
  break;
450
- case '<=':
451
- Filters.where.$and.push({ [element]: { $lte: value } });
515
+ case types_1.LogicOperator.lessOrEqualThan:
516
+ Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
452
517
  break;
453
- case 'in':
454
- Filters.where.$and.push({ [element]: { $in: value } });
518
+ case types_1.LogicOperator.in:
519
+ Filters.where.$or[0].$and.push({ [element]: { $in: value } });
455
520
  break;
456
- case 'nin':
457
- Filters.where.$and.push({
521
+ case types_1.LogicOperator.notIn:
522
+ Filters.where.$or[0].$and.push({
458
523
  [element]: { $not: { $in: value } }
459
524
  });
460
525
  break;
461
- case 'exists':
462
- Filters.where.$and.push({ [element]: { $exists: true } });
526
+ case types_1.LogicOperator.exists:
527
+ Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
463
528
  break;
464
- case '!exists':
465
- Filters.where.$and.push({ [element]: { $exists: false } });
529
+ case types_1.LogicOperator.notExists:
530
+ Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
466
531
  break;
467
- case 'regex':
468
- Filters.where.$and.push({ [element]: { $regex: value } });
532
+ case types_1.LogicOperator.regexp:
533
+ Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
469
534
  break;
470
535
  }
471
- });
472
- return Filters;
473
- }
474
- getOrderBy(filter) {
475
- if (!this.orderByArray || this.orderByArray.length === 0) {
476
- return filter;
477
536
  }
478
- return {
479
- ...filter,
480
- order: {
481
- [this.orderByArray[0]]: this.orderByArray[1].toUpperCase()
537
+ for (const condition of rootLevelConditions) {
538
+ let { element, operator, value } = condition;
539
+ if (element === 'id') {
540
+ element = '_id';
541
+ value = (Array.isArray(value)
542
+ ? value.map(v => js_utils_1.Ids.objectID(v))
543
+ : js_utils_1.Ids.objectID(value));
482
544
  }
483
- };
545
+ switch (operator) {
546
+ case types_1.LogicOperator.equals:
547
+ Filters.where.$or[0].$and.push({ [element]: { $eq: value } });
548
+ break;
549
+ case types_1.LogicOperator.isNot:
550
+ Filters.where.$or[0].$and.push({ [element]: { $neq: value } });
551
+ break;
552
+ case types_1.LogicOperator.greaterThan:
553
+ Filters.where.$or[0].$and.push({ [element]: { $gt: value } });
554
+ break;
555
+ case types_1.LogicOperator.greaterOrEqualThan:
556
+ Filters.where.$or[0].$and.push({ [element]: { $gte: value } });
557
+ break;
558
+ case types_1.LogicOperator.lessThan:
559
+ Filters.where.$or[0].$and.push({ [element]: { $lt: value } });
560
+ break;
561
+ case types_1.LogicOperator.lessOrEqualThan:
562
+ Filters.where.$or[0].$and.push({ [element]: { $lte: value } });
563
+ break;
564
+ case types_1.LogicOperator.in:
565
+ Filters.where.$or[0].$and.push({ [element]: { $in: value } });
566
+ break;
567
+ case types_1.LogicOperator.notIn:
568
+ Filters.where.$or[0].$and.push({
569
+ [element]: { $not: { $in: value } }
570
+ });
571
+ break;
572
+ case types_1.LogicOperator.exists:
573
+ Filters.where.$or[0].$and.push({ [element]: { $exists: true } });
574
+ break;
575
+ case types_1.LogicOperator.notExists:
576
+ Filters.where.$or[0].$and.push({ [element]: { $exists: false } });
577
+ break;
578
+ case types_1.LogicOperator.regexp:
579
+ Filters.where.$or[0].$and.push({ [element]: { $regex: value } });
580
+ break;
581
+ }
582
+ }
583
+ for (const condition of orConditions) {
584
+ let { element, operator, value } = condition;
585
+ if (element === 'id') {
586
+ element = '_id';
587
+ value = (Array.isArray(value)
588
+ ? value.map(v => js_utils_1.Ids.objectID(v))
589
+ : js_utils_1.Ids.objectID(value));
590
+ }
591
+ switch (operator) {
592
+ case types_1.LogicOperator.equals:
593
+ Filters.where.$or.push({ [element]: { $eq: value } });
594
+ break;
595
+ case types_1.LogicOperator.isNot:
596
+ Filters.where.$or.push({ [element]: { $neq: value } });
597
+ break;
598
+ case types_1.LogicOperator.greaterThan:
599
+ Filters.where.$or.push({ [element]: { $gt: value } });
600
+ break;
601
+ case types_1.LogicOperator.greaterOrEqualThan:
602
+ Filters.where.$or.push({ [element]: { $gte: value } });
603
+ break;
604
+ case types_1.LogicOperator.lessThan:
605
+ Filters.where.$or.push({ [element]: { $lt: value } });
606
+ break;
607
+ case types_1.LogicOperator.lessOrEqualThan:
608
+ Filters.where.$or.push({ [element]: { $lte: value } });
609
+ break;
610
+ case types_1.LogicOperator.in:
611
+ Filters.where.$or.push({ [element]: { $in: value } });
612
+ break;
613
+ case types_1.LogicOperator.notIn:
614
+ Filters.where.$or.push({
615
+ [element]: { $not: { $in: value } }
616
+ });
617
+ break;
618
+ case types_1.LogicOperator.exists:
619
+ Filters.where.$or.push({ [element]: { $exists: true } });
620
+ break;
621
+ case types_1.LogicOperator.notExists:
622
+ Filters.where.$or.push({ [element]: { $exists: false } });
623
+ break;
624
+ case types_1.LogicOperator.regexp:
625
+ Filters.where.$or.push({ [element]: { $regex: value } });
626
+ break;
627
+ }
628
+ }
629
+ const filtered = this.clearEmpties(Filters.where);
630
+ return filtered;
484
631
  }
485
- getLimit(filter) {
486
- if (!this.limitNumber || this.limitNumber === 0) {
487
- this.limitNumber = (this.rawQuery && this.rawQuery.limit) || 50;
632
+ async updateById(id, data) {
633
+ const parsedId = this.isMongoDB
634
+ ? js_utils_1.Ids.objectID(id)
635
+ : id;
636
+ const idFieldName = this.isMongoDB ? '_id' : 'id';
637
+ const dataToInsert = this.outputKeys.includes('updated')
638
+ ? {
639
+ ...data,
640
+ ...{ updated: new Date() }
641
+ }
642
+ : data;
643
+ const validatedData = this.inputSchema.parse(dataToInsert);
644
+ const updateResults = await this.repository.update(id, validatedData);
645
+ if (updateResults.affected === 0) {
646
+ throw new Error('No rows where affected');
488
647
  }
489
- return { ...filter, take: this.limitNumber };
648
+ const dbResult = await this.repository.findOneOrFail({
649
+ where: {
650
+ [idFieldName]: parsedId
651
+ }
652
+ });
653
+ if (this.isMongoDB) {
654
+ dbResult['id'] = dbResult['id'].toString();
655
+ }
656
+ return this.outputSchema?.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(dbResult)));
490
657
  }
491
- getSkip(filter) {
492
- if (!this.offsetNumber) {
493
- this.offsetNumber = (this.rawQuery && this.rawQuery.skip) || 0;
658
+ async replaceById(id, data) {
659
+ const parsedId = this.isMongoDB
660
+ ? js_utils_1.Ids.objectID(id)
661
+ : id;
662
+ const idFieldName = this.isMongoDB ? '_id' : 'id';
663
+ const value = await this.repository.findOneOrFail({
664
+ where: {
665
+ [idFieldName]: parsedId
666
+ }
667
+ });
668
+ const flatValue = js_utils_1.Objects.flatten(JSON.parse(JSON.stringify(value)));
669
+ Object.keys(flatValue).forEach(key => {
670
+ flatValue[key] = null;
671
+ });
672
+ const nullObject = js_utils_1.Objects.nest(flatValue);
673
+ const newValue = { ...nullObject, ...data };
674
+ delete newValue._id;
675
+ delete newValue.id;
676
+ delete newValue.created;
677
+ delete newValue.updated;
678
+ const dataToInsert = this.outputKeys.includes('updated')
679
+ ? {
680
+ ...data,
681
+ ...{ updated: new Date() }
682
+ }
683
+ : data;
684
+ const validatedData = this.inputSchema.parse(dataToInsert);
685
+ const updateResults = await this.repository.update(id, validatedData);
686
+ if (updateResults.affected === 0) {
687
+ throw new Error('No rows where affected');
688
+ }
689
+ const val = await this.repository.findOneOrFail({
690
+ where: {
691
+ [idFieldName]: parsedId
692
+ }
693
+ });
694
+ if (this.isMongoDB) {
695
+ val['id'] = val['id'].toString();
494
696
  }
495
- return { ...filter, skip: this.offsetNumber };
697
+ return this.outputSchema.parse(this.clearEmpties(js_utils_1.Objects.deleteNulls(val)));
496
698
  }
497
- getSelect(filter) {
498
- let select = this.selectArray;
499
- if (Object.keys(select).length === 0 && select.constructor === Object) {
500
- select = [''];
699
+ async clear() {
700
+ await this.repository.clear();
701
+ return true;
702
+ }
703
+ loadFirst(query) {
704
+ const detachedClass = Object.assign(Object.create(Object.getPrototypeOf(this)), this);
705
+ detachedClass.setRelatedQuery({
706
+ entity: this.entity,
707
+ repository: this,
708
+ query
709
+ });
710
+ return detachedClass;
711
+ }
712
+ loadById(id) {
713
+ const newInstance = this.clone();
714
+ newInstance.setRelatedQuery({
715
+ entity: this.entity,
716
+ repository: this,
717
+ query: {
718
+ where: {
719
+ id
720
+ }
721
+ }
722
+ });
723
+ return newInstance;
724
+ }
725
+ async requireById(id, q) {
726
+ const found = await this.findByIds([id], {
727
+ select: q?.select,
728
+ include: q?.include,
729
+ limit: 1
730
+ });
731
+ found.map(d => {
732
+ if (this.isMongoDB) {
733
+ d['id'] = d['id'].toString();
734
+ }
735
+ this.clearEmpties(js_utils_1.Objects.deleteNulls(d));
736
+ });
737
+ if (!found[0]) {
738
+ throw new Error(`Object ${id} not found`);
501
739
  }
502
- select = select.map(s => {
503
- s = s.split(' as ')[0];
504
- s = s.includes('id') ? 'id' : s;
505
- return s;
740
+ return this.outputSchema?.parse(found[0]);
741
+ }
742
+ clone() {
743
+ return new this.constructor();
744
+ }
745
+ async findByIds(ids, q) {
746
+ let data = await this.findMany({
747
+ where: {
748
+ id: {
749
+ in: ids
750
+ }
751
+ },
752
+ limit: q?.limit,
753
+ select: q?.select,
754
+ include: q?.include
506
755
  });
507
- if (select.find(e => e.startsWith('data.'))) {
508
- select.unshift('data');
756
+ return this.outputSchema?.array().parse(data);
757
+ }
758
+ getOrderBy(orderBy) {
759
+ if (!orderBy || orderBy.length === 0) {
760
+ return {};
509
761
  }
510
- if (!select) {
511
- return filter;
762
+ const order = {};
763
+ for (const orderElement of orderBy) {
764
+ const flattenOrder = js_utils_1.Objects.flatten(orderElement);
765
+ for (const k of Object.keys(flattenOrder)) {
766
+ order[k] = flattenOrder[k];
767
+ }
512
768
  }
513
- return { ...filter, fields: select };
769
+ return js_utils_1.Objects.nest(order);
514
770
  }
515
771
  }
516
772
  exports.TypeOrmConnector = TypeOrmConnector;