aws-service-stack 0.18.421 → 0.18.425

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 (322) hide show
  1. package/dist/_examples/controller/local-task-controller.d.ts +17 -0
  2. package/dist/_examples/controller/local-task-controller.d.ts.map +1 -0
  3. package/dist/_examples/controller/local-task-controller.js +87 -0
  4. package/dist/_examples/controller/local-task-controller.js.map +1 -0
  5. package/dist/_examples/controller/order/order-config.d.ts +7 -0
  6. package/dist/_examples/controller/order/order-config.d.ts.map +1 -0
  7. package/dist/_examples/controller/order/order-config.js +54 -0
  8. package/dist/_examples/controller/order/order-config.js.map +1 -0
  9. package/dist/_examples/controller/order/order-controller-cron.d.ts +8 -0
  10. package/dist/_examples/controller/order/order-controller-cron.d.ts.map +1 -0
  11. package/dist/_examples/controller/order/order-controller-cron.js +58 -0
  12. package/dist/_examples/controller/order/order-controller-cron.js.map +1 -0
  13. package/dist/_examples/controller/order/order-controller-streamer.d.ts +7 -0
  14. package/dist/_examples/controller/order/order-controller-streamer.d.ts.map +1 -0
  15. package/dist/_examples/controller/order/order-controller-streamer.js +60 -0
  16. package/dist/_examples/controller/order/order-controller-streamer.js.map +1 -0
  17. package/dist/_examples/controller/order/order-controller.d.ts +15 -0
  18. package/dist/_examples/controller/order/order-controller.d.ts.map +1 -0
  19. package/dist/_examples/controller/order/order-controller.js +121 -0
  20. package/dist/_examples/controller/order/order-controller.js.map +1 -0
  21. package/dist/_examples/controller/order/order-cron.d.ts +6 -0
  22. package/dist/_examples/controller/order/order-cron.d.ts.map +1 -0
  23. package/dist/_examples/controller/order/order-cron.js +57 -0
  24. package/dist/_examples/controller/order/order-cron.js.map +1 -0
  25. package/dist/_examples/controller/order/order-crud.d.ts +5 -0
  26. package/dist/_examples/controller/order/order-crud.d.ts.map +1 -0
  27. package/dist/_examples/controller/order/order-crud.js +57 -0
  28. package/dist/_examples/controller/order/order-crud.js.map +1 -0
  29. package/dist/_examples/controller/order/order-streamer.d.ts +5 -0
  30. package/dist/_examples/controller/order/order-streamer.d.ts.map +1 -0
  31. package/dist/_examples/controller/order/order-streamer.js +57 -0
  32. package/dist/_examples/controller/order/order-streamer.js.map +1 -0
  33. package/dist/_examples/controller/order-item/order-item-config.d.ts +7 -0
  34. package/dist/_examples/controller/order-item/order-item-config.d.ts.map +1 -0
  35. package/dist/_examples/controller/order-item/order-item-config.js +43 -0
  36. package/dist/_examples/controller/order-item/order-item-config.js.map +1 -0
  37. package/dist/_examples/controller/order-item/order-item-controller-streamer.d.ts +7 -0
  38. package/dist/_examples/controller/order-item/order-item-controller-streamer.d.ts.map +1 -0
  39. package/dist/_examples/controller/order-item/order-item-controller-streamer.js +60 -0
  40. package/dist/_examples/controller/order-item/order-item-controller-streamer.js.map +1 -0
  41. package/dist/_examples/controller/order-item/order-item-controller.d.ts +12 -0
  42. package/dist/_examples/controller/order-item/order-item-controller.d.ts.map +1 -0
  43. package/dist/_examples/controller/order-item/order-item-controller.js +78 -0
  44. package/dist/_examples/controller/order-item/order-item-controller.js.map +1 -0
  45. package/dist/_examples/controller/order-item/order-item-crud.d.ts +5 -0
  46. package/dist/_examples/controller/order-item/order-item-crud.d.ts.map +1 -0
  47. package/dist/_examples/controller/order-item/order-item-crud.js +57 -0
  48. package/dist/_examples/controller/order-item/order-item-crud.js.map +1 -0
  49. package/dist/_examples/controller/order-item/order-item-streamer.d.ts +5 -0
  50. package/dist/_examples/controller/order-item/order-item-streamer.d.ts.map +1 -0
  51. package/dist/_examples/controller/order-item/order-item-streamer.js +57 -0
  52. package/dist/_examples/controller/order-item/order-item-streamer.js.map +1 -0
  53. package/dist/_examples/controller/profile/profile-crud-simple.d.ts +1 -0
  54. package/dist/_examples/controller/profile/profile-crud-simple.d.ts.map +1 -0
  55. package/dist/_examples/controller/profile/profile-crud.d.ts +2 -1
  56. package/dist/_examples/controller/profile/profile-crud.d.ts.map +1 -0
  57. package/dist/_examples/controller/profile/profile.config.d.ts +1 -0
  58. package/dist/_examples/controller/profile/profile.config.d.ts.map +1 -0
  59. package/dist/_examples/controller/profile/profile.config.js +20 -45
  60. package/dist/_examples/controller/profile/profile.config.js.map +1 -1
  61. package/dist/_examples/controller/profile/profile.controller.d.ts +4 -3
  62. package/dist/_examples/controller/profile/profile.controller.d.ts.map +1 -0
  63. package/dist/_examples/controller/profile/profile.controller.js +10 -3
  64. package/dist/_examples/controller/profile/profile.controller.js.map +1 -1
  65. package/dist/_examples/model-shared/example.model.d.ts +1 -0
  66. package/dist/_examples/model-shared/example.model.d.ts.map +1 -0
  67. package/dist/_examples/model-shared/order.model.d.ts +74 -0
  68. package/dist/_examples/model-shared/order.model.d.ts.map +1 -0
  69. package/dist/_examples/model-shared/order.model.js +12 -0
  70. package/dist/_examples/model-shared/order.model.js.map +1 -0
  71. package/dist/_examples/repositories/order/order-db.repo.d.ts +8 -0
  72. package/dist/_examples/repositories/order/order-db.repo.d.ts.map +1 -0
  73. package/dist/_examples/repositories/order/order-db.repo.interface.d.ts +5 -0
  74. package/dist/_examples/repositories/order/order-db.repo.interface.d.ts.map +1 -0
  75. package/dist/_examples/repositories/order/order-db.repo.interface.js +3 -0
  76. package/dist/_examples/repositories/order/order-db.repo.interface.js.map +1 -0
  77. package/dist/_examples/repositories/order/order-db.repo.js +20 -0
  78. package/dist/_examples/repositories/order/order-db.repo.js.map +1 -0
  79. package/dist/_examples/repositories/order/order-item-db.repo.d.ts +8 -0
  80. package/dist/_examples/repositories/order/order-item-db.repo.d.ts.map +1 -0
  81. package/dist/_examples/repositories/order/order-item-db.repo.interface.d.ts +5 -0
  82. package/dist/_examples/repositories/order/order-item-db.repo.interface.d.ts.map +1 -0
  83. package/dist/_examples/repositories/order/order-item-db.repo.interface.js +3 -0
  84. package/dist/_examples/repositories/order/order-item-db.repo.interface.js.map +1 -0
  85. package/dist/_examples/repositories/order/order-item-db.repo.js +20 -0
  86. package/dist/_examples/repositories/order/order-item-db.repo.js.map +1 -0
  87. package/dist/_examples/repositories/profile/profile-repo-db.d.ts +1 -0
  88. package/dist/_examples/repositories/profile/profile-repo-db.d.ts.map +1 -0
  89. package/dist/_examples/repositories/profile/profile-repo-db.interface.d.ts +1 -0
  90. package/dist/_examples/repositories/profile/profile-repo-db.interface.d.ts.map +1 -0
  91. package/dist/_examples/service/order/order-item-service-stream.d.ts +13 -0
  92. package/dist/_examples/service/order/order-item-service-stream.d.ts.map +1 -0
  93. package/dist/_examples/service/order/order-item-service-stream.interface.d.ts +5 -0
  94. package/dist/_examples/service/order/order-item-service-stream.interface.d.ts.map +1 -0
  95. package/dist/_examples/service/order/order-item-service-stream.interface.js +3 -0
  96. package/dist/_examples/service/order/order-item-service-stream.interface.js.map +1 -0
  97. package/dist/_examples/service/order/order-item-service-stream.js +81 -0
  98. package/dist/_examples/service/order/order-item-service-stream.js.map +1 -0
  99. package/dist/_examples/service/order/order-item-service.d.ts +16 -0
  100. package/dist/_examples/service/order/order-item-service.d.ts.map +1 -0
  101. package/dist/_examples/service/order/order-item-service.interface.d.ts +14 -0
  102. package/dist/_examples/service/order/order-item-service.interface.d.ts.map +1 -0
  103. package/dist/_examples/service/order/order-item-service.interface.js +3 -0
  104. package/dist/_examples/service/order/order-item-service.interface.js.map +1 -0
  105. package/dist/_examples/service/order/order-item-service.js +120 -0
  106. package/dist/_examples/service/order/order-item-service.js.map +1 -0
  107. package/dist/_examples/service/order/order-service-stream.d.ts +12 -0
  108. package/dist/_examples/service/order/order-service-stream.d.ts.map +1 -0
  109. package/dist/_examples/service/order/order-service-stream.interface.d.ts +5 -0
  110. package/dist/_examples/service/order/order-service-stream.interface.d.ts.map +1 -0
  111. package/dist/_examples/service/order/order-service-stream.interface.js +3 -0
  112. package/dist/_examples/service/order/order-service-stream.interface.js.map +1 -0
  113. package/dist/_examples/service/order/order-service-stream.js +80 -0
  114. package/dist/_examples/service/order/order-service-stream.js.map +1 -0
  115. package/dist/_examples/service/order/order-service.d.ts +19 -0
  116. package/dist/_examples/service/order/order-service.d.ts.map +1 -0
  117. package/dist/_examples/service/order/order-service.interface.d.ts +14 -0
  118. package/dist/_examples/service/order/order-service.interface.d.ts.map +1 -0
  119. package/dist/_examples/service/order/order-service.interface.js +3 -0
  120. package/dist/_examples/service/order/order-service.interface.js.map +1 -0
  121. package/dist/_examples/service/order/order-service.js +127 -0
  122. package/dist/_examples/service/order/order-service.js.map +1 -0
  123. package/dist/_examples/service/profile-service.d.ts +3 -3
  124. package/dist/_examples/service/profile-service.d.ts.map +1 -0
  125. package/dist/_examples/service/profile-service.interface.d.ts +2 -1
  126. package/dist/_examples/service/profile-service.interface.d.ts.map +1 -0
  127. package/dist/_examples/service/profile-service.interface.js.map +1 -1
  128. package/dist/_examples/service/profile-service.js +14 -14
  129. package/dist/_examples/service/profile-service.js.map +1 -1
  130. package/dist/controller/base-controller.d.ts +1 -0
  131. package/dist/controller/base-controller.d.ts.map +1 -0
  132. package/dist/controller/base-controller.js +14 -13
  133. package/dist/controller/base-controller.js.map +1 -1
  134. package/dist/controller/controller-api.d.ts +1 -0
  135. package/dist/controller/controller-api.d.ts.map +1 -0
  136. package/dist/controller/controller-api.js +14 -14
  137. package/dist/controller/controller-api.js.map +1 -1
  138. package/dist/controller/controller-request.d.ts +1 -0
  139. package/dist/controller/controller-request.d.ts.map +1 -0
  140. package/dist/controller/controller-request.js +2 -2
  141. package/dist/controller/controller-request.js.map +1 -1
  142. package/dist/controller/controller-role.d.ts +1 -0
  143. package/dist/controller/controller-role.d.ts.map +1 -0
  144. package/dist/controller/controller-role.js +7 -5
  145. package/dist/controller/controller-role.js.map +1 -1
  146. package/dist/controller/controller-stream.d.ts +1 -0
  147. package/dist/controller/controller-stream.d.ts.map +1 -0
  148. package/dist/controller/index.d.ts +1 -0
  149. package/dist/controller/index.d.ts.map +1 -0
  150. package/dist/exception/errors.d.ts +28 -11
  151. package/dist/exception/errors.d.ts.map +1 -0
  152. package/dist/exception/errors.js +35 -8
  153. package/dist/exception/errors.js.map +1 -1
  154. package/dist/exception/exception-handler.d.ts +6 -0
  155. package/dist/exception/exception-handler.d.ts.map +1 -0
  156. package/dist/exception/exception-handler.js +3 -1
  157. package/dist/exception/exception-handler.js.map +1 -1
  158. package/dist/exception/index.d.ts +1 -0
  159. package/dist/exception/index.d.ts.map +1 -0
  160. package/dist/function/cognito/cognito.function.d.ts +1 -0
  161. package/dist/function/cognito/cognito.function.d.ts.map +1 -0
  162. package/dist/function/cognito/index.d.ts +1 -0
  163. package/dist/function/cognito/index.d.ts.map +1 -0
  164. package/dist/function/index.d.ts +1 -0
  165. package/dist/function/index.d.ts.map +1 -0
  166. package/dist/function/logger.d.ts +1 -0
  167. package/dist/function/logger.d.ts.map +1 -0
  168. package/dist/function/s3/index.d.ts +1 -0
  169. package/dist/function/s3/index.d.ts.map +1 -0
  170. package/dist/function/s3/s3.function.d.ts +1 -0
  171. package/dist/function/s3/s3.function.d.ts.map +1 -0
  172. package/dist/index.d.ts +1 -0
  173. package/dist/index.d.ts.map +1 -0
  174. package/dist/model/base.config.d.ts +1 -0
  175. package/dist/model/base.config.d.ts.map +1 -0
  176. package/dist/model/base.model.d.ts +1 -0
  177. package/dist/model/base.model.d.ts.map +1 -0
  178. package/dist/model/cognito-user.model.d.ts +1 -0
  179. package/dist/model/cognito-user.model.d.ts.map +1 -0
  180. package/dist/model/dynamodb.model.d.ts +1 -0
  181. package/dist/model/dynamodb.model.d.ts.map +1 -0
  182. package/dist/model/filter.model.d.ts +2 -0
  183. package/dist/model/filter.model.d.ts.map +1 -0
  184. package/dist/model/filter.model.js.map +1 -1
  185. package/dist/model/http.model.d.ts +1 -0
  186. package/dist/model/http.model.d.ts.map +1 -0
  187. package/dist/model/index.d.ts +1 -0
  188. package/dist/model/index.d.ts.map +1 -0
  189. package/dist/model/role.model.d.ts +6 -5
  190. package/dist/model/role.model.d.ts.map +1 -0
  191. package/dist/model/role.model.js.map +1 -1
  192. package/dist/model/validation.model.d.ts +1 -0
  193. package/dist/model/validation.model.d.ts.map +1 -0
  194. package/dist/provider/apigateway.d.ts +1 -0
  195. package/dist/provider/apigateway.d.ts.map +1 -0
  196. package/dist/provider/dynamodb.d.ts +1 -0
  197. package/dist/provider/dynamodb.d.ts.map +1 -0
  198. package/dist/provider/index.d.ts +1 -0
  199. package/dist/provider/index.d.ts.map +1 -0
  200. package/dist/provider/opensearch.d.ts +1 -0
  201. package/dist/provider/opensearch.d.ts.map +1 -0
  202. package/dist/repositories/base-core.repo.interface.d.ts +10 -4
  203. package/dist/repositories/base-core.repo.interface.d.ts.map +1 -0
  204. package/dist/repositories/base-core.repo.interface.js.map +1 -1
  205. package/dist/repositories/base-db.repo.d.ts +14 -8
  206. package/dist/repositories/base-db.repo.d.ts.map +1 -0
  207. package/dist/repositories/base-db.repo.interface.d.ts +25 -4
  208. package/dist/repositories/base-db.repo.interface.d.ts.map +1 -0
  209. package/dist/repositories/base-db.repo.interface.js.map +1 -1
  210. package/dist/repositories/base-db.repo.js +70 -26
  211. package/dist/repositories/base-db.repo.js.map +1 -1
  212. package/dist/repositories/base-es.repo.d.ts +2 -1
  213. package/dist/repositories/base-es.repo.d.ts.map +1 -0
  214. package/dist/repositories/base-es.repo.interface.d.ts +1 -0
  215. package/dist/repositories/base-es.repo.interface.d.ts.map +1 -0
  216. package/dist/repositories/base-es.repo.js +2 -2
  217. package/dist/repositories/base-es.repo.js.map +1 -1
  218. package/dist/repositories/index.d.ts +1 -0
  219. package/dist/repositories/index.d.ts.map +1 -0
  220. package/dist/service/api.services/api.service.d.ts +1 -0
  221. package/dist/service/api.services/api.service.d.ts.map +1 -0
  222. package/dist/service/api.services/api.service.interface.d.ts +1 -0
  223. package/dist/service/api.services/api.service.interface.d.ts.map +1 -0
  224. package/dist/service/api.services/index.d.ts +1 -0
  225. package/dist/service/api.services/index.d.ts.map +1 -0
  226. package/dist/service/auth.service.d.ts +1 -0
  227. package/dist/service/auth.service.d.ts.map +1 -0
  228. package/dist/service/auth.service.interface.d.ts +1 -0
  229. package/dist/service/auth.service.interface.d.ts.map +1 -0
  230. package/dist/service/base.service.d.ts +5 -3
  231. package/dist/service/base.service.d.ts.map +1 -0
  232. package/dist/service/base.service.interface.d.ts +21 -10
  233. package/dist/service/base.service.interface.d.ts.map +1 -0
  234. package/dist/service/base.service.interface.js.map +1 -1
  235. package/dist/service/base.service.js +14 -11
  236. package/dist/service/base.service.js.map +1 -1
  237. package/dist/service/crud-operations.d.ts +103 -0
  238. package/dist/service/crud-operations.d.ts.map +1 -0
  239. package/dist/service/crud-operations.js +459 -0
  240. package/dist/service/crud-operations.js.map +1 -0
  241. package/dist/service/crud.service.d.ts +12 -18
  242. package/dist/service/crud.service.d.ts.map +1 -0
  243. package/dist/service/crud.service.interface.d.ts +55 -13
  244. package/dist/service/crud.service.interface.d.ts.map +1 -0
  245. package/dist/service/crud.service.interface.js.map +1 -1
  246. package/dist/service/crud.service.js +53 -351
  247. package/dist/service/crud.service.js.map +1 -1
  248. package/dist/service/index.d.ts +2 -0
  249. package/dist/service/index.d.ts.map +1 -0
  250. package/dist/service/index.js +1 -0
  251. package/dist/service/index.js.map +1 -1
  252. package/dist/service/key-aws.services.d.ts +1 -0
  253. package/dist/service/key-aws.services.d.ts.map +1 -0
  254. package/dist/service/key.services.interface.d.ts +1 -0
  255. package/dist/service/key.services.interface.d.ts.map +1 -0
  256. package/dist/service/permission.cache.d.ts +1 -0
  257. package/dist/service/permission.cache.d.ts.map +1 -0
  258. package/dist/service/permission.repo.d.ts +1 -0
  259. package/dist/service/permission.repo.d.ts.map +1 -0
  260. package/dist/service/permission.service.d.ts +3 -0
  261. package/dist/service/permission.service.d.ts.map +1 -0
  262. package/dist/service/permission.service.js +30 -14
  263. package/dist/service/permission.service.js.map +1 -1
  264. package/dist/service/socket.service.d.ts +1 -0
  265. package/dist/service/socket.service.d.ts.map +1 -0
  266. package/dist/service/socket.service.interface.d.ts +1 -0
  267. package/dist/service/socket.service.interface.d.ts.map +1 -0
  268. package/dist/service/stream.service.d.ts +1 -0
  269. package/dist/service/stream.service.d.ts.map +1 -0
  270. package/dist/service/stream.service.interface.d.ts +1 -0
  271. package/dist/service/stream.service.interface.d.ts.map +1 -0
  272. package/dist/service/validation.service.interface.d.ts +1 -0
  273. package/dist/service/validation.service.interface.d.ts.map +1 -0
  274. package/dist/utils/array.util.d.ts +1 -0
  275. package/dist/utils/array.util.d.ts.map +1 -0
  276. package/dist/utils/auth.util.d.ts +1 -0
  277. package/dist/utils/auth.util.d.ts.map +1 -0
  278. package/dist/utils/data.util.d.ts +1 -0
  279. package/dist/utils/data.util.d.ts.map +1 -0
  280. package/dist/utils/date.util.d.ts +1 -0
  281. package/dist/utils/date.util.d.ts.map +1 -0
  282. package/dist/utils/dynamodb.utils.d.ts +2 -1
  283. package/dist/utils/dynamodb.utils.d.ts.map +1 -0
  284. package/dist/utils/dynamodb.utils.js +105 -30
  285. package/dist/utils/dynamodb.utils.js.map +1 -1
  286. package/dist/utils/env.util.d.ts +1 -0
  287. package/dist/utils/env.util.d.ts.map +1 -0
  288. package/dist/utils/error.util.d.ts +1 -0
  289. package/dist/utils/error.util.d.ts.map +1 -0
  290. package/dist/utils/http/http-request.d.ts +1 -0
  291. package/dist/utils/http/http-request.d.ts.map +1 -0
  292. package/dist/utils/http/http.util.d.ts +1 -0
  293. package/dist/utils/http/http.util.d.ts.map +1 -0
  294. package/dist/utils/index.d.ts +1 -0
  295. package/dist/utils/index.d.ts.map +1 -0
  296. package/dist/utils/json.util.d.ts +1 -0
  297. package/dist/utils/json.util.d.ts.map +1 -0
  298. package/dist/utils/opensearch/opensearch.parser.aggs.d.ts +1 -0
  299. package/dist/utils/opensearch/opensearch.parser.aggs.d.ts.map +1 -0
  300. package/dist/utils/opensearch/opensearch.parser.d.ts +1 -0
  301. package/dist/utils/opensearch/opensearch.parser.d.ts.map +1 -0
  302. package/dist/utils/opensearch/opensearch.parser.keyword.d.ts +1 -0
  303. package/dist/utils/opensearch/opensearch.parser.keyword.d.ts.map +1 -0
  304. package/dist/utils/opensearch/opensearch.parser.query.map.d.ts +1 -0
  305. package/dist/utils/opensearch/opensearch.parser.query.map.d.ts.map +1 -0
  306. package/dist/utils/opensearch/opensearch.parser.sort.d.ts +1 -0
  307. package/dist/utils/opensearch/opensearch.parser.sort.d.ts.map +1 -0
  308. package/dist/utils/opensearch/opensearch.parser.utils.d.ts +1 -0
  309. package/dist/utils/opensearch/opensearch.parser.utils.d.ts.map +1 -0
  310. package/dist/utils/opensearch/opensearch.transform.d.ts +1 -0
  311. package/dist/utils/opensearch/opensearch.transform.d.ts.map +1 -0
  312. package/dist/utils/opensearch.utils.d.ts +1 -0
  313. package/dist/utils/opensearch.utils.d.ts.map +1 -0
  314. package/dist/utils/reflection.util.d.ts +1 -0
  315. package/dist/utils/reflection.util.d.ts.map +1 -0
  316. package/dist/utils/reflection.util.js +7 -8
  317. package/dist/utils/reflection.util.js.map +1 -1
  318. package/dist/utils/string.util.d.ts +1 -0
  319. package/dist/utils/string.util.d.ts.map +1 -0
  320. package/dist/utils/validation.util.d.ts +1 -0
  321. package/dist/utils/validation.util.d.ts.map +1 -0
  322. package/package.json +1 -1
@@ -0,0 +1,459 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OpenSearchOperations = exports.DynamoScanOperations = exports.DynamoFindOperations = exports.DynamoWriteOperations = void 0;
7
+ const index_1 = require("../index");
8
+ const exception_1 = require("../exception");
9
+ const opensearch_parser_1 = require("../utils/opensearch/opensearch.parser");
10
+ const dayjs_1 = __importDefault(require("dayjs"));
11
+ /**
12
+ * Maps public owner aliases to the entity-specific owner field names.
13
+ */
14
+ function parseOwnerFields(filter, entityConfig) {
15
+ if (!filter)
16
+ return null;
17
+ const parsedFilter = filter;
18
+ log.debug("input filter", parsedFilter);
19
+ if (parsedFilter.ownerParentId && !entityConfig.OWNER_PARENT_ID_FIELD_NAME) {
20
+ parsedFilter.profileId = parsedFilter.ownerParentId;
21
+ delete parsedFilter.ownerParentId;
22
+ }
23
+ if (!parsedFilter.profileId)
24
+ delete parsedFilter.profileId;
25
+ if (parsedFilter.ownerParentId && entityConfig.OWNER_PARENT_ID_FIELD_NAME) {
26
+ parsedFilter[entityConfig.OWNER_PARENT_ID_FIELD_NAME] = parsedFilter.ownerParentId;
27
+ if (entityConfig.OWNER_PARENT_ID_FIELD_NAME !== "ownerParentId")
28
+ delete parsedFilter.ownerParentId;
29
+ }
30
+ if (parsedFilter.profileId && entityConfig.OWNER_ID_FIELD_NAME) {
31
+ parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.profileId;
32
+ if (entityConfig.OWNER_ID_FIELD_NAME !== "profileId")
33
+ delete parsedFilter.profileId;
34
+ }
35
+ if (parsedFilter.ownerId && entityConfig.OWNER_ID_FIELD_NAME) {
36
+ parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.ownerId;
37
+ if (entityConfig.OWNER_ID_FIELD_NAME !== "ownerId")
38
+ delete parsedFilter.ownerId;
39
+ }
40
+ log.debug("parsedFilter", parsedFilter);
41
+ return parsedFilter;
42
+ }
43
+ class DynamoWriteOperations {
44
+ repoDB;
45
+ config;
46
+ constructor(repoDB, config) {
47
+ this.repoDB = repoDB;
48
+ this.config = config;
49
+ }
50
+ deleteFields(entityId, fields) {
51
+ return this.repoDB.deleteFields(entityId, fields);
52
+ }
53
+ incrementValueByField(entityId, fieldName, value) {
54
+ return this.repoDB.incrementValueByField(entityId, fieldName, value);
55
+ }
56
+ decrementValueByField(entityId, fieldName, value) {
57
+ return this.repoDB.decrementValueByField(entityId, fieldName, value);
58
+ }
59
+ async save(entity, ownerId, parentId, createdByUser) {
60
+ entity = this.setSystemData(entity, index_1.Action.CREATE, createdByUser);
61
+ if (ownerId && this.config.OWNER_ID_FIELD_NAME)
62
+ entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;
63
+ if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME)
64
+ entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;
65
+ return this.repoDB.save(entity);
66
+ }
67
+ async saveAll(entities, ownerId, parentId, createdByUser, isTransactional) {
68
+ const entitiesUpdated = [];
69
+ for (const item of entities) {
70
+ const entity = this.setSystemData(item, index_1.Action.CREATE, createdByUser || ownerId);
71
+ if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME)
72
+ entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;
73
+ if (ownerId && this.config.OWNER_ID_FIELD_NAME)
74
+ entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;
75
+ entitiesUpdated.push(entity);
76
+ }
77
+ return this.repoDB.saveMany(entitiesUpdated, isTransactional);
78
+ }
79
+ async update(entity, requestUser, fields) {
80
+ const fieldName = this.config.DYNAMO_DB?.MAP?.partitionKey ?? "id";
81
+ if (fields && fields.length > 0)
82
+ fields.push(fieldName);
83
+ if (fields && fields.length > 0)
84
+ entity = (0, index_1.removeFields)([entity], fields)[0];
85
+ if (!entity || !entity[fieldName])
86
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, `id required`);
87
+ const item = await this.repoDB.findById(entity[fieldName]);
88
+ if (!entity || !item)
89
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, `id not found`);
90
+ if (requestUser &&
91
+ !requestUser.isScope &&
92
+ !requestUser.isAdmin &&
93
+ (item[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||
94
+ item[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId))
95
+ throw new exception_1.ErrorHttp(exception_1.HTTP.FORBIDDEN, `No permission to resource: ${entity.id}`);
96
+ entity = this.setSystemData(entity, index_1.Action.UPDATE, requestUser, item);
97
+ return this.repoDB.update(entity);
98
+ }
99
+ updateAll(entities, fields, requestUser, isTransactional) {
100
+ if (requestUser)
101
+ log.warn("this methode is under development, cannot check ownership by updateAll");
102
+ return this.repoDB.updateMany(entities, fields, isTransactional);
103
+ }
104
+ updateFields(entity, fields) {
105
+ if (!entity || !fields?.length)
106
+ return Promise.resolve(entity);
107
+ return this.repoDB.updateFields(entity, [...fields]);
108
+ }
109
+ async remove(entityId, requestUser) {
110
+ if (!entityId)
111
+ throw new Error("Entity id required");
112
+ if (requestUser && requestUser.isAdmin)
113
+ return this.repoDB.delete(entityId);
114
+ const entity = await this.repoDB.findById(entityId);
115
+ if (!entity)
116
+ throw new Error("Entity not found");
117
+ if (requestUser &&
118
+ !requestUser.isScope &&
119
+ (entity[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||
120
+ entity[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId))
121
+ throw new exception_1.ErrorHttp(exception_1.HTTP.FORBIDDEN, `No permission to resource: ${entity.id}`);
122
+ return this.repoDB.delete(entityId);
123
+ }
124
+ removeAll(entityIds, requestUser) {
125
+ if (requestUser)
126
+ log.warn("this methode is under development, cannot check ownership by removeAll");
127
+ return this.repoDB.deleteMany(entityIds);
128
+ }
129
+ async changeOwner(entityId, ownerId) {
130
+ const entity = await this.repoDB.findById(entityId);
131
+ entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;
132
+ return this.repoDB.update(entity);
133
+ }
134
+ async findById(entityId, requestUser) {
135
+ const entity = await this.repoDB.findById(entityId);
136
+ if (!entity)
137
+ return null;
138
+ if (!requestUser || requestUser.isAdmin)
139
+ return entity;
140
+ const isOwnerParent = entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile;
141
+ const isParent = entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile;
142
+ if (!requestUser.profile || isOwnerParent || isParent)
143
+ return entity;
144
+ return null;
145
+ }
146
+ async findByIds(entityIds, requestUser) {
147
+ if (entityIds.length > 25)
148
+ throw new exception_1.ErrorDynamoDB(this.repoDB.getTableName(), "findByIds", "Too many entities");
149
+ const entities = await this.repoDB.findByIds(entityIds);
150
+ if (!requestUser || requestUser.isAdmin)
151
+ return entities;
152
+ const ownEntities = [];
153
+ for (const entity of entities) {
154
+ if (entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile ||
155
+ entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile) {
156
+ ownEntities.push(entity);
157
+ }
158
+ }
159
+ return ownEntities;
160
+ }
161
+ /**
162
+ * Applies generated id, timestamps, audit user, and optional change history.
163
+ */
164
+ setSystemData(itemNew, action, requestUser, itemOld) {
165
+ if (!action || action === index_1.Action.DELETE || action === index_1.Action.READ)
166
+ return itemNew;
167
+ const date = (0, dayjs_1.default)().toISOString();
168
+ const user = this.extractUser(requestUser);
169
+ switch (action) {
170
+ case index_1.Action.CREATE:
171
+ return this.handleCreate(itemNew, user, date);
172
+ case index_1.Action.UPDATE:
173
+ return this.handleUpdate(itemNew, itemOld, user, date);
174
+ default:
175
+ return itemNew;
176
+ }
177
+ }
178
+ /**
179
+ * Normalizes a raw username or Cognito user into a stored audit username.
180
+ */
181
+ extractUser(requestUser) {
182
+ if (!requestUser)
183
+ return undefined;
184
+ if (typeof requestUser === "string")
185
+ return requestUser;
186
+ return requestUser.username;
187
+ }
188
+ /**
189
+ * Populates system fields that are required when creating an entity.
190
+ */
191
+ handleCreate(entity, user, date) {
192
+ const dayjsData = (0, dayjs_1.default)(new Date(date));
193
+ const noIdExist = entity[this.config.DYNAMO_DB.MAP.partitionKey ?? "id"] === undefined;
194
+ if (noIdExist)
195
+ entity[this.config.DYNAMO_DB.MAP.partitionKey ?? "id"] = crypto.randomUUID();
196
+ entity.createdAt = date;
197
+ if (user)
198
+ entity.createdBy = user;
199
+ entity.year = dayjsData.year().toString();
200
+ entity.yearMonth = dayjsData.format("YYYY-MM");
201
+ if (!entity.updatedAt) {
202
+ entity.updatedAt = entity.createdAt;
203
+ }
204
+ if (!this.config.TRACE_CHANGE?.fields)
205
+ return entity;
206
+ entity.history = this.addHistory(entity.history, { action: index_1.Action.CREATE, user, date });
207
+ return entity;
208
+ }
209
+ /**
210
+ * Populates update metadata and records traced field changes when configured.
211
+ */
212
+ handleUpdate(entity, itemOld, user, date) {
213
+ if (user)
214
+ entity.updatedBy = user;
215
+ entity.history = entity.history || itemOld?.history;
216
+ entity.updatedAt = date;
217
+ if (!this.config.TRACE_CHANGE?.fields || !itemOld) {
218
+ return entity;
219
+ }
220
+ const changes = (0, index_1.computeChangedFields)(itemOld, entity, this.config.TRACE_CHANGE);
221
+ if (changes.length > 0) {
222
+ entity.history = this.addHistory(entity.history, {
223
+ action: index_1.Action.UPDATE,
224
+ user,
225
+ date,
226
+ changes,
227
+ });
228
+ }
229
+ return entity;
230
+ }
231
+ /**
232
+ * Appends a non-empty history entry while keeping the in-entity history bounded.
233
+ */
234
+ addHistory(history, entry) {
235
+ if (!entry.changes || entry.changes.length === 0) {
236
+ return history || [];
237
+ }
238
+ const newHistory = [...(history || [])];
239
+ const MAX_HISTORY_ENTRIES = 100;
240
+ if (newHistory.length >= MAX_HISTORY_ENTRIES) {
241
+ newHistory.shift();
242
+ }
243
+ newHistory.push(entry);
244
+ return newHistory;
245
+ }
246
+ }
247
+ exports.DynamoWriteOperations = DynamoWriteOperations;
248
+ class DynamoFindOperations {
249
+ repoDB;
250
+ config;
251
+ constructor(repoDB, config) {
252
+ this.repoDB = repoDB;
253
+ this.config = config;
254
+ }
255
+ async findQuery(queryParams) {
256
+ const filter = (0, index_1.parseIndexFilter)(queryParams, this.getIndexMap());
257
+ this.checkIsIndexedField(filter);
258
+ return this.find(filter);
259
+ }
260
+ async findAll() {
261
+ throw new exception_1.ErrorDynamoDB(this.repoDB.getTableName(), "findAll", "findAll requires an index filter; use scan() otherwise");
262
+ }
263
+ async findAllMatch(filter) {
264
+ if (typeof filter === "string")
265
+ filter = (0, index_1.parseIndexFilter)(filter, this.getIndexMap());
266
+ this.checkIsIndexedField(filter);
267
+ return this.fetchAll(filter);
268
+ }
269
+ async findAllByIndex(indexName, indexValue) {
270
+ const filter = { indexName: indexName, indexValue: indexValue };
271
+ this.checkIsIndexedField(filter);
272
+ const parsedFilter = (0, index_1.parseIndexFilter)(filter, this.getIndexMap());
273
+ return this.fetchAll(parsedFilter);
274
+ }
275
+ async findByField(fieldName, fieldValue) {
276
+ const filter = { [fieldName]: fieldValue, size: 100 };
277
+ this.checkIsIndexedField(filter);
278
+ const parsedFilter = (0, index_1.parseIndexFilter)(fieldName + "=" + fieldValue + "&size=100", this.getIndexMap());
279
+ return (await this.find(parsedFilter));
280
+ }
281
+ async findFirst(fieldName, fieldValue) {
282
+ const filter = { [fieldName]: fieldValue };
283
+ this.checkIsIndexedField(filter);
284
+ const result = await this.findByField(fieldName, fieldValue);
285
+ return result.items.length > 0 ? result.items[0] : null;
286
+ }
287
+ async find(filter, debug) {
288
+ if (typeof filter === "string")
289
+ filter = (0, index_1.parseIndexFilter)(filter, this.getIndexMap());
290
+ let parsedFilter = parseOwnerFields(filter, this.config);
291
+ this.checkIsIndexedField(parsedFilter);
292
+ parsedFilter = (0, index_1.parseIndexFilter)(filter, this.getIndexMap());
293
+ return this.repoDB.find(parsedFilter, debug);
294
+ }
295
+ async *findStream(filter, size) {
296
+ let lastKey = "";
297
+ const pageSize = size ?? 50;
298
+ do {
299
+ const filterStr = `size=${pageSize}&${filter}${lastKey ? `&lastKey=${encodeURIComponent(lastKey)}` : ""}`;
300
+ const itemList = await this.findQuery(filterStr);
301
+ yield* itemList.items;
302
+ lastKey = itemList.lastKey;
303
+ } while (lastKey);
304
+ }
305
+ /**
306
+ * Walks DynamoDB Query pages for indexed find-all helpers.
307
+ */
308
+ async fetchAll(filter) {
309
+ if (typeof filter === "string")
310
+ filter = (0, index_1.parseFilter)(filter);
311
+ const result = [];
312
+ do {
313
+ const response = await this.repoDB.find(filter);
314
+ result.push(...response.items);
315
+ filter.lastKey = response.lastKey;
316
+ } while (filter.lastKey);
317
+ return result;
318
+ }
319
+ /**
320
+ * Rejects find filters containing fields outside the configured index map.
321
+ */
322
+ checkIsIndexedField(filter) {
323
+ if (!filter || typeof filter !== "object") {
324
+ return;
325
+ }
326
+ const indexMap = this.getIndexMap();
327
+ if (!indexMap || indexMap.size === 0) {
328
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, "No indexes configured for this table");
329
+ }
330
+ const validFields = new Set();
331
+ if (indexMap.partitionKey) {
332
+ validFields.add(indexMap.partitionKey);
333
+ }
334
+ for (const [, indexConfig] of indexMap.entries()) {
335
+ if (indexConfig.field) {
336
+ validFields.add(indexConfig.field);
337
+ }
338
+ if (indexConfig.rFields) {
339
+ indexConfig.rFields.forEach((field) => validFields.add(field));
340
+ }
341
+ if (indexConfig.sortKeyField) {
342
+ validFields.add(indexConfig.sortKeyField);
343
+ }
344
+ }
345
+ const invalidFields = [];
346
+ for (const fieldName of Object.keys(filter)) {
347
+ if (["indexName", "indexValue", "size", "lastKey", "fieldsInclude", "fieldsExclude", "rangeFilters"].includes(fieldName)) {
348
+ continue;
349
+ }
350
+ const rangeSuffixes = ["Min", "Max", "From", "To", "Start", "End"];
351
+ const isRangeField = rangeSuffixes.some((suffix) => fieldName.endsWith(suffix));
352
+ if (isRangeField) {
353
+ continue;
354
+ }
355
+ if (!validFields.has(fieldName)) {
356
+ invalidFields.push(fieldName);
357
+ }
358
+ }
359
+ if (invalidFields.length > 0) {
360
+ const availableFields = Array.from(validFields).sort();
361
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, `Invalid field names in filter: ${invalidFields.join(", ")}. Available fields: ${availableFields.join(", ")}`);
362
+ }
363
+ }
364
+ /**
365
+ * Returns the DynamoDB index map from the operation config snapshot.
366
+ */
367
+ getIndexMap() {
368
+ return this.config.DYNAMO_DB?.MAP;
369
+ }
370
+ }
371
+ exports.DynamoFindOperations = DynamoFindOperations;
372
+ class DynamoScanOperations {
373
+ repoDB;
374
+ config;
375
+ constructor(repoDB, config) {
376
+ this.repoDB = repoDB;
377
+ this.config = config;
378
+ }
379
+ async scan(filter, debug) {
380
+ const parsedFilter = (0, index_1.parseIndexFilter)(filter, this.getIndexMap());
381
+ return this.repoDB.scan(parsedFilter, debug);
382
+ }
383
+ /**
384
+ * Returns the DynamoDB index map used for scan filter parsing.
385
+ */
386
+ getIndexMap() {
387
+ return this.config.DYNAMO_DB?.MAP;
388
+ }
389
+ }
390
+ exports.DynamoScanOperations = DynamoScanOperations;
391
+ class OpenSearchOperations {
392
+ repoES;
393
+ config;
394
+ constructor(repoES, config) {
395
+ this.repoES = repoES;
396
+ this.config = config;
397
+ }
398
+ async searchQuery(queryParams, debug) {
399
+ const query = (0, opensearch_parser_1.buildSearchQueryOS)(queryParams, this.config);
400
+ return this.repoES.search(query, debug);
401
+ }
402
+ searchQueryTotalCount(queryParams) {
403
+ const query = (0, opensearch_parser_1.buildSearchQueryOS)(queryParams, this.config);
404
+ return this.repoES.count(query);
405
+ }
406
+ async search(filter, debug) {
407
+ if (typeof filter === "string")
408
+ filter = (0, index_1.parseIndexFilter)(filter, this.getIndexMap());
409
+ let parsedFilter = parseOwnerFields(filter, this.config);
410
+ parsedFilter = this.setIndexField(parsedFilter);
411
+ return this.repoES.find(parsedFilter, debug);
412
+ }
413
+ searchFieldNotExist(fieldName, from, size) {
414
+ return this.repoES.fieldNotExists(fieldName, from, size);
415
+ }
416
+ async *searchStream(filter, pageSize = 50) {
417
+ let pageNumber = 1;
418
+ while (true) {
419
+ const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;
420
+ const resultList = await this.searchQuery(filterStr);
421
+ yield* resultList.items;
422
+ if (resultList.items.length < pageSize)
423
+ break;
424
+ }
425
+ }
426
+ async *searchStreamAggr(filter, pageSize = 50) {
427
+ let pageNumber = 1;
428
+ while (true) {
429
+ const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;
430
+ const resultList = await this.searchQuery(filterStr);
431
+ yield resultList;
432
+ if (resultList.items.length < pageSize)
433
+ break;
434
+ }
435
+ }
436
+ /**
437
+ * Converts a DynamoDB index name to its OpenSearch field name for search filters.
438
+ */
439
+ setIndexField(filter) {
440
+ if (!filter.indexName || !filter.indexValue)
441
+ return filter;
442
+ const indexMap = this.config.DYNAMO_DB.MAP;
443
+ if (!indexMap || indexMap.size === 0)
444
+ return filter;
445
+ const indexConfig = indexMap.get(filter.indexName);
446
+ if (!indexConfig)
447
+ return filter;
448
+ filter.indexName = indexConfig.field;
449
+ return filter;
450
+ }
451
+ /**
452
+ * Returns the DynamoDB index map used to parse shared filter strings.
453
+ */
454
+ getIndexMap() {
455
+ return this.config.DYNAMO_DB?.MAP;
456
+ }
457
+ }
458
+ exports.OpenSearchOperations = OpenSearchOperations;
459
+ //# sourceMappingURL=crud-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud-operations.js","sourceRoot":"","sources":["../../src/service/crud-operations.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Action,\n BaseEntity,\n BaseRepoDB,\n BaseRepoES,\n ChangeHistory,\n CognitoUser,\n computeChangedFields,\n Filter,\n List,\n parseFilter,\n parseIndexFilter,\n removeFields,\n} from \"../index\";\nimport { ErrorDynamoDB, ErrorHttp, HTTP } from \"../exception\";\nimport { buildSearchQueryOS } from \"../utils/opensearch/opensearch.parser\";\nimport { EntityConfig } from \"@chinggis/types\";\nimport dayjs from \"dayjs\";\n\n/**\n * Maps public owner aliases to the entity-specific owner field names.\n */\nfunction parseOwnerFields(filter: Filter, entityConfig: EntityConfig): Filter {\n if (!filter) return null;\n\n const parsedFilter = filter;\n\n log.debug(\"input filter\", parsedFilter);\n\n if (parsedFilter.ownerParentId && !entityConfig.OWNER_PARENT_ID_FIELD_NAME) {\n parsedFilter.profileId = parsedFilter.ownerParentId;\n delete parsedFilter.ownerParentId;\n }\n if (!parsedFilter.profileId) delete parsedFilter.profileId;\n\n if (parsedFilter.ownerParentId && entityConfig.OWNER_PARENT_ID_FIELD_NAME) {\n parsedFilter[entityConfig.OWNER_PARENT_ID_FIELD_NAME] = parsedFilter.ownerParentId;\n if (entityConfig.OWNER_PARENT_ID_FIELD_NAME !== \"ownerParentId\") delete parsedFilter.ownerParentId;\n }\n\n if (parsedFilter.profileId && entityConfig.OWNER_ID_FIELD_NAME) {\n parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.profileId;\n if (entityConfig.OWNER_ID_FIELD_NAME !== \"profileId\") delete parsedFilter.profileId;\n }\n\n if (parsedFilter.ownerId && entityConfig.OWNER_ID_FIELD_NAME) {\n parsedFilter[entityConfig.OWNER_ID_FIELD_NAME] = parsedFilter.ownerId;\n if (entityConfig.OWNER_ID_FIELD_NAME !== \"ownerId\") delete parsedFilter.ownerId;\n }\n log.debug(\"parsedFilter\", parsedFilter);\n\n return parsedFilter;\n}\n\nexport class DynamoWriteOperations<T extends BaseEntity, D extends BaseRepoDB<T>> {\n constructor(\n private readonly repoDB: D,\n private readonly config: EntityConfig,\n ) {}\n\n deleteFields(entityId: string, fields: string[]): Promise<Partial<T>> {\n return this.repoDB.deleteFields(entityId, fields);\n }\n\n incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return this.repoDB.incrementValueByField(entityId, fieldName, value);\n }\n\n decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T> {\n return this.repoDB.decrementValueByField(entityId, fieldName, value);\n }\n\n async save(entity: Partial<T>, ownerId: string, parentId?: string, createdByUser?: string | CognitoUser): Promise<T> {\n entity = this.setSystemData(entity, Action.CREATE, createdByUser);\n\n if (ownerId && this.config.OWNER_ID_FIELD_NAME) entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME) entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;\n\n return this.repoDB.save(entity);\n }\n\n async saveAll(\n entities: Partial<T>[],\n ownerId: string,\n parentId?: string,\n createdByUser?: string | CognitoUser,\n isTransactional?: boolean,\n ): Promise<Partial<T>[]> {\n const entitiesUpdated = [];\n\n for (const item of entities) {\n const entity = this.setSystemData(item, Action.CREATE, createdByUser || ownerId);\n\n if (parentId && this.config.OWNER_PARENT_ID_FIELD_NAME) entity[this.config.OWNER_PARENT_ID_FIELD_NAME] = parentId;\n if (ownerId && this.config.OWNER_ID_FIELD_NAME) entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n\n entitiesUpdated.push(entity);\n }\n\n return this.repoDB.saveMany(entitiesUpdated, isTransactional);\n }\n\n async update(entity: Partial<T>, requestUser?: CognitoUser, fields?: string[]): Promise<T> {\n const fieldName = this.config.DYNAMO_DB?.MAP?.partitionKey ?? \"id\";\n if (fields && fields.length > 0) fields.push(fieldName);\n if (fields && fields.length > 0) entity = removeFields([entity], fields)[0];\n\n if (!entity || !entity[fieldName]) throw new ErrorHttp(HTTP.BAD_REQUEST, `id required`);\n\n const item = await this.repoDB.findById(entity[fieldName]);\n\n if (!entity || !item) throw new ErrorHttp(HTTP.BAD_REQUEST, `id not found`);\n\n if (\n requestUser &&\n !requestUser.isScope &&\n !requestUser.isAdmin &&\n (item[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||\n item[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId)\n )\n throw new ErrorHttp(HTTP.FORBIDDEN, `No permission to resource: ${entity.id}`);\n\n entity = this.setSystemData(entity, Action.UPDATE, requestUser, item);\n\n return this.repoDB.update(entity);\n }\n\n updateAll(\n entities: Partial<T>[],\n fields: string[],\n requestUser?: CognitoUser,\n isTransactional?: boolean,\n ): Promise<boolean> {\n if (requestUser) log.warn(\"this methode is under development, cannot check ownership by updateAll\");\n\n return this.repoDB.updateMany(entities, fields, isTransactional);\n }\n\n updateFields(entity: Partial<T>, fields: string[]): Promise<Partial<T>> {\n if (!entity || !fields?.length) return Promise.resolve(entity);\n return this.repoDB.updateFields(entity, [...fields]);\n }\n\n async remove(entityId: string, requestUser?: CognitoUser): Promise<boolean> {\n if (!entityId) throw new Error(\"Entity id required\");\n\n if (requestUser && requestUser.isAdmin) return this.repoDB.delete(entityId);\n\n const entity = await this.repoDB.findById(entityId);\n if (!entity) throw new Error(\"Entity not found\");\n\n if (\n requestUser &&\n !requestUser.isScope &&\n (entity[this.config.OWNER_ID_FIELD_NAME] !== requestUser.profile ||\n entity[this.config.OWNER_PARENT_ID_FIELD_NAME] !== requestUser.parentId)\n )\n throw new ErrorHttp(HTTP.FORBIDDEN, `No permission to resource: ${entity.id}`);\n\n return this.repoDB.delete(entityId);\n }\n\n removeAll(entityIds: string[], requestUser?: CognitoUser): Promise<boolean> {\n if (requestUser) log.warn(\"this methode is under development, cannot check ownership by removeAll\");\n return this.repoDB.deleteMany(entityIds);\n }\n\n async changeOwner(entityId: string, ownerId: string): Promise<T> {\n const entity = await this.repoDB.findById(entityId);\n entity[this.config.OWNER_ID_FIELD_NAME] = ownerId;\n return this.repoDB.update(entity);\n }\n\n async findById(entityId: string, requestUser?: CognitoUser): Promise<T> {\n const entity = await this.repoDB.findById(entityId);\n\n if (!entity) return null;\n if (!requestUser || requestUser.isAdmin) return entity;\n\n const isOwnerParent = entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile;\n const isParent = entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile;\n\n if (!requestUser.profile || isOwnerParent || isParent) return entity;\n\n return null;\n }\n\n async findByIds(entityIds: string[], requestUser?: CognitoUser): Promise<T[]> {\n if (entityIds.length > 25) throw new ErrorDynamoDB(this.repoDB.getTableName(), \"findByIds\", \"Too many entities\");\n\n const entities = await this.repoDB.findByIds(entityIds);\n\n if (!requestUser || requestUser.isAdmin) return entities;\n\n const ownEntities = [];\n for (const entity of entities) {\n if (\n entity[this.config.OWNER_PARENT_ID_FIELD_NAME] == requestUser.profile ||\n entity[this.config.OWNER_ID_FIELD_NAME] == requestUser.profile\n ) {\n ownEntities.push(entity);\n }\n }\n return ownEntities;\n }\n\n /**\n * Applies generated id, timestamps, audit user, and optional change history.\n */\n private setSystemData(itemNew: Partial<T>, action: Action, requestUser?: string | CognitoUser, itemOld?: T): T {\n if (!action || action === Action.DELETE || action === Action.READ) return itemNew as T;\n\n const date = dayjs().toISOString();\n const user = this.extractUser(requestUser);\n\n switch (action) {\n case Action.CREATE:\n return this.handleCreate(itemNew, user, date);\n case Action.UPDATE:\n return this.handleUpdate(itemNew, itemOld, user, date);\n default:\n return itemNew as T;\n }\n }\n\n /**\n * Normalizes a raw username or Cognito user into a stored audit username.\n */\n private extractUser(requestUser: string | CognitoUser): string {\n if (!requestUser) return undefined;\n\n if (typeof requestUser === \"string\") return requestUser;\n\n return requestUser.username;\n }\n\n /**\n * Populates system fields that are required when creating an entity.\n */\n private handleCreate(entity: Partial<T>, user: string, date: string): T {\n const dayjsData = dayjs(new Date(date));\n\n const noIdExist = entity[this.config.DYNAMO_DB.MAP.partitionKey ?? \"id\"] === undefined;\n if (noIdExist) entity[this.config.DYNAMO_DB.MAP.partitionKey ?? \"id\"] = crypto.randomUUID();\n\n entity.createdAt = date;\n if (user) entity.createdBy = user;\n entity.year = dayjsData.year().toString();\n entity.yearMonth = dayjsData.format(\"YYYY-MM\");\n\n if (!entity.updatedAt) {\n entity.updatedAt = entity.createdAt;\n }\n\n if (!this.config.TRACE_CHANGE?.fields) return entity as T;\n\n entity.history = this.addHistory(entity.history, { action: Action.CREATE, user, date });\n return entity as T;\n }\n\n /**\n * Populates update metadata and records traced field changes when configured.\n */\n private handleUpdate(entity: Partial<T>, itemOld: T | undefined, user: string, date: string): T {\n if (user) entity.updatedBy = user;\n entity.history = entity.history || itemOld?.history;\n\n entity.updatedAt = date;\n\n if (!this.config.TRACE_CHANGE?.fields || !itemOld) {\n return entity as T;\n }\n\n const changes = computeChangedFields(itemOld, entity, this.config.TRACE_CHANGE);\n if (changes.length > 0) {\n entity.history = this.addHistory(entity.history, {\n action: Action.UPDATE,\n user,\n date,\n changes,\n });\n }\n\n return entity as T;\n }\n\n /**\n * Appends a non-empty history entry while keeping the in-entity history bounded.\n */\n private addHistory(history: ChangeHistory[] | undefined, entry: ChangeHistory): ChangeHistory[] {\n if (!entry.changes || entry.changes.length === 0) {\n return history || [];\n }\n\n const newHistory = [...(history || [])];\n\n const MAX_HISTORY_ENTRIES = 100;\n if (newHistory.length >= MAX_HISTORY_ENTRIES) {\n newHistory.shift();\n }\n\n newHistory.push(entry);\n return newHistory;\n }\n}\n\nexport class DynamoFindOperations<T extends BaseEntity, D extends BaseRepoDB<T>> {\n constructor(\n private readonly repoDB: D,\n private readonly config: EntityConfig,\n ) {}\n\n async findQuery(queryParams: string): Promise<List<Partial<T>>> {\n const filter = parseIndexFilter(queryParams, this.getIndexMap());\n this.checkIsIndexedField(filter);\n return this.find(filter);\n }\n\n async findAll(): Promise<T[]> {\n throw new ErrorDynamoDB(\n this.repoDB.getTableName(),\n \"findAll\",\n \"findAll requires an index filter; use scan() otherwise\",\n );\n }\n\n async findAllMatch(filter: Filter | string): Promise<T[]> {\n if (typeof filter === \"string\") filter = parseIndexFilter(filter, this.getIndexMap());\n this.checkIsIndexedField(filter);\n return this.fetchAll(filter);\n }\n\n async findAllByIndex(indexName: string, indexValue: any): Promise<T[]> {\n const filter = { indexName: indexName, indexValue: indexValue };\n this.checkIsIndexedField(filter);\n\n const parsedFilter = parseIndexFilter(filter, this.getIndexMap());\n return this.fetchAll(parsedFilter);\n }\n\n async findByField(fieldName: string, fieldValue: any): Promise<List<T>> {\n const filter = { [fieldName]: fieldValue, size: 100 };\n this.checkIsIndexedField(filter);\n const parsedFilter = parseIndexFilter(fieldName + \"=\" + fieldValue + \"&size=100\", this.getIndexMap());\n return (await this.find(parsedFilter)) as List<T>;\n }\n\n async findFirst(fieldName: string, fieldValue: string | boolean | number | Date): Promise<T> {\n const filter = { [fieldName]: fieldValue };\n this.checkIsIndexedField(filter);\n\n const result = await this.findByField(fieldName, fieldValue);\n return result.items.length > 0 ? result.items[0] : null;\n }\n\n async find(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>> {\n if (typeof filter === \"string\") filter = parseIndexFilter(filter, this.getIndexMap());\n\n let parsedFilter = parseOwnerFields(filter, this.config);\n this.checkIsIndexedField(parsedFilter);\n\n parsedFilter = parseIndexFilter(filter, this.getIndexMap());\n return this.repoDB.find(parsedFilter, debug);\n }\n\n async *findStream(filter: string, size?: number): AsyncGenerator<T> {\n let lastKey: string = \"\";\n const pageSize = size ?? 50;\n\n do {\n const filterStr = `size=${pageSize}&${filter}${lastKey ? `&lastKey=${encodeURIComponent(lastKey)}` : \"\"}`;\n const itemList = await this.findQuery(filterStr);\n\n yield* itemList.items as T[];\n\n lastKey = itemList.lastKey;\n } while (lastKey);\n }\n\n /**\n * Walks DynamoDB Query pages for indexed find-all helpers.\n */\n private async fetchAll(filter: Filter | string): Promise<T[]> {\n if (typeof filter === \"string\") filter = parseFilter(filter);\n\n const result: Partial<T>[] = [];\n do {\n const response = await this.repoDB.find(filter);\n result.push(...response.items);\n filter.lastKey = response.lastKey;\n } while (filter.lastKey);\n\n return result as T[];\n }\n\n /**\n * Rejects find filters containing fields outside the configured index map.\n */\n private checkIsIndexedField(filter: Filter): void {\n if (!filter || typeof filter !== \"object\") {\n return;\n }\n\n const indexMap = this.getIndexMap();\n if (!indexMap || indexMap.size === 0) {\n throw new ErrorHttp(HTTP.BAD_REQUEST, \"No indexes configured for this table\");\n }\n\n const validFields = new Set<string>();\n\n if (indexMap.partitionKey) {\n validFields.add(indexMap.partitionKey);\n }\n\n for (const [, indexConfig] of indexMap.entries()) {\n if (indexConfig.field) {\n validFields.add(indexConfig.field);\n }\n if (indexConfig.rFields) {\n indexConfig.rFields.forEach((field) => validFields.add(field));\n }\n if (indexConfig.sortKeyField) {\n validFields.add(indexConfig.sortKeyField);\n }\n }\n\n const invalidFields: string[] = [];\n for (const fieldName of Object.keys(filter)) {\n if (\n [\"indexName\", \"indexValue\", \"size\", \"lastKey\", \"fieldsInclude\", \"fieldsExclude\", \"rangeFilters\"].includes(\n fieldName,\n )\n ) {\n continue;\n }\n\n const rangeSuffixes = [\"Min\", \"Max\", \"From\", \"To\", \"Start\", \"End\"];\n const isRangeField = rangeSuffixes.some((suffix) => fieldName.endsWith(suffix));\n if (isRangeField) {\n continue;\n }\n\n if (!validFields.has(fieldName)) {\n invalidFields.push(fieldName);\n }\n }\n\n if (invalidFields.length > 0) {\n const availableFields = Array.from(validFields).sort();\n throw new ErrorHttp(\n HTTP.BAD_REQUEST,\n `Invalid field names in filter: ${invalidFields.join(\", \")}. Available fields: ${availableFields.join(\", \")}`,\n );\n }\n }\n\n /**\n * Returns the DynamoDB index map from the operation config snapshot.\n */\n private getIndexMap() {\n return this.config.DYNAMO_DB?.MAP;\n }\n}\n\nexport class DynamoScanOperations<T extends BaseEntity, D extends BaseRepoDB<T>> {\n constructor(\n private readonly repoDB: D,\n private readonly config: EntityConfig,\n ) {}\n\n async scan(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>> {\n const parsedFilter = parseIndexFilter(filter, this.getIndexMap());\n return this.repoDB.scan(parsedFilter, debug);\n }\n\n /**\n * Returns the DynamoDB index map used for scan filter parsing.\n */\n private getIndexMap() {\n return this.config.DYNAMO_DB?.MAP;\n }\n}\n\nexport class OpenSearchOperations<T extends BaseEntity, S extends BaseRepoES<T>> {\n constructor(\n private readonly repoES: S,\n private readonly config: EntityConfig,\n ) {}\n\n async searchQuery(\n queryParams: any,\n debug?: boolean,\n ): Promise<{ items: Partial<T>[]; total: number; aggs?: Record<string, any> }> {\n const query = buildSearchQueryOS(queryParams, this.config);\n\n return this.repoES.search(query, debug);\n }\n\n searchQueryTotalCount(queryParams: any): Promise<number> {\n const query = buildSearchQueryOS(queryParams, this.config);\n\n return this.repoES.count(query);\n }\n\n async search(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>> {\n if (typeof filter === \"string\") filter = parseIndexFilter(filter, this.getIndexMap());\n\n let parsedFilter = parseOwnerFields(filter, this.config);\n parsedFilter = this.setIndexField(parsedFilter);\n\n return this.repoES.find(parsedFilter, debug);\n }\n\n searchFieldNotExist(fieldName: string, from: number, size: number): Promise<Partial<T>[]> {\n return this.repoES.fieldNotExists(fieldName, from, size);\n }\n\n async *searchStream(filter: string, pageSize = 50): AsyncGenerator<T> {\n let pageNumber = 1;\n\n while (true) {\n const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;\n const resultList = await this.searchQuery(filterStr);\n yield* resultList.items as T[];\n if (resultList.items.length < pageSize) break;\n }\n }\n\n async *searchStreamAggr(\n filter: string,\n pageSize = 50,\n ): AsyncGenerator<{ items: Partial<T>[]; total: number; aggs?: Record<string, any> }> {\n let pageNumber = 1;\n\n while (true) {\n const filterStr = `page=${pageNumber++}&size=${pageSize}&${filter}`;\n const resultList = await this.searchQuery(filterStr);\n yield resultList;\n if (resultList.items.length < pageSize) break;\n }\n }\n\n /**\n * Converts a DynamoDB index name to its OpenSearch field name for search filters.\n */\n private setIndexField(filter: Filter): Filter {\n if (!filter.indexName || !filter.indexValue) return filter;\n\n const indexMap = this.config.DYNAMO_DB.MAP;\n if (!indexMap || indexMap.size === 0) return filter;\n\n const indexConfig = indexMap.get(filter.indexName);\n if (!indexConfig) return filter;\n\n filter.indexName = indexConfig.field;\n return filter;\n }\n\n /**\n * Returns the DynamoDB index map used to parse shared filter strings.\n */\n private getIndexMap() {\n return this.config.DYNAMO_DB?.MAP;\n }\n}\n"]}
@@ -1,10 +1,14 @@
1
- import { BaseEntity, BaseRepoDB, BaseRepoES, CognitoUser, DynamoIndexMap, Filter, List } from "../index";
1
+ import { BaseEntity, BaseRepoDB, BaseRepoES, CognitoUser, DynamoIndexMap, ErrorReason, Filter, HttpStatus, List } from "../index";
2
2
  import { EntityConfig } from "../model/index.js";
3
3
  import { CrudService } from "./crud.service.interface";
4
4
  export declare abstract class CrudServiceImpl<T extends BaseEntity, D extends BaseRepoDB<T>, S extends BaseRepoES<T>> implements CrudService<T> {
5
5
  protected repoDB: D;
6
6
  protected repoES: S;
7
7
  protected config: EntityConfig;
8
+ private writeOps;
9
+ private findOps;
10
+ private scanOps;
11
+ private searchOps;
8
12
  protected constructor(repoDB: D, repoES: S);
9
13
  getTableName(): string;
10
14
  findQuery(queryParams: string): Promise<List<Partial<T>>>;
@@ -17,7 +21,7 @@ export declare abstract class CrudServiceImpl<T extends BaseEntity, D extends Ba
17
21
  searchQueryTotalCount(queryParams: any): Promise<number>;
18
22
  incrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;
19
23
  decrementValueByField(entityId: string, fieldName: string, value?: number): Promise<T>;
20
- search(filter: Filter | string): Promise<List<Partial<T>>>;
24
+ search(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>>;
21
25
  searchFieldNotExist(fieldName: string, from: number, size: number): Promise<Partial<T>[]>;
22
26
  save(entity: Partial<T>, ownerId: string, parentId?: string, createdByUser?: string | CognitoUser): Promise<T>;
23
27
  saveAll(entities: Partial<T>[], ownerId: string, parentId?: string, createdByUser?: string | CognitoUser, isTransactional?: boolean): Promise<Partial<T>[]>;
@@ -38,7 +42,7 @@ export declare abstract class CrudServiceImpl<T extends BaseEntity, D extends Ba
38
42
  findAllByIndex(indexName: string, indexValue: any): Promise<T[]>;
39
43
  findByField(fieldName: string, fieldValue: any): Promise<List<T>>;
40
44
  findFirst(fieldName: string, fieldValue: string | boolean | number | Date): Promise<T>;
41
- find(filter: Filter | string): Promise<List<Partial<T>>>;
45
+ find(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>>;
42
46
  findStream(filter: string, size?: number): AsyncGenerator<T>;
43
47
  searchStream(filter: string, size?: number): AsyncGenerator<T>;
44
48
  searchStreamAggr(filter: string, size?: number): AsyncGenerator<{
@@ -48,30 +52,20 @@ export declare abstract class CrudServiceImpl<T extends BaseEntity, D extends Ba
48
52
  }>;
49
53
  findById(entityId: string, requestUser?: CognitoUser): Promise<T>;
50
54
  findByIds(entityIds: string[], requestUser?: CognitoUser): Promise<T[]>;
51
- scan(filter: Filter): Promise<List<Partial<T>>>;
55
+ scan(filter: Filter | string, debug?: boolean): Promise<List<Partial<T>>>;
52
56
  throwErrorHttp(error: {
53
57
  message: string;
54
58
  code: number;
55
59
  }, message?: string, errorContent?: any): void;
56
60
  throwErrorsHttp(code: number, message: string, errorContent?: any): void;
61
+ throwHttpError(status: HttpStatus, message: string, content?: any, reason?: ErrorReason): void;
57
62
  throwErrorDatabase(tableName: string, command: any, errorContent?: any): void;
58
63
  throwErrorValidation(entityName: string, validation: Map<string, any>, errorContent?: any): void;
59
64
  throwError(code: number, message: string, errorContent?: any): void;
60
65
  setConfig(config: EntityConfig): void;
61
66
  /**
62
- * Validates that all field names in the filter exist in the index map.
63
- * Throws a Bad Request error if any field is not found in the available indexes.
64
- *
65
- * @param filter - The filter object containing field names to validate
66
- * @throws ErrorHttp with status 400 if validation fails
67
+ * Creates operation delegates with the current config snapshot.
67
68
  */
68
- private checkIsIndexedField;
69
- private fetchAll;
70
- private parseOwnerFields;
71
- private setSystemData;
72
- private extractUser;
73
- private handleCreate;
74
- private handleUpdate;
75
- private addHistory;
76
- private setIndexField;
69
+ private initializeOperations;
77
70
  }
71
+ //# sourceMappingURL=crud.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crud.service.d.ts","sourceRoot":"","sources":["../../src/service/crud.service.ts"],"names":[],"mappings":"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"}