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 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,0BAA0B,CAAC;AACzC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,sBAAsB,CAAC"}
@@ -21,6 +21,7 @@ __exportStar(require("./socket.service"), exports);
21
21
  __exportStar(require("./socket.service.interface"), exports);
22
22
  __exportStar(require("./crud.service"), exports);
23
23
  __exportStar(require("./crud.service.interface"), exports);
24
+ __exportStar(require("./crud-operations"), exports);
24
25
  __exportStar(require("./stream.service"), exports);
25
26
  __exportStar(require("./stream.service.interface"), exports);
26
27
  __exportStar(require("./permission.cache"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,iDAA+B;AAC/B,2DAAyC;AACzC,mDAAiC;AACjC,6DAA2C;AAC3C,iDAA+B;AAC/B,2DAAyC;AACzC,mDAAiC;AACjC,6DAA2C;AAC3C,qDAAmC;AACnC,oDAAkC;AAClC,uDAAqC","sourcesContent":["export * from \"./api.services\";\nexport * from \"./base.service\";\nexport * from \"./base.service.interface\";\nexport * from \"./socket.service\";\nexport * from \"./socket.service.interface\";\nexport * from \"./crud.service\";\nexport * from \"./crud.service.interface\";\nexport * from \"./stream.service\";\nexport * from \"./stream.service.interface\";\nexport * from \"./permission.cache\";\nexport * from \"./permission.repo\";\nexport * from \"./permission.service\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/service/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iDAA+B;AAC/B,iDAA+B;AAC/B,2DAAyC;AACzC,mDAAiC;AACjC,6DAA2C;AAC3C,iDAA+B;AAC/B,2DAAyC;AACzC,oDAAkC;AAClC,mDAAiC;AACjC,6DAA2C;AAC3C,qDAAmC;AACnC,oDAAkC;AAClC,uDAAqC","sourcesContent":["export * from \"./api.services\";\nexport * from \"./base.service\";\nexport * from \"./base.service.interface\";\nexport * from \"./socket.service\";\nexport * from \"./socket.service.interface\";\nexport * from \"./crud.service\";\nexport * from \"./crud.service.interface\";\nexport * from \"./crud-operations\";\nexport * from \"./stream.service\";\nexport * from \"./stream.service.interface\";\nexport * from \"./permission.cache\";\nexport * from \"./permission.repo\";\nexport * from \"./permission.service\";\n"]}
@@ -4,3 +4,4 @@ export declare class KeyServiceImpl implements KeyService {
4
4
  constructor(region: string);
5
5
  get(keyId: string): Promise<string>;
6
6
  }
7
+ //# sourceMappingURL=key-aws.services.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key-aws.services.d.ts","sourceRoot":"","sources":["../../src/service/key-aws.services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,qBACa,cAAe,YAAW,UAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuB;gBAElC,MAAM,EAAE,MAAM;IAIpB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAW1C"}
@@ -1,3 +1,4 @@
1
1
  export interface KeyService {
2
2
  get(key: string): Promise<string>;
3
3
  }
4
+ //# sourceMappingURL=key.services.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.services.interface.d.ts","sourceRoot":"","sources":["../../src/service/key.services.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC"}
@@ -22,3 +22,4 @@ export declare class PermissionCache {
22
22
  invalidate(key: string): void;
23
23
  clear(): void;
24
24
  }
25
+ //# sourceMappingURL=permission.cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.cache.d.ts","sourceRoot":"","sources":["../../src/service/permission.cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AASjD;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAiC;IACvD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiD;IAC1E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,KAAK,GAAE,MAAuB;IAI1C,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAUnC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,GAAG,IAAI;IAIzC;;;OAGG;IACG,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAiBpG,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI7B,KAAK,IAAI,IAAI;CAGd"}
@@ -16,3 +16,4 @@ export declare class PermissionRepo {
16
16
  delete(id: string): Promise<boolean>;
17
17
  scan(): Promise<List<Partial<Permission>>>;
18
18
  }
19
+ //# sourceMappingURL=permission.repo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.repo.d.ts","sourceRoot":"","sources":["../../src/service/permission.repo.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAezC;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAA6B;gBAEpC,SAAS,EAAE,MAAM;IAMvB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIhD,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAOtE,WAAW,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAKhE,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAe1D,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAW5D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;CAGjD"}
@@ -37,4 +37,7 @@ export declare class PermissionService {
37
37
  deletePermission(id: string): Promise<boolean>;
38
38
  listPermissions(filter?: Filter): Promise<List<Partial<Permission>>>;
39
39
  clearCache(): void;
40
+ /** Normalize method keys to uppercase. */
41
+ private normalizeMethodKeys;
40
42
  }
43
+ //# sourceMappingURL=permission.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permission.service.d.ts","sourceRoot":"","sources":["../../src/service/permission.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;;;;;;;GASG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IACtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAkB;gBAE5B,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IASlD,oFAAoF;IAC9E,kBAAkB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAM3E,mDAAmD;IAC7C,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAU/D;;;;;;;OAOG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB9F,gBAAgB,CAAC,KAAK,EAAE;QAC5B,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;KAC9B,GAAG,OAAO,CAAC,UAAU,CAAC;IAkCjB,gBAAgB,CACpB,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC,GAC3E,OAAO,CAAC,UAAU,CAAC;IAoChB,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgB9C,eAAe,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAW1E,UAAU,IAAI,IAAI;IAQlB,0CAA0C;IAC1C,OAAO,CAAC,mBAAmB;CAS5B"}
@@ -54,33 +54,33 @@ class PermissionService {
54
54
  const permission = await this.getPermissionByKey(permissionKey);
55
55
  if (!permission?.method)
56
56
  return false;
57
- const methodLower = method.toUpperCase();
58
- return permission.method[methodLower] === true;
57
+ const methodKey = method.toUpperCase();
58
+ return permission.method[methodKey] === true;
59
59
  }
60
60
  // ---------------------------------------------------------------------------
61
61
  // CRUD — create
62
62
  // ---------------------------------------------------------------------------
63
63
  async createPermission(input) {
64
64
  if (!input.role?.trim()) {
65
- throw new exception_1.ErrorHttp({ code: 400, error: "BadRequest" }, "Role is required");
65
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, "Role is required");
66
66
  }
67
67
  if (!input.resource?.trim()) {
68
- throw new exception_1.ErrorHttp({ code: 400, error: "BadRequest" }, "Resource is required");
68
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, "Resource is required");
69
69
  }
70
70
  if (!input.scope?.trim()) {
71
- throw new exception_1.ErrorHttp({ code: 400, error: "BadRequest" }, "Scope is required");
71
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, "Scope is required");
72
72
  }
73
73
  // Duplicate check
74
- const permissionKey = `${input.role}#${input.resource}#${input.scope}`;
74
+ const permissionKey = `${input.role.trim()}#${input.resource.trim()}#${input.scope.trim()}`;
75
75
  const existing = await this.repo.findByPermissionKey(permissionKey);
76
76
  if (existing) {
77
- throw new exception_1.ErrorHttp({ code: 409, error: "Conflict" }, `Permission "${permissionKey}" already exists`);
77
+ throw new exception_1.ErrorHttp(exception_1.HTTP.CONFLICT, `Permission "${permissionKey}" already exists`);
78
78
  }
79
79
  const saved = await this.repo.save({
80
80
  role: input.role.trim(),
81
81
  resource: input.resource.trim(),
82
82
  scope: input.scope.trim(),
83
- method: input.method ?? {},
83
+ method: this.normalizeMethodKeys(input.method ?? {}),
84
84
  permissionKey,
85
85
  });
86
86
  this.cache.clear();
@@ -91,10 +91,10 @@ class PermissionService {
91
91
  // ---------------------------------------------------------------------------
92
92
  async updatePermission(id, updates) {
93
93
  if (!id)
94
- throw new exception_1.ErrorHttp({ code: 400, error: "BadRequest" }, "Permission id is required");
94
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, "Permission id is required");
95
95
  const existing = await this.repo.findById(id);
96
96
  if (!existing)
97
- throw new exception_1.ErrorHttp({ code: 404, error: "NotFound" }, `Permission "${id}" not found`);
97
+ throw new exception_1.ErrorHttp(exception_1.HTTP.NOT_FOUND, `Permission "${id}" not found`);
98
98
  const data = { id };
99
99
  if (updates.role !== undefined)
100
100
  data.role = updates.role.trim();
@@ -103,7 +103,7 @@ class PermissionService {
103
103
  if (updates.scope !== undefined)
104
104
  data.scope = updates.scope.trim();
105
105
  if (updates.method !== undefined)
106
- data.method = updates.method;
106
+ data.method = this.normalizeMethodKeys(updates.method);
107
107
  // Rebuild key if any key component changed
108
108
  const role = data.role ?? existing.role;
109
109
  const resource = data.resource ?? existing.resource;
@@ -113,7 +113,7 @@ class PermissionService {
113
113
  if (data.permissionKey !== existing.permissionKey) {
114
114
  const conflict = await this.repo.findByPermissionKey(data.permissionKey);
115
115
  if (conflict) {
116
- throw new exception_1.ErrorHttp({ code: 409, error: "Conflict" }, `Permission "${data.permissionKey}" already exists`);
116
+ throw new exception_1.ErrorHttp(exception_1.HTTP.CONFLICT, `Permission "${data.permissionKey}" already exists`);
117
117
  }
118
118
  }
119
119
  const updated = await this.repo.update(data);
@@ -125,10 +125,10 @@ class PermissionService {
125
125
  // ---------------------------------------------------------------------------
126
126
  async deletePermission(id) {
127
127
  if (!id)
128
- throw new exception_1.ErrorHttp({ code: 400, error: "BadRequest" }, "Permission id is required");
128
+ throw new exception_1.ErrorHttp(exception_1.HTTP.BAD_REQUEST, "Permission id is required");
129
129
  const existing = await this.repo.findById(id);
130
130
  if (!existing)
131
- throw new exception_1.ErrorHttp({ code: 404, error: "NotFound" }, `Permission "${id}" not found`);
131
+ throw new exception_1.ErrorHttp(exception_1.HTTP.NOT_FOUND, `Permission "${id}" not found`);
132
132
  const result = await this.repo.delete(id);
133
133
  this.cache.clear();
134
134
  return result;
@@ -137,6 +137,9 @@ class PermissionService {
137
137
  // CRUD — list
138
138
  // ---------------------------------------------------------------------------
139
139
  async listPermissions(filter) {
140
+ if (!filter) {
141
+ return this.repo.scan();
142
+ }
140
143
  return this.repo.findByIndex(filter);
141
144
  }
142
145
  // ---------------------------------------------------------------------------
@@ -145,6 +148,19 @@ class PermissionService {
145
148
  clearCache() {
146
149
  this.cache.clear();
147
150
  }
151
+ // ---------------------------------------------------------------------------
152
+ // Utils
153
+ // ---------------------------------------------------------------------------
154
+ /** Normalize method keys to uppercase. */
155
+ normalizeMethodKeys(method) {
156
+ const normalized = {};
157
+ for (const key in method) {
158
+ if (method[key] === true) {
159
+ normalized[key.toUpperCase()] = true;
160
+ }
161
+ }
162
+ return normalized;
163
+ }
148
164
  }
149
165
  exports.PermissionService = PermissionService;
150
166
  //# sourceMappingURL=permission.service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"permission.service.js","sourceRoot":"","sources":["../../src/service/permission.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Permission } from \"../model/role.model\";\nimport { ErrorHttp } from \"../exception\";\nimport { PermissionCache } from \"./permission.cache\";\nimport { PermissionRepo } from \"./permission.repo\";\nimport { Filter, List } from \"@chinggis/types\";\n\n/**\n * PermissionService — cache + orchestration layer for Permission entities.\n *\n * Design decisions:\n * - Read-through cache via PermissionCache (in-flight dedup, TTL).\n * - Repository handles only DB I/O.\n * - Cache invalidation on every mutation.\n * - ~100 roles total, read-heavy → caching makes sense.\n * - Cache keyed by `perm:{permissionKey}` for deterministic, namespaced lookup.\n */\nexport class PermissionService {\n private readonly repo: PermissionRepo;\n private readonly cache: PermissionCache;\n\n constructor(tableName: string, cacheTtlMs?: number) {\n this.repo = new PermissionRepo(tableName);\n this.cache = new PermissionCache(cacheTtlMs);\n }\n\n // ---------------------------------------------------------------------------\n // Core lookup\n // ---------------------------------------------------------------------------\n\n /** Fetch Permission by composite key (role#resource#scope). Read-through cached. */\n async getPermissionByKey(permissionKey: string): Promise<Permission | null> {\n if (!permissionKey) return null;\n\n return this.cache.getOrFetch(`perm:${permissionKey}`, () => this.repo.findByPermissionKey(permissionKey));\n }\n\n /** Fetch Permission by id. Read-through cached. */\n async getPermissionById(id: string): Promise<Permission | null> {\n if (!id) return null;\n\n return this.cache.getOrFetch(`id:${id}`, () => this.repo.findById(id));\n }\n\n // ---------------------------------------------------------------------------\n // Permission check\n // ---------------------------------------------------------------------------\n\n /**\n * Check if the given role+resource+scope has a specific HTTP method allowed.\n *\n * Builds the permissionKey `role#resource#scope`, fetches the Permission,\n * and checks the method map.\n *\n * @returns `true` if allowed, `false` otherwise.\n */\n async hasPermission(role: string, resource: string, scope: string, method: string): Promise<boolean> {\n if (!role || !resource || !scope || !method) return false;\n\n const permissionKey = `${role}#${resource}#${scope}`;\n const permission = await this.getPermissionByKey(permissionKey);\n if (!permission?.method) return false;\n\n const methodLower = method.toUpperCase() as keyof Permission[\"method\"];\n\n return permission.method[methodLower] === true;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — create\n // ---------------------------------------------------------------------------\n\n async createPermission(input: {\n role: string;\n resource: string;\n scope: string;\n method: Permission[\"method\"];\n }): Promise<Permission> {\n if (!input.role?.trim()) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Role is required\");\n }\n if (!input.resource?.trim()) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Resource is required\");\n }\n if (!input.scope?.trim()) {\n throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Scope is required\");\n }\n\n // Duplicate check\n const permissionKey = `${input.role}#${input.resource}#${input.scope}`;\n const existing = await this.repo.findByPermissionKey(permissionKey);\n if (existing) {\n throw new ErrorHttp({ code: 409, error: \"Conflict\" }, `Permission \"${permissionKey}\" already exists`);\n }\n\n const saved = await this.repo.save({\n role: input.role.trim(),\n resource: input.resource.trim(),\n scope: input.scope.trim(),\n method: input.method ?? {},\n permissionKey,\n });\n\n this.cache.clear();\n return saved;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — update\n // ---------------------------------------------------------------------------\n\n async updatePermission(\n id: string,\n updates: Partial<Pick<Permission, \"role\" | \"resource\" | \"scope\" | \"method\">>,\n ): Promise<Permission> {\n if (!id) throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Permission id is required\");\n\n const existing = await this.repo.findById(id);\n if (!existing) throw new ErrorHttp({ code: 404, error: \"NotFound\" }, `Permission \"${id}\" not found`);\n\n const data: Partial<Permission> = { id };\n if (updates.role !== undefined) data.role = updates.role.trim();\n if (updates.resource !== undefined) data.resource = updates.resource.trim();\n if (updates.scope !== undefined) data.scope = updates.scope.trim();\n if (updates.method !== undefined) data.method = updates.method;\n\n // Rebuild key if any key component changed\n const role = data.role ?? existing.role;\n const resource = data.resource ?? existing.resource;\n const scope = data.scope ?? existing.scope;\n data.permissionKey = `${role}#${resource}#${scope}`;\n\n // Check for duplicate key if components changed\n if (data.permissionKey !== existing.permissionKey) {\n const conflict = await this.repo.findByPermissionKey(data.permissionKey);\n if (conflict) {\n throw new ErrorHttp({ code: 409, error: \"Conflict\" }, `Permission \"${data.permissionKey}\" already exists`);\n }\n }\n\n const updated = await this.repo.update(data);\n\n this.cache.clear();\n return updated;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — delete\n // ---------------------------------------------------------------------------\n\n async deletePermission(id: string): Promise<boolean> {\n if (!id) throw new ErrorHttp({ code: 400, error: \"BadRequest\" }, \"Permission id is required\");\n\n const existing = await this.repo.findById(id);\n if (!existing) throw new ErrorHttp({ code: 404, error: \"NotFound\" }, `Permission \"${id}\" not found`);\n\n const result = await this.repo.delete(id);\n\n this.cache.clear();\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — list\n // ---------------------------------------------------------------------------\n\n async listPermissions(filter?: Filter): Promise<List<Partial<Permission>>> {\n return this.repo.findByIndex(filter);\n }\n\n // ---------------------------------------------------------------------------\n // Cache control (for testing)\n // ---------------------------------------------------------------------------\n\n clearCache(): void {\n this.cache.clear();\n }\n}\n"]}
1
+ {"version":3,"file":"permission.service.js","sourceRoot":"","sources":["../../src/service/permission.service.ts"],"names":[],"mappings":"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","sourcesContent":["import { Permission } from \"../model/role.model\";\nimport { ErrorHttp, HTTP } from \"../exception\";\nimport { PermissionCache } from \"./permission.cache\";\nimport { PermissionRepo } from \"./permission.repo\";\nimport { Filter, List } from \"@chinggis/types\";\n\n/**\n * PermissionService — cache + orchestration layer for Permission entities.\n *\n * Design decisions:\n * - Read-through cache via PermissionCache (in-flight dedup, TTL).\n * - Repository handles only DB I/O.\n * - Cache invalidation on every mutation.\n * - ~100 roles total, read-heavy → caching makes sense.\n * - Cache keyed by `perm:{permissionKey}` for deterministic, namespaced lookup.\n */\nexport class PermissionService {\n private readonly repo: PermissionRepo;\n private readonly cache: PermissionCache;\n\n constructor(tableName: string, cacheTtlMs?: number) {\n this.repo = new PermissionRepo(tableName);\n this.cache = new PermissionCache(cacheTtlMs);\n }\n\n // ---------------------------------------------------------------------------\n // Core lookup\n // ---------------------------------------------------------------------------\n\n /** Fetch Permission by composite key (role#resource#scope). Read-through cached. */\n async getPermissionByKey(permissionKey: string): Promise<Permission | null> {\n if (!permissionKey) return null;\n\n return this.cache.getOrFetch(`perm:${permissionKey}`, () => this.repo.findByPermissionKey(permissionKey));\n }\n\n /** Fetch Permission by id. Read-through cached. */\n async getPermissionById(id: string): Promise<Permission | null> {\n if (!id) return null;\n\n return this.cache.getOrFetch(`id:${id}`, () => this.repo.findById(id));\n }\n\n // ---------------------------------------------------------------------------\n // Permission check\n // ---------------------------------------------------------------------------\n\n /**\n * Check if the given role+resource+scope has a specific HTTP method allowed.\n *\n * Builds the permissionKey `role#resource#scope`, fetches the Permission,\n * and checks the method map.\n *\n * @returns `true` if allowed, `false` otherwise.\n */\n async hasPermission(role: string, resource: string, scope: string, method: string): Promise<boolean> {\n if (!role || !resource || !scope || !method) return false;\n\n const permissionKey = `${role}#${resource}#${scope}`;\n const permission = await this.getPermissionByKey(permissionKey);\n if (!permission?.method) return false;\n\n const methodKey = method.toUpperCase() as keyof Permission[\"method\"];\n\n return permission.method[methodKey] === true;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — create\n // ---------------------------------------------------------------------------\n\n async createPermission(input: {\n role: string;\n resource: string;\n scope: string;\n method: Permission[\"method\"];\n }): Promise<Permission> {\n if (!input.role?.trim()) {\n throw new ErrorHttp(HTTP.BAD_REQUEST, \"Role is required\");\n }\n if (!input.resource?.trim()) {\n throw new ErrorHttp(HTTP.BAD_REQUEST, \"Resource is required\");\n }\n if (!input.scope?.trim()) {\n throw new ErrorHttp(HTTP.BAD_REQUEST, \"Scope is required\");\n }\n\n // Duplicate check\n const permissionKey = `${input.role.trim()}#${input.resource.trim()}#${input.scope.trim()}`;\n const existing = await this.repo.findByPermissionKey(permissionKey);\n if (existing) {\n throw new ErrorHttp(HTTP.CONFLICT, `Permission \"${permissionKey}\" already exists`);\n }\n\n const saved = await this.repo.save({\n role: input.role.trim(),\n resource: input.resource.trim(),\n scope: input.scope.trim(),\n method: this.normalizeMethodKeys(input.method ?? {}),\n permissionKey,\n });\n\n this.cache.clear();\n return saved;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — update\n // ---------------------------------------------------------------------------\n\n async updatePermission(\n id: string,\n updates: Partial<Pick<Permission, \"role\" | \"resource\" | \"scope\" | \"method\">>,\n ): Promise<Permission> {\n if (!id) throw new ErrorHttp(HTTP.BAD_REQUEST, \"Permission id is required\");\n\n const existing = await this.repo.findById(id);\n if (!existing) throw new ErrorHttp(HTTP.NOT_FOUND, `Permission \"${id}\" not found`);\n\n const data: Partial<Permission> = { id };\n if (updates.role !== undefined) data.role = updates.role.trim();\n if (updates.resource !== undefined) data.resource = updates.resource.trim();\n if (updates.scope !== undefined) data.scope = updates.scope.trim();\n if (updates.method !== undefined) data.method = this.normalizeMethodKeys(updates.method);\n\n // Rebuild key if any key component changed\n const role = data.role ?? existing.role;\n const resource = data.resource ?? existing.resource;\n const scope = data.scope ?? existing.scope;\n data.permissionKey = `${role}#${resource}#${scope}`;\n\n // Check for duplicate key if components changed\n if (data.permissionKey !== existing.permissionKey) {\n const conflict = await this.repo.findByPermissionKey(data.permissionKey);\n if (conflict) {\n throw new ErrorHttp(HTTP.CONFLICT, `Permission \"${data.permissionKey}\" already exists`);\n }\n }\n\n const updated = await this.repo.update(data);\n\n this.cache.clear();\n return updated;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — delete\n // ---------------------------------------------------------------------------\n\n async deletePermission(id: string): Promise<boolean> {\n if (!id) throw new ErrorHttp(HTTP.BAD_REQUEST, \"Permission id is required\");\n\n const existing = await this.repo.findById(id);\n if (!existing) throw new ErrorHttp(HTTP.NOT_FOUND, `Permission \"${id}\" not found`);\n\n const result = await this.repo.delete(id);\n\n this.cache.clear();\n return result;\n }\n\n // ---------------------------------------------------------------------------\n // CRUD — list\n // ---------------------------------------------------------------------------\n\n async listPermissions(filter?: Filter): Promise<List<Partial<Permission>>> {\n if (!filter) {\n return this.repo.scan();\n }\n return this.repo.findByIndex(filter);\n }\n\n // ---------------------------------------------------------------------------\n // Cache control (for testing)\n // ---------------------------------------------------------------------------\n\n clearCache(): void {\n this.cache.clear();\n }\n\n // ---------------------------------------------------------------------------\n // Utils\n // ---------------------------------------------------------------------------\n\n /** Normalize method keys to uppercase. */\n private normalizeMethodKeys(method: Permission[\"method\"]): Permission[\"method\"] {\n const normalized: Permission[\"method\"] = {} as any;\n for (const key in method) {\n if (method[key] === true) {\n normalized[key.toUpperCase()] = true;\n }\n }\n return normalized;\n }\n}\n"]}
@@ -4,3 +4,4 @@ export declare class BaseSocketServiceIml<T> implements BaseSocketService<T> {
4
4
  private readonly apiGatewayManagement;
5
5
  sendSocketMessage(connectionId: string, data: T): Promise<any>;
6
6
  }
7
+ //# sourceMappingURL=socket.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.service.d.ts","sourceRoot":"","sources":["../../src/service/socket.service.ts"],"names":[],"mappings":"AAEA,OAAO,wBAAwB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAG/D,qBACa,oBAAoB,CAAC,CAAC,CAAE,YAAW,iBAAiB,CAAC,CAAC,CAAC;IAClC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAuB;IAE5F,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;CAQ/D"}
@@ -1,3 +1,4 @@
1
1
  export interface BaseSocketService<T> {
2
2
  sendSocketMessage(connectionId: string, data: T): Promise<any>;
3
3
  }
4
+ //# sourceMappingURL=socket.service.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"socket.service.interface.d.ts","sourceRoot":"","sources":["../../src/service/socket.service.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAChE"}
@@ -15,3 +15,4 @@ export declare abstract class StreamServiceImpl<T extends BaseEntity, D extends
15
15
  abstract processDeletion(oldItem: T, newItem: T, tableName?: string): Promise<any>;
16
16
  abstract processInsertion(newItem: T, tableName: string): Promise<any>;
17
17
  }
18
+ //# sourceMappingURL=stream.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.service.d.ts","sourceRoot":"","sources":["../../src/service/stream.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAkB,UAAU,EAAkB,cAAc,EAAE,MAAM,UAAU,CAAC;AAE9G,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,kBAAkB,CAAC;AAG1B,8BAAsB,iBAAiB,CAAC,CAAC,SAAS,UAAU,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,UAAU,CAAC,CAAC,CAAC,CAC5G,YAAW,aAAa,CAAC,CAAC,CAAC;IAE3B,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACpB,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;IACpB,SAAS,CAAC,MAAM,EAAE,YAAY,CAAC;IAE/B,SAAS,aAAa,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC;IAa1C,YAAY,IAAI,MAAM;IAItB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO;IAMpE,aAAa,IAAI,cAAc;IAI/B,SAAS,CAAC,MAAM,EAAE,YAAY;IAe9B,QAAQ,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAErF,QAAQ,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAElF,QAAQ,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;CACvE"}
@@ -12,3 +12,4 @@ export interface StreamService<T extends BaseEntity> {
12
12
  processInsertion(newItem: T, tableName: string): Promise<any>;
13
13
  processModification(itemOld: T, itemNew: T, tableName?: string): Promise<any>;
14
14
  }
15
+ //# sourceMappingURL=stream.service.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.service.interface.d.ts","sourceRoot":"","sources":["../../src/service/stream.service.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,UAAU;IACjD,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAEtC,YAAY,IAAI,MAAM,CAAC;IAEvB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,GAAG,OAAO,CAAC;IAErE,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE1E,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAE9D,mBAAmB,CAAC,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC/E"}
@@ -1,2 +1,3 @@
1
1
  export interface ValidationService {
2
2
  }
3
+ //# sourceMappingURL=validation.service.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.service.interface.d.ts","sourceRoot":"","sources":["../../src/service/validation.service.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;CAAG"}
@@ -5,3 +5,4 @@
5
5
  * @returns An array of chunks.
6
6
  */
7
7
  export declare const chunkArray: <T>(array: T[], chunkSize: number) => T[][];
8
+ //# sourceMappingURL=array.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array.util.d.ts","sourceRoot":"","sources":["../../src/utils/array.util.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,WAAW,MAAM,KAAG,CAAC,EAAE,EAMhE,CAAC"}
@@ -9,3 +9,4 @@ export interface AuthConfig {
9
9
  secretAccessKey: string;
10
10
  };
11
11
  }
12
+ //# sourceMappingURL=auth.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.util.d.ts","sourceRoot":"","sources":["../../src/utils/auth.util.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,iBAAiB,QAAO;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;CAKzB,CAAC;AAEF,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE;QACZ,WAAW,EAAE,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH"}
@@ -18,3 +18,4 @@ export declare class EntityBuilder<T extends ZodType<any, any, any>> {
18
18
  private shouldInvalidate;
19
19
  }
20
20
  export {};
21
+ //# sourceMappingURL=data.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.util.d.ts","sourceRoot":"","sources":["../../src/utils/data.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAmF,OAAO,EAAE,MAAM,KAAK,CAAC;AAElH,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,EAAE,CAAC;AAExC;;;;;;GAMG;AACH,qBAAa,aAAa,CAAC,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAIvD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,OAAO,CAAC,IAAI,CAAK;gBAGE,MAAM,EAAE,CAAC,EACT,OAAO,GAAE,aAAoB,EAC7B,WAAW,GAAE,MAAU;IAG1C,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;IAInB,OAAO,CAAC,YAAY;IAyCpB,OAAO,CAAC,gBAAgB;CAYzB"}
@@ -16,3 +16,4 @@ export declare function minDateStr(dateStrList: any[]): string;
16
16
  * @returns The newest date string, or an empty string if the list is empty.
17
17
  */
18
18
  export declare function maxDateStr(dateStrList: any[]): string;
19
+ //# sourceMappingURL=date.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"date.util.d.ts","sourceRoot":"","sources":["../../src/utils/date.util.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAErC,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGpD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,CAInG;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,OAAO,CAEnE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAYnD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,KAAK,GAAG,KAAK,CAElE;AACD;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,GAAG,MAAM,CAErD"}
@@ -3,7 +3,7 @@ import { Filter } from "../model";
3
3
  import { ActionDynamoDB, DynamoIndexMap } from "../model/dynamodb.model";
4
4
  export declare const generateUUID: () => string;
5
5
  export declare const buildDynamoDBFilterConditions: (filter: Filter, indexMap: DynamoIndexMap) => FilterExpression;
6
- export declare const buildQueryDB: (tableName: string, filter: Filter, indexMap: DynamoIndexMap) => QueryCommandInput | ScanCommandInput;
6
+ export declare const buildQueryDB: (tableName: string, filter: Filter, indexMap: DynamoIndexMap) => QueryCommandInput;
7
7
  export declare const buildDynamoDBScanCommand: ({ tableName, filter, expression, }: {
8
8
  tableName: string;
9
9
  filter?: Filter;
@@ -46,3 +46,4 @@ export declare function toBase64(inputStr: any): string;
46
46
  export declare function getTableName(eventSourceARN: any): string;
47
47
  export declare function parseImage(image: any): Record<string, any>;
48
48
  export declare function parseEventToAction(action: "INSERT" | "MODIFY" | "REMOVE"): ActionDynamoDB;
49
+ //# sourceMappingURL=dynamodb.utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamodb.utils.d.ts","sourceRoot":"","sources":["../../src/utils/dynamodb.utils.ts"],"names":[],"mappings":"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"}
@@ -21,9 +21,12 @@ exports.generateUUID = generateUUID;
21
21
  const buildDynamoDBFilterConditions = (filter, indexMap) => {
22
22
  if (!filter)
23
23
  throw new errors_1.MissingParameterError("filter");
24
- const rFields = indexMap.get(filter.indexName)?.rFields ?? [];
24
+ const indexInfo = indexMap.get(filter.indexName);
25
+ const rFields = indexInfo?.rFields ?? [];
26
+ const sortKeyField = indexInfo?.sortKeyField;
25
27
  const ignoredKeys = [
26
28
  ...rFields,
29
+ sortKeyField,
27
30
  "page",
28
31
  "size",
29
32
  "sortBy",
@@ -33,14 +36,16 @@ const buildDynamoDBFilterConditions = (filter, indexMap) => {
33
36
  "rangeFilterBy",
34
37
  "rangeFilterMin",
35
38
  "rangeFilterMax",
39
+ "queryCountLimit",
36
40
  "lastKey",
37
41
  "indexName",
38
42
  "indexValue",
39
43
  "indexSortName",
40
44
  "indexSortValue",
45
+ "rangeFilters",
41
46
  "fieldsInclude",
42
47
  "fieldsExclude",
43
- ];
48
+ ].filter(Boolean);
44
49
  const dynamicFilters = (0, reflection_util_1.excludeKeys)(filter, ignoredKeys);
45
50
  const expressions = [];
46
51
  const attrNames = {};
@@ -54,7 +59,7 @@ const buildDynamoDBFilterConditions = (filter, indexMap) => {
54
59
  };
55
60
  };
56
61
  // Range Filter
57
- if (filter.rangeFilterBy) {
62
+ if (filter.rangeFilterBy && filter.rangeFilterBy !== sortKeyField) {
58
63
  const key = filter.rangeFilterBy;
59
64
  const { name, value } = genPlaceholder(key);
60
65
  attrNames[name] = key;
@@ -129,28 +134,30 @@ const marshallExpressionValue = (value) => (0, util_dynamodb_1.marshall)({ val:
129
134
  convertClassInstanceToMap: true,
130
135
  removeUndefinedValues: true,
131
136
  }).val;
137
+ const marshallKeyConditionValue = (value) => {
138
+ if (value instanceof Date) {
139
+ return marshallExpressionValue(value.toISOString().slice(0, 10));
140
+ }
141
+ return marshallExpressionValue(value);
142
+ };
132
143
  const buildQueryDB = (tableName, filter, indexMap) => {
133
144
  if (!tableName || !filter)
134
145
  throw new errors_1.MissingParameterError("tableName or filter");
135
146
  const filterCondition = (0, exports.buildDynamoDBFilterConditions)(filter, indexMap);
136
147
  const indexField = indexMap.get(filter.indexName)?.field;
137
- if (indexField) {
138
- return (0, exports.buildDynamoDBQueryCommand)({
139
- filterCondition,
140
- tableName,
141
- filter,
142
- indexMap,
143
- });
148
+ if (!indexField) {
149
+ throw new errors_1.ErrorDynamoDB(tableName, "buildQueryDB", "find requires indexName and indexValue; use scan() otherwise");
144
150
  }
145
- return (0, exports.buildDynamoDBScanCommand)({
146
- tableName,
151
+ return (0, exports.buildDynamoDBQueryCommand)({
152
+ filterCondition,
147
153
  filter,
148
- expression: filterCondition,
154
+ tableName,
155
+ indexMap,
149
156
  });
150
157
  };
151
158
  exports.buildQueryDB = buildQueryDB;
152
159
  const buildDynamoDBScanCommand = ({ tableName, filter, expression, }) => {
153
- const scanCommand = { TableName: tableName, Limit: filter?.size ?? 25 };
160
+ const scanCommand = { TableName: tableName };
154
161
  if (filter?.lastKey && filter.lastKey != "undefined")
155
162
  scanCommand.ExclusiveStartKey = (0, exports.parseLastEvaluatedKey)(filter.lastKey);
156
163
  if (isEmptyExpressions(expression))
@@ -181,17 +188,13 @@ const buildDynamoDBQueryCommand = ({ filter, tableName, filterCondition, indexMa
181
188
  [attrKey]: attr,
182
189
  };
183
190
  let expressionAttributeValues = {
184
- [valueKey]: marshallExpressionValue(value),
191
+ [valueKey]: marshallKeyConditionValue(value),
185
192
  };
186
- // Add sort key if exist in index map
187
- if (filter.indexSortName && filter.indexSortValue && indexInfo.sortKeyField) {
188
- const sortAttr = indexInfo.sortKeyField;
189
- const sortValue = filter.indexSortValue;
190
- const sortAttrKey = `#${sortAttr}`;
191
- const sortAttrValueKey = `:${sortAttr}`;
192
- keyConditionExpression += ` AND ${sortAttrKey} = ${sortAttrValueKey}`;
193
- expressionAttributeNames[sortAttrKey] = sortAttr;
194
- expressionAttributeValues[sortAttrValueKey] = marshallExpressionValue(sortValue);
193
+ const sortKeyCondition = buildSortKeyCondition(filter, indexInfo.sortKeyField);
194
+ if (sortKeyCondition) {
195
+ keyConditionExpression += ` AND ${sortKeyCondition.expression}`;
196
+ Object.assign(expressionAttributeNames, sortKeyCondition.attributeNames);
197
+ Object.assign(expressionAttributeValues, sortKeyCondition.attributeValues);
195
198
  }
196
199
  if (filterCondition?.filter) {
197
200
  if (filterCondition.attributeNames) {
@@ -221,6 +224,76 @@ const buildDynamoDBQueryCommand = ({ filter, tableName, filterCondition, indexMa
221
224
  return queryCommand;
222
225
  };
223
226
  exports.buildDynamoDBQueryCommand = buildDynamoDBQueryCommand;
227
+ const hasValue = (value) => value !== undefined && value !== null && value !== "";
228
+ const buildSortKeyCondition = (filter, sortKeyField) => {
229
+ if (!sortKeyField)
230
+ return undefined;
231
+ const sortAttrKey = `#${sortKeyField}`;
232
+ const sortValueKey = `:${sortKeyField}`;
233
+ const attributeNames = { [sortAttrKey]: sortKeyField };
234
+ const rangeFilter = filter.rangeFilters?.find((item) => item.fieldName === sortKeyField);
235
+ if (rangeFilter && (hasValue(rangeFilter.minValue) || hasValue(rangeFilter.maxValue))) {
236
+ return buildSortKeyRangeCondition(sortAttrKey, sortValueKey, attributeNames, rangeFilter);
237
+ }
238
+ if (filter.rangeFilterBy === sortKeyField && (hasValue(filter.rangeFilterMin) || hasValue(filter.rangeFilterMax))) {
239
+ return buildSortKeyRangeCondition(sortAttrKey, sortValueKey, attributeNames, {
240
+ fieldName: sortKeyField,
241
+ minValue: filter.rangeFilterMin,
242
+ maxValue: filter.rangeFilterMax,
243
+ });
244
+ }
245
+ const explicitSortValue = (!filter.indexSortName || filter.indexSortName === sortKeyField) && hasValue(filter.indexSortValue)
246
+ ? filter.indexSortValue
247
+ : undefined;
248
+ const directSortValue = hasValue(filter[sortKeyField]) ? filter[sortKeyField] : undefined;
249
+ const sortValue = explicitSortValue ?? directSortValue;
250
+ if (!hasValue(sortValue))
251
+ return undefined;
252
+ return {
253
+ expression: `${sortAttrKey} = ${sortValueKey}`,
254
+ attributeNames,
255
+ attributeValues: {
256
+ [sortValueKey]: marshallKeyConditionValue(sortValue),
257
+ },
258
+ };
259
+ };
260
+ const buildSortKeyRangeCondition = (sortAttrKey, sortValueKey, attributeNames, rangeFilter) => {
261
+ const attributeValues = {};
262
+ const hasMin = hasValue(rangeFilter.minValue);
263
+ const hasMax = hasValue(rangeFilter.maxValue);
264
+ if (hasMin && hasMax) {
265
+ if (!rangeFilter.minExclude && !rangeFilter.maxExclude) {
266
+ attributeValues[`${sortValueKey}_min`] = marshallKeyConditionValue(rangeFilter.minValue);
267
+ attributeValues[`${sortValueKey}_max`] = marshallKeyConditionValue(rangeFilter.maxValue);
268
+ return {
269
+ expression: `${sortAttrKey} BETWEEN ${sortValueKey}_min AND ${sortValueKey}_max`,
270
+ attributeNames,
271
+ attributeValues,
272
+ };
273
+ }
274
+ attributeValues[`${sortValueKey}_min`] = marshallKeyConditionValue(rangeFilter.minValue);
275
+ attributeValues[`${sortValueKey}_max`] = marshallKeyConditionValue(rangeFilter.maxValue);
276
+ return {
277
+ expression: `${sortAttrKey} ${rangeFilter.minExclude ? ">" : ">="} ${sortValueKey}_min AND ${sortAttrKey} ${rangeFilter.maxExclude ? "<" : "<="} ${sortValueKey}_max`,
278
+ attributeNames,
279
+ attributeValues,
280
+ };
281
+ }
282
+ if (hasMin) {
283
+ attributeValues[sortValueKey] = marshallKeyConditionValue(rangeFilter.minValue);
284
+ return {
285
+ expression: `${sortAttrKey} ${rangeFilter.minExclude ? ">" : ">="} ${sortValueKey}`,
286
+ attributeNames,
287
+ attributeValues,
288
+ };
289
+ }
290
+ attributeValues[sortValueKey] = marshallKeyConditionValue(rangeFilter.maxValue);
291
+ return {
292
+ expression: `${sortAttrKey} ${rangeFilter.maxExclude ? "<" : "<="} ${sortValueKey}`,
293
+ attributeNames,
294
+ attributeValues,
295
+ };
296
+ };
224
297
  const generateIndexValues = (input, indexMap) => {
225
298
  const result = { ...input };
226
299
  for (const [, { field, rFields, fieldSeparator }] of indexMap.entries()) {
@@ -406,13 +479,15 @@ const parseLastEvaluatedKey = (lastKey) => {
406
479
  };
407
480
  exports.parseLastEvaluatedKey = parseLastEvaluatedKey;
408
481
  function generateLastEvaluatedKey(item, indexField, sortField) {
409
- if (!item?.id && !indexField)
482
+ if (!item?.id && (!indexField || !item?.[indexField]))
410
483
  throw new Error("id or indexField not found");
411
- const result = { id: item?.id };
412
- if (indexField)
413
- Object.assign(result, { [indexField]: item[indexField] });
414
- if (sortField)
415
- Object.assign(result, { [sortField]: item[sortField] });
484
+ const result = {};
485
+ if (item?.id)
486
+ result.id = item.id;
487
+ if (indexField && item[indexField])
488
+ result[indexField] = item[indexField];
489
+ if (sortField && item[sortField])
490
+ result[sortField] = item[sortField];
416
491
  return toBase64(JSON.stringify(result));
417
492
  }
418
493
  function toBase64(inputStr) {