@authup/server-core 1.0.0-beta.56 → 1.0.0-beta.58

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 (478) hide show
  1. package/dist/adapters/database/domains/role/entity.d.ts.map +1 -1
  2. package/dist/adapters/database/domains/role/entity.mjs +2 -1
  3. package/dist/adapters/database/domains/role/entity.mjs.map +1 -1
  4. package/dist/adapters/database/logger/module.mjs +2 -4
  5. package/dist/adapters/database/logger/module.mjs.map +1 -1
  6. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.d.ts +25 -0
  7. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.d.ts.map +1 -0
  8. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.mjs +60 -0
  9. package/dist/adapters/database/migrations/mysql/1784970000000-RoleClientForeignKey.mjs.map +1 -0
  10. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.d.ts +25 -0
  11. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.d.ts.map +1 -0
  12. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.mjs +60 -0
  13. package/dist/adapters/database/migrations/postgres/1784970000000-RoleClientForeignKey.mjs.map +1 -0
  14. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +1 -1
  15. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
  16. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +1 -1
  17. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
  18. package/dist/adapters/http/adapters/oauth2/grant-types/identity.mjs +1 -1
  19. package/dist/adapters/http/adapters/oauth2/grant-types/identity.mjs.map +1 -1
  20. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +1 -1
  21. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
  22. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +1 -1
  23. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
  24. package/dist/adapters/http/controllers/entities/client/module.d.ts +6 -6
  25. package/dist/adapters/http/controllers/entities/client/module.d.ts.map +1 -1
  26. package/dist/adapters/http/controllers/entities/client/module.mjs +30 -7
  27. package/dist/adapters/http/controllers/entities/client/module.mjs.map +1 -1
  28. package/dist/adapters/http/controllers/entities/client-permission/module.d.ts +5 -5
  29. package/dist/adapters/http/controllers/entities/client-permission/module.d.ts.map +1 -1
  30. package/dist/adapters/http/controllers/entities/client-permission/module.mjs +23 -5
  31. package/dist/adapters/http/controllers/entities/client-permission/module.mjs.map +1 -1
  32. package/dist/adapters/http/controllers/entities/client-role/module.d.ts +4 -4
  33. package/dist/adapters/http/controllers/entities/client-role/module.d.ts.map +1 -1
  34. package/dist/adapters/http/controllers/entities/client-role/module.mjs +19 -4
  35. package/dist/adapters/http/controllers/entities/client-role/module.mjs.map +1 -1
  36. package/dist/adapters/http/controllers/entities/client-scope/module.d.ts +4 -4
  37. package/dist/adapters/http/controllers/entities/client-scope/module.d.ts.map +1 -1
  38. package/dist/adapters/http/controllers/entities/client-scope/module.mjs +19 -4
  39. package/dist/adapters/http/controllers/entities/client-scope/module.mjs.map +1 -1
  40. package/dist/adapters/http/controllers/entities/consent/module.d.ts +3 -3
  41. package/dist/adapters/http/controllers/entities/consent/module.d.ts.map +1 -1
  42. package/dist/adapters/http/controllers/entities/consent/module.mjs +15 -3
  43. package/dist/adapters/http/controllers/entities/consent/module.mjs.map +1 -1
  44. package/dist/adapters/http/controllers/entities/event/module.d.ts +2 -2
  45. package/dist/adapters/http/controllers/entities/event/module.d.ts.map +1 -1
  46. package/dist/adapters/http/controllers/entities/event/module.mjs +11 -2
  47. package/dist/adapters/http/controllers/entities/event/module.mjs.map +1 -1
  48. package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts +5 -5
  49. package/dist/adapters/http/controllers/entities/identity-provide-role/module.d.ts.map +1 -1
  50. package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs +23 -5
  51. package/dist/adapters/http/controllers/entities/identity-provide-role/module.mjs.map +1 -1
  52. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts +6 -6
  53. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  54. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +24 -8
  55. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  56. package/dist/adapters/http/controllers/entities/key/module.d.ts +5 -5
  57. package/dist/adapters/http/controllers/entities/key/module.d.ts.map +1 -1
  58. package/dist/adapters/http/controllers/entities/key/module.mjs +23 -5
  59. package/dist/adapters/http/controllers/entities/key/module.mjs.map +1 -1
  60. package/dist/adapters/http/controllers/entities/permission/module.d.ts +6 -6
  61. package/dist/adapters/http/controllers/entities/permission/module.d.ts.map +1 -1
  62. package/dist/adapters/http/controllers/entities/permission/module.mjs +27 -6
  63. package/dist/adapters/http/controllers/entities/permission/module.mjs.map +1 -1
  64. package/dist/adapters/http/controllers/entities/permission-policy/module.d.ts +4 -4
  65. package/dist/adapters/http/controllers/entities/permission-policy/module.d.ts.map +1 -1
  66. package/dist/adapters/http/controllers/entities/permission-policy/module.mjs +19 -4
  67. package/dist/adapters/http/controllers/entities/permission-policy/module.mjs.map +1 -1
  68. package/dist/adapters/http/controllers/entities/policy/module.d.ts +7 -7
  69. package/dist/adapters/http/controllers/entities/policy/module.d.ts.map +1 -1
  70. package/dist/adapters/http/controllers/entities/policy/module.mjs +27 -6
  71. package/dist/adapters/http/controllers/entities/policy/module.mjs.map +1 -1
  72. package/dist/adapters/http/controllers/entities/realm/module.d.ts +6 -6
  73. package/dist/adapters/http/controllers/entities/realm/module.d.ts.map +1 -1
  74. package/dist/adapters/http/controllers/entities/realm/module.mjs +29 -8
  75. package/dist/adapters/http/controllers/entities/realm/module.mjs.map +1 -1
  76. package/dist/adapters/http/controllers/entities/role/module.d.ts +6 -6
  77. package/dist/adapters/http/controllers/entities/role/module.d.ts.map +1 -1
  78. package/dist/adapters/http/controllers/entities/role/module.mjs +27 -6
  79. package/dist/adapters/http/controllers/entities/role/module.mjs.map +1 -1
  80. package/dist/adapters/http/controllers/entities/role-attribute/module.d.ts +5 -5
  81. package/dist/adapters/http/controllers/entities/role-attribute/module.d.ts.map +1 -1
  82. package/dist/adapters/http/controllers/entities/role-attribute/module.mjs +23 -5
  83. package/dist/adapters/http/controllers/entities/role-attribute/module.mjs.map +1 -1
  84. package/dist/adapters/http/controllers/entities/role-permission/module.d.ts +5 -5
  85. package/dist/adapters/http/controllers/entities/role-permission/module.d.ts.map +1 -1
  86. package/dist/adapters/http/controllers/entities/role-permission/module.mjs +23 -5
  87. package/dist/adapters/http/controllers/entities/role-permission/module.mjs.map +1 -1
  88. package/dist/adapters/http/controllers/entities/scope/module.d.ts +6 -6
  89. package/dist/adapters/http/controllers/entities/scope/module.d.ts.map +1 -1
  90. package/dist/adapters/http/controllers/entities/scope/module.mjs +27 -6
  91. package/dist/adapters/http/controllers/entities/scope/module.mjs.map +1 -1
  92. package/dist/adapters/http/controllers/entities/session/module.d.ts +3 -3
  93. package/dist/adapters/http/controllers/entities/session/module.d.ts.map +1 -1
  94. package/dist/adapters/http/controllers/entities/session/module.mjs +15 -3
  95. package/dist/adapters/http/controllers/entities/session/module.mjs.map +1 -1
  96. package/dist/adapters/http/controllers/entities/trust-anchor/module.d.ts +5 -5
  97. package/dist/adapters/http/controllers/entities/trust-anchor/module.d.ts.map +1 -1
  98. package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs +23 -5
  99. package/dist/adapters/http/controllers/entities/trust-anchor/module.mjs.map +1 -1
  100. package/dist/adapters/http/controllers/entities/user/module.d.ts +6 -6
  101. package/dist/adapters/http/controllers/entities/user/module.d.ts.map +1 -1
  102. package/dist/adapters/http/controllers/entities/user/module.mjs +27 -6
  103. package/dist/adapters/http/controllers/entities/user/module.mjs.map +1 -1
  104. package/dist/adapters/http/controllers/entities/user-attribute/module.d.ts +5 -5
  105. package/dist/adapters/http/controllers/entities/user-attribute/module.d.ts.map +1 -1
  106. package/dist/adapters/http/controllers/entities/user-attribute/module.mjs +23 -5
  107. package/dist/adapters/http/controllers/entities/user-attribute/module.mjs.map +1 -1
  108. package/dist/adapters/http/controllers/entities/user-authenticator/module.d.ts +4 -4
  109. package/dist/adapters/http/controllers/entities/user-authenticator/module.d.ts.map +1 -1
  110. package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs +19 -4
  111. package/dist/adapters/http/controllers/entities/user-authenticator/module.mjs.map +1 -1
  112. package/dist/adapters/http/controllers/entities/user-permission/module.d.ts +5 -5
  113. package/dist/adapters/http/controllers/entities/user-permission/module.d.ts.map +1 -1
  114. package/dist/adapters/http/controllers/entities/user-permission/module.mjs +23 -5
  115. package/dist/adapters/http/controllers/entities/user-permission/module.mjs.map +1 -1
  116. package/dist/adapters/http/controllers/entities/user-role/module.d.ts +4 -4
  117. package/dist/adapters/http/controllers/entities/user-role/module.d.ts.map +1 -1
  118. package/dist/adapters/http/controllers/entities/user-role/module.mjs +19 -4
  119. package/dist/adapters/http/controllers/entities/user-role/module.mjs.map +1 -1
  120. package/dist/adapters/http/controllers/index.mjs +2 -1
  121. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs +1 -1
  122. package/dist/adapters/http/controllers/workflows/authenticator-challenge/module.mjs.map +1 -1
  123. package/dist/adapters/http/controllers/workflows/index.d.ts +1 -0
  124. package/dist/adapters/http/controllers/workflows/index.d.ts.map +1 -1
  125. package/dist/adapters/http/controllers/workflows/index.mjs +3 -1
  126. package/dist/adapters/http/controllers/workflows/logout/module.d.ts.map +1 -1
  127. package/dist/adapters/http/controllers/workflows/logout/module.mjs +5 -1
  128. package/dist/adapters/http/controllers/workflows/logout/module.mjs.map +1 -1
  129. package/dist/adapters/http/controllers/workflows/userinfo/index.d.ts +2 -0
  130. package/dist/adapters/http/controllers/workflows/userinfo/index.d.ts.map +1 -0
  131. package/dist/adapters/http/controllers/workflows/userinfo/index.mjs +5 -0
  132. package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts +18 -0
  133. package/dist/adapters/http/controllers/workflows/userinfo/module.d.ts.map +1 -0
  134. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs +53 -0
  135. package/dist/adapters/http/controllers/workflows/userinfo/module.mjs.map +1 -0
  136. package/dist/adapters/http/index.mjs +2 -1
  137. package/dist/adapters/http/middleware/built-in/authorization/module.d.ts +1 -0
  138. package/dist/adapters/http/middleware/built-in/authorization/module.d.ts.map +1 -1
  139. package/dist/adapters/http/middleware/built-in/authorization/module.mjs +10 -1
  140. package/dist/adapters/http/middleware/built-in/authorization/module.mjs.map +1 -1
  141. package/dist/adapters/http/middleware/built-in/rate-limit.d.ts.map +1 -1
  142. package/dist/adapters/http/middleware/built-in/rate-limit.mjs +4 -2
  143. package/dist/adapters/http/middleware/built-in/rate-limit.mjs.map +1 -1
  144. package/dist/adapters/http/request/client-certificate.mjs +1 -1
  145. package/dist/adapters/http/request/client-certificate.mjs.map +1 -1
  146. package/dist/adapters/http/request/event-context.mjs +1 -1
  147. package/dist/adapters/http/request/event-context.mjs.map +1 -1
  148. package/dist/adapters/http/request/helpers/locations.mjs +1 -3
  149. package/dist/adapters/http/request/helpers/locations.mjs.map +1 -1
  150. package/dist/app/factory.d.ts +2 -1
  151. package/dist/app/factory.d.ts.map +1 -1
  152. package/dist/app/factory.mjs +2 -2
  153. package/dist/app/factory.mjs.map +1 -1
  154. package/dist/app/index.d.ts +1 -0
  155. package/dist/app/index.d.ts.map +1 -1
  156. package/dist/app/index.mjs +5 -1
  157. package/dist/app/modules/authentication/module.mjs +6 -3
  158. package/dist/app/modules/authentication/module.mjs.map +1 -1
  159. package/dist/app/modules/authentication/repositories/session.mjs +2 -2
  160. package/dist/app/modules/authentication/repositories/session.mjs.map +1 -1
  161. package/dist/app/modules/components/module.d.ts +3 -0
  162. package/dist/app/modules/components/module.d.ts.map +1 -1
  163. package/dist/app/modules/components/module.mjs +17 -2
  164. package/dist/app/modules/components/module.mjs.map +1 -1
  165. package/dist/app/modules/config/constants.d.ts +1 -0
  166. package/dist/app/modules/config/constants.d.ts.map +1 -1
  167. package/dist/app/modules/config/constants.mjs +1 -0
  168. package/dist/app/modules/config/constants.mjs.map +1 -1
  169. package/dist/app/modules/config/helpers.d.ts +9 -0
  170. package/dist/app/modules/config/helpers.d.ts.map +1 -0
  171. package/dist/app/modules/config/helpers.mjs +22 -0
  172. package/dist/app/modules/config/helpers.mjs.map +1 -0
  173. package/dist/app/modules/config/index.d.ts +2 -0
  174. package/dist/app/modules/config/index.d.ts.map +1 -1
  175. package/dist/app/modules/config/index.mjs +6 -1
  176. package/dist/app/modules/config/module.d.ts.map +1 -1
  177. package/dist/app/modules/config/module.mjs +2 -7
  178. package/dist/app/modules/config/module.mjs.map +1 -1
  179. package/dist/app/modules/config/normalize.d.ts.map +1 -1
  180. package/dist/app/modules/config/normalize.mjs +4 -0
  181. package/dist/app/modules/config/normalize.mjs.map +1 -1
  182. package/dist/app/modules/config/read/env.d.ts.map +1 -1
  183. package/dist/app/modules/config/read/env.mjs +2 -0
  184. package/dist/app/modules/config/read/env.mjs.map +1 -1
  185. package/dist/app/modules/config/read/fs.d.ts.map +1 -1
  186. package/dist/app/modules/config/read/fs.mjs +31 -8
  187. package/dist/app/modules/config/read/fs.mjs.map +1 -1
  188. package/dist/app/modules/config/read/module.mjs +8 -3
  189. package/dist/app/modules/config/read/module.mjs.map +1 -1
  190. package/dist/app/modules/config/trust-proxy.d.ts +28 -0
  191. package/dist/app/modules/config/trust-proxy.d.ts.map +1 -0
  192. package/dist/app/modules/config/trust-proxy.mjs +64 -0
  193. package/dist/app/modules/config/trust-proxy.mjs.map +1 -0
  194. package/dist/app/modules/config/types.d.ts +18 -0
  195. package/dist/app/modules/config/types.d.ts.map +1 -1
  196. package/dist/app/modules/config/validator.d.ts.map +1 -1
  197. package/dist/app/modules/config/validator.mjs +7 -0
  198. package/dist/app/modules/config/validator.mjs.map +1 -1
  199. package/dist/app/modules/database/module.mjs +2 -1
  200. package/dist/app/modules/database/module.mjs.map +1 -1
  201. package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
  202. package/dist/app/modules/database/repositories/client/repository.mjs +3 -4
  203. package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
  204. package/dist/app/modules/database/repositories/client-permission/repository.mjs +2 -2
  205. package/dist/app/modules/database/repositories/client-permission/repository.mjs.map +1 -1
  206. package/dist/app/modules/database/repositories/client-role/repository.mjs +2 -2
  207. package/dist/app/modules/database/repositories/client-role/repository.mjs.map +1 -1
  208. package/dist/app/modules/database/repositories/client-scope/repository.mjs +2 -2
  209. package/dist/app/modules/database/repositories/client-scope/repository.mjs.map +1 -1
  210. package/dist/app/modules/database/repositories/event/repository.d.ts.map +1 -1
  211. package/dist/app/modules/database/repositories/event/repository.mjs +4 -3
  212. package/dist/app/modules/database/repositories/event/repository.mjs.map +1 -1
  213. package/dist/app/modules/database/repositories/identity-provider/repository.mjs +2 -2
  214. package/dist/app/modules/database/repositories/identity-provider/repository.mjs.map +1 -1
  215. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs +2 -2
  216. package/dist/app/modules/database/repositories/identity-provider-role-mapping/repository.mjs.map +1 -1
  217. package/dist/app/modules/database/repositories/key/repository.mjs +2 -2
  218. package/dist/app/modules/database/repositories/key/repository.mjs.map +1 -1
  219. package/dist/app/modules/database/repositories/permission/repository.mjs +2 -2
  220. package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
  221. package/dist/app/modules/database/repositories/permission-policy/repository.mjs +2 -2
  222. package/dist/app/modules/database/repositories/permission-policy/repository.mjs.map +1 -1
  223. package/dist/app/modules/database/repositories/policy/repository.mjs +2 -2
  224. package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
  225. package/dist/app/modules/database/repositories/query.d.ts +20 -0
  226. package/dist/app/modules/database/repositories/query.d.ts.map +1 -1
  227. package/dist/app/modules/database/repositories/query.mjs +26 -3
  228. package/dist/app/modules/database/repositories/query.mjs.map +1 -1
  229. package/dist/app/modules/database/repositories/realm/repository.mjs +2 -2
  230. package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
  231. package/dist/app/modules/database/repositories/role/repository.mjs +2 -2
  232. package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
  233. package/dist/app/modules/database/repositories/role-attribute/repository.mjs +2 -2
  234. package/dist/app/modules/database/repositories/role-attribute/repository.mjs.map +1 -1
  235. package/dist/app/modules/database/repositories/role-permission/repository.mjs +2 -2
  236. package/dist/app/modules/database/repositories/role-permission/repository.mjs.map +1 -1
  237. package/dist/app/modules/database/repositories/schema-validation.d.ts +17 -3
  238. package/dist/app/modules/database/repositories/schema-validation.d.ts.map +1 -1
  239. package/dist/app/modules/database/repositories/schema-validation.mjs +29 -5
  240. package/dist/app/modules/database/repositories/schema-validation.mjs.map +1 -1
  241. package/dist/app/modules/database/repositories/scope/repository.mjs +2 -2
  242. package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
  243. package/dist/app/modules/database/repositories/trust-anchor/repository.mjs +2 -2
  244. package/dist/app/modules/database/repositories/trust-anchor/repository.mjs.map +1 -1
  245. package/dist/app/modules/database/repositories/user/repository.mjs +2 -2
  246. package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
  247. package/dist/app/modules/database/repositories/user-attribute/repository.mjs +2 -2
  248. package/dist/app/modules/database/repositories/user-attribute/repository.mjs.map +1 -1
  249. package/dist/app/modules/database/repositories/user-authenticator/repository.mjs +2 -2
  250. package/dist/app/modules/database/repositories/user-authenticator/repository.mjs.map +1 -1
  251. package/dist/app/modules/database/repositories/user-permission/repository.mjs +2 -2
  252. package/dist/app/modules/database/repositories/user-permission/repository.mjs.map +1 -1
  253. package/dist/app/modules/database/repositories/user-role/repository.mjs +2 -2
  254. package/dist/app/modules/database/repositories/user-role/repository.mjs.map +1 -1
  255. package/dist/app/modules/http/constants.d.ts +2 -13
  256. package/dist/app/modules/http/constants.d.ts.map +1 -1
  257. package/dist/app/modules/http/constants.mjs.map +1 -1
  258. package/dist/app/modules/http/module.d.ts.map +1 -1
  259. package/dist/app/modules/http/module.mjs +7 -1
  260. package/dist/app/modules/http/module.mjs.map +1 -1
  261. package/dist/app/modules/http/modules/controller.d.ts +4 -2
  262. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  263. package/dist/app/modules/http/modules/controller.mjs +208 -124
  264. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  265. package/dist/app/modules/http/modules/middleware.mjs +10 -5
  266. package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
  267. package/dist/app/modules/identity/module.mjs +6 -3
  268. package/dist/app/modules/identity/module.mjs.map +1 -1
  269. package/dist/app/modules/index.mjs +5 -1
  270. package/dist/app/modules/oauth2/module.mjs +37 -17
  271. package/dist/app/modules/oauth2/module.mjs.map +1 -1
  272. package/dist/app/modules/oauth2/repositories/authorize/state/repository.mjs +1 -1
  273. package/dist/app/modules/oauth2/repositories/authorize/state/repository.mjs.map +1 -1
  274. package/dist/app/modules/oauth2/repositories/consent/repository.mjs +2 -2
  275. package/dist/app/modules/oauth2/repositories/consent/repository.mjs.map +1 -1
  276. package/dist/app/modules/oauth2/repositories/token/repository.mjs +1 -1
  277. package/dist/app/modules/oauth2/repositories/token/repository.mjs.map +1 -1
  278. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  279. package/dist/app/modules/provisioning/module.mjs +21 -12
  280. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  281. package/dist/app/modules/provisioning/sources/file/module.d.ts.map +1 -1
  282. package/dist/app/modules/provisioning/sources/file/module.mjs +11 -2
  283. package/dist/app/modules/provisioning/sources/file/module.mjs.map +1 -1
  284. package/dist/app/types.d.ts +5 -0
  285. package/dist/app/types.d.ts.map +1 -0
  286. package/dist/app/types.mjs +4 -0
  287. package/dist/cli/commands/healthcheck.d.ts +2 -1
  288. package/dist/cli/commands/healthcheck.d.ts.map +1 -1
  289. package/dist/cli/commands/healthcheck.mjs +3 -2
  290. package/dist/cli/commands/healthcheck.mjs.map +1 -1
  291. package/dist/cli/commands/index.d.ts +0 -1
  292. package/dist/cli/commands/index.d.ts.map +1 -1
  293. package/dist/cli/commands/index.mjs +1 -2
  294. package/dist/cli/commands/migration.d.ts +2 -1
  295. package/dist/cli/commands/migration.d.ts.map +1 -1
  296. package/dist/cli/commands/migration.mjs +3 -2
  297. package/dist/cli/commands/migration.mjs.map +1 -1
  298. package/dist/cli/commands/start.d.ts +2 -1
  299. package/dist/cli/commands/start.d.ts.map +1 -1
  300. package/dist/cli/commands/start.mjs +3 -2
  301. package/dist/cli/commands/start.mjs.map +1 -1
  302. package/dist/cli/config.d.ts +18 -0
  303. package/dist/cli/config.d.ts.map +1 -0
  304. package/dist/cli/config.mjs +34 -0
  305. package/dist/cli/config.mjs.map +1 -0
  306. package/dist/cli/module.d.ts +8 -8
  307. package/dist/cli/module.d.ts.map +1 -1
  308. package/dist/cli/module.mjs +8 -28
  309. package/dist/cli/module.mjs.map +1 -1
  310. package/dist/cli/types.d.ts +5 -0
  311. package/dist/cli/types.d.ts.map +1 -0
  312. package/dist/cli/types.mjs +4 -0
  313. package/dist/components/event-cleaner/module.d.ts.map +1 -1
  314. package/dist/components/event-cleaner/module.mjs +26 -14
  315. package/dist/components/event-cleaner/module.mjs.map +1 -1
  316. package/dist/components/index.d.ts +0 -1
  317. package/dist/components/index.d.ts.map +1 -1
  318. package/dist/components/index.mjs +1 -4
  319. package/dist/components/oauth2-cleaner/module.d.ts.map +1 -1
  320. package/dist/components/oauth2-cleaner/module.mjs +29 -17
  321. package/dist/components/oauth2-cleaner/module.mjs.map +1 -1
  322. package/dist/components/types.d.ts +1 -0
  323. package/dist/components/types.d.ts.map +1 -1
  324. package/dist/core/authentication/login-throttle/service.d.ts.map +1 -1
  325. package/dist/core/authentication/login-throttle/service.mjs +2 -1
  326. package/dist/core/authentication/login-throttle/service.mjs.map +1 -1
  327. package/dist/core/authentication/session/module.mjs +2 -4
  328. package/dist/core/authentication/session/module.mjs.map +1 -1
  329. package/dist/core/entities/client/constants.d.ts +10 -0
  330. package/dist/core/entities/client/constants.d.ts.map +1 -0
  331. package/dist/core/entities/client/constants.mjs +20 -0
  332. package/dist/core/entities/client/constants.mjs.map +1 -0
  333. package/dist/core/entities/client/index.d.ts +1 -0
  334. package/dist/core/entities/client/index.d.ts.map +1 -1
  335. package/dist/core/entities/client/index.mjs +3 -2
  336. package/dist/core/entities/client/schema.d.ts.map +1 -1
  337. package/dist/core/entities/client/schema.mjs +40 -3
  338. package/dist/core/entities/client/schema.mjs.map +1 -1
  339. package/dist/core/entities/client/service.d.ts.map +1 -1
  340. package/dist/core/entities/client/service.mjs +9 -61
  341. package/dist/core/entities/client/service.mjs.map +1 -1
  342. package/dist/core/entities/client/web-client.d.ts +39 -3
  343. package/dist/core/entities/client/web-client.d.ts.map +1 -1
  344. package/dist/core/entities/client/web-client.mjs +68 -12
  345. package/dist/core/entities/client/web-client.mjs.map +1 -1
  346. package/dist/core/entities/client-permission/service.mjs +12 -9
  347. package/dist/core/entities/client-permission/service.mjs.map +1 -1
  348. package/dist/core/entities/client-scope/schema.d.ts.map +1 -1
  349. package/dist/core/entities/client-scope/schema.mjs +3 -1
  350. package/dist/core/entities/client-scope/schema.mjs.map +1 -1
  351. package/dist/core/entities/event/constants.d.ts +7 -0
  352. package/dist/core/entities/event/constants.d.ts.map +1 -1
  353. package/dist/core/entities/event/constants.mjs +7 -1
  354. package/dist/core/entities/event/constants.mjs.map +1 -1
  355. package/dist/core/entities/event/index.mjs +2 -2
  356. package/dist/core/entities/event/service.mjs +1 -1
  357. package/dist/core/entities/event/service.mjs.map +1 -1
  358. package/dist/core/entities/index.mjs +4 -3
  359. package/dist/core/entities/key/service.mjs +4 -2
  360. package/dist/core/entities/key/service.mjs.map +1 -1
  361. package/dist/core/entities/permission/service.d.ts.map +1 -1
  362. package/dist/core/entities/permission/service.mjs +1 -1
  363. package/dist/core/entities/permission/service.mjs.map +1 -1
  364. package/dist/core/entities/policy/service.d.ts.map +1 -1
  365. package/dist/core/entities/policy/service.mjs +3 -2
  366. package/dist/core/entities/policy/service.mjs.map +1 -1
  367. package/dist/core/entities/realm/service.d.ts.map +1 -1
  368. package/dist/core/entities/realm/service.mjs +1 -1
  369. package/dist/core/entities/realm/service.mjs.map +1 -1
  370. package/dist/core/entities/role/schema.d.ts.map +1 -1
  371. package/dist/core/entities/role/schema.mjs +4 -0
  372. package/dist/core/entities/role/schema.mjs.map +1 -1
  373. package/dist/core/entities/role/service.d.ts.map +1 -1
  374. package/dist/core/entities/role/service.mjs +1 -1
  375. package/dist/core/entities/role/service.mjs.map +1 -1
  376. package/dist/core/entities/role-permission/service.mjs +12 -9
  377. package/dist/core/entities/role-permission/service.mjs.map +1 -1
  378. package/dist/core/entities/scope/service.d.ts.map +1 -1
  379. package/dist/core/entities/scope/service.mjs +1 -1
  380. package/dist/core/entities/scope/service.mjs.map +1 -1
  381. package/dist/core/entities/session/schema.d.ts.map +1 -1
  382. package/dist/core/entities/session/schema.mjs +2 -0
  383. package/dist/core/entities/session/schema.mjs.map +1 -1
  384. package/dist/core/entities/user/schema.d.ts.map +1 -1
  385. package/dist/core/entities/user/schema.mjs +2 -0
  386. package/dist/core/entities/user/schema.mjs.map +1 -1
  387. package/dist/core/entities/user/service.d.ts.map +1 -1
  388. package/dist/core/entities/user/service.mjs +1 -1
  389. package/dist/core/entities/user/service.mjs.map +1 -1
  390. package/dist/core/entities/user-authenticator/helpers.mjs +1 -1
  391. package/dist/core/entities/user-authenticator/helpers.mjs.map +1 -1
  392. package/dist/core/entities/user-authenticator/service.mjs +7 -7
  393. package/dist/core/entities/user-authenticator/service.mjs.map +1 -1
  394. package/dist/core/entities/user-permission/service.mjs +12 -9
  395. package/dist/core/entities/user-permission/service.mjs.map +1 -1
  396. package/dist/core/identity/password-recovery/check.mjs +4 -4
  397. package/dist/core/identity/password-recovery/check.mjs.map +1 -1
  398. package/dist/core/identity/password-recovery/service.mjs +1 -1
  399. package/dist/core/identity/password-recovery/service.mjs.map +1 -1
  400. package/dist/core/identity/registration/check.mjs +2 -2
  401. package/dist/core/identity/registration/check.mjs.map +1 -1
  402. package/dist/core/index.mjs +5 -3
  403. package/dist/core/key/check.mjs +2 -2
  404. package/dist/core/key/check.mjs.map +1 -1
  405. package/dist/core/provisioning/entities/client/relations-validator.d.ts.map +1 -1
  406. package/dist/core/provisioning/entities/client/relations-validator.mjs +2 -0
  407. package/dist/core/provisioning/entities/client/relations-validator.mjs.map +1 -1
  408. package/dist/core/provisioning/entities/client/types.d.ts +8 -0
  409. package/dist/core/provisioning/entities/client/types.d.ts.map +1 -1
  410. package/dist/core/provisioning/synchronizer/client/module.d.ts +3 -1
  411. package/dist/core/provisioning/synchronizer/client/module.d.ts.map +1 -1
  412. package/dist/core/provisioning/synchronizer/client/module.mjs +10 -1
  413. package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
  414. package/dist/core/provisioning/synchronizer/client/types.d.ts +3 -1
  415. package/dist/core/provisioning/synchronizer/client/types.d.ts.map +1 -1
  416. package/dist/core/provisioning/synchronizer/entity-resolver.d.ts +4 -1
  417. package/dist/core/provisioning/synchronizer/entity-resolver.d.ts.map +1 -1
  418. package/dist/core/provisioning/synchronizer/entity-resolver.mjs +14 -29
  419. package/dist/core/provisioning/synchronizer/entity-resolver.mjs.map +1 -1
  420. package/dist/core/provisioning/synchronizer/index.d.ts +1 -0
  421. package/dist/core/provisioning/synchronizer/index.d.ts.map +1 -1
  422. package/dist/core/provisioning/synchronizer/permission/module.mjs +0 -1
  423. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  424. package/dist/core/provisioning/synchronizer/realm/module.d.ts.map +1 -1
  425. package/dist/core/provisioning/synchronizer/realm/module.mjs +8 -9
  426. package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
  427. package/dist/core/provisioning/synchronizer/role/module.mjs +0 -1
  428. package/dist/core/provisioning/synchronizer/role/module.mjs.map +1 -1
  429. package/dist/core/provisioning/synchronizer/scope/module.mjs +0 -1
  430. package/dist/core/provisioning/synchronizer/scope/module.mjs.map +1 -1
  431. package/dist/core/provisioning/synchronizer/types.d.ts +11 -0
  432. package/dist/core/provisioning/synchronizer/types.d.ts.map +1 -0
  433. package/dist/core/provisioning/synchronizer/types.mjs +4 -0
  434. package/dist/core/provisioning/synchronizer/user/module.mjs +0 -1
  435. package/dist/core/provisioning/synchronizer/user/module.mjs.map +1 -1
  436. package/dist/core/query/describe.d.ts +25 -0
  437. package/dist/core/query/describe.d.ts.map +1 -0
  438. package/dist/core/query/describe.mjs +50 -0
  439. package/dist/core/query/describe.mjs.map +1 -0
  440. package/dist/core/query/fields.d.ts +44 -0
  441. package/dist/core/query/fields.d.ts.map +1 -0
  442. package/dist/core/query/fields.mjs +46 -0
  443. package/dist/core/query/fields.mjs.map +1 -0
  444. package/dist/core/query/index.d.ts +1 -0
  445. package/dist/core/query/index.d.ts.map +1 -1
  446. package/dist/core/query/index.mjs +2 -1
  447. package/dist/core/query/module.d.ts +1 -1
  448. package/dist/core/query/module.mjs +1 -1
  449. package/dist/core/query/module.mjs.map +1 -1
  450. package/dist/index.mjs +6 -2
  451. package/dist/path.mjs.map +1 -1
  452. package/dist/swagger.json +1324 -193
  453. package/dist/ui/client/.vite/ssr-manifest.json +1030 -760
  454. package/dist/ui/client/assets/index-BTK3GPZZ.js +106 -0
  455. package/dist/ui/client/assets/index-Cx_pI7BS.css +2 -0
  456. package/dist/ui/client/index.html +2 -2
  457. package/dist/ui/server/server.js +4465 -11501
  458. package/package.json +51 -50
  459. package/dist/cli/commands/reset.d.ts +0 -2
  460. package/dist/cli/commands/reset.d.ts.map +0 -1
  461. package/dist/cli/commands/reset.mjs +0 -23
  462. package/dist/cli/commands/reset.mjs.map +0 -1
  463. package/dist/components/database/index.d.ts +0 -2
  464. package/dist/components/database/index.d.ts.map +0 -1
  465. package/dist/components/database/index.mjs +0 -7
  466. package/dist/components/database/unique-entries/factory.d.ts +0 -4
  467. package/dist/components/database/unique-entries/factory.d.ts.map +0 -1
  468. package/dist/components/database/unique-entries/factory.mjs +0 -12
  469. package/dist/components/database/unique-entries/factory.mjs.map +0 -1
  470. package/dist/components/database/unique-entries/index.d.ts +0 -3
  471. package/dist/components/database/unique-entries/index.d.ts.map +0 -1
  472. package/dist/components/database/unique-entries/index.mjs +0 -6
  473. package/dist/components/database/unique-entries/module.d.ts +0 -15
  474. package/dist/components/database/unique-entries/module.d.ts.map +0 -1
  475. package/dist/components/database/unique-entries/module.mjs +0 -69
  476. package/dist/components/database/unique-entries/module.mjs.map +0 -1
  477. package/dist/ui/client/assets/index-C05uGFDe.js +0 -131
  478. package/dist/ui/client/assets/index-CiHrf73J.css +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["AuthupError","KeyStatus","arrayBufferToBase64","createNanoID","isUUID","AsymmetricKey","CryptoAsymmetricAlgorithm","createAsymmetricKeyPair","JWKType","JWKUse","JWTAlgorithm","Like","validateEntityJoinColumns","applyQuery","getRandomValues","DatabaseConflictError","KeyEntity","RealmEntity","UserAuthenticatorEntity","REALM_CIPHER_BLOB_VERSION","isWrappedKeyMaterial","unwrapKeyMaterial","wrapKeyMaterial","applyRealmScopeSelect","isEntityUnique","translateWhereConditions","RealmRepositoryAdapter","KeyRepositoryAdapter","dataSource","secretsCipher","realmRepository","logger","options","getRepository","repository","resolveOrCreate","realmId","use","entity","findOne","select","id","name","type","status","signatureAlgorithm","encryptionKey","decryptionKey","where","ACTIVE","order","priority","createdAt","afterLoad","total","countBy","ENCRYPTION","createEncryptionKey","createSignatureKey","resolveById","keyPair","RSASSA_PKCS1_V1_5","privateKeyContainer","privateKey","publicKeyContainer","publicKey","material","toBase64","create","generateName","SIGNATURE","RSA","protect","RS256","save","raw","Uint8Array","buffer","OCT","update","e","warn","error","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","getManyAndCount","data","meta","findOneById","findOneBy","findOneByName","realmKey","resolveId","findOneByIdOrName","idOrName","realm","findManyBy","findBy","merge","saved","remove","validateJoinColumns","entityTarget","checkUniqueness","existing","isUnique","entityExisting","countBlobReferences","keyId","secret","findHighestPriority","maximum"],"sources":["../../../../../../src/app/modules/database/repositories/key/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AuthupError } from '@authup/errors';\nimport type { IQuery } from '@rapiq/core';\nimport type { Key } from '@authup/core-kit';\nimport { KeyStatus } from '@authup/core-kit';\nimport { arrayBufferToBase64, createNanoID, isUUID } from '@authup/kit';\nimport {\n AsymmetricKey,\n CryptoAsymmetricAlgorithm,\n type EntityRepositoryFindManyResult,\n type ISymmetricCipher,\n type Logger,\n createAsymmetricKeyPair,\n} from '@authup/server-kit';\nimport { JWKType, JWKUse, JWTAlgorithm } from '@authup/specs';\nimport type { DataSource, FindOptionsWhere, Repository } from 'typeorm';\nimport { Like } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery } from '../query.ts';\nimport { getRandomValues } from 'uncrypto';\nimport {\n DatabaseConflictError,\n KeyEntity,\n RealmEntity,\n UserAuthenticatorEntity,\n} from '../../../../../adapters/database/index.ts';\nimport type { IKeyRepository, IKeyStore, IRealmRepository } from '../../../../../core/index.ts';\nimport {\n REALM_CIPHER_BLOB_VERSION,\n isWrappedKeyMaterial,\n unwrapKeyMaterial,\n wrapKeyMaterial,\n} from '../../../../../core/index.ts';\nimport { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type KeyRepositoryAdapterOptions = {\n /**\n * Optional KEK (config secretsEncryptionKey) — when present, key\n * material is persisted wrapped and unwrapped transparently on read.\n */\n secretsCipher?: ISymmetricCipher | null,\n logger?: Logger,\n};\n\n/**\n * One adapter, two ports: the entity CRUD surface (IKeyRepository) for the\n * key management API and the material-resolving store (IKeyStore) for the\n * signer / verifier / realm cipher. Entity reads never select\n * decryptionKey; only the IKeyStore surface hands out (unwrapped) material.\n */\nexport class KeyRepositoryAdapter implements IKeyRepository, IKeyStore {\n protected dataSource : DataSource;\n\n protected secretsCipher : ISymmetricCipher | null;\n\n protected realmRepository : IRealmRepository;\n\n protected logger? : Logger;\n\n constructor(dataSource: DataSource, options: KeyRepositoryAdapterOptions = {}) {\n this.dataSource = dataSource;\n this.secretsCipher = options.secretsCipher ?? null;\n this.logger = options.logger;\n this.realmRepository = new RealmRepositoryAdapter(dataSource.getRepository(RealmEntity));\n }\n\n protected get repository() : Repository<KeyEntity> {\n return this.dataSource.getRepository(KeyEntity);\n }\n\n // ------------------------------------------------------------------\n // IKeyStore — material resolution (signer / verifier / realm cipher)\n // ------------------------------------------------------------------\n\n async resolveOrCreate(realmId: string, use: `${JWKUse}`): Promise<Key> {\n const { repository } = this;\n\n const entity = await repository.findOne({\n select: {\n id: true,\n name: true,\n type: true,\n use: true,\n status: true,\n signatureAlgorithm: true,\n encryptionKey: true,\n decryptionKey: true,\n realmId: true,\n },\n where: {\n realmId,\n use,\n status: KeyStatus.ACTIVE,\n },\n // createdAt + id break priority ties deterministically (e.g.\n // duplicate mints from a concurrent zero-row backstop race —\n // benign, both keys verify, but selection must be stable).\n order: {\n priority: 'DESC', \n createdAt: 'DESC', \n id: 'ASC', \n },\n });\n\n if (entity) {\n return this.afterLoad(repository, entity);\n }\n\n const total = await repository.countBy({ realmId, use });\n if (total > 0) {\n // an admin who disabled every key meant it — do not silently\n // re-mint around the kill switch.\n throw new AuthupError(\n `No active ${use} key is available for realm ${realmId} ` +\n `(${total} key(s) exist, none active).`,\n );\n }\n\n if (use === JWKUse.ENCRYPTION) {\n return this.createEncryptionKey(repository, realmId);\n }\n\n return this.createSignatureKey(repository, realmId);\n }\n\n async resolveById(id: string): Promise<Key | null> {\n const { repository } = this;\n\n // `id` reaches here from an attacker-controlled JWT `kid` header on the\n // token-verification hot path. A non-UUID value binds against a\n // postgres `uuid` column as a driver-level type error (500) instead of\n // a clean miss — short-circuit to \"not found\" so a garbage kid is a\n // plain verification failure.\n if (!isUUID(id)) {\n return null;\n }\n\n const entity = await repository.findOne({\n select: {\n id: true,\n name: true,\n type: true,\n use: true,\n status: true,\n signatureAlgorithm: true,\n encryptionKey: true,\n decryptionKey: true,\n realmId: true,\n },\n where: { id },\n });\n\n if (!entity) {\n return null;\n }\n\n return this.afterLoad(repository, entity);\n }\n\n protected async createSignatureKey(\n repository: Repository<KeyEntity>,\n realmId: string,\n ) : Promise<Key> {\n const keyPair = await createAsymmetricKeyPair({ name: CryptoAsymmetricAlgorithm.RSASSA_PKCS1_V1_5 });\n\n const privateKeyContainer = new AsymmetricKey(keyPair.privateKey);\n const publicKeyContainer = new AsymmetricKey(keyPair.publicKey);\n\n const material = await privateKeyContainer.toBase64();\n\n const entity = repository.create({\n name: this.generateName(JWKUse.SIGNATURE),\n type: JWKType.RSA,\n use: JWKUse.SIGNATURE,\n status: KeyStatus.ACTIVE,\n decryptionKey: await this.protect(material),\n encryptionKey: await publicKeyContainer.toBase64(),\n realmId,\n signatureAlgorithm: `${JWTAlgorithm.RS256}`,\n });\n\n await repository.save(entity);\n\n // hand the caller usable material regardless of the persisted form.\n entity.decryptionKey = material;\n\n return entity;\n }\n\n protected async createEncryptionKey(\n repository: Repository<KeyEntity>,\n realmId: string,\n ) : Promise<Key> {\n const raw = new Uint8Array(32);\n getRandomValues(raw);\n\n const material = arrayBufferToBase64(raw.buffer);\n\n const entity = repository.create({\n name: this.generateName(JWKUse.ENCRYPTION),\n type: JWKType.OCT,\n use: JWKUse.ENCRYPTION,\n status: KeyStatus.ACTIVE,\n decryptionKey: await this.protect(material),\n encryptionKey: null,\n realmId,\n signatureAlgorithm: null,\n });\n\n await repository.save(entity);\n\n entity.decryptionKey = material;\n\n return entity;\n }\n\n protected generateName(use: `${JWKUse}`) : string {\n return `${use}-${createNanoID(10)}`;\n }\n\n protected async afterLoad(\n repository: Repository<KeyEntity>,\n entity: KeyEntity,\n ) : Promise<Key> {\n if (!entity.decryptionKey) {\n return entity;\n }\n\n if (isWrappedKeyMaterial(entity.decryptionKey)) {\n entity.decryptionKey = await unwrapKeyMaterial(this.secretsCipher, entity.decryptionKey);\n return entity;\n }\n\n if (this.secretsCipher) {\n // lazy wrap-on-read: a KEK added to a running deployment\n // hardens existing rows without a migration step. Best-effort —\n // the material stays readable either way.\n const material = entity.decryptionKey;\n try {\n await repository.update(entity.id, { decryptionKey: await wrapKeyMaterial(this.secretsCipher, material) });\n } catch (e) {\n // Best-effort — the material stays readable and the next read\n // retries. Surface it though: a persistent failure (e.g. a\n // read-only replica) means the row is never hardened at rest.\n this.logger?.warn(`Failed to wrap key material at rest for key ${entity.id}.`, { error: e });\n }\n entity.decryptionKey = material;\n }\n\n return entity;\n }\n\n protected async protect(material: string) : Promise<string> {\n if (!this.secretsCipher) {\n return material;\n }\n\n return wrapKeyMaterial(this.secretsCipher, material);\n }\n\n // ------------------------------------------------------------------\n // IKeyRepository — entity CRUD surface (key management API)\n // ------------------------------------------------------------------\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Key>> {\n const qb = this.repository.createQueryBuilder('keyEntity');\n qb.groupBy('keyEntity.id');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'keyEntity');\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<Key | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Key | null> {\n const where : FindOptionsWhere<KeyEntity> = { name };\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n\n where.realmId = realmId;\n }\n\n return this.repository.findOneBy(where);\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Key | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Key[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Key | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Key>): Key {\n return this.repository.create(data);\n }\n\n merge(entity: Key, data: Partial<Key>): Key {\n return this.repository.merge(entity as KeyEntity, data);\n }\n\n async save(entity: Key): Promise<Key> {\n if (\n entity.decryptionKey &&\n this.secretsCipher &&\n !isWrappedKeyMaterial(entity.decryptionKey)\n ) {\n const material = entity.decryptionKey;\n entity.decryptionKey = await wrapKeyMaterial(this.secretsCipher, material);\n const saved = await this.repository.save(entity as KeyEntity);\n saved.decryptionKey = material;\n return saved;\n }\n\n return this.repository.save(entity as KeyEntity);\n }\n\n async remove(entity: Key): Promise<void> {\n await this.repository.remove(entity as KeyEntity);\n }\n\n async validateJoinColumns(data: Partial<Key>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.dataSource,\n entityTarget: KeyEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Key>, existing?: Key): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.dataSource,\n entityTarget: KeyEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async countBlobReferences(keyId: string): Promise<number> {\n return this.dataSource.getRepository(UserAuthenticatorEntity).countBy({ secret: Like(`${REALM_CIPHER_BLOB_VERSION}.${keyId}.%`) });\n }\n\n async findHighestPriority(realmId: string, use: string): Promise<number | null> {\n return this.repository.maximum('priority', { realmId, use: use as `${JWKUse}` });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"repository.mjs","names":["AuthupError","KeyStatus","arrayBufferToBase64","createNanoID","isUUID","AsymmetricKey","CryptoAsymmetricAlgorithm","createAsymmetricKeyPair","JWKType","JWKUse","JWTAlgorithm","Like","validateEntityJoinColumns","applyQuery","redactFieldConditions","getRandomValues","DatabaseConflictError","KeyEntity","RealmEntity","UserAuthenticatorEntity","REALM_CIPHER_BLOB_VERSION","isWrappedKeyMaterial","unwrapKeyMaterial","wrapKeyMaterial","applyRealmScopeSelect","isEntityUnique","translateWhereConditions","RealmRepositoryAdapter","KeyRepositoryAdapter","dataSource","secretsCipher","realmRepository","logger","options","getRepository","repository","resolveOrCreate","realmId","use","entity","findOne","select","id","name","type","status","signatureAlgorithm","encryptionKey","decryptionKey","where","ACTIVE","order","priority","createdAt","afterLoad","total","countBy","ENCRYPTION","createEncryptionKey","createSignatureKey","resolveById","keyPair","RSASSA_PKCS1_V1_5","privateKeyContainer","privateKey","publicKeyContainer","publicKey","material","toBase64","create","generateName","SIGNATURE","RSA","protect","RS256","save","raw","Uint8Array","buffer","OCT","update","e","warn","error","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","getManyAndCount","data","meta","findOneById","findOneBy","findOneByName","realmKey","resolveId","findOneByIdOrName","idOrName","realm","findManyBy","findBy","merge","saved","remove","validateJoinColumns","entityTarget","checkUniqueness","existing","isUnique","entityExisting","countBlobReferences","keyId","secret","findHighestPriority","maximum"],"sources":["../../../../../../src/app/modules/database/repositories/key/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { AuthupError } from '@authup/errors';\nimport type { IQuery } from '@rapiq/core';\nimport type { Key } from '@authup/core-kit';\nimport { KeyStatus } from '@authup/core-kit';\nimport { arrayBufferToBase64, createNanoID, isUUID } from '@authup/kit';\nimport {\n AsymmetricKey,\n CryptoAsymmetricAlgorithm,\n type EntityRepositoryFindManyResult,\n type ISymmetricCipher,\n type Logger,\n createAsymmetricKeyPair,\n} from '@authup/server-kit';\nimport { JWKType, JWKUse, JWTAlgorithm } from '@authup/specs';\nimport type { DataSource, FindOptionsWhere, Repository } from 'typeorm';\nimport { Like } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport { getRandomValues } from 'uncrypto';\nimport {\n DatabaseConflictError,\n KeyEntity,\n RealmEntity,\n UserAuthenticatorEntity,\n} from '../../../../../adapters/database/index.ts';\nimport type { IKeyRepository, IKeyStore, IRealmRepository } from '../../../../../core/index.ts';\nimport {\n REALM_CIPHER_BLOB_VERSION,\n isWrappedKeyMaterial,\n unwrapKeyMaterial,\n wrapKeyMaterial,\n} from '../../../../../core/index.ts';\nimport { applyRealmScopeSelect, isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type KeyRepositoryAdapterOptions = {\n /**\n * Optional KEK (config secretsEncryptionKey) — when present, key\n * material is persisted wrapped and unwrapped transparently on read.\n */\n secretsCipher?: ISymmetricCipher | null,\n logger?: Logger,\n};\n\n/**\n * One adapter, two ports: the entity CRUD surface (IKeyRepository) for the\n * key management API and the material-resolving store (IKeyStore) for the\n * signer / verifier / realm cipher. Entity reads never select\n * decryptionKey; only the IKeyStore surface hands out (unwrapped) material.\n */\nexport class KeyRepositoryAdapter implements IKeyRepository, IKeyStore {\n protected dataSource : DataSource;\n\n protected secretsCipher : ISymmetricCipher | null;\n\n protected realmRepository : IRealmRepository;\n\n protected logger? : Logger;\n\n constructor(dataSource: DataSource, options: KeyRepositoryAdapterOptions = {}) {\n this.dataSource = dataSource;\n this.secretsCipher = options.secretsCipher ?? null;\n this.logger = options.logger;\n this.realmRepository = new RealmRepositoryAdapter(dataSource.getRepository(RealmEntity));\n }\n\n protected get repository() : Repository<KeyEntity> {\n return this.dataSource.getRepository(KeyEntity);\n }\n\n // ------------------------------------------------------------------\n // IKeyStore — material resolution (signer / verifier / realm cipher)\n // ------------------------------------------------------------------\n\n async resolveOrCreate(realmId: string, use: `${JWKUse}`): Promise<Key> {\n const { repository } = this;\n\n const entity = await repository.findOne({\n select: {\n id: true,\n name: true,\n type: true,\n use: true,\n status: true,\n signatureAlgorithm: true,\n encryptionKey: true,\n decryptionKey: true,\n realmId: true,\n },\n where: {\n realmId,\n use,\n status: KeyStatus.ACTIVE,\n },\n // createdAt + id break priority ties deterministically (e.g.\n // duplicate mints from a concurrent zero-row backstop race —\n // benign, both keys verify, but selection must be stable).\n order: {\n priority: 'DESC', \n createdAt: 'DESC', \n id: 'ASC', \n },\n });\n\n if (entity) {\n return this.afterLoad(repository, entity);\n }\n\n const total = await repository.countBy({ realmId, use });\n if (total > 0) {\n // an admin who disabled every key meant it — do not silently\n // re-mint around the kill switch.\n throw new AuthupError(\n `No active ${use} key is available for realm ${realmId} ` +\n `(${total} key(s) exist, none active).`,\n );\n }\n\n if (use === JWKUse.ENCRYPTION) {\n return this.createEncryptionKey(repository, realmId);\n }\n\n return this.createSignatureKey(repository, realmId);\n }\n\n async resolveById(id: string): Promise<Key | null> {\n const { repository } = this;\n\n // `id` reaches here from an attacker-controlled JWT `kid` header on the\n // token-verification hot path. A non-UUID value binds against a\n // postgres `uuid` column as a driver-level type error (500) instead of\n // a clean miss — short-circuit to \"not found\" so a garbage kid is a\n // plain verification failure.\n if (!isUUID(id)) {\n return null;\n }\n\n const entity = await repository.findOne({\n select: {\n id: true,\n name: true,\n type: true,\n use: true,\n status: true,\n signatureAlgorithm: true,\n encryptionKey: true,\n decryptionKey: true,\n realmId: true,\n },\n where: { id },\n });\n\n if (!entity) {\n return null;\n }\n\n return this.afterLoad(repository, entity);\n }\n\n protected async createSignatureKey(\n repository: Repository<KeyEntity>,\n realmId: string,\n ) : Promise<Key> {\n const keyPair = await createAsymmetricKeyPair({ name: CryptoAsymmetricAlgorithm.RSASSA_PKCS1_V1_5 });\n\n const privateKeyContainer = new AsymmetricKey(keyPair.privateKey);\n const publicKeyContainer = new AsymmetricKey(keyPair.publicKey);\n\n const material = await privateKeyContainer.toBase64();\n\n const entity = repository.create({\n name: this.generateName(JWKUse.SIGNATURE),\n type: JWKType.RSA,\n use: JWKUse.SIGNATURE,\n status: KeyStatus.ACTIVE,\n decryptionKey: await this.protect(material),\n encryptionKey: await publicKeyContainer.toBase64(),\n realmId,\n signatureAlgorithm: `${JWTAlgorithm.RS256}`,\n });\n\n await repository.save(entity);\n\n // hand the caller usable material regardless of the persisted form.\n entity.decryptionKey = material;\n\n return entity;\n }\n\n protected async createEncryptionKey(\n repository: Repository<KeyEntity>,\n realmId: string,\n ) : Promise<Key> {\n const raw = new Uint8Array(32);\n getRandomValues(raw);\n\n const material = arrayBufferToBase64(raw.buffer);\n\n const entity = repository.create({\n name: this.generateName(JWKUse.ENCRYPTION),\n type: JWKType.OCT,\n use: JWKUse.ENCRYPTION,\n status: KeyStatus.ACTIVE,\n decryptionKey: await this.protect(material),\n encryptionKey: null,\n realmId,\n signatureAlgorithm: null,\n });\n\n await repository.save(entity);\n\n entity.decryptionKey = material;\n\n return entity;\n }\n\n protected generateName(use: `${JWKUse}`) : string {\n return `${use}-${createNanoID(10)}`;\n }\n\n protected async afterLoad(\n repository: Repository<KeyEntity>,\n entity: KeyEntity,\n ) : Promise<Key> {\n if (!entity.decryptionKey) {\n return entity;\n }\n\n if (isWrappedKeyMaterial(entity.decryptionKey)) {\n entity.decryptionKey = await unwrapKeyMaterial(this.secretsCipher, entity.decryptionKey);\n return entity;\n }\n\n if (this.secretsCipher) {\n // lazy wrap-on-read: a KEK added to a running deployment\n // hardens existing rows without a migration step. Best-effort —\n // the material stays readable either way.\n const material = entity.decryptionKey;\n try {\n await repository.update(entity.id, { decryptionKey: await wrapKeyMaterial(this.secretsCipher, material) });\n } catch (e) {\n // Best-effort — the material stays readable and the next read\n // retries. Surface it though: a persistent failure (e.g. a\n // read-only replica) means the row is never hardened at rest.\n this.logger?.warn(`Failed to wrap key material at rest for key ${entity.id}.`, { error: e });\n }\n entity.decryptionKey = material;\n }\n\n return entity;\n }\n\n protected async protect(material: string) : Promise<string> {\n if (!this.secretsCipher) {\n return material;\n }\n\n return wrapKeyMaterial(this.secretsCipher, material);\n }\n\n // ------------------------------------------------------------------\n // IKeyRepository — entity CRUD surface (key management API)\n // ------------------------------------------------------------------\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Key>> {\n const qb = this.repository.createQueryBuilder('keyEntity');\n qb.groupBy('keyEntity.id');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'keyEntity');\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<Key | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Key | null> {\n const where : FindOptionsWhere<KeyEntity> = { name };\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n\n where.realmId = realmId;\n }\n\n return this.repository.findOneBy(where);\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Key | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Key[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Key | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Key>): Key {\n return this.repository.create(data);\n }\n\n merge(entity: Key, data: Partial<Key>): Key {\n return this.repository.merge(entity as KeyEntity, data);\n }\n\n async save(entity: Key): Promise<Key> {\n if (\n entity.decryptionKey &&\n this.secretsCipher &&\n !isWrappedKeyMaterial(entity.decryptionKey)\n ) {\n const material = entity.decryptionKey;\n entity.decryptionKey = await wrapKeyMaterial(this.secretsCipher, material);\n const saved = await this.repository.save(entity as KeyEntity);\n saved.decryptionKey = material;\n return saved;\n }\n\n return this.repository.save(entity as KeyEntity);\n }\n\n async remove(entity: Key): Promise<void> {\n await this.repository.remove(entity as KeyEntity);\n }\n\n async validateJoinColumns(data: Partial<Key>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.dataSource,\n entityTarget: KeyEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Key>, existing?: Key): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.dataSource,\n entityTarget: KeyEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async countBlobReferences(keyId: string): Promise<number> {\n return this.dataSource.getRepository(UserAuthenticatorEntity).countBy({ secret: Like(`${REALM_CIPHER_BLOB_VERSION}.${keyId}.%`) });\n }\n\n async findHighestPriority(realmId: string, use: string): Promise<number | null> {\n return this.repository.maximum('priority', { realmId, use: use as `${JWKUse}` });\n }\n}\n"],"mappings":"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"}
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { PermissionEntity } from "../../../../../adapters/database/domains/permission/entity.mjs";
5
5
  import "../../../../../adapters/database/domains/index.mjs";
6
- import { applyQuery } from "../query.mjs";
6
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
7
7
  import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
8
8
  import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
9
9
  import "../../../../../adapters/database/index.mjs";
@@ -24,7 +24,7 @@ var PermissionRepositoryAdapter = class {
24
24
  const { pagination } = applyQuery(qb, query);
25
25
  const [entities, total] = await qb.getManyAndCount();
26
26
  return {
27
- data: entities,
27
+ data: redactFieldConditions(query, entities),
28
28
  meta: {
29
29
  total,
30
30
  ...pagination
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["isUUID","validateEntityJoinColumns","applyQuery","DatabaseConflictError","isEntityUnique","translateWhereConditions","PermissionEntity","RealmRepositoryAdapter","PermissionRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","result","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting"],"sources":["../../../../../../src/app/modules/database/repositories/permission/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Permission, Realm } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPermissionRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { PermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PermissionRepositoryAdapterContext = {\n repository: Repository<Permission>,\n realmRepository: Repository<Realm>,\n};\n\nexport class PermissionRepositoryAdapter implements IPermissionRepository {\n private readonly repository: Repository<Permission>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PermissionRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Permission>> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.groupBy('permission.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Permission | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Permission | null> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.where('permission.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('permission.realmId = :realmId', { realmId });\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Permission | null> {\n const result = isUUID(idOrName) ?\n await this.findOneById(idOrName) :\n await this.findOneByName(idOrName, realm);\n\n return result;\n }\n\n async findManyBy(where: Record<string, any>): Promise<Permission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Permission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Permission>): Permission {\n return this.repository.create(data);\n }\n\n merge(entity: Permission, data: Partial<Permission>): Permission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Permission): Promise<Permission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Permission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Permission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Permission>, existing?: Permission): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,IAAaQ,8BAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAyC;EACjD,KAAKF,aAAaE,IAAIF;EACtB,KAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,eAAe;CACzE;CAEA,MAAME,SAASC,OAAoE;EAC/E,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,YAAA;EAC9CD,GAAGE,QAAQ,eAAA;EAEX,MAAM,EAAEC,eAAef,WAAWY,IAAID,KAAAA;EAEtC,MAAM,CAACK,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAAwC;EAChD,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,cAAcC,MAAcC,UAA+C;EAC7E,MAAMd,KAAK,KAAKL,WAAWM,mBAAmB,YAAA;EAC9CD,GAAGe,MAAM,2BAA2B,EAAEF,KAAK,CAAA;EAE3C,IAAIC,UAAU;GACV,MAAME,UAAU,MAAM,KAAKpB,gBAAgBqB,UAAUH,QAAAA;GACrD,IAAI,CAACE,SACD,OAAO;GAEXhB,GAAGkB,SAAS,iCAAiC,EAAEF,QAAQ,CAAA;EAC3D;EAEA,OAAOhB,GAAGmB,OAAM;CACpB;CAEA,MAAMC,kBAAkBC,UAAkBC,OAA4C;EAKlF,OAJepC,OAAOmC,QAAAA,IAClB,MAAM,KAAKZ,YAAYY,QAAAA,IACvB,MAAM,KAAKT,cAAcS,UAAUC,KAAAA;CAG3C;CAEA,MAAME,WAAWT,OAAmD;EAChE,OAAO,KAAKpB,WAAW8B,OAAOlC,yBAAyBwB,KAAAA,CAAAA;CAC3D;CAEA,MAAMJ,UAAUI,OAAwD;EACpE,OAAO,KAAKpB,WAAWgB,UAAUpB,yBAAyBwB,KAAAA,CAAAA;CAC9D;CAEAW,OAAOnB,MAAuC;EAC1C,OAAO,KAAKZ,WAAW+B,OAAOnB,IAAAA;CAClC;CAEAoB,MAAMC,QAAoBrB,MAAuC;EAC7D,OAAO,KAAKZ,WAAWgC,MAAMC,QAAQrB,IAAAA;CACzC;CAEA,MAAMsB,KAAKD,QAAyC;EAChD,OAAO,KAAKjC,WAAWkC,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAAmC;EAC5C,MAAM,KAAKjC,WAAWmC,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBxB,MAA0C;EAChE,MAAMpB,0BAA0BoB,MAAM;GAClCyB,YAAY,KAAKrC,WAAWsC,QAAQC;GACpCC,cAAc3C;EAClB,CAAA;CACJ;CAEA,MAAM4C,gBAAgB7B,MAA2B8B,UAAsC;EAQnF,IAAI,CAACC,MAPkBhD,eAAe;GAClC0C,YAAY,KAAKrC,WAAWsC,QAAQC;GACpCC,cAAc3C;GACdoC,QAAQrB;GACRgC,gBAAgBF;EACpB,CAAA,GAGI,MAAM,IAAIhD,sBAAAA;CAElB;AACJ"}
1
+ {"version":3,"file":"repository.mjs","names":["isUUID","validateEntityJoinColumns","applyQuery","redactFieldConditions","DatabaseConflictError","isEntityUnique","translateWhereConditions","PermissionEntity","RealmRepositoryAdapter","PermissionRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","result","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting"],"sources":["../../../../../../src/app/modules/database/repositories/permission/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Permission, Realm } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPermissionRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { PermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PermissionRepositoryAdapterContext = {\n repository: Repository<Permission>,\n realmRepository: Repository<Realm>,\n};\n\nexport class PermissionRepositoryAdapter implements IPermissionRepository {\n private readonly repository: Repository<Permission>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PermissionRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Permission>> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.groupBy('permission.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Permission | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Permission | null> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.where('permission.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('permission.realmId = :realmId', { realmId });\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Permission | null> {\n const result = isUUID(idOrName) ?\n await this.findOneById(idOrName) :\n await this.findOneByName(idOrName, realm);\n\n return result;\n }\n\n async findManyBy(where: Record<string, any>): Promise<Permission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Permission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Permission>): Permission {\n return this.repository.create(data);\n }\n\n merge(entity: Permission, data: Partial<Permission>): Permission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Permission): Promise<Permission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Permission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Permission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Permission>, existing?: Permission): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAyBA,IAAaS,8BAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAyC;EACjD,KAAKF,aAAaE,IAAIF;EACtB,KAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,eAAe;CACzE;CAEA,MAAME,SAASC,OAAoE;EAC/E,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,YAAA;EAC9CD,GAAGE,QAAQ,eAAA;EAEX,MAAM,EAAEC,eAAehB,WAAWa,IAAID,KAAAA;EAEtC,MAAM,CAACK,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMnB,sBAAsBW,OAAOK,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAAwC;EAChD,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,cAAcC,MAAcC,UAA+C;EAC7E,MAAMd,KAAK,KAAKL,WAAWM,mBAAmB,YAAA;EAC9CD,GAAGe,MAAM,2BAA2B,EAAEF,KAAK,CAAA;EAE3C,IAAIC,UAAU;GACV,MAAME,UAAU,MAAM,KAAKpB,gBAAgBqB,UAAUH,QAAAA;GACrD,IAAI,CAACE,SACD,OAAO;GAEXhB,GAAGkB,SAAS,iCAAiC,EAAEF,QAAQ,CAAA;EAC3D;EAEA,OAAOhB,GAAGmB,OAAM;CACpB;CAEA,MAAMC,kBAAkBC,UAAkBC,OAA4C;EAKlF,OAJerC,OAAOoC,QAAAA,IAClB,MAAM,KAAKZ,YAAYY,QAAAA,IACvB,MAAM,KAAKT,cAAcS,UAAUC,KAAAA;CAG3C;CAEA,MAAME,WAAWT,OAAmD;EAChE,OAAO,KAAKpB,WAAW8B,OAAOlC,yBAAyBwB,KAAAA,CAAAA;CAC3D;CAEA,MAAMJ,UAAUI,OAAwD;EACpE,OAAO,KAAKpB,WAAWgB,UAAUpB,yBAAyBwB,KAAAA,CAAAA;CAC9D;CAEAW,OAAOnB,MAAuC;EAC1C,OAAO,KAAKZ,WAAW+B,OAAOnB,IAAAA;CAClC;CAEAoB,MAAMC,QAAoBrB,MAAuC;EAC7D,OAAO,KAAKZ,WAAWgC,MAAMC,QAAQrB,IAAAA;CACzC;CAEA,MAAMsB,KAAKD,QAAyC;EAChD,OAAO,KAAKjC,WAAWkC,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAAmC;EAC5C,MAAM,KAAKjC,WAAWmC,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBxB,MAA0C;EAChE,MAAMrB,0BAA0BqB,MAAM;GAClCyB,YAAY,KAAKrC,WAAWsC,QAAQC;GACpCC,cAAc3C;EAClB,CAAA;CACJ;CAEA,MAAM4C,gBAAgB7B,MAA2B8B,UAAsC;EAQnF,IAAI,CAACC,MAPkBhD,eAAe;GAClC0C,YAAY,KAAKrC,WAAWsC,QAAQC;GACpCC,cAAc3C;GACdoC,QAAQrB;GACRgC,gBAAgBF;EACpB,CAAA,GAGI,MAAM,IAAIhD,sBAAAA;CAElB;AACJ"}
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { PermissionPolicyEntity } from "../../../../../adapters/database/domains/permission-policy/entity.mjs";
5
5
  import "../../../../../adapters/database/domains/index.mjs";
6
- import { applyQuery } from "../query.mjs";
6
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
7
7
  import { translateWhereConditions } from "../helpers.mjs";
8
8
  import { validateEntityJoinColumns } from "typeorm-extension";
9
9
  //#region src/app/modules/database/repositories/permission-policy/repository.ts
@@ -18,7 +18,7 @@ var PermissionPolicyRepositoryAdapter = class {
18
18
  const { pagination } = applyQuery(qb, query);
19
19
  const [entities, total] = await qb.getManyAndCount();
20
20
  return {
21
- data: entities,
21
+ data: redactFieldConditions(query, entities),
22
22
  meta: {
23
23
  total,
24
24
  ...pagination
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["validateEntityJoinColumns","applyQuery","PermissionPolicyEntity","translateWhereConditions","PermissionPolicyRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget"],"sources":["../../../../../../src/app/modules/database/repositories/permission-policy/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPermissionPolicyRepository } from '../../../../../core/index.ts';\nimport { PermissionPolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class PermissionPolicyRepositoryAdapter implements IPermissionPolicyRepository {\n private readonly repository: Repository<PermissionPolicy>;\n\n constructor(repository: Repository<PermissionPolicy>) {\n this.repository = repository;\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<PermissionPolicy>> {\n const qb = this.repository.createQueryBuilder('permissionPolicy');\n qb.groupBy('permissionPolicy.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<PermissionPolicy | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<PermissionPolicy | null> {\n return null;\n }\n\n findOneByIdOrName(idOrName: string): Promise<PermissionPolicy | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<PermissionPolicy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<PermissionPolicy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<PermissionPolicy>): PermissionPolicy {\n return this.repository.create(data);\n }\n\n merge(entity: PermissionPolicy, data: Partial<PermissionPolicy>): PermissionPolicy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: PermissionPolicy): Promise<PermissionPolicy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: PermissionPolicy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<PermissionPolicy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionPolicyEntity,\n });\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaI,oCAAb,MAAaA;CACQC;CAEjB,YAAYA,YAA0C;EAClD,KAAKA,aAAaA;CACtB;CAEA,MAAMC,SAASC,OAA0E;EACrF,MAAMC,KAAK,KAAKH,WAAWI,mBAAmB,kBAAA;EAC9CD,GAAGE,QAAQ,qBAAA;EAEX,MAAM,EAAEC,eAAeV,WAAWO,IAAID,KAAAA;EAEtC,MAAM,CAACK,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAA8C;EACtD,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,gBAAkD;EACpD,OAAO;CACX;CAEAC,kBAAkBC,UAAoD;EAClE,OAAO,KAAKL,YAAYK,QAAAA;CAC5B;CAEA,MAAMC,WAAWC,OAAyD;EACtE,OAAO,KAAKnB,WAAWoB,OAAOtB,yBAAyBqB,KAAAA,CAAAA;CAC3D;CAEA,MAAML,UAAUK,OAA8D;EAC1E,OAAO,KAAKnB,WAAWc,UAAUhB,yBAAyBqB,KAAAA,CAAAA;CAC9D;CAEAE,OAAOX,MAAmD;EACtD,OAAO,KAAKV,WAAWqB,OAAOX,IAAAA;CAClC;CAEAY,MAAMC,QAA0Bb,MAAmD;EAC/E,OAAO,KAAKV,WAAWsB,MAAMC,QAAQb,IAAAA;CACzC;CAEA,MAAMc,KAAKD,QAAqD;EAC5D,OAAO,KAAKvB,WAAWwB,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAAyC;EAClD,MAAM,KAAKvB,WAAWyB,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBhB,MAAgD;EACtE,MAAMf,0BAA0Be,MAAM;GAClCiB,YAAY,KAAK3B,WAAW4B,QAAQC;GACpCC,cAAcjC;EAClB,CAAA;CACJ;AACJ"}
1
+ {"version":3,"file":"repository.mjs","names":["validateEntityJoinColumns","applyQuery","redactFieldConditions","PermissionPolicyEntity","translateWhereConditions","PermissionPolicyRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget"],"sources":["../../../../../../src/app/modules/database/repositories/permission-policy/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { PermissionPolicy } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPermissionPolicyRepository } from '../../../../../core/index.ts';\nimport { PermissionPolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class PermissionPolicyRepositoryAdapter implements IPermissionPolicyRepository {\n private readonly repository: Repository<PermissionPolicy>;\n\n constructor(repository: Repository<PermissionPolicy>) {\n this.repository = repository;\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<PermissionPolicy>> {\n const qb = this.repository.createQueryBuilder('permissionPolicy');\n qb.groupBy('permissionPolicy.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<PermissionPolicy | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<PermissionPolicy | null> {\n return null;\n }\n\n findOneByIdOrName(idOrName: string): Promise<PermissionPolicy | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<PermissionPolicy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<PermissionPolicy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<PermissionPolicy>): PermissionPolicy {\n return this.repository.create(data);\n }\n\n merge(entity: PermissionPolicy, data: Partial<PermissionPolicy>): PermissionPolicy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: PermissionPolicy): Promise<PermissionPolicy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: PermissionPolicy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<PermissionPolicy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionPolicyEntity,\n });\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaK,oCAAb,MAAaA;CACQC;CAEjB,YAAYA,YAA0C;EAClD,KAAKA,aAAaA;CACtB;CAEA,MAAMC,SAASC,OAA0E;EACrF,MAAMC,KAAK,KAAKH,WAAWI,mBAAmB,kBAAA;EAC9CD,GAAGE,QAAQ,qBAAA;EAEX,MAAM,EAAEC,eAAeX,WAAWQ,IAAID,KAAAA;EAEtC,MAAM,CAACK,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMd,sBAAsBM,OAAOK,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAA8C;EACtD,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,gBAAkD;EACpD,OAAO;CACX;CAEAC,kBAAkBC,UAAoD;EAClE,OAAO,KAAKL,YAAYK,QAAAA;CAC5B;CAEA,MAAMC,WAAWC,OAAyD;EACtE,OAAO,KAAKnB,WAAWoB,OAAOtB,yBAAyBqB,KAAAA,CAAAA;CAC3D;CAEA,MAAML,UAAUK,OAA8D;EAC1E,OAAO,KAAKnB,WAAWc,UAAUhB,yBAAyBqB,KAAAA,CAAAA;CAC9D;CAEAE,OAAOX,MAAmD;EACtD,OAAO,KAAKV,WAAWqB,OAAOX,IAAAA;CAClC;CAEAY,MAAMC,QAA0Bb,MAAmD;EAC/E,OAAO,KAAKV,WAAWsB,MAAMC,QAAQb,IAAAA;CACzC;CAEA,MAAMc,KAAKD,QAAqD;EAC5D,OAAO,KAAKvB,WAAWwB,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAAyC;EAClD,MAAM,KAAKvB,WAAWyB,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBhB,MAAgD;EACtE,MAAMhB,0BAA0BgB,MAAM;GAClCiB,YAAY,KAAK3B,WAAW4B,QAAQC;GACpCC,cAAcjC;EAClB,CAAA;CACJ;AACJ"}
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { PolicyEntity } from "../../../../../adapters/database/domains/policy/entity.mjs";
5
5
  import "../../../../../adapters/database/domains/index.mjs";
6
- import { applyQuery } from "../query.mjs";
6
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
7
7
  import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
8
8
  import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
9
9
  import "../../../../../adapters/database/index.mjs";
@@ -25,7 +25,7 @@ var PolicyRepositoryAdapter = class {
25
25
  const [entities, total] = await qb.getManyAndCount();
26
26
  await this.repository.extendManyWithEA(entities);
27
27
  return {
28
- data: entities,
28
+ data: redactFieldConditions(query, entities),
29
29
  meta: {
30
30
  total,
31
31
  ...pagination
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["isUUID","validateEntityJoinColumns","applyQuery","DatabaseConflictError","PolicyEntity","isEntityUnique","translateWhereConditions","RealmRepositoryAdapter","PolicyRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","findManyBy","findBy","create","merge","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","saveWithEA","saveOneWithEA","updateClosureTable","deleteFromTree","treeRepository","getTreeRepository"],"sources":["../../../../../../src/app/modules/database/repositories/policy/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Policy, Realm } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPolicyRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { PolicyRepository } from '../../../../../adapters/database/domains/index.ts';\nimport { PolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PolicyRepositoryAdapterContext = {\n repository: PolicyRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class PolicyRepositoryAdapter implements IPolicyRepository {\n private readonly repository: PolicyRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PolicyRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Policy>> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.groupBy('policy.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<Policy | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Policy | null> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.where('policy.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('policy.realmId = :realmId', { realmId });\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Policy | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Policy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Policy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Policy>): Policy {\n return this.repository.create(data);\n }\n\n merge(entity: Policy, data: Partial<Policy>): Policy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Policy): Promise<Policy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Policy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Policy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Policy>, existing?: Policy): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async saveWithEA(entity: Policy, data?: Record<string, any>): Promise<Policy> {\n await this.repository.saveOneWithEA(entity, data);\n await this.repository.updateClosureTable(entity, this.repository.manager);\n\n return entity;\n }\n\n async deleteFromTree(entity: Policy): Promise<void> {\n const treeRepository = this.repository.manager.connection.getTreeRepository(PolicyEntity);\n await treeRepository.remove(entity);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"repository.mjs","names":["isUUID","validateEntityJoinColumns","applyQuery","redactFieldConditions","DatabaseConflictError","PolicyEntity","isEntityUnique","translateWhereConditions","RealmRepositoryAdapter","PolicyRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","findManyBy","findBy","create","merge","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","saveWithEA","saveOneWithEA","updateClosureTable","deleteFromTree","treeRepository","getTreeRepository"],"sources":["../../../../../../src/app/modules/database/repositories/policy/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Policy, Realm } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IPolicyRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { PolicyRepository } from '../../../../../adapters/database/domains/index.ts';\nimport { PolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PolicyRepositoryAdapterContext = {\n repository: PolicyRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class PolicyRepositoryAdapter implements IPolicyRepository {\n private readonly repository: PolicyRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PolicyRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Policy>> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.groupBy('policy.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<Policy | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Policy | null> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.where('policy.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('policy.realmId = :realmId', { realmId });\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Policy | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Policy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Policy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Policy>): Policy {\n return this.repository.create(data);\n }\n\n merge(entity: Policy, data: Partial<Policy>): Policy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Policy): Promise<Policy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Policy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Policy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Policy>, existing?: Policy): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async saveWithEA(entity: Policy, data?: Record<string, any>): Promise<Policy> {\n await this.repository.saveOneWithEA(entity, data);\n await this.repository.updateClosureTable(entity, this.repository.manager);\n\n return entity;\n }\n\n async deleteFromTree(entity: Policy): Promise<void> {\n const treeRepository = this.repository.manager.connection.getTreeRepository(PolicyEntity);\n await treeRepository.remove(entity);\n }\n}\n"],"mappings":";;;;;;;;;;;;;AA0BA,IAAaS,0BAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAqC;EAC7C,KAAKF,aAAaE,IAAIF;EACtB,KAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,eAAe;CACzE;CAEA,MAAME,SAASC,OAAgE;EAC3E,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,QAAA;EAC9CD,GAAGE,QAAQ,WAAA;EAEX,MAAM,EAAEC,eAAehB,WAAWa,IAAID,KAAAA;EAEtC,MAAM,CAACK,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAClD,MAAM,KAAKX,WAAWY,iBAAiBH,QAAAA;EAEvC,OAAO;GACHI,MAAMpB,sBAAsBW,OAAOK,QAAAA;GACnCK,MAAM;IACFJ;IACA,GAAGF;GACP;EACJ;CACJ;CAEA,MAAMO,YAAYC,IAAoC;EAClD,MAAMC,SAAS,MAAM,KAAKC,UAAU,EAAEF,GAAG,CAAA;EACzC,IAAIC,QACA,MAAM,KAAKjB,WAAWmB,gBAAgBF,MAAAA;EAE1C,OAAOA;CACX;CAEA,MAAMG,cAAcC,MAAcC,UAA2C;EACzE,MAAMjB,KAAK,KAAKL,WAAWM,mBAAmB,QAAA;EAC9CD,GAAGkB,MAAM,uBAAuB,EAAEF,KAAK,CAAA;EAEvC,IAAIC,UAAU;GACV,MAAME,UAAU,MAAM,KAAKvB,gBAAgBwB,UAAUH,QAAAA;GACrD,IAAI,CAACE,SACD,OAAO;GAEXnB,GAAGqB,SAAS,6BAA6B,EAAEF,QAAQ,CAAA;EACvD;EAEA,MAAMP,SAAS,MAAMZ,GAAGsB,OAAM;EAC9B,IAAIV,QACA,MAAM,KAAKjB,WAAWmB,gBAAgBF,MAAAA;EAE1C,OAAOA;CACX;CAEA,MAAMW,kBAAkBC,UAAkBC,OAAwC;EAC9E,OAAOxC,OAAOuC,QAAAA,IACV,KAAKd,YAAYc,QAAAA,IACjB,KAAKT,cAAcS,UAAUC,KAAAA;CACrC;CAEA,MAAMC,WAAWR,OAA+C;EAC5D,OAAO,KAAKvB,WAAWgC,OAAOnC,yBAAyB0B,KAAAA,CAAAA;CAC3D;CAEA,MAAML,UAAUK,OAAoD;EAChE,OAAO,KAAKvB,WAAWkB,UAAUrB,yBAAyB0B,KAAAA,CAAAA;CAC9D;CAEAU,OAAOpB,MAA+B;EAClC,OAAO,KAAKb,WAAWiC,OAAOpB,IAAAA;CAClC;CAEAqB,MAAMjB,QAAgBJ,MAA+B;EACjD,OAAO,KAAKb,WAAWkC,MAAMjB,QAAQJ,IAAAA;CACzC;CAEA,MAAMsB,KAAKlB,QAAiC;EACxC,OAAO,KAAKjB,WAAWmC,KAAKlB,MAAAA;CAChC;CAEA,MAAMmB,OAAOnB,QAA+B;EACxC,MAAM,KAAKjB,WAAWoC,OAAOnB,MAAAA;CACjC;CAEA,MAAMoB,oBAAoBxB,MAAsC;EAC5D,MAAMtB,0BAA0BsB,MAAM;GAClCyB,YAAY,KAAKtC,WAAWuC,QAAQC;GACpCC,cAAc9C;EAClB,CAAA;CACJ;CAEA,MAAM+C,gBAAgB7B,MAAuB8B,UAAkC;EAQ3E,IAAI,CAACC,MAPkBhD,eAAe;GAClC0C,YAAY,KAAKtC,WAAWuC,QAAQC;GACpCC,cAAc9C;GACdsB,QAAQJ;GACRgC,gBAAgBF;EACpB,CAAA,GAGI,MAAM,IAAIjD,sBAAAA;CAElB;CAEA,MAAMoD,WAAW7B,QAAgBJ,MAA6C;EAC1E,MAAM,KAAKb,WAAW+C,cAAc9B,QAAQJ,IAAAA;EAC5C,MAAM,KAAKb,WAAWgD,mBAAmB/B,QAAQ,KAAKjB,WAAWuC,OAAO;EAExE,OAAOtB;CACX;CAEA,MAAMgC,eAAehC,QAA+B;EAEhD,MADuB,KAAKjB,WAAWuC,QAAQC,WAAWW,kBAAkBxD,YACtEuD,CAAAA,CAAed,OAAOnB,MAAAA;CAChC;AACJ"}
@@ -11,8 +11,28 @@ import type { EntityRepositoryPaginationMeta } from '@authup/server-kit';
11
11
  * Joins triggered by the parsed relations replicate the DISTINCT-id
12
12
  * pattern: when the builder already groups by the root id, every join
13
13
  * contributes its own `GROUP BY <alias>.id`.
14
+ *
15
+ * Field visibility conditions (`IField.condition`, attached by a
16
+ * schema `fields.validateMany` gate) cannot go into the statement — a
17
+ * TypeORM selection must stay a bare column for entity hydration.
18
+ * The adapter projects the gated column unconditionally and
19
+ * force-selects every column its condition reads (rapiq#830's operand
20
+ * projection — the SQL counterpart of the plan-039 force-select
21
+ * discipline, so a sparse replace-projection can neither over-redact
22
+ * nor fail open on missing operands); the fetching adapter MUST then
23
+ * run the rows through `redactFieldConditions` before returning them.
14
24
  */
15
25
  export declare function applyQuery(queryBuilder: SelectQueryBuilder<any>, query?: IQuery): {
16
26
  pagination: EntityRepositoryPaginationMeta;
17
27
  };
28
+ /**
29
+ * Enforce the field visibility conditions of a decoded query on
30
+ * already-fetched rows: a gated column is dropped from every row that
31
+ * fails its condition; no row is ever removed. The SQL execution path
32
+ * projects gated columns unconditionally, so EVERY `findMany` adapter
33
+ * must pass its fetched entities through this before returning them —
34
+ * enforcement is fail-open by construction (a skipped call ships the
35
+ * value). Condition-less queries pass through untouched.
36
+ */
37
+ export declare function redactFieldConditions<T>(query: IQuery | undefined, data: T[]): T[];
18
38
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/query.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEzE;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CACtB,YAAY,EAAE,kBAAkB,CAAC,GAAG,CAAC,EACrC,KAAK,CAAC,EAAE,MAAM,GACd;IAAE,UAAU,EAAE,8BAA8B,CAAA;CAAE,CAejD"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/query.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,oBAAoB,CAAC;AAEzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,UAAU,CACtB,YAAY,EAAE,kBAAkB,CAAC,GAAG,CAAC,EACrC,KAAK,CAAC,EAAE,MAAM,GACd;IAAE,UAAU,EAAE,8BAA8B,CAAA;CAAE,CAejD;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC,EAAE,GAAI,CAAC,EAAE,CAMnF"}
@@ -1,8 +1,9 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
- import { Query } from "@rapiq/core";
5
- import { TypeormAdapter } from "@rapiq/typeorm";
4
+ import { Query, hasFieldConditions } from "@rapiq/core";
5
+ import { applyFieldConditions } from "@rapiq/adapter-memory";
6
+ import { TypeormAdapter } from "@rapiq/adapter-typeorm";
6
7
  //#region src/app/modules/database/repositories/query.ts
7
8
  /**
8
9
  * Apply a decoded rapiq query (IR) to the given TypeORM query builder.
@@ -14,6 +15,16 @@ import { TypeormAdapter } from "@rapiq/typeorm";
14
15
  * Joins triggered by the parsed relations replicate the DISTINCT-id
15
16
  * pattern: when the builder already groups by the root id, every join
16
17
  * contributes its own `GROUP BY <alias>.id`.
18
+ *
19
+ * Field visibility conditions (`IField.condition`, attached by a
20
+ * schema `fields.validateMany` gate) cannot go into the statement — a
21
+ * TypeORM selection must stay a bare column for entity hydration.
22
+ * The adapter projects the gated column unconditionally and
23
+ * force-selects every column its condition reads (rapiq#830's operand
24
+ * projection — the SQL counterpart of the plan-039 force-select
25
+ * discipline, so a sparse replace-projection can neither over-redact
26
+ * nor fail open on missing operands); the fetching adapter MUST then
27
+ * run the rows through `redactFieldConditions` before returning them.
17
28
  */ function applyQuery(queryBuilder, query) {
18
29
  const { pagination } = new TypeormAdapter({
19
30
  queryBuilder,
@@ -23,7 +34,19 @@ import { TypeormAdapter } from "@rapiq/typeorm";
23
34
  }).execute(query ?? new Query({}));
24
35
  return { pagination };
25
36
  }
37
+ /**
38
+ * Enforce the field visibility conditions of a decoded query on
39
+ * already-fetched rows: a gated column is dropped from every row that
40
+ * fails its condition; no row is ever removed. The SQL execution path
41
+ * projects gated columns unconditionally, so EVERY `findMany` adapter
42
+ * must pass its fetched entities through this before returning them —
43
+ * enforcement is fail-open by construction (a skipped call ships the
44
+ * value). Condition-less queries pass through untouched.
45
+ */ function redactFieldConditions(query, data) {
46
+ if (!query || !hasFieldConditions(query.fields)) return data;
47
+ return applyFieldConditions(query.fields, data);
48
+ }
26
49
  //#endregion
27
- export { applyQuery };
50
+ export { applyQuery, redactFieldConditions };
28
51
 
29
52
  //# sourceMappingURL=query.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.mjs","names":["Query","TypeormAdapter","applyQuery","queryBuilder","query","adapter","relations","onJoin","_path","alias","qb","expressionMap","groupBys","length","addGroupBy","pagination","execute"],"sources":["../../../../../src/app/modules/database/repositories/query.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IQuery } from '@rapiq/core';\nimport { Query } from '@rapiq/core';\nimport { TypeormAdapter } from '@rapiq/typeorm';\nimport type { SelectQueryBuilder } from 'typeorm';\nimport type { EntityRepositoryPaginationMeta } from '@authup/server-kit';\n\n/**\n * Apply a decoded rapiq query (IR) to the given TypeORM query builder.\n * Schema allow-lists, defaults and pagination bounds were already\n * applied at decode time (`decodeQuery` in core/query) — this helper\n * only executes the IR. Returns the applied pagination for the\n * response meta block.\n *\n * Joins triggered by the parsed relations replicate the DISTINCT-id\n * pattern: when the builder already groups by the root id, every join\n * contributes its own `GROUP BY <alias>.id`.\n */\nexport function applyQuery(\n queryBuilder: SelectQueryBuilder<any>,\n query?: IQuery,\n) : { pagination: EntityRepositoryPaginationMeta } {\n const adapter = new TypeormAdapter({\n queryBuilder,\n relations: {\n onJoin: (_path, alias, qb) => {\n if (qb.expressionMap.groupBys.length > 0) {\n qb.addGroupBy(`${alias}.id`);\n }\n },\n },\n });\n\n const { pagination } = adapter.execute(query ?? new Query({}));\n\n return { pagination };\n}\n"],"mappings":";;;;;;;;;;;;;;;;GAwBA,SAAgBE,WACZC,cACAC,OAAc;CAad,MAAM,EAAEW,eAAeV,IAXHJ,eAAe;EAC/BE;EACAG,WAAW,EACPC,SAASC,OAAOC,OAAOC,OAAAA;GACnB,IAAIA,GAAGC,cAAcC,SAASC,SAAS,GACnCH,GAAGI,WAAW,GAAGL,MAAM,IAAI;EAEnC,EACJ;CACJ,CAEuBJ,CAAAA,CAAQW,QAAQZ,SAAS,IAAIJ,MAAM,CAAC,CAAA,CAAA;CAE3D,OAAO,EAAEe,WAAW;AACxB"}
1
+ {"version":3,"file":"query.mjs","names":["Query","hasFieldConditions","applyFieldConditions","TypeormAdapter","applyQuery","queryBuilder","query","adapter","relations","onJoin","_path","alias","qb","expressionMap","groupBys","length","addGroupBy","pagination","execute","redactFieldConditions","data","fields"],"sources":["../../../../../src/app/modules/database/repositories/query.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { IQuery } from '@rapiq/core';\nimport { Query, hasFieldConditions } from '@rapiq/core';\nimport { applyFieldConditions } from '@rapiq/adapter-memory';\nimport { TypeormAdapter } from '@rapiq/adapter-typeorm';\nimport type { SelectQueryBuilder } from 'typeorm';\nimport type { EntityRepositoryPaginationMeta } from '@authup/server-kit';\n\n/**\n * Apply a decoded rapiq query (IR) to the given TypeORM query builder.\n * Schema allow-lists, defaults and pagination bounds were already\n * applied at decode time (`decodeQuery` in core/query) — this helper\n * only executes the IR. Returns the applied pagination for the\n * response meta block.\n *\n * Joins triggered by the parsed relations replicate the DISTINCT-id\n * pattern: when the builder already groups by the root id, every join\n * contributes its own `GROUP BY <alias>.id`.\n *\n * Field visibility conditions (`IField.condition`, attached by a\n * schema `fields.validateMany` gate) cannot go into the statement — a\n * TypeORM selection must stay a bare column for entity hydration.\n * The adapter projects the gated column unconditionally and\n * force-selects every column its condition reads (rapiq#830's operand\n * projection — the SQL counterpart of the plan-039 force-select\n * discipline, so a sparse replace-projection can neither over-redact\n * nor fail open on missing operands); the fetching adapter MUST then\n * run the rows through `redactFieldConditions` before returning them.\n */\nexport function applyQuery(\n queryBuilder: SelectQueryBuilder<any>,\n query?: IQuery,\n) : { pagination: EntityRepositoryPaginationMeta } {\n const adapter = new TypeormAdapter({\n queryBuilder,\n relations: {\n onJoin: (_path, alias, qb) => {\n if (qb.expressionMap.groupBys.length > 0) {\n qb.addGroupBy(`${alias}.id`);\n }\n },\n },\n });\n\n const { pagination } = adapter.execute(query ?? new Query({}));\n\n return { pagination };\n}\n\n/**\n * Enforce the field visibility conditions of a decoded query on\n * already-fetched rows: a gated column is dropped from every row that\n * fails its condition; no row is ever removed. The SQL execution path\n * projects gated columns unconditionally, so EVERY `findMany` adapter\n * must pass its fetched entities through this before returning them —\n * enforcement is fail-open by construction (a skipped call ships the\n * value). Condition-less queries pass through untouched.\n */\nexport function redactFieldConditions<T>(query: IQuery | undefined, data: T[]) : T[] {\n if (!query || !hasFieldConditions(query.fields)) {\n return data;\n }\n\n return applyFieldConditions(query.fields, data);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCA,SAAgBI,WACZC,cACAC,OAAc;CAad,MAAM,EAAEW,eAAeV,IAXHJ,eAAe;EAC/BE;EACAG,WAAW,EACPC,SAASC,OAAOC,OAAOC,OAAAA;GACnB,IAAIA,GAAGC,cAAcC,SAASC,SAAS,GACnCH,GAAGI,WAAW,GAAGL,MAAM,IAAI;EAEnC,EACJ;CACJ,CAEuBJ,CAAAA,CAAQW,QAAQZ,SAAS,IAAIN,MAAM,CAAC,CAAA,CAAA;CAE3D,OAAO,EAAEiB,WAAW;AACxB;;;;;;;;;GAWA,SAAgBE,sBAAyBb,OAA2Bc,MAAS;CACzE,IAAI,CAACd,SAAS,CAACL,mBAAmBK,MAAMe,MAAM,GAC1C,OAAOD;CAGX,OAAOlB,qBAAqBI,MAAMe,QAAQD,IAAAA;AAC9C"}
@@ -4,7 +4,7 @@ import.meta.url;
4
4
  import { RealmEntity } from "../../../../../adapters/database/domains/realm/entity.mjs";
5
5
  import { CachePrefix } from "../../../../../adapters/database/domains/constants.mjs";
6
6
  import "../../../../../adapters/database/domains/index.mjs";
7
- import { applyQuery } from "../query.mjs";
7
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
8
8
  import { translateWhereConditions } from "../helpers.mjs";
9
9
  import { isUUID } from "@authup/kit";
10
10
  import { REALM_MASTER_NAME } from "@authup/core-kit";
@@ -37,7 +37,7 @@ var RealmRepositoryAdapter = class {
37
37
  const { pagination } = applyQuery(qb, query);
38
38
  const [entities, total] = await qb.getManyAndCount();
39
39
  return {
40
- data: entities,
40
+ data: redactFieldConditions(query, entities),
41
41
  meta: {
42
42
  total,
43
43
  ...pagination
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["REALM_MASTER_NAME","InternalError","isUUID","validateEntityJoinColumns","applyQuery","buildRedisKeyPath","CachePrefix","RealmEntity","translateWhereConditions","RealmRepositoryAdapter","repository","findOneById","id","qb","createQueryBuilder","where","cache","prefix","REALM","key","getOne","findOneByName","name","trim","toLowerCase","findMany","query","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneByIdOrName","idOrName","findManyBy","findBy","findOneBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","resolveId","resolve","withFallback"],"sources":["../../../../../../src/app/modules/database/repositories/realm/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { InternalError } from '@authup/errors';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { IRealmRepository } from '../../../../../core/index.ts';\nimport { CachePrefix, RealmEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RealmRepositoryAdapter implements IRealmRepository {\n private readonly repository: Repository<Realm>;\n\n constructor(repository: Repository<Realm>) {\n this.repository = repository;\n }\n\n findOneById(id: string): Promise<Realm | null> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.where('realm.id = :id', { id });\n qb.cache(\n buildRedisKeyPath({\n prefix: CachePrefix.REALM,\n key: id,\n }),\n 60_000,\n );\n\n return qb.getOne();\n }\n\n findOneByName(name: string): Promise<Realm | null> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.where('realm.name = :name', { name: name.trim().toLowerCase() });\n\n return qb.getOne();\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Realm>> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.groupBy('realm.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneByIdOrName(idOrName: string): Promise<Realm | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Realm[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Realm | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Realm>): Realm {\n return this.repository.create(data);\n }\n\n merge(entity: Realm, data: Partial<Realm>): Realm {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Realm): Promise<Realm> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Realm): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Realm>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RealmEntity,\n });\n }\n\n async resolveId(key: string): Promise<string | null> {\n if (isUUID(key)) {\n return key;\n }\n\n const entity = await this.findOneByName(key);\n return entity ? entity.id : null;\n }\n\n async resolve(id: string | undefined, withFallback: true): Promise<Realm>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null> {\n let entity: Realm | null = null;\n\n if (id) {\n entity = await this.findOneByIdOrName(id);\n }\n\n if (!entity && withFallback) {\n entity = await this.findOneBy({ name: REALM_MASTER_NAME });\n if (!entity) {\n throw new InternalError('The master realm could not be resolved.');\n }\n }\n\n return entity;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,IAAaS,yBAAb,MAAaA;CACQC;CAEjB,YAAYA,YAA+B;EACvC,KAAKA,aAAaA;CACtB;CAEAC,YAAYC,IAAmC;EAC3C,MAAMC,KAAK,KAAKH,WAAWI,mBAAmB,OAAA;EAC9CD,GAAGE,MAAM,kBAAkB,EAAEH,GAAG,CAAA;EAChCC,GAAGG,MACCX,kBAAkB;GACdY,QAAQX,YAAYY;GACpBC,KAAKP;EACT,CAAA,GACA,GAAA;EAGJ,OAAOC,GAAGO,OAAM;CACpB;CAEAC,cAAcC,MAAqC;EAC/C,MAAMT,KAAK,KAAKH,WAAWI,mBAAmB,OAAA;EAC9CD,GAAGE,MAAM,sBAAsB,EAAEO,MAAMA,KAAKC,KAAI,CAAA,CAAGC,YAAW,EAAG,CAAA;EAEjE,OAAOX,GAAGO,OAAM;CACpB;CAEA,MAAMK,SAASC,OAA+D;EAC1E,MAAMb,KAAK,KAAKH,WAAWI,mBAAmB,OAAA;EAC9CD,GAAGc,QAAQ,UAAA;EAEX,MAAM,EAAEC,eAAexB,WAAWS,IAAIa,KAAAA;EAEtC,MAAM,CAACG,UAAUC,SAAS,MAAMjB,GAAGkB,gBAAe;EAElD,OAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEA,MAAMM,kBAAkBC,UAAyC;EAC7D,OAAOjC,OAAOiC,QAAAA,IACV,KAAKxB,YAAYwB,QAAAA,IACjB,KAAKd,cAAcc,QAAAA;CAC3B;CAEA,MAAMC,WAAWrB,OAA8C;EAC3D,OAAO,KAAKL,WAAW2B,OAAO7B,yBAAyBO,KAAAA,CAAAA;CAC3D;CAEA,MAAMuB,UAAUvB,OAAmD;EAC/D,OAAO,KAAKL,WAAW4B,UAAU9B,yBAAyBO,KAAAA,CAAAA;CAC9D;CAEAwB,OAAOP,MAA6B;EAChC,OAAO,KAAKtB,WAAW6B,OAAOP,IAAAA;CAClC;CAEAQ,MAAMC,QAAeT,MAA6B;EAC9C,OAAO,KAAKtB,WAAW8B,MAAMC,QAAQT,IAAAA;CACzC;CAEA,MAAMU,KAAKD,QAA+B;EACtC,OAAO,KAAK/B,WAAWgC,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAA8B;EACvC,MAAM,KAAK/B,WAAWiC,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBZ,MAAqC;EAC3D,MAAM7B,0BAA0B6B,MAAM;GAClCa,YAAY,KAAKnC,WAAWoC,QAAQC;GACpCC,cAAczC;EAClB,CAAA;CACJ;CAEA,MAAM0C,UAAU9B,KAAqC;EACjD,IAAIjB,OAAOiB,GAAAA,GACP,OAAOA;EAGX,MAAMsB,SAAS,MAAM,KAAKpB,cAAcF,GAAAA;EACxC,OAAOsB,SAASA,OAAO7B,KAAK;CAChC;CAMA,MAAMsC,QAAQtC,IAAwBuC,cAA+C;EACjF,IAAIV,SAAuB;EAE3B,IAAI7B,IACA6B,SAAS,MAAM,KAAKP,kBAAkBtB,EAAAA;EAG1C,IAAI,CAAC6B,UAAUU,cAAc;GACzBV,SAAS,MAAM,KAAKH,UAAU,EAAEhB,MAAMtB,kBAAkB,CAAA;GACxD,IAAI,CAACyC,QACD,MAAM,IAAIxC,cAAc,yCAAA;EAEhC;EAEA,OAAOwC;CACX;AACJ"}
1
+ {"version":3,"file":"repository.mjs","names":["REALM_MASTER_NAME","InternalError","isUUID","validateEntityJoinColumns","applyQuery","redactFieldConditions","buildRedisKeyPath","CachePrefix","RealmEntity","translateWhereConditions","RealmRepositoryAdapter","repository","findOneById","id","qb","createQueryBuilder","where","cache","prefix","REALM","key","getOne","findOneByName","name","trim","toLowerCase","findMany","query","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneByIdOrName","idOrName","findManyBy","findBy","findOneBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","resolveId","resolve","withFallback"],"sources":["../../../../../../src/app/modules/database/repositories/realm/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { InternalError } from '@authup/errors';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { IRealmRepository } from '../../../../../core/index.ts';\nimport { CachePrefix, RealmEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RealmRepositoryAdapter implements IRealmRepository {\n private readonly repository: Repository<Realm>;\n\n constructor(repository: Repository<Realm>) {\n this.repository = repository;\n }\n\n findOneById(id: string): Promise<Realm | null> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.where('realm.id = :id', { id });\n qb.cache(\n buildRedisKeyPath({\n prefix: CachePrefix.REALM,\n key: id,\n }),\n 60_000,\n );\n\n return qb.getOne();\n }\n\n findOneByName(name: string): Promise<Realm | null> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.where('realm.name = :name', { name: name.trim().toLowerCase() });\n\n return qb.getOne();\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Realm>> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.groupBy('realm.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneByIdOrName(idOrName: string): Promise<Realm | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Realm[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Realm | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Realm>): Realm {\n return this.repository.create(data);\n }\n\n merge(entity: Realm, data: Partial<Realm>): Realm {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Realm): Promise<Realm> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Realm): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Realm>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RealmEntity,\n });\n }\n\n async resolveId(key: string): Promise<string | null> {\n if (isUUID(key)) {\n return key;\n }\n\n const entity = await this.findOneByName(key);\n return entity ? entity.id : null;\n }\n\n async resolve(id: string | undefined, withFallback: true): Promise<Realm>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null> {\n let entity: Realm | null = null;\n\n if (id) {\n entity = await this.findOneByIdOrName(id);\n }\n\n if (!entity && withFallback) {\n entity = await this.findOneBy({ name: REALM_MASTER_NAME });\n if (!entity) {\n throw new InternalError('The master realm could not be resolved.');\n }\n }\n\n return entity;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAqBA,IAAaU,yBAAb,MAAaA;CACQC;CAEjB,YAAYA,YAA+B;EACvC,KAAKA,aAAaA;CACtB;CAEAC,YAAYC,IAAmC;EAC3C,MAAMC,KAAK,KAAKH,WAAWI,mBAAmB,OAAA;EAC9CD,GAAGE,MAAM,kBAAkB,EAAEH,GAAG,CAAA;EAChCC,GAAGG,MACCX,kBAAkB;GACdY,QAAQX,YAAYY;GACpBC,KAAKP;EACT,CAAA,GACA,GAAA;EAGJ,OAAOC,GAAGO,OAAM;CACpB;CAEAC,cAAcC,MAAqC;EAC/C,MAAMT,KAAK,KAAKH,WAAWI,mBAAmB,OAAA;EAC9CD,GAAGE,MAAM,sBAAsB,EAAEO,MAAMA,KAAKC,KAAI,CAAA,CAAGC,YAAW,EAAG,CAAA;EAEjE,OAAOX,GAAGO,OAAM;CACpB;CAEA,MAAMK,SAASC,OAA+D;EAC1E,MAAMb,KAAK,KAAKH,WAAWI,mBAAmB,OAAA;EAC9CD,GAAGc,QAAQ,UAAA;EAEX,MAAM,EAAEC,eAAezB,WAAWU,IAAIa,KAAAA;EAEtC,MAAM,CAACG,UAAUC,SAAS,MAAMjB,GAAGkB,gBAAe;EAElD,OAAO;GACHC,MAAM5B,sBAAsBsB,OAAOG,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEA,MAAMM,kBAAkBC,UAAyC;EAC7D,OAAOlC,OAAOkC,QAAAA,IACV,KAAKxB,YAAYwB,QAAAA,IACjB,KAAKd,cAAcc,QAAAA;CAC3B;CAEA,MAAMC,WAAWrB,OAA8C;EAC3D,OAAO,KAAKL,WAAW2B,OAAO7B,yBAAyBO,KAAAA,CAAAA;CAC3D;CAEA,MAAMuB,UAAUvB,OAAmD;EAC/D,OAAO,KAAKL,WAAW4B,UAAU9B,yBAAyBO,KAAAA,CAAAA;CAC9D;CAEAwB,OAAOP,MAA6B;EAChC,OAAO,KAAKtB,WAAW6B,OAAOP,IAAAA;CAClC;CAEAQ,MAAMC,QAAeT,MAA6B;EAC9C,OAAO,KAAKtB,WAAW8B,MAAMC,QAAQT,IAAAA;CACzC;CAEA,MAAMU,KAAKD,QAA+B;EACtC,OAAO,KAAK/B,WAAWgC,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAA8B;EACvC,MAAM,KAAK/B,WAAWiC,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBZ,MAAqC;EAC3D,MAAM9B,0BAA0B8B,MAAM;GAClCa,YAAY,KAAKnC,WAAWoC,QAAQC;GACpCC,cAAczC;EAClB,CAAA;CACJ;CAEA,MAAM0C,UAAU9B,KAAqC;EACjD,IAAIlB,OAAOkB,GAAAA,GACP,OAAOA;EAGX,MAAMsB,SAAS,MAAM,KAAKpB,cAAcF,GAAAA;EACxC,OAAOsB,SAASA,OAAO7B,KAAK;CAChC;CAMA,MAAMsC,QAAQtC,IAAwBuC,cAA+C;EACjF,IAAIV,SAAuB;EAE3B,IAAI7B,IACA6B,SAAS,MAAM,KAAKP,kBAAkBtB,EAAAA;EAG1C,IAAI,CAAC6B,UAAUU,cAAc;GACzBV,SAAS,MAAM,KAAKH,UAAU,EAAEhB,MAAMvB,kBAAkB,CAAA;GACxD,IAAI,CAAC0C,QACD,MAAM,IAAIzC,cAAc,yCAAA;EAEhC;EAEA,OAAOyC;CACX;AACJ"}
@@ -5,7 +5,7 @@ import { CachePrefix } from "../../../../../adapters/database/domains/constants.
5
5
  import { RoleEntity } from "../../../../../adapters/database/domains/role/entity.mjs";
6
6
  import { RolePermissionEntity } from "../../../../../adapters/database/domains/role-permission/entity.mjs";
7
7
  import "../../../../../adapters/database/domains/index.mjs";
8
- import { applyQuery } from "../query.mjs";
8
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
9
9
  import { isEntityUnique, translateWhereConditions } from "../helpers.mjs";
10
10
  import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
11
11
  import "../../../../../adapters/database/index.mjs";
@@ -27,7 +27,7 @@ var RoleRepositoryAdapter = class {
27
27
  const { pagination } = applyQuery(qb, query);
28
28
  const [entities, total] = await qb.getManyAndCount();
29
29
  return {
30
- data: entities,
30
+ data: redactFieldConditions(query, entities),
31
31
  meta: {
32
32
  total,
33
33
  ...pagination
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["isUUID","validateEntityJoinColumns","applyQuery","DatabaseConflictError","isEntityUnique","translateWhereConditions","loadBoundPermissions","CachePrefix","RoleEntity","RolePermissionEntity","RealmRepositoryAdapter","RoleRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","getBoundPermissions","junctionTarget","roleId","cachePrefix","ROLE_OWNED_PERMISSIONS","cacheKey","getBoundPermissionsForMany","results","Promise","all","map","flat"],"sources":["../../../../../../src/app/modules/database/repositories/role/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, Role } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { PermissionPolicyBinding } from '@authup/access';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository, IRoleRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { loadBoundPermissions } from '../bindings.ts';\nimport {\n CachePrefix,\n RoleEntity,\n RolePermissionEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type RoleRepositoryAdapterContext = {\n repository: Repository<Role>,\n realmRepository: Repository<Realm>,\n};\n\nexport class RoleRepositoryAdapter implements IRoleRepository {\n private readonly repository: Repository<Role>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: RoleRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Role>> {\n const qb = this.repository.createQueryBuilder('role');\n qb.groupBy('role.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Role | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Role | null> {\n const qb = this.repository.createQueryBuilder('role');\n qb.where('role.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('role.realmId = :realmId', { realmId });\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Role | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Role[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Role | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Role>): Role {\n return this.repository.create(data);\n }\n\n merge(entity: Role, data: Partial<Role>): Role {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Role): Promise<Role> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Role): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Role>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RoleEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Role>, existing?: Role): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: RoleEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundPermissions(entity: string | Role): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: RolePermissionEntity,\n where: { roleId: id },\n cachePrefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n\n async getBoundPermissionsForMany(entities: (string | Role)[]): Promise<PermissionPolicyBinding[]> {\n const results = await Promise.all(entities.map((entity) => this.getBoundPermissions(entity)));\n return results.flat();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA+BA,IAAaW,wBAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAmC;EAC3C,KAAKF,aAAaE,IAAIF;EACtB,KAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,eAAe;CACzE;CAEA,MAAME,SAASC,OAA8D;EACzE,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,MAAA;EAC9CD,GAAGE,QAAQ,SAAA;EAEX,MAAM,EAAEC,eAAelB,WAAWe,IAAID,KAAAA;EAEtC,MAAM,CAACK,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAAkC;EAC1C,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,cAAcC,MAAcC,UAAyC;EACvE,MAAMd,KAAK,KAAKL,WAAWM,mBAAmB,MAAA;EAC9CD,GAAGe,MAAM,qBAAqB,EAAEF,KAAK,CAAA;EAErC,IAAIC,UAAU;GACV,MAAME,UAAU,MAAM,KAAKpB,gBAAgBqB,UAAUH,QAAAA;GACrD,IAAI,CAACE,SACD,OAAO;GAEXhB,GAAGkB,SAAS,2BAA2B,EAAEF,QAAQ,CAAA;EACrD;EAEA,OAAOhB,GAAGmB,OAAM;CACpB;CAEA,MAAMC,kBAAkBC,UAAkBC,OAAsC;EAC5E,OAAOvC,OAAOsC,QAAAA,IACV,KAAKZ,YAAYY,QAAAA,IACjB,KAAKT,cAAcS,UAAUC,KAAAA;CACrC;CAEA,MAAMC,WAAWR,OAA6C;EAC1D,OAAO,KAAKpB,WAAW6B,OAAOpC,yBAAyB2B,KAAAA,CAAAA;CAC3D;CAEA,MAAMJ,UAAUI,OAAkD;EAC9D,OAAO,KAAKpB,WAAWgB,UAAUvB,yBAAyB2B,KAAAA,CAAAA;CAC9D;CAEAU,OAAOlB,MAA2B;EAC9B,OAAO,KAAKZ,WAAW8B,OAAOlB,IAAAA;CAClC;CAEAmB,MAAMC,QAAcpB,MAA2B;EAC3C,OAAO,KAAKZ,WAAW+B,MAAMC,QAAQpB,IAAAA;CACzC;CAEA,MAAMqB,KAAKD,QAA6B;EACpC,OAAO,KAAKhC,WAAWiC,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAA6B;EACtC,MAAM,KAAKhC,WAAWkC,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBvB,MAAoC;EAC1D,MAAMvB,0BAA0BuB,MAAM;GAClCwB,YAAY,KAAKpC,WAAWqC,QAAQC;GACpCC,cAAc3C;EAClB,CAAA;CACJ;CAEA,MAAM4C,gBAAgB5B,MAAqB6B,UAAgC;EAQvE,IAAI,CAACC,MAPkBlD,eAAe;GAClC4C,YAAY,KAAKpC,WAAWqC,QAAQC;GACpCC,cAAc3C;GACdoC,QAAQpB;GACR+B,gBAAgBF;EACpB,CAAA,GAGI,MAAM,IAAIlD,sBAAAA;CAElB;CAEA,MAAMqD,oBAAoBZ,QAA2D;EACjF,MAAMjB,KAAK,OAAOiB,WAAW,WAAWA,SAASA,OAAOjB;EACxD,OAAOrB,qBAAqB;GACxB2C,SAAS,KAAKrC,WAAWqC;GACzBQ,gBAAgBhD;GAChBuB,OAAO,EAAE0B,QAAQ/B,GAAG;GACpBgC,aAAapD,YAAYqD;GACzBC,UAAUlC;EACd,CAAA;CACJ;CAEA,MAAMmC,2BAA2BzC,UAAiE;EAE9F,QAAO0C,MADeC,QAAQC,IAAI5C,SAAS6C,KAAKtB,WAAW,KAAKY,oBAAoBZ,MAAAA,CAAAA,CAAAA,EAAAA,CACrEuB,KAAI;CACvB;AACJ"}
1
+ {"version":3,"file":"repository.mjs","names":["isUUID","validateEntityJoinColumns","applyQuery","redactFieldConditions","DatabaseConflictError","isEntityUnique","translateWhereConditions","loadBoundPermissions","CachePrefix","RoleEntity","RolePermissionEntity","RealmRepositoryAdapter","RoleRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realmId","resolveId","andWhere","getOne","findOneByIdOrName","idOrName","realm","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","getBoundPermissions","junctionTarget","roleId","cachePrefix","ROLE_OWNED_PERMISSIONS","cacheKey","getBoundPermissionsForMany","results","Promise","all","map","flat"],"sources":["../../../../../../src/app/modules/database/repositories/role/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm, Role } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { PermissionPolicyBinding } from '@authup/access';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository, IRoleRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { isEntityUnique, translateWhereConditions } from '../helpers.ts';\nimport { loadBoundPermissions } from '../bindings.ts';\nimport {\n CachePrefix,\n RoleEntity,\n RolePermissionEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type RoleRepositoryAdapterContext = {\n repository: Repository<Role>,\n realmRepository: Repository<Realm>,\n};\n\nexport class RoleRepositoryAdapter implements IRoleRepository {\n private readonly repository: Repository<Role>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: RoleRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<Role>> {\n const qb = this.repository.createQueryBuilder('role');\n qb.groupBy('role.id');\n\n const { pagination } = applyQuery(qb, query);\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Role | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Role | null> {\n const qb = this.repository.createQueryBuilder('role');\n qb.where('role.name = :name', { name });\n\n if (realmKey) {\n const realmId = await this.realmRepository.resolveId(realmKey);\n if (!realmId) {\n return null;\n }\n qb.andWhere('role.realmId = :realmId', { realmId });\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Role | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Role[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Role | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Role>): Role {\n return this.repository.create(data);\n }\n\n merge(entity: Role, data: Partial<Role>): Role {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Role): Promise<Role> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Role): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Role>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RoleEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Role>, existing?: Role): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: RoleEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundPermissions(entity: string | Role): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: RolePermissionEntity,\n where: { roleId: id },\n cachePrefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n\n async getBoundPermissionsForMany(entities: (string | Role)[]): Promise<PermissionPolicyBinding[]> {\n const results = await Promise.all(entities.map((entity) => this.getBoundPermissions(entity)));\n return results.flat();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AA+BA,IAAaY,wBAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAmC;EAC3C,KAAKF,aAAaE,IAAIF;EACtB,KAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,eAAe;CACzE;CAEA,MAAME,SAASC,OAA8D;EACzE,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,MAAA;EAC9CD,GAAGE,QAAQ,SAAA;EAEX,MAAM,EAAEC,eAAenB,WAAWgB,IAAID,KAAAA;EAEtC,MAAM,CAACK,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMtB,sBAAsBc,OAAOK,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAAkC;EAC1C,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,cAAcC,MAAcC,UAAyC;EACvE,MAAMd,KAAK,KAAKL,WAAWM,mBAAmB,MAAA;EAC9CD,GAAGe,MAAM,qBAAqB,EAAEF,KAAK,CAAA;EAErC,IAAIC,UAAU;GACV,MAAME,UAAU,MAAM,KAAKpB,gBAAgBqB,UAAUH,QAAAA;GACrD,IAAI,CAACE,SACD,OAAO;GAEXhB,GAAGkB,SAAS,2BAA2B,EAAEF,QAAQ,CAAA;EACrD;EAEA,OAAOhB,GAAGmB,OAAM;CACpB;CAEA,MAAMC,kBAAkBC,UAAkBC,OAAsC;EAC5E,OAAOxC,OAAOuC,QAAAA,IACV,KAAKZ,YAAYY,QAAAA,IACjB,KAAKT,cAAcS,UAAUC,KAAAA;CACrC;CAEA,MAAMC,WAAWR,OAA6C;EAC1D,OAAO,KAAKpB,WAAW6B,OAAOpC,yBAAyB2B,KAAAA,CAAAA;CAC3D;CAEA,MAAMJ,UAAUI,OAAkD;EAC9D,OAAO,KAAKpB,WAAWgB,UAAUvB,yBAAyB2B,KAAAA,CAAAA;CAC9D;CAEAU,OAAOlB,MAA2B;EAC9B,OAAO,KAAKZ,WAAW8B,OAAOlB,IAAAA;CAClC;CAEAmB,MAAMC,QAAcpB,MAA2B;EAC3C,OAAO,KAAKZ,WAAW+B,MAAMC,QAAQpB,IAAAA;CACzC;CAEA,MAAMqB,KAAKD,QAA6B;EACpC,OAAO,KAAKhC,WAAWiC,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAA6B;EACtC,MAAM,KAAKhC,WAAWkC,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBvB,MAAoC;EAC1D,MAAMxB,0BAA0BwB,MAAM;GAClCwB,YAAY,KAAKpC,WAAWqC,QAAQC;GACpCC,cAAc3C;EAClB,CAAA;CACJ;CAEA,MAAM4C,gBAAgB5B,MAAqB6B,UAAgC;EAQvE,IAAI,CAACC,MAPkBlD,eAAe;GAClC4C,YAAY,KAAKpC,WAAWqC,QAAQC;GACpCC,cAAc3C;GACdoC,QAAQpB;GACR+B,gBAAgBF;EACpB,CAAA,GAGI,MAAM,IAAIlD,sBAAAA;CAElB;CAEA,MAAMqD,oBAAoBZ,QAA2D;EACjF,MAAMjB,KAAK,OAAOiB,WAAW,WAAWA,SAASA,OAAOjB;EACxD,OAAOrB,qBAAqB;GACxB2C,SAAS,KAAKrC,WAAWqC;GACzBQ,gBAAgBhD;GAChBuB,OAAO,EAAE0B,QAAQ/B,GAAG;GACpBgC,aAAapD,YAAYqD;GACzBC,UAAUlC;EACd,CAAA;CACJ;CAEA,MAAMmC,2BAA2BzC,UAAiE;EAE9F,QAAO0C,MADeC,QAAQC,IAAI5C,SAAS6C,KAAKtB,WAAW,KAAKY,oBAAoBZ,MAAAA,CAAAA,CAAAA,EAAAA,CACrEuB,KAAI;CACvB;AACJ"}
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { RoleAttributeEntity } from "../../../../../adapters/database/domains/role-attribute/entity.mjs";
5
5
  import "../../../../../adapters/database/domains/index.mjs";
6
- import { applyQuery } from "../query.mjs";
6
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
7
7
  import { applyRealmScopeSelect, translateWhereConditions } from "../helpers.mjs";
8
8
  import { validateEntityJoinColumns } from "typeorm-extension";
9
9
  //#region src/app/modules/database/repositories/role-attribute/repository.ts
@@ -19,7 +19,7 @@ var RoleAttributeRepositoryAdapter = class {
19
19
  applyRealmScopeSelect(qb, "roleAttribute");
20
20
  const [entities, total] = await qb.getManyAndCount();
21
21
  return {
22
- data: entities,
22
+ data: redactFieldConditions(query, entities),
23
23
  meta: {
24
24
  total,
25
25
  ...pagination
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["validateEntityJoinColumns","applyQuery","RoleAttributeEntity","applyRealmScopeSelect","translateWhereConditions","RoleAttributeRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget"],"sources":["../../../../../../src/app/modules/database/repositories/role-attribute/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RoleAttribute } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRoleAttributeRepository } from '../../../../../core/index.ts';\nimport { RoleAttributeEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { applyRealmScopeSelect, translateWhereConditions } from '../helpers.ts';\n\nexport class RoleAttributeRepositoryAdapter implements IRoleAttributeRepository {\n private readonly repository: Repository<RoleAttribute>;\n\n constructor(repository: Repository<RoleAttribute>) {\n this.repository = repository;\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<RoleAttribute>> {\n const qb = this.repository.createQueryBuilder('roleAttribute');\n qb.groupBy('roleAttribute.id');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'roleAttribute');\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<RoleAttribute | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<RoleAttribute | null> {\n return null;\n }\n\n async findOneByIdOrName(idOrName: string): Promise<RoleAttribute | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<RoleAttribute[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<RoleAttribute | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<RoleAttribute>): RoleAttribute {\n return this.repository.create(data);\n }\n\n merge(entity: RoleAttribute, data: Partial<RoleAttribute>): RoleAttribute {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: RoleAttribute): Promise<RoleAttribute> {\n return this.repository.save(entity);\n }\n\n async remove(entity: RoleAttribute): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<RoleAttribute>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RoleAttributeEntity,\n });\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaK,iCAAb,MAAaA;CACQC;CAEjB,YAAYA,YAAuC;EAC/C,KAAKA,aAAaA;CACtB;CAEA,MAAMC,SAASC,OAAuE;EAClF,MAAMC,KAAK,KAAKH,WAAWI,mBAAmB,eAAA;EAC9CD,GAAGE,QAAQ,kBAAA;EAEX,MAAM,EAAEC,eAAeX,WAAWQ,IAAID,KAAAA;EAEtCL,sBAAsBM,IAAI,eAAA;EAE1B,MAAM,CAACI,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAA2C;EACnD,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,gBAA+C;EACjD,OAAO;CACX;CAEA,MAAMC,kBAAkBC,UAAiD;EACrE,OAAO,KAAKL,YAAYK,QAAAA;CAC5B;CAEA,MAAMC,WAAWC,OAAsD;EACnE,OAAO,KAAKnB,WAAWoB,OAAOtB,yBAAyBqB,KAAAA,CAAAA;CAC3D;CAEA,MAAML,UAAUK,OAA2D;EACvE,OAAO,KAAKnB,WAAWc,UAAUhB,yBAAyBqB,KAAAA,CAAAA;CAC9D;CAEAE,OAAOX,MAA6C;EAChD,OAAO,KAAKV,WAAWqB,OAAOX,IAAAA;CAClC;CAEAY,MAAMC,QAAuBb,MAA6C;EACtE,OAAO,KAAKV,WAAWsB,MAAMC,QAAQb,IAAAA;CACzC;CAEA,MAAMc,KAAKD,QAA+C;EACtD,OAAO,KAAKvB,WAAWwB,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAAsC;EAC/C,MAAM,KAAKvB,WAAWyB,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBhB,MAA6C;EACnE,MAAMhB,0BAA0BgB,MAAM;GAClCiB,YAAY,KAAK3B,WAAW4B,QAAQC;GACpCC,cAAclC;EAClB,CAAA;CACJ;AACJ"}
1
+ {"version":3,"file":"repository.mjs","names":["validateEntityJoinColumns","applyQuery","redactFieldConditions","RoleAttributeEntity","applyRealmScopeSelect","translateWhereConditions","RoleAttributeRepositoryAdapter","repository","findMany","query","qb","createQueryBuilder","groupBy","pagination","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","findOneByIdOrName","idOrName","findManyBy","where","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget"],"sources":["../../../../../../src/app/modules/database/repositories/role-attribute/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { RoleAttribute } from '@authup/core-kit';\nimport type { IQuery } from '@rapiq/core';\nimport type { Repository } from 'typeorm';\nimport { validateEntityJoinColumns } from 'typeorm-extension';\nimport { applyQuery, redactFieldConditions } from '../query.ts';\nimport type { EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRoleAttributeRepository } from '../../../../../core/index.ts';\nimport { RoleAttributeEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { applyRealmScopeSelect, translateWhereConditions } from '../helpers.ts';\n\nexport class RoleAttributeRepositoryAdapter implements IRoleAttributeRepository {\n private readonly repository: Repository<RoleAttribute>;\n\n constructor(repository: Repository<RoleAttribute>) {\n this.repository = repository;\n }\n\n async findMany(query: IQuery): Promise<EntityRepositoryFindManyResult<RoleAttribute>> {\n const qb = this.repository.createQueryBuilder('roleAttribute');\n qb.groupBy('roleAttribute.id');\n\n const { pagination } = applyQuery(qb, query);\n\n applyRealmScopeSelect(qb, 'roleAttribute');\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: redactFieldConditions(query, entities),\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<RoleAttribute | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(): Promise<RoleAttribute | null> {\n return null;\n }\n\n async findOneByIdOrName(idOrName: string): Promise<RoleAttribute | null> {\n return this.findOneById(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<RoleAttribute[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<RoleAttribute | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<RoleAttribute>): RoleAttribute {\n return this.repository.create(data);\n }\n\n merge(entity: RoleAttribute, data: Partial<RoleAttribute>): RoleAttribute {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: RoleAttribute): Promise<RoleAttribute> {\n return this.repository.save(entity);\n }\n\n async remove(entity: RoleAttribute): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<RoleAttribute>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RoleAttributeEntity,\n });\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaM,iCAAb,MAAaA;CACQC;CAEjB,YAAYA,YAAuC;EAC/C,KAAKA,aAAaA;CACtB;CAEA,MAAMC,SAASC,OAAuE;EAClF,MAAMC,KAAK,KAAKH,WAAWI,mBAAmB,eAAA;EAC9CD,GAAGE,QAAQ,kBAAA;EAEX,MAAM,EAAEC,eAAeZ,WAAWS,IAAID,KAAAA;EAEtCL,sBAAsBM,IAAI,eAAA;EAE1B,MAAM,CAACI,UAAUC,SAAS,MAAML,GAAGM,gBAAe;EAElD,OAAO;GACHC,MAAMf,sBAAsBO,OAAOK,QAAAA;GACnCI,MAAM;IACFH;IACA,GAAGF;GACP;EACJ;CACJ;CAEAM,YAAYC,IAA2C;EACnD,OAAO,KAAKC,UAAU,EAAED,GAAG,CAAA;CAC/B;CAEA,MAAME,gBAA+C;EACjD,OAAO;CACX;CAEA,MAAMC,kBAAkBC,UAAiD;EACrE,OAAO,KAAKL,YAAYK,QAAAA;CAC5B;CAEA,MAAMC,WAAWC,OAAsD;EACnE,OAAO,KAAKnB,WAAWoB,OAAOtB,yBAAyBqB,KAAAA,CAAAA;CAC3D;CAEA,MAAML,UAAUK,OAA2D;EACvE,OAAO,KAAKnB,WAAWc,UAAUhB,yBAAyBqB,KAAAA,CAAAA;CAC9D;CAEAE,OAAOX,MAA6C;EAChD,OAAO,KAAKV,WAAWqB,OAAOX,IAAAA;CAClC;CAEAY,MAAMC,QAAuBb,MAA6C;EACtE,OAAO,KAAKV,WAAWsB,MAAMC,QAAQb,IAAAA;CACzC;CAEA,MAAMc,KAAKD,QAA+C;EACtD,OAAO,KAAKvB,WAAWwB,KAAKD,MAAAA;CAChC;CAEA,MAAME,OAAOF,QAAsC;EAC/C,MAAM,KAAKvB,WAAWyB,OAAOF,MAAAA;CACjC;CAEA,MAAMG,oBAAoBhB,MAA6C;EACnE,MAAMjB,0BAA0BiB,MAAM;GAClCiB,YAAY,KAAK3B,WAAW4B,QAAQC;GACpCC,cAAclC;EAClB,CAAA;CACJ;AACJ"}
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { RolePermissionEntity } from "../../../../../adapters/database/domains/role-permission/entity.mjs";
5
5
  import "../../../../../adapters/database/domains/index.mjs";
6
- import { applyQuery } from "../query.mjs";
6
+ import { applyQuery, redactFieldConditions } from "../query.mjs";
7
7
  import { translateWhereConditions } from "../helpers.mjs";
8
8
  import { validateEntityJoinColumns } from "typeorm-extension";
9
9
  //#region src/app/modules/database/repositories/role-permission/repository.ts
@@ -18,7 +18,7 @@ var RolePermissionRepositoryAdapter = class {
18
18
  const { pagination } = applyQuery(qb, query);
19
19
  const [entities, total] = await qb.getManyAndCount();
20
20
  return {
21
- data: entities,
21
+ data: redactFieldConditions(query, entities),
22
22
  meta: {
23
23
  total,
24
24
  ...pagination