@loopback/repository 4.1.2 → 5.0.2

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 (250) hide show
  1. package/LICENSE +1 -1
  2. package/dist/connectors/connector.js +1 -1
  3. package/dist/connectors/connector.js.map +1 -1
  4. package/dist/connectors/crud.connector.js +1 -1
  5. package/dist/connectors/crud.connector.js.map +1 -1
  6. package/dist/connectors/index.js +1 -1
  7. package/dist/connectors/index.js.map +1 -1
  8. package/dist/connectors/kv.connector.js +1 -1
  9. package/dist/connectors/kv.connector.js.map +1 -1
  10. package/dist/datasource.js +1 -1
  11. package/dist/datasource.js.map +1 -1
  12. package/dist/decorators/index.js +1 -1
  13. package/dist/decorators/index.js.map +1 -1
  14. package/dist/decorators/metadata.js +1 -1
  15. package/dist/decorators/metadata.js.map +1 -1
  16. package/dist/decorators/model.decorator.js +1 -1
  17. package/dist/decorators/model.decorator.js.map +1 -1
  18. package/dist/decorators/repository.decorator.js +1 -1
  19. package/dist/decorators/repository.decorator.js.map +1 -1
  20. package/dist/define-model-class.js +1 -1
  21. package/dist/define-model-class.js.map +1 -1
  22. package/dist/define-repository-class.js +1 -1
  23. package/dist/define-repository-class.js.map +1 -1
  24. package/dist/errors/entity-not-found.error.js +1 -1
  25. package/dist/errors/entity-not-found.error.js.map +1 -1
  26. package/dist/errors/index.d.ts +1 -0
  27. package/dist/errors/index.js +2 -1
  28. package/dist/errors/index.js.map +1 -1
  29. package/dist/errors/invalid-polymorphism.error.d.ts +5 -0
  30. package/dist/errors/invalid-polymorphism.error.js +22 -0
  31. package/dist/errors/invalid-polymorphism.error.js.map +1 -0
  32. package/dist/errors/invalid-relation.error.d.ts +1 -1
  33. package/dist/errors/invalid-relation.error.js +1 -1
  34. package/dist/errors/invalid-relation.error.js.map +1 -1
  35. package/dist/index.js +1 -1
  36. package/dist/index.js.map +1 -1
  37. package/dist/mixins/index.js +1 -1
  38. package/dist/mixins/index.js.map +1 -1
  39. package/dist/mixins/repository.mixin.d.ts +49 -50
  40. package/dist/mixins/repository.mixin.js +1 -1
  41. package/dist/mixins/repository.mixin.js.map +1 -1
  42. package/dist/model.d.ts +7 -1
  43. package/dist/model.js +15 -1
  44. package/dist/model.js.map +1 -1
  45. package/dist/relations/belongs-to/belongs-to.accessor.d.ts +6 -2
  46. package/dist/relations/belongs-to/belongs-to.accessor.js +19 -6
  47. package/dist/relations/belongs-to/belongs-to.accessor.js.map +1 -1
  48. package/dist/relations/belongs-to/belongs-to.decorator.js +1 -1
  49. package/dist/relations/belongs-to/belongs-to.decorator.js.map +1 -1
  50. package/dist/relations/belongs-to/belongs-to.helpers.d.ts +3 -0
  51. package/dist/relations/belongs-to/belongs-to.helpers.js +33 -9
  52. package/dist/relations/belongs-to/belongs-to.helpers.js.map +1 -1
  53. package/dist/relations/belongs-to/belongs-to.inclusion-resolver.d.ts +5 -2
  54. package/dist/relations/belongs-to/belongs-to.inclusion-resolver.js +82 -9
  55. package/dist/relations/belongs-to/belongs-to.inclusion-resolver.js.map +1 -1
  56. package/dist/relations/belongs-to/belongs-to.repository.d.ts +28 -5
  57. package/dist/relations/belongs-to/belongs-to.repository.js +50 -11
  58. package/dist/relations/belongs-to/belongs-to.repository.js.map +1 -1
  59. package/dist/relations/belongs-to/index.d.ts +2 -2
  60. package/dist/relations/belongs-to/index.js +3 -3
  61. package/dist/relations/belongs-to/index.js.map +1 -1
  62. package/dist/relations/has-many/has-many-through.helpers.d.ts +3 -0
  63. package/dist/relations/has-many/has-many-through.helpers.js +26 -2
  64. package/dist/relations/has-many/has-many-through.helpers.js.map +1 -1
  65. package/dist/relations/has-many/has-many-through.inclusion-resolver.d.ts +3 -1
  66. package/dist/relations/has-many/has-many-through.inclusion-resolver.js +93 -22
  67. package/dist/relations/has-many/has-many-through.inclusion-resolver.js.map +1 -1
  68. package/dist/relations/has-many/has-many-through.repository-factory.d.ts +3 -1
  69. package/dist/relations/has-many/has-many-through.repository-factory.js +8 -2
  70. package/dist/relations/has-many/has-many-through.repository-factory.js.map +1 -1
  71. package/dist/relations/has-many/has-many-through.repository.d.ts +66 -11
  72. package/dist/relations/has-many/has-many-through.repository.js +212 -36
  73. package/dist/relations/has-many/has-many-through.repository.js.map +1 -1
  74. package/dist/relations/has-many/has-many.decorator.js +1 -1
  75. package/dist/relations/has-many/has-many.decorator.js.map +1 -1
  76. package/dist/relations/has-many/has-many.helpers.js +1 -1
  77. package/dist/relations/has-many/has-many.helpers.js.map +1 -1
  78. package/dist/relations/has-many/has-many.inclusion-resolver.js +1 -1
  79. package/dist/relations/has-many/has-many.inclusion-resolver.js.map +1 -1
  80. package/dist/relations/has-many/has-many.repository-factory.js +1 -1
  81. package/dist/relations/has-many/has-many.repository-factory.js.map +1 -1
  82. package/dist/relations/has-many/has-many.repository.js +1 -1
  83. package/dist/relations/has-many/has-many.repository.js.map +1 -1
  84. package/dist/relations/has-many/index.d.ts +2 -2
  85. package/dist/relations/has-many/index.js +3 -3
  86. package/dist/relations/has-many/index.js.map +1 -1
  87. package/dist/relations/has-one/has-one.decorator.js +1 -1
  88. package/dist/relations/has-one/has-one.decorator.js.map +1 -1
  89. package/dist/relations/has-one/has-one.helpers.d.ts +3 -0
  90. package/dist/relations/has-one/has-one.helpers.js +35 -9
  91. package/dist/relations/has-one/has-one.helpers.js.map +1 -1
  92. package/dist/relations/has-one/has-one.inclusion-resolver.d.ts +6 -3
  93. package/dist/relations/has-one/has-one.inclusion-resolver.js +83 -8
  94. package/dist/relations/has-one/has-one.inclusion-resolver.js.map +1 -1
  95. package/dist/relations/has-one/has-one.repository-factory.d.ts +9 -3
  96. package/dist/relations/has-one/has-one.repository-factory.js +14 -4
  97. package/dist/relations/has-one/has-one.repository-factory.js.map +1 -1
  98. package/dist/relations/has-one/has-one.repository.d.ts +58 -11
  99. package/dist/relations/has-one/has-one.repository.js +119 -16
  100. package/dist/relations/has-one/has-one.repository.js.map +1 -1
  101. package/dist/relations/has-one/index.js +1 -1
  102. package/dist/relations/has-one/index.js.map +1 -1
  103. package/dist/relations/index.d.ts +2 -0
  104. package/dist/relations/index.js +3 -1
  105. package/dist/relations/index.js.map +1 -1
  106. package/dist/relations/references-many/index.d.ts +4 -0
  107. package/dist/relations/references-many/index.js +12 -0
  108. package/dist/relations/references-many/index.js.map +1 -0
  109. package/dist/relations/references-many/references-many.accessor.d.ts +17 -0
  110. package/dist/relations/references-many/references-many.accessor.js +40 -0
  111. package/dist/relations/references-many/references-many.accessor.js.map +1 -0
  112. package/dist/relations/references-many/references-many.decorator.d.ts +11 -0
  113. package/dist/relations/references-many/references-many.decorator.js +73 -0
  114. package/dist/relations/references-many/references-many.decorator.js.map +1 -0
  115. package/dist/relations/references-many/references-many.helpers.d.ts +17 -0
  116. package/dist/relations/references-many/references-many.helpers.js +63 -0
  117. package/dist/relations/references-many/references-many.helpers.js.map +1 -0
  118. package/dist/relations/references-many/references-many.inclusion-resolver.d.ts +14 -0
  119. package/dist/relations/references-many/references-many.inclusion-resolver.js +42 -0
  120. package/dist/relations/references-many/references-many.inclusion-resolver.js.map +1 -0
  121. package/dist/relations/references-many/references-many.repository.d.ts +28 -0
  122. package/dist/relations/references-many/references-many.repository.js +33 -0
  123. package/dist/relations/references-many/references-many.repository.js.map +1 -0
  124. package/dist/relations/relation.decorator.d.ts +0 -6
  125. package/dist/relations/relation.decorator.js +2 -14
  126. package/dist/relations/relation.decorator.js.map +1 -1
  127. package/dist/relations/relation.filter.solver.d.ts +2 -0
  128. package/dist/relations/relation.filter.solver.js +57 -0
  129. package/dist/relations/relation.filter.solver.js.map +1 -0
  130. package/dist/relations/relation.helpers.js +18 -3
  131. package/dist/relations/relation.helpers.js.map +1 -1
  132. package/dist/relations/relation.types.d.ts +52 -1
  133. package/dist/relations/relation.types.js +1 -1
  134. package/dist/relations/relation.types.js.map +1 -1
  135. package/dist/repositories/constraint-utils.js +1 -1
  136. package/dist/repositories/constraint-utils.js.map +1 -1
  137. package/dist/repositories/index.d.ts +2 -2
  138. package/dist/repositories/index.js +3 -3
  139. package/dist/repositories/index.js.map +1 -1
  140. package/dist/repositories/kv.repository.bridge.js +1 -1
  141. package/dist/repositories/kv.repository.bridge.js.map +1 -1
  142. package/dist/repositories/kv.repository.d.ts +2 -2
  143. package/dist/repositories/kv.repository.js +1 -1
  144. package/dist/repositories/kv.repository.js.map +1 -1
  145. package/dist/repositories/legacy-juggler-bridge.d.ts +36 -9
  146. package/dist/repositories/legacy-juggler-bridge.js +38 -16
  147. package/dist/repositories/legacy-juggler-bridge.js.map +1 -1
  148. package/dist/repositories/repository.js +1 -1
  149. package/dist/repositories/repository.js.map +1 -1
  150. package/dist/type-resolver.js +1 -1
  151. package/dist/type-resolver.js.map +1 -1
  152. package/dist/types/any.js +1 -1
  153. package/dist/types/any.js.map +1 -1
  154. package/dist/types/array.js +1 -1
  155. package/dist/types/array.js.map +1 -1
  156. package/dist/types/boolean.js +1 -1
  157. package/dist/types/boolean.js.map +1 -1
  158. package/dist/types/buffer.js +1 -1
  159. package/dist/types/buffer.js.map +1 -1
  160. package/dist/types/date.js +1 -1
  161. package/dist/types/date.js.map +1 -1
  162. package/dist/types/index.js +1 -1
  163. package/dist/types/index.js.map +1 -1
  164. package/dist/types/model.js +1 -1
  165. package/dist/types/model.js.map +1 -1
  166. package/dist/types/null.js +1 -1
  167. package/dist/types/null.js.map +1 -1
  168. package/dist/types/number.js +1 -1
  169. package/dist/types/number.js.map +1 -1
  170. package/dist/types/object.js +1 -1
  171. package/dist/types/object.js.map +1 -1
  172. package/dist/types/string.js +1 -1
  173. package/dist/types/string.js.map +1 -1
  174. package/dist/types/type.js +1 -1
  175. package/dist/types/type.js.map +1 -1
  176. package/dist/types/union.js +1 -1
  177. package/dist/types/union.js.map +1 -1
  178. package/package.json +15 -15
  179. package/src/connectors/connector.ts +1 -1
  180. package/src/connectors/crud.connector.ts +1 -1
  181. package/src/connectors/index.ts +1 -1
  182. package/src/connectors/kv.connector.ts +1 -1
  183. package/src/datasource.ts +1 -1
  184. package/src/decorators/index.ts +1 -1
  185. package/src/decorators/metadata.ts +1 -1
  186. package/src/decorators/model.decorator.ts +1 -1
  187. package/src/decorators/repository.decorator.ts +1 -1
  188. package/src/define-model-class.ts +1 -1
  189. package/src/define-repository-class.ts +1 -1
  190. package/src/errors/entity-not-found.error.ts +1 -1
  191. package/src/errors/index.ts +2 -1
  192. package/src/errors/invalid-polymorphism.error.ts +28 -0
  193. package/src/errors/invalid-relation.error.ts +2 -2
  194. package/src/index.ts +1 -1
  195. package/src/mixins/index.ts +1 -1
  196. package/src/mixins/repository.mixin.ts +1 -6
  197. package/src/model.ts +20 -1
  198. package/src/relations/belongs-to/belongs-to.accessor.ts +36 -7
  199. package/src/relations/belongs-to/belongs-to.decorator.ts +2 -2
  200. package/src/relations/belongs-to/belongs-to.helpers.ts +37 -10
  201. package/src/relations/belongs-to/belongs-to.inclusion-resolver.ts +109 -18
  202. package/src/relations/belongs-to/belongs-to.repository.ts +78 -18
  203. package/src/relations/belongs-to/index.ts +3 -3
  204. package/src/relations/has-many/has-many-through.helpers.ts +28 -2
  205. package/src/relations/has-many/has-many-through.inclusion-resolver.ts +118 -27
  206. package/src/relations/has-many/has-many-through.repository-factory.ts +22 -4
  207. package/src/relations/has-many/has-many-through.repository.ts +344 -77
  208. package/src/relations/has-many/has-many.decorator.ts +1 -1
  209. package/src/relations/has-many/has-many.helpers.ts +1 -1
  210. package/src/relations/has-many/has-many.inclusion-resolver.ts +1 -1
  211. package/src/relations/has-many/has-many.repository-factory.ts +1 -1
  212. package/src/relations/has-many/has-many.repository.ts +1 -1
  213. package/src/relations/has-many/index.ts +3 -3
  214. package/src/relations/has-one/has-one.decorator.ts +1 -1
  215. package/src/relations/has-one/has-one.helpers.ts +41 -14
  216. package/src/relations/has-one/has-one.inclusion-resolver.ts +110 -16
  217. package/src/relations/has-one/has-one.repository-factory.ts +35 -7
  218. package/src/relations/has-one/has-one.repository.ts +189 -36
  219. package/src/relations/has-one/index.ts +1 -1
  220. package/src/relations/index.ts +3 -1
  221. package/src/relations/references-many/index.ts +9 -0
  222. package/src/relations/references-many/references-many.accessor.ts +76 -0
  223. package/src/relations/references-many/references-many.decorator.ts +100 -0
  224. package/src/relations/references-many/references-many.helpers.ts +82 -0
  225. package/src/relations/references-many/references-many.inclusion-resolver.ts +80 -0
  226. package/src/relations/references-many/references-many.repository.ts +55 -0
  227. package/src/relations/relation.decorator.ts +1 -13
  228. package/src/relations/relation.filter.solver.ts +56 -0
  229. package/src/relations/relation.helpers.ts +18 -3
  230. package/src/relations/relation.types.ts +52 -1
  231. package/src/repositories/constraint-utils.ts +1 -1
  232. package/src/repositories/index.ts +3 -3
  233. package/src/repositories/kv.repository.bridge.ts +1 -1
  234. package/src/repositories/kv.repository.ts +3 -3
  235. package/src/repositories/legacy-juggler-bridge.ts +80 -16
  236. package/src/repositories/repository.ts +1 -1
  237. package/src/type-resolver.ts +1 -1
  238. package/src/types/any.ts +1 -1
  239. package/src/types/array.ts +1 -1
  240. package/src/types/boolean.ts +1 -1
  241. package/src/types/buffer.ts +1 -1
  242. package/src/types/date.ts +1 -1
  243. package/src/types/index.ts +1 -1
  244. package/src/types/model.ts +1 -1
  245. package/src/types/null.ts +1 -1
  246. package/src/types/number.ts +1 -1
  247. package/src/types/object.ts +1 -1
  248. package/src/types/string.ts +1 -1
  249. package/src/types/type.ts +1 -1
  250. package/src/types/union.ts +1 -1
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
- // Copyright IBM Corp. 2019,2020. All Rights Reserved.
2
+ // Copyright IBM Corp. and LoopBack contributors 2019,2020. All Rights Reserved.
3
3
  // Node module: @loopback/repository
4
4
  // This file is licensed under the MIT License.
5
5
  // License text available at https://opensource.org/licenses/MIT
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.createHasOneInclusionResolver = void 0;
8
+ const lodash_1 = require("lodash");
9
+ const __1 = require("../../");
8
10
  const relation_helpers_1 = require("../relation.helpers");
9
11
  const has_one_helpers_1 = require("./has-one.helpers");
10
12
  /**
@@ -14,21 +16,94 @@ const has_one_helpers_1 = require("./has-one.helpers");
14
16
  *
15
17
  * Notice: scope field for inclusion is not supported yet.
16
18
  *
17
- * @param meta
18
- * @param getTargetRepo
19
+ * @param meta - resolved HasOneMetadata
20
+ * @param getTargetRepoDict - dictionary of target model type - target repository
21
+ * i.e where related instances for different types are
19
22
  */
20
- function createHasOneInclusionResolver(meta, getTargetRepo) {
23
+ function createHasOneInclusionResolver(meta, getTargetRepoDict) {
21
24
  const relationMeta = (0, has_one_helpers_1.resolveHasOneMetadata)(meta);
22
25
  return async function fetchHasOneModel(entities, inclusion, options) {
23
26
  if (!entities.length)
24
27
  return [];
28
+ // Source ids are grouped by their target polymorphic types
29
+ // Each type search for target instances and then merge together in a merge-sort-like manner
25
30
  const sourceKey = relationMeta.keyFrom;
26
- const sourceIds = entities.map(e => e[sourceKey]);
27
31
  const targetKey = relationMeta.keyTo;
32
+ const targetDiscriminator = relationMeta.polymorphic
33
+ ? relationMeta.polymorphic.discriminator
34
+ : undefined;
28
35
  const scope = typeof inclusion === 'string' ? {} : inclusion.scope;
29
- const targetRepo = await getTargetRepo();
30
- const targetsFound = await (0, relation_helpers_1.findByForeignKeys)(targetRepo, targetKey, sourceIds, scope, options);
31
- return (0, relation_helpers_1.flattenTargetsOfOneToOneRelation)(sourceIds, targetsFound, targetKey);
36
+ // sourceIds in {targetType -> sourceId}
37
+ const sourceIdsCategorized = {};
38
+ if (targetDiscriminator) {
39
+ entities.forEach((value, index, allEntites) => {
40
+ const concreteType = String(value[targetDiscriminator]);
41
+ if (!getTargetRepoDict[concreteType]) {
42
+ throw new __1.InvalidPolymorphismError(concreteType, targetDiscriminator);
43
+ }
44
+ if (!sourceIdsCategorized[concreteType]) {
45
+ sourceIdsCategorized[concreteType] = [];
46
+ }
47
+ sourceIdsCategorized[concreteType].push(value[sourceKey]);
48
+ });
49
+ }
50
+ else {
51
+ const concreteType = relationMeta.target().name;
52
+ if (!getTargetRepoDict[concreteType]) {
53
+ throw new __1.InvalidPolymorphismError(concreteType);
54
+ }
55
+ entities.forEach((value, index, allEntites) => {
56
+ if (!sourceIdsCategorized[concreteType]) {
57
+ sourceIdsCategorized[concreteType] = [];
58
+ }
59
+ sourceIdsCategorized[concreteType].push(value[sourceKey]);
60
+ });
61
+ }
62
+ // Ensure targetKey is included otherwise flatten function cannot work
63
+ const changedTargetKeyField = (0, __1.includeFieldIfNot)(scope === null || scope === void 0 ? void 0 : scope.fields, targetKey);
64
+ let needToRemoveTargetKeyFieldLater = false;
65
+ if (changedTargetKeyField !== false) {
66
+ scope.fields = changedTargetKeyField;
67
+ needToRemoveTargetKeyFieldLater = true;
68
+ }
69
+ // Each sourceIds array with same target type extract target instances
70
+ const targetCategorized = {};
71
+ for (const k of Object.keys(sourceIdsCategorized)) {
72
+ const targetRepo = await getTargetRepoDict[k]();
73
+ const targetsFound = await (0, relation_helpers_1.findByForeignKeys)(targetRepo, targetKey, sourceIdsCategorized[k], scope, Object.assign((0, lodash_1.cloneDeep)(options !== null && options !== void 0 ? options : {}), { polymorphicType: k }));
74
+ targetCategorized[k] = (0, relation_helpers_1.flattenTargetsOfOneToOneRelation)(sourceIdsCategorized[k], targetsFound, targetKey);
75
+ // Remove targetKey if should be excluded but included above
76
+ if (needToRemoveTargetKeyFieldLater) {
77
+ targetCategorized[k] = targetCategorized[k].map(e => {
78
+ if (e) {
79
+ delete e[targetKey];
80
+ }
81
+ return e;
82
+ });
83
+ }
84
+ }
85
+ // Merge
86
+ // Why the order is correct:
87
+ // e.g. target model 1 = a, target model 2 = b
88
+ // all entities: [S(a-1), S(a-2), S(b-3), S(a-4), S(b-5)]
89
+ // a-result: [a-1, a-2, a-4]
90
+ // b-result: [b-3, b-4]
91
+ // merged:
92
+ // entities[1]->a => targets: [a-1 from a-result.shift()]
93
+ // entities[2]->a => targets: [a-1, a-2 from a-result.shift()]
94
+ // entities[3]->b => targets: [a-1, a-2, b-3 from b-result.shift()]
95
+ // entities[4]->a => targets: [a-1, a-2, b-3, a-4 from a-result.shift()]
96
+ // entities[5]->b => targets: [a-1, a-2, b-3, a-4, b-5 from b-result.shift()]
97
+ if (targetDiscriminator) {
98
+ const allTargets = [];
99
+ entities.forEach((value, index, allEntites) => {
100
+ allTargets.push(targetCategorized[String(value[targetDiscriminator])].shift());
101
+ });
102
+ return allTargets;
103
+ }
104
+ else {
105
+ return targetCategorized[relationMeta.target().name];
106
+ }
32
107
  };
33
108
  }
34
109
  exports.createHasOneInclusionResolver = createHasOneInclusionResolver;
@@ -1 +1 @@
1
- {"version":3,"file":"has-one.inclusion-resolver.js","sourceRoot":"","sources":["../../../src/relations/has-one/has-one.inclusion-resolver.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAMhE,0DAI6B;AAE7B,uDAAwD;AAExD;;;;;;;;;GASG;AACH,SAAgB,6BAA6B,CAK3C,IAAsB,EACtB,aAEC;IAED,MAAM,YAAY,GAAG,IAAA,uCAAqB,EAAC,IAAI,CAAC,CAAC;IAEjD,OAAO,KAAK,UAAU,gBAAgB,CACpC,QAAkB,EAClB,SAA0B,EAC1B,OAAiB;QAEjB,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEhC,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,CAAe,CAAC,SAAS,CAAC,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,YAAY,CAAC,KAA4B,CAAC;QAE5D,MAAM,KAAK,GACT,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,SAAS,CAAC,KAAwB,CAAC;QAE3E,MAAM,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;QACzC,MAAM,YAAY,GAAG,MAAM,IAAA,oCAAiB,EAC1C,UAAU,EACV,SAAS,EACT,SAAS,EACT,KAAK,EACL,OAAO,CACR,CAAC;QAEF,OAAO,IAAA,mDAAgC,EAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;IAC9E,CAAC,CAAC;AACJ,CAAC;AArCD,sEAqCC"}
1
+ {"version":3,"file":"has-one.inclusion-resolver.js","sourceRoot":"","sources":["../../../src/relations/has-one/has-one.inclusion-resolver.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAGhE,mCAAiC;AACjC,8BAAmE;AAInE,0DAI6B;AAE7B,uDAAwD;AAExD;;;;;;;;;;GAUG;AAEH,SAAgB,6BAA6B,CAK3C,IAAsB,EACtB,iBAIC;IAED,MAAM,YAAY,GAAG,IAAA,uCAAqB,EAAC,IAAI,CAAC,CAAC;IAEjD,OAAO,KAAK,UAAU,gBAAgB,CACpC,QAAkB,EAClB,SAA0B,EAC1B,OAAiB;QAEjB,IAAI,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEhC,2DAA2D;QAC3D,4FAA4F;QAE5F,MAAM,SAAS,GAAG,YAAY,CAAC,OAAO,CAAC;QACvC,MAAM,SAAS,GAAG,YAAY,CAAC,KAA4B,CAAC;QAC5D,MAAM,mBAAmB,GACvB,YAAY,CAAC,WAAW;YACtB,CAAC,CAAE,YAAY,CAAC,WAAW,CAAC,aAA8B;YAC1D,CAAC,CAAC,SAAS,CAAC;QAEhB,MAAM,KAAK,GACT,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAE,SAAS,CAAC,KAAwB,CAAC;QAE3E,wCAAwC;QACxC,MAAM,oBAAoB,GAEtB,EAAE,CAAC;QACP,IAAI,mBAAmB,EAAE;YACvB,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACxD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;oBACpC,MAAM,IAAI,4BAAwB,CAAC,YAAY,EAAE,mBAAmB,CAAC,CAAC;iBACvE;gBACD,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,EAAE;oBACvC,oBAAoB,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;iBACzC;gBACD,oBAAoB,CAAC,YAAY,CAAC,CAAC,IAAI,CACpC,KAAmB,CAAC,SAAS,CAAC,CAChC,CAAC;YACJ,CAAC,CAAC,CAAC;SACJ;aAAM;YACL,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;YAChD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE;gBACpC,MAAM,IAAI,4BAAwB,CAAC,YAAY,CAAC,CAAC;aAClD;YACD,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC5C,IAAI,CAAC,oBAAoB,CAAC,YAAY,CAAC,EAAE;oBACvC,oBAAoB,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC;iBACzC;gBACD,oBAAoB,CAAC,YAAY,CAAC,CAAC,IAAI,CACpC,KAAmB,CAAC,SAAS,CAAC,CAChC,CAAC;YACJ,CAAC,CAAC,CAAC;SACJ;QAED,sEAAsE;QACtE,MAAM,qBAAqB,GAAG,IAAA,qBAAiB,EAAC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,MAAM,EAAE,SAAS,CAAC,CAAC;QAC1E,IAAI,+BAA+B,GAAG,KAAK,CAAC;QAC5C,IAAI,qBAAqB,KAAK,KAAK,EAAE;YACnC,KAAK,CAAC,MAAM,GAAG,qBAAqB,CAAC;YACrC,+BAA+B,GAAG,IAAI,CAAC;SACxC;QACD,sEAAsE;QACtE,MAAM,iBAAiB,GAEnB,EAAE,CAAC;QACP,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,EAAE;YACjD,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,MAAM,IAAA,oCAAiB,EAC1C,UAAU,EACV,SAAS,EACT,oBAAoB,CAAC,CAAC,CAAC,EACvB,KAAK,EACL,MAAM,CAAC,MAAM,CAAC,IAAA,kBAAS,EAAC,OAAO,aAAP,OAAO,cAAP,OAAO,GAAI,EAAE,CAAC,EAAE,EAAC,eAAe,EAAE,CAAC,EAAC,CAAC,CAC9D,CAAC;YACF,iBAAiB,CAAC,CAAC,CAAC,GAAG,IAAA,mDAAgC,EACrD,oBAAoB,CAAC,CAAC,CAAC,EACvB,YAAY,EACZ,SAAS,CACV,CAAC;YAEF,4DAA4D;YAC5D,IAAI,+BAA+B,EAAE;gBACnC,iBAAiB,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;oBAClD,IAAI,CAAC,EAAE;wBACL,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC;qBACrB;oBACD,OAAO,CAAC,CAAC;gBACX,CAAC,CAAC,CAAC;aACJ;SACF;QAED,QAAQ;QACR,4BAA4B;QAC5B,8CAA8C;QAC9C,yDAAyD;QACzD,4BAA4B;QAC5B,uBAAuB;QACvB,UAAU;QACV,yDAAyD;QACzD,8DAA8D;QAC9D,mEAAmE;QACnE,wEAAwE;QACxE,6EAA6E;QAC7E,IAAI,mBAAmB,EAAE;YACvB,MAAM,UAAU,GAA+C,EAAE,CAAC;YAClE,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE;gBAC5C,UAAU,CAAC,IAAI,CACb,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAC9D,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,OAAO,UAAU,CAAC;SACnB;aAAM;YACL,OAAO,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;SACtD;IACH,CAAC,CAAC;AACJ,CAAC;AA/HD,sEA+HC"}
@@ -18,11 +18,17 @@ export interface HasOneRepositoryFactory<Target extends Entity, ForeignKeyType>
18
18
  * via a HasOne relation, then, the relational repository returned by the
19
19
  * factory function would be constrained by a Customer model instance's id(s).
20
20
  *
21
+ * If the target model is polymorphic, i.e. stored within different repositories,
22
+ * supply the targetRepositoryGetter with a dictionary in the form of {[typeName: string]: repositoryGetter}
23
+ *
21
24
  * @param relationMetadata - The relation metadata used to describe the
22
25
  * relationship and determine how to apply the constraint.
23
- * @param targetRepositoryGetter - The repository which represents the target model of a
24
- * relation attached to a datasource.
26
+ * @param targetRepositoryGetter - The repository or a dictionary of classname - repository,
27
+ * which represents the target model of a relation attached to a datasource.
28
+ * For the dictionary, the key is the class name of the concrete class the the polymorphic model.
25
29
  * @returns The factory function which accepts a foreign key value to constrain
26
30
  * the given target repository
27
31
  */
28
- export declare function createHasOneRepositoryFactory<Target extends Entity, TargetID, ForeignKeyType>(relationMetadata: HasOneDefinition, targetRepositoryGetter: Getter<EntityCrudRepository<Target, TargetID>>): HasOneRepositoryFactory<Target, ForeignKeyType>;
32
+ export declare function createHasOneRepositoryFactory<Target extends Entity, TargetID, ForeignKeyType>(relationMetadata: HasOneDefinition, targetRepositoryGetter: Getter<EntityCrudRepository<Target, TargetID>> | {
33
+ [repoType: string]: Getter<EntityCrudRepository<Target, TargetID>>;
34
+ }): HasOneRepositoryFactory<Target, ForeignKeyType>;
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- // Copyright IBM Corp. 2018,2020. All Rights Reserved.
2
+ // Copyright IBM Corp. and LoopBack contributors 2018,2020. All Rights Reserved.
3
3
  // Node module: @loopback/repository
4
4
  // This file is licensed under the MIT License.
5
5
  // License text available at https://opensource.org/licenses/MIT
@@ -17,20 +17,30 @@ const debug = (0, debug_1.default)('loopback:repository:relations:has-one:reposi
17
17
  * via a HasOne relation, then, the relational repository returned by the
18
18
  * factory function would be constrained by a Customer model instance's id(s).
19
19
  *
20
+ * If the target model is polymorphic, i.e. stored within different repositories,
21
+ * supply the targetRepositoryGetter with a dictionary in the form of {[typeName: string]: repositoryGetter}
22
+ *
20
23
  * @param relationMetadata - The relation metadata used to describe the
21
24
  * relationship and determine how to apply the constraint.
22
- * @param targetRepositoryGetter - The repository which represents the target model of a
23
- * relation attached to a datasource.
25
+ * @param targetRepositoryGetter - The repository or a dictionary of classname - repository,
26
+ * which represents the target model of a relation attached to a datasource.
27
+ * For the dictionary, the key is the class name of the concrete class the the polymorphic model.
24
28
  * @returns The factory function which accepts a foreign key value to constrain
25
29
  * the given target repository
26
30
  */
27
31
  function createHasOneRepositoryFactory(relationMetadata, targetRepositoryGetter) {
28
32
  const meta = (0, has_one_helpers_1.resolveHasOneMetadata)(relationMetadata);
33
+ // resolve the repositoryGetter into a dictionary
34
+ if (typeof targetRepositoryGetter === 'function') {
35
+ targetRepositoryGetter = {
36
+ [meta.target().name]: targetRepositoryGetter,
37
+ };
38
+ }
29
39
  debug('Resolved HasOne relation metadata: %o', meta);
30
40
  const result = function (fkValue) {
31
41
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
42
  const constraint = { [meta.keyTo]: fkValue };
33
- return new has_one_repository_1.DefaultHasOneRepository(targetRepositoryGetter, constraint);
43
+ return new has_one_repository_1.DefaultHasOneRepository(targetRepositoryGetter, constraint, relationMetadata.target);
34
44
  };
35
45
  result.inclusionResolver = (0, has_one_inclusion_resolver_1.createHasOneInclusionResolver)(meta, targetRepositoryGetter);
36
46
  return result;
@@ -1 +1 @@
1
- {"version":3,"file":"has-one.repository-factory.js","sourceRoot":"","sources":["../../../src/relations/has-one/has-one.repository-factory.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,0DAAiC;AAKjC,uDAAwD;AACxD,6EAA2E;AAC3E,6DAA+E;AAE/E,MAAM,KAAK,GAAG,IAAA,eAAY,EACxB,0DAA0D,CAC3D,CAAC;AAgBF;;;;;;;;;;;;GAYG;AACH,SAAgB,6BAA6B,CAK3C,gBAAkC,EAClC,sBAAsE;IAEtE,MAAM,IAAI,GAAG,IAAA,uCAAqB,EAAC,gBAAgB,CAAC,CAAC;IACrD,KAAK,CAAC,uCAAuC,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAoD,UAC9D,OAAuB;QAEvB,8DAA8D;QAC9D,MAAM,UAAU,GAAQ,EAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAC,CAAC;QAChD,OAAO,IAAI,4CAAuB,CAIhC,sBAAsB,EAAE,UAAgC,CAAC,CAAC;IAC9D,CAAC,CAAC;IACF,MAAM,CAAC,iBAAiB,GAAG,IAAA,0DAA6B,EACtD,IAAI,EACJ,sBAAsB,CACvB,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AA1BD,sEA0BC"}
1
+ {"version":3,"file":"has-one.repository-factory.js","sourceRoot":"","sources":["../../../src/relations/has-one/has-one.repository-factory.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;;AAEhE,0DAAiC;AAKjC,uDAAwD;AACxD,6EAA2E;AAC3E,6DAA+E;AAE/E,MAAM,KAAK,GAAG,IAAA,eAAY,EACxB,0DAA0D,CAC3D,CAAC;AAgBF;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,6BAA6B,CAK3C,gBAAkC,EAClC,sBAIK;IAEL,MAAM,IAAI,GAAG,IAAA,uCAAqB,EAAC,gBAAgB,CAAC,CAAC;IACrD,iDAAiD;IACjD,IAAI,OAAO,sBAAsB,KAAK,UAAU,EAAE;QAChD,sBAAsB,GAAG;YACvB,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,sBAErB;SACF,CAAC;KACH;IACD,KAAK,CAAC,uCAAuC,EAAE,IAAI,CAAC,CAAC;IACrD,MAAM,MAAM,GAAoD,UAC9D,OAAuB;QAEvB,8DAA8D;QAC9D,MAAM,UAAU,GAAQ,EAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,EAAC,CAAC;QAChD,OAAO,IAAI,4CAAuB,CAKhC,sBAEC,EACD,UAAgC,EAChC,gBAAgB,CAAC,MAAM,CACxB,CAAC;IACJ,CAAC,CAAC;IACF,MAAM,CAAC,iBAAiB,GAAG,IAAA,0DAA6B,EAKtD,IAAI,EACJ,sBAEC,CACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC;AAlDD,sEAkDC"}
@@ -1,5 +1,6 @@
1
1
  import { Getter } from '@loopback/core';
2
2
  import { Filter } from '@loopback/filter';
3
+ import { TypeResolver } from '../../';
3
4
  import { Count, DataObject, Options } from '../../common-types';
4
5
  import { Entity } from '../../model';
5
6
  import { EntityCrudRepository } from '../../repositories';
@@ -11,43 +12,89 @@ export interface HasOneRepository<Target extends Entity> {
11
12
  * Create a target model instance
12
13
  * @param targetModelData - The target model data
13
14
  * @param options - Options for the operation
15
+ * options.polymorphicType - If polymorphic target model,
16
+ * specify of which concrete model the created instance should be
14
17
  * @returns A promise which resolves to the newly created target model instance
15
18
  */
16
- create(targetModelData: DataObject<Target>, options?: Options): Promise<Target>;
19
+ create(targetModelData: DataObject<Target>, options?: Options & {
20
+ polymorphicType?: string;
21
+ }): Promise<Target>;
17
22
  /**
18
23
  * Find the only target model instance that belongs to the declaring model.
19
24
  * @param filter - Query filter without a Where condition
20
25
  * @param options - Options for the operations
26
+ * options.polymorphicType - a string or a string array of polymorphic type names
27
+ * to specify which repositories should are expected to be searched
28
+ * It is highly recommended to contain this param especially for
29
+ * datasources using deplicated ids across tables
21
30
  * @returns A promise resolved with the target object or rejected
22
31
  * with an EntityNotFoundError when target model instance was not found.
23
32
  */
24
- get(filter?: Pick<Filter<Target>, Exclude<keyof Filter<Target>, 'where'>>, options?: Options): Promise<Target>;
33
+ get(filter?: Pick<Filter<Target>, Exclude<keyof Filter<Target>, 'where'>>, options?: Options & {
34
+ polymorphicType?: string | string[];
35
+ }): Promise<Target>;
25
36
  /**
26
37
  * Delete the related target model instance
27
38
  * @param options
39
+ * options.polymorphicType - a string or a string array of polymorphic type names
40
+ * to specify which repositories should are expected to be searched
41
+ * It is highly recommended to contain this param especially for
42
+ * datasources using deplicated ids across tables
28
43
  * @returns A promise which resolves the deleted target model instances
29
44
  */
30
- delete(options?: Options): Promise<Count>;
45
+ delete(options?: Options & {
46
+ polymorphicType?: string | string[];
47
+ }): Promise<Count>;
31
48
  /**
32
49
  * Patch the related target model instance
33
50
  * @param dataObject - The target model fields and their new values to patch
51
+ * If the target models are of different types, this should be a dictionary
34
52
  * @param options
53
+ * options.isPolymorphic - whether dataObject is a dictionary
35
54
  * @returns A promise which resolves the patched target model instances
36
55
  */
37
- patch(dataObject: DataObject<Target>, options?: Options): Promise<Count>;
56
+ patch(dataObject: DataObject<Target> | {
57
+ [polymorphicType: string]: DataObject<Target>;
58
+ }, options?: Options & {
59
+ isPolymorphic?: boolean;
60
+ }): Promise<Count>;
38
61
  }
39
62
  export declare class DefaultHasOneRepository<TargetEntity extends Entity, TargetID, TargetRepository extends EntityCrudRepository<TargetEntity, TargetID>> implements HasOneRepository<TargetEntity> {
40
- getTargetRepository: Getter<TargetRepository>;
63
+ getTargetRepository: Getter<TargetRepository> | {
64
+ [repoType: string]: Getter<TargetRepository>;
65
+ };
41
66
  constraint: DataObject<TargetEntity>;
67
+ targetResolver: TypeResolver<Entity, typeof Entity>;
42
68
  /**
43
69
  * Constructor of DefaultHasOneEntityCrudRepository
44
- * @param getTargetRepository - the getter of the related target model repository instance
70
+ * @param getTargetRepository - either a dictionary of target model type - target repository instance
71
+ * or a single target repository instance
72
+ * e.g. if the target is of a non-polymorphic type "Student", put the studentRepositoryGetterInstance
73
+ * if the target is of a polymorphic type "Person" which can be either a "Student" or a "Teacher"
74
+ * then put "{Student: studentRepositoryGetterInstance, Teacher: teacherRepositoryGetterInstance}"
45
75
  * @param constraint - the key value pair representing foreign key name to constrain
46
76
  * the target repository instance
77
+ * @param targetResolver - () => Target to resolve the target class
78
+ * e.g. if the target is of type "Student", then put "() => Student"
47
79
  */
48
- constructor(getTargetRepository: Getter<TargetRepository>, constraint: DataObject<TargetEntity>);
49
- create(targetModelData: DataObject<TargetEntity>, options?: Options): Promise<TargetEntity>;
50
- get(filter?: Pick<Filter<TargetEntity>, Exclude<keyof Filter<TargetEntity>, 'where'>>, options?: Options): Promise<TargetEntity>;
51
- delete(options?: Options): Promise<Count>;
52
- patch(dataObject: DataObject<TargetEntity>, options?: Options): Promise<Count>;
80
+ constructor(getTargetRepository: Getter<TargetRepository> | {
81
+ [repoType: string]: Getter<TargetRepository>;
82
+ }, constraint: DataObject<TargetEntity>, targetResolver: TypeResolver<Entity, typeof Entity>);
83
+ getTargetRepositoryDict: {
84
+ [repoType: string]: Getter<TargetRepository>;
85
+ };
86
+ create(targetModelData: DataObject<TargetEntity>, options?: Options & {
87
+ polymorphicType?: string;
88
+ }): Promise<TargetEntity>;
89
+ get(filter?: Pick<Filter<TargetEntity>, Exclude<keyof Filter<TargetEntity>, 'where'>>, options?: Options & {
90
+ polymorphicType?: string | string[];
91
+ }): Promise<TargetEntity>;
92
+ delete(options?: Options & {
93
+ polymorphicType?: string | string[];
94
+ }): Promise<Count>;
95
+ patch(dataObject: DataObject<TargetEntity> | {
96
+ [polymorphicType: string]: DataObject<TargetEntity>;
97
+ }, options?: Options & {
98
+ isPolymorphic?: boolean;
99
+ }): Promise<Count>;
53
100
  }
@@ -1,44 +1,147 @@
1
1
  "use strict";
2
- // Copyright IBM Corp. 2018,2020. All Rights Reserved.
2
+ // Copyright IBM Corp. and LoopBack contributors 2018,2020. All Rights Reserved.
3
3
  // Node module: @loopback/repository
4
4
  // This file is licensed under the MIT License.
5
5
  // License text available at https://opensource.org/licenses/MIT
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.DefaultHasOneRepository = void 0;
8
+ const lodash_1 = require("lodash");
8
9
  const errors_1 = require("../../errors");
9
10
  const repositories_1 = require("../../repositories");
10
11
  class DefaultHasOneRepository {
11
12
  /**
12
13
  * Constructor of DefaultHasOneEntityCrudRepository
13
- * @param getTargetRepository - the getter of the related target model repository instance
14
+ * @param getTargetRepository - either a dictionary of target model type - target repository instance
15
+ * or a single target repository instance
16
+ * e.g. if the target is of a non-polymorphic type "Student", put the studentRepositoryGetterInstance
17
+ * if the target is of a polymorphic type "Person" which can be either a "Student" or a "Teacher"
18
+ * then put "{Student: studentRepositoryGetterInstance, Teacher: teacherRepositoryGetterInstance}"
14
19
  * @param constraint - the key value pair representing foreign key name to constrain
15
20
  * the target repository instance
21
+ * @param targetResolver - () => Target to resolve the target class
22
+ * e.g. if the target is of type "Student", then put "() => Student"
16
23
  */
17
- constructor(getTargetRepository, constraint) {
24
+ constructor(getTargetRepository, constraint, targetResolver) {
18
25
  this.getTargetRepository = getTargetRepository;
19
26
  this.constraint = constraint;
27
+ this.targetResolver = targetResolver;
28
+ if (typeof getTargetRepository === 'function') {
29
+ this.getTargetRepositoryDict = {
30
+ [targetResolver().name]: getTargetRepository,
31
+ };
32
+ }
33
+ else {
34
+ this.getTargetRepositoryDict = getTargetRepository;
35
+ }
20
36
  }
21
37
  async create(targetModelData, options) {
22
- const targetRepository = await this.getTargetRepository();
38
+ let polymorphicTypeName = options === null || options === void 0 ? void 0 : options.polymorphicType;
39
+ if (polymorphicTypeName) {
40
+ if (!this.getTargetRepositoryDict[polymorphicTypeName]) {
41
+ throw new errors_1.InvalidPolymorphismError(polymorphicTypeName);
42
+ }
43
+ }
44
+ else {
45
+ if (Object.keys(this.getTargetRepositoryDict).length > 1) {
46
+ console.warn('It is highly recommended to specify the polymorphicType param when using polymorphic types.');
47
+ }
48
+ polymorphicTypeName = this.targetResolver().name;
49
+ if (!this.getTargetRepositoryDict[polymorphicTypeName]) {
50
+ throw new errors_1.InvalidPolymorphismError(polymorphicTypeName);
51
+ }
52
+ }
53
+ const targetRepository = await this.getTargetRepositoryDict[polymorphicTypeName]();
23
54
  return targetRepository.create((0, repositories_1.constrainDataObject)(targetModelData, this.constraint), options);
24
55
  }
25
56
  async get(filter, options) {
26
- const targetRepository = await this.getTargetRepository();
27
- const found = await targetRepository.find(Object.assign({ limit: 1 }, (0, repositories_1.constrainFilter)(filter, this.constraint)), options);
28
- if (found.length < 1) {
29
- // We don't have a direct access to the foreign key value here :(
30
- const id = 'constraint ' + JSON.stringify(this.constraint);
31
- throw new errors_1.EntityNotFoundError(targetRepository.entityClass, id);
32
- }
33
- return found[0];
57
+ let polymorphicTypes = options === null || options === void 0 ? void 0 : options.polymorphicType;
58
+ let allKeys;
59
+ if (Object.keys(this.getTargetRepositoryDict).length <= 1) {
60
+ allKeys = Object.keys(this.getTargetRepositoryDict);
61
+ }
62
+ else if (!polymorphicTypes || polymorphicTypes.length === 0) {
63
+ console.warn('It is highly recommended to specify the polymorphicType param when using polymorphic types.');
64
+ allKeys = Object.keys(this.getTargetRepositoryDict);
65
+ }
66
+ else {
67
+ if (typeof polymorphicTypes === 'string') {
68
+ polymorphicTypes = [polymorphicTypes];
69
+ }
70
+ allKeys = [];
71
+ new Set(polymorphicTypes).forEach(element => {
72
+ if (Object.keys(this.getTargetRepositoryDict).includes(element)) {
73
+ allKeys.push(element);
74
+ }
75
+ });
76
+ }
77
+ for (const key of allKeys) {
78
+ const targetRepository = await this.getTargetRepositoryDict[key]();
79
+ const found = await targetRepository.find(Object.assign({ limit: 1 }, (0, repositories_1.constrainFilter)(filter, this.constraint)), Object.assign((0, lodash_1.cloneDeep)(options !== null && options !== void 0 ? options : {}), { polymorphicType: key }));
80
+ if (found.length >= 1) {
81
+ return found[0];
82
+ }
83
+ }
84
+ // We don't have a direct access to the foreign key value here :(
85
+ const id = 'constraint ' + JSON.stringify(this.constraint);
86
+ throw new errors_1.EntityNotFoundError(this.targetResolver().name, id);
34
87
  }
35
88
  async delete(options) {
36
- const targetRepository = await this.getTargetRepository();
37
- return targetRepository.deleteAll((0, repositories_1.constrainWhere)({}, this.constraint), options);
89
+ var _a, _b;
90
+ let polymorphicTypes = options === null || options === void 0 ? void 0 : options.polymorphicType;
91
+ let allKeys;
92
+ if (Object.keys(this.getTargetRepositoryDict).length <= 1) {
93
+ allKeys = Object.keys(this.getTargetRepositoryDict);
94
+ }
95
+ else if (!polymorphicTypes || polymorphicTypes.length === 0) {
96
+ console.warn('It is highly recommended to specify the polymorphicType param when using polymorphic types.');
97
+ allKeys = Object.keys(this.getTargetRepositoryDict);
98
+ }
99
+ else {
100
+ if (typeof polymorphicTypes === 'string') {
101
+ polymorphicTypes = [polymorphicTypes];
102
+ }
103
+ allKeys = [];
104
+ new Set(polymorphicTypes).forEach(element => {
105
+ if (Object.keys(this.getTargetRepositoryDict).includes(element)) {
106
+ allKeys.push(element);
107
+ }
108
+ });
109
+ }
110
+ let total = 0;
111
+ for (const key of allKeys) {
112
+ const targetRepository = await this.getTargetRepositoryDict[key]();
113
+ total +=
114
+ (_b = (_a = (await targetRepository.deleteAll((0, repositories_1.constrainWhere)({}, this.constraint), options))) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0;
115
+ }
116
+ return { count: total };
38
117
  }
39
118
  async patch(dataObject, options) {
40
- const targetRepository = await this.getTargetRepository();
41
- return targetRepository.updateAll((0, repositories_1.constrainDataObject)(dataObject, this.constraint), (0, repositories_1.constrainWhere)({}, this.constraint), options);
119
+ var _a, _b;
120
+ const isMultipleTypes = options === null || options === void 0 ? void 0 : options.isPolymorphic;
121
+ let allKeys;
122
+ if (!isMultipleTypes) {
123
+ if (Object.keys(this.getTargetRepositoryDict).length > 1) {
124
+ console.warn('It is highly recommended to specify the isPolymorphic param and pass in a dictionary of dataobjects when using polymorphic types.');
125
+ }
126
+ allKeys = Object.keys(this.getTargetRepositoryDict);
127
+ }
128
+ else {
129
+ allKeys = [];
130
+ new Set(Object.keys(dataObject)).forEach(element => {
131
+ if (Object.keys(this.getTargetRepositoryDict).includes(element)) {
132
+ allKeys.push(element);
133
+ }
134
+ });
135
+ }
136
+ let total = 0;
137
+ for (const key of allKeys) {
138
+ const targetRepository = await this.getTargetRepositoryDict[key]();
139
+ total +=
140
+ (_b = (_a = (await targetRepository.updateAll((0, repositories_1.constrainDataObject)(isMultipleTypes
141
+ ? dataObject[key]
142
+ : dataObject, this.constraint), (0, repositories_1.constrainWhere)({}, this.constraint), options))) === null || _a === void 0 ? void 0 : _a.count) !== null && _b !== void 0 ? _b : 0;
143
+ }
144
+ return { count: total };
42
145
  }
43
146
  }
44
147
  exports.DefaultHasOneRepository = DefaultHasOneRepository;
@@ -1 +1 @@
1
- {"version":3,"file":"has-one.repository.js","sourceRoot":"","sources":["../../../src/relations/has-one/has-one.repository.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAKhE,yCAAiD;AAEjD,qDAK4B;AA6C5B,MAAa,uBAAuB;IAMlC;;;;;OAKG;IACH,YACS,mBAA6C,EAC7C,UAAoC;QADpC,wBAAmB,GAAnB,mBAAmB,CAA0B;QAC7C,eAAU,GAAV,UAAU,CAA0B;IAC1C,CAAC;IAEJ,KAAK,CAAC,MAAM,CACV,eAAyC,EACzC,OAAiB;QAEjB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1D,OAAO,gBAAgB,CAAC,MAAM,CAC5B,IAAA,kCAAmB,EAAC,eAAe,EAAE,IAAI,CAAC,UAAU,CAAC,EACrD,OAAO,CACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CACP,MAGC,EACD,OAAiB;QAEjB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,IAAI,CACvC,MAAM,CAAC,MAAM,CAAC,EAAC,KAAK,EAAE,CAAC,EAAC,EAAE,IAAA,8BAAe,EAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EACnE,OAAO,CACR,CAAC;QACF,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,iEAAiE;YACjE,MAAM,EAAE,GAAG,aAAa,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC3D,MAAM,IAAI,4BAAmB,CAAC,gBAAgB,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;SACjE;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,CAAC,MAAM,CAAC,OAAiB;QAC5B,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1D,OAAO,gBAAgB,CAAC,SAAS,CAC/B,IAAA,6BAAc,EAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,EACnC,OAAO,CACR,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CACT,UAAoC,EACpC,OAAiB;QAEjB,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC1D,OAAO,gBAAgB,CAAC,SAAS,CAC/B,IAAA,kCAAmB,EAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,EAChD,IAAA,6BAAc,EAAC,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,EACnC,OAAO,CACR,CAAC;IACJ,CAAC;CACF;AAlED,0DAkEC"}
1
+ {"version":3,"file":"has-one.repository.js","sourceRoot":"","sources":["../../../src/relations/has-one/has-one.repository.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- // Copyright IBM Corp. 2018,2020. All Rights Reserved.
2
+ // Copyright IBM Corp. and LoopBack contributors 2018,2020. All Rights Reserved.
3
3
  // Node module: @loopback/repository
4
4
  // This file is licensed under the MIT License.
5
5
  // License text available at https://opensource.org/licenses/MIT
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/relations/has-one/index.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAEhE,8DAAoC;AACpC,+DAAqC;AACrC,uEAA6C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/relations/has-one/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAEhE,8DAAoC;AACpC,+DAAqC;AACrC,uEAA6C"}
@@ -1,6 +1,8 @@
1
1
  export * from './belongs-to';
2
2
  export * from './has-many';
3
3
  export * from './has-one';
4
+ export * from './references-many';
4
5
  export * from './relation.decorator';
6
+ export * from './relation.filter.solver';
5
7
  export * from './relation.helpers';
6
8
  export * from './relation.types';
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- // Copyright IBM Corp. 2018,2020. All Rights Reserved.
2
+ // Copyright IBM Corp. and LoopBack contributors 2018,2020. All Rights Reserved.
3
3
  // Node module: @loopback/repository
4
4
  // This file is licensed under the MIT License.
5
5
  // License text available at https://opensource.org/licenses/MIT
@@ -8,7 +8,9 @@ const tslib_1 = require("tslib");
8
8
  tslib_1.__exportStar(require("./belongs-to"), exports);
9
9
  tslib_1.__exportStar(require("./has-many"), exports);
10
10
  tslib_1.__exportStar(require("./has-one"), exports);
11
+ tslib_1.__exportStar(require("./references-many"), exports);
11
12
  tslib_1.__exportStar(require("./relation.decorator"), exports);
13
+ tslib_1.__exportStar(require("./relation.filter.solver"), exports);
12
14
  tslib_1.__exportStar(require("./relation.helpers"), exports);
13
15
  tslib_1.__exportStar(require("./relation.types"), exports);
14
16
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relations/index.ts"],"names":[],"mappings":";AAAA,sDAAsD;AACtD,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAEhE,uDAA6B;AAC7B,qDAA2B;AAC3B,oDAA0B;AAC1B,+DAAqC;AACrC,6DAAmC;AACnC,2DAAiC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/relations/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAEhE,uDAA6B;AAC7B,qDAA2B;AAC3B,oDAA0B;AAC1B,4DAAkC;AAClC,+DAAqC;AACrC,mEAAyC;AACzC,6DAAmC;AACnC,2DAAiC"}
@@ -0,0 +1,4 @@
1
+ export * from './references-many.accessor';
2
+ export * from './references-many.decorator';
3
+ export * from './references-many.inclusion-resolver';
4
+ export * from './references-many.repository';
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. and LoopBack contributors 2018,2020. All Rights Reserved.
3
+ // Node module: @loopback/repository
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const tslib_1 = require("tslib");
8
+ tslib_1.__exportStar(require("./references-many.accessor"), exports);
9
+ tslib_1.__exportStar(require("./references-many.decorator"), exports);
10
+ tslib_1.__exportStar(require("./references-many.inclusion-resolver"), exports);
11
+ tslib_1.__exportStar(require("./references-many.repository"), exports);
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/relations/references-many/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oCAAoC;AACpC,+CAA+C;AAC/C,gEAAgE;;;AAEhE,qEAA2C;AAC3C,sEAA4C;AAC5C,+EAAqD;AACrD,uEAA6C"}
@@ -0,0 +1,17 @@
1
+ import { Entity } from '../../model';
2
+ import { EntityCrudRepository } from '../../repositories/repository';
3
+ import { Getter, InclusionResolver, ReferencesManyDefinition } from '../relation.types';
4
+ export interface ReferencesManyAccessor<Target extends Entity, SourceId> {
5
+ /**
6
+ * Invoke the function to obtain HasManyRepository.
7
+ */
8
+ (sourceId: SourceId): Promise<Target>;
9
+ /**
10
+ * Use `resolver` property to obtain an InclusionResolver for this relation.
11
+ */
12
+ inclusionResolver: InclusionResolver<Entity, Target>;
13
+ }
14
+ /**
15
+ * Enforces a ReferencesMany constraint on a repository
16
+ */
17
+ export declare function createReferencesManyAccessor<Target extends Entity, TargetIds, Source extends Entity, SourceId>(referencesManyMetadata: ReferencesManyDefinition, targetRepoGetter: Getter<EntityCrudRepository<Target, TargetIds>>, sourceRepository: EntityCrudRepository<Source, SourceId>): ReferencesManyAccessor<Target, SourceId>;
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. and LoopBack contributors 2018,2019. All Rights Reserved.
3
+ // Node module: @loopback/repository
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.createReferencesManyAccessor = void 0;
8
+ const tslib_1 = require("tslib");
9
+ const debug_1 = tslib_1.__importDefault(require("debug"));
10
+ const references_many_helpers_1 = require("./references-many.helpers");
11
+ const references_many_inclusion_resolver_1 = require("./references-many.inclusion-resolver");
12
+ const references_many_repository_1 = require("./references-many.repository");
13
+ const debug = (0, debug_1.default)('loopback:repository:relations:references-many:accessor');
14
+ /**
15
+ * Enforces a ReferencesMany constraint on a repository
16
+ */
17
+ function createReferencesManyAccessor(referencesManyMetadata, targetRepoGetter, sourceRepository) {
18
+ const meta = (0, references_many_helpers_1.resolveReferencesManyMetadata)(referencesManyMetadata);
19
+ debug('Resolved ReferencesMany relation metadata: %o', meta);
20
+ const result = async function getTargetInstancesOfReferencesMany(sourceId) {
21
+ const foreignKey = meta.keyFrom;
22
+ const primaryKey = meta.keyTo;
23
+ const sourceModel = await sourceRepository.findById(sourceId);
24
+ const foreignKeyValue = sourceModel[foreignKey];
25
+ // workaround to check referential integrity.
26
+ // should be removed once the memory connector ref integrity is done
27
+ // GH issue: https://github.com/loopbackio/loopback-next/issues/2333
28
+ if (!foreignKeyValue) {
29
+ return undefined;
30
+ }
31
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
32
+ const constraint = { [primaryKey]: foreignKeyValue };
33
+ const constrainedRepo = new references_many_repository_1.DefaultReferencesManyRepository(targetRepoGetter, constraint);
34
+ return constrainedRepo.get();
35
+ };
36
+ result.inclusionResolver = (0, references_many_inclusion_resolver_1.createReferencesManyInclusionResolver)(meta, targetRepoGetter);
37
+ return result;
38
+ }
39
+ exports.createReferencesManyAccessor = createReferencesManyAccessor;
40
+ //# sourceMappingURL=references-many.accessor.js.map