@authup/server-core 1.0.0-beta.37 → 1.0.0-beta.38

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 (181) hide show
  1. package/dist/adapters/database/data-source/options/module.mjs +16 -16
  2. package/dist/adapters/database/domains/client/index.d.ts +0 -1
  3. package/dist/adapters/database/domains/client/index.d.ts.map +1 -1
  4. package/dist/adapters/database/domains/client/index.mjs +1 -2
  5. package/dist/adapters/database/domains/index.mjs +26 -28
  6. package/dist/adapters/database/domains/policy/repository.mjs +1 -1
  7. package/dist/adapters/database/domains/robot/index.d.ts +0 -1
  8. package/dist/adapters/database/domains/robot/index.d.ts.map +1 -1
  9. package/dist/adapters/database/domains/robot/index.mjs +1 -2
  10. package/dist/adapters/database/domains/role/repository.d.ts +0 -6
  11. package/dist/adapters/database/domains/role/repository.d.ts.map +1 -1
  12. package/dist/adapters/database/domains/role/repository.mjs +1 -58
  13. package/dist/adapters/database/domains/role/repository.mjs.map +1 -1
  14. package/dist/adapters/database/domains/role-permission/entity.mjs +1 -1
  15. package/dist/adapters/database/domains/user/repository.d.ts +1 -5
  16. package/dist/adapters/database/domains/user/repository.d.ts.map +1 -1
  17. package/dist/adapters/database/domains/user/repository.mjs +0 -60
  18. package/dist/adapters/database/domains/user/repository.mjs.map +1 -1
  19. package/dist/adapters/database/extra-attribute-repository/tree/repository.d.ts.map +1 -1
  20. package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs +1 -0
  21. package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs.map +1 -1
  22. package/dist/adapters/database/index.mjs +18 -20
  23. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +1 -1
  24. package/dist/adapters/http/controllers/entities/permission/module.mjs +1 -1
  25. package/dist/adapters/http/controllers/entities/policy/module.mjs +1 -1
  26. package/dist/adapters/http/controllers/entities/policy/utils/attributes-validator.mjs +1 -1
  27. package/dist/adapters/http/controllers/workflows/authorize/module.d.ts.map +1 -1
  28. package/dist/adapters/http/controllers/workflows/authorize/module.mjs +5 -6
  29. package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
  30. package/dist/adapters/http/middleware/built-in/assets.mjs +3 -3
  31. package/dist/adapters/http/middleware/built-in/assets.mjs.map +1 -1
  32. package/dist/app/modules/database/repositories/bindings.d.ts +17 -0
  33. package/dist/app/modules/database/repositories/bindings.d.ts.map +1 -0
  34. package/dist/app/modules/database/repositories/bindings.mjs +40 -0
  35. package/dist/app/modules/database/repositories/bindings.mjs.map +1 -0
  36. package/dist/app/modules/database/repositories/client/repository.d.ts +4 -1
  37. package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
  38. package/dist/app/modules/database/repositories/client/repository.mjs +29 -0
  39. package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
  40. package/dist/app/modules/database/repositories/robot/repository.d.ts +4 -1
  41. package/dist/app/modules/database/repositories/robot/repository.d.ts.map +1 -1
  42. package/dist/app/modules/database/repositories/robot/repository.mjs +29 -0
  43. package/dist/app/modules/database/repositories/robot/repository.mjs.map +1 -1
  44. package/dist/app/modules/database/repositories/role/repository.d.ts +3 -0
  45. package/dist/app/modules/database/repositories/role/repository.d.ts.map +1 -1
  46. package/dist/app/modules/database/repositories/role/repository.mjs +16 -0
  47. package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
  48. package/dist/app/modules/database/repositories/user/repository.d.ts +4 -1
  49. package/dist/app/modules/database/repositories/user/repository.d.ts.map +1 -1
  50. package/dist/app/modules/database/repositories/user/repository.mjs +29 -0
  51. package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
  52. package/dist/app/modules/http/modules/controller.d.ts +1 -2
  53. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  54. package/dist/app/modules/http/modules/controller.mjs +30 -34
  55. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  56. package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
  57. package/dist/app/modules/http/modules/middleware.mjs +2 -15
  58. package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
  59. package/dist/app/modules/identity/constants.d.ts +3 -1
  60. package/dist/app/modules/identity/constants.d.ts.map +1 -1
  61. package/dist/app/modules/identity/constants.mjs +2 -0
  62. package/dist/app/modules/identity/constants.mjs.map +1 -1
  63. package/dist/app/modules/identity/module.d.ts.map +1 -1
  64. package/dist/app/modules/identity/module.mjs +42 -5
  65. package/dist/app/modules/identity/module.mjs.map +1 -1
  66. package/dist/app/modules/identity/repositories/client.d.ts +2 -2
  67. package/dist/app/modules/identity/repositories/client.d.ts.map +1 -1
  68. package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
  69. package/dist/app/modules/identity/repositories/robot.d.ts +2 -2
  70. package/dist/app/modules/identity/repositories/robot.d.ts.map +1 -1
  71. package/dist/app/modules/identity/repositories/robot.mjs.map +1 -1
  72. package/dist/app/modules/oauth2/module.d.ts.map +1 -1
  73. package/dist/app/modules/oauth2/module.mjs +5 -2
  74. package/dist/app/modules/oauth2/module.mjs.map +1 -1
  75. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  76. package/dist/app/modules/provisioning/module.mjs +14 -9
  77. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  78. package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
  79. package/dist/app/modules/provisioning/sources/default/module.mjs +66 -10
  80. package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
  81. package/dist/components/database/unique-entries/module.mjs +1 -1
  82. package/dist/core/entities/client/service.d.ts.map +1 -1
  83. package/dist/core/entities/client/service.mjs +15 -4
  84. package/dist/core/entities/client/service.mjs.map +1 -1
  85. package/dist/core/entities/client/types.d.ts +4 -1
  86. package/dist/core/entities/client/types.d.ts.map +1 -1
  87. package/dist/core/entities/client-scope/service.d.ts.map +1 -1
  88. package/dist/core/entities/client-scope/service.mjs +2 -0
  89. package/dist/core/entities/client-scope/service.mjs.map +1 -1
  90. package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -1
  91. package/dist/core/entities/identity-provider-role-mapping/service.mjs +2 -0
  92. package/dist/core/entities/identity-provider-role-mapping/service.mjs.map +1 -1
  93. package/dist/core/entities/permission/service.mjs +1 -1
  94. package/dist/core/entities/policy/attributes-validator.mjs +1 -1
  95. package/dist/core/entities/policy/service.mjs +1 -1
  96. package/dist/core/entities/realm/service.mjs +1 -1
  97. package/dist/core/entities/robot/service.d.ts.map +1 -1
  98. package/dist/core/entities/robot/service.mjs +29 -8
  99. package/dist/core/entities/robot/service.mjs.map +1 -1
  100. package/dist/core/entities/robot/types.d.ts +4 -1
  101. package/dist/core/entities/robot/types.d.ts.map +1 -1
  102. package/dist/core/entities/role/service.mjs +1 -1
  103. package/dist/core/entities/role/types.d.ts +3 -0
  104. package/dist/core/entities/role/types.d.ts.map +1 -1
  105. package/dist/core/entities/role-attribute/service.d.ts +2 -0
  106. package/dist/core/entities/role-attribute/service.d.ts.map +1 -1
  107. package/dist/core/entities/role-attribute/service.mjs +7 -3
  108. package/dist/core/entities/role-attribute/service.mjs.map +1 -1
  109. package/dist/core/entities/scope/service.mjs +1 -1
  110. package/dist/core/entities/user/service.d.ts.map +1 -1
  111. package/dist/core/entities/user/service.mjs +10 -12
  112. package/dist/core/entities/user/service.mjs.map +1 -1
  113. package/dist/core/entities/user/types.d.ts +4 -1
  114. package/dist/core/entities/user/types.d.ts.map +1 -1
  115. package/dist/core/entities/user-attribute/service.d.ts +3 -1
  116. package/dist/core/entities/user-attribute/service.d.ts.map +1 -1
  117. package/dist/core/entities/user-attribute/service.mjs +44 -17
  118. package/dist/core/entities/user-attribute/service.mjs.map +1 -1
  119. package/dist/core/identity/index.d.ts +1 -0
  120. package/dist/core/identity/index.d.ts.map +1 -1
  121. package/dist/core/identity/index.mjs +2 -1
  122. package/dist/core/identity/permission/module.d.ts +12 -6
  123. package/dist/core/identity/permission/module.d.ts.map +1 -1
  124. package/dist/core/identity/permission/module.mjs +11 -19
  125. package/dist/core/identity/permission/module.mjs.map +1 -1
  126. package/dist/core/identity/permission/types.d.ts +11 -13
  127. package/dist/core/identity/permission/types.d.ts.map +1 -1
  128. package/dist/core/identity/role/index.d.ts +3 -0
  129. package/dist/core/identity/role/index.d.ts.map +1 -0
  130. package/dist/core/identity/role/index.mjs +2 -0
  131. package/dist/core/identity/role/module.d.ts +15 -0
  132. package/dist/core/identity/role/module.d.ts.map +1 -0
  133. package/dist/core/identity/role/module.mjs +27 -0
  134. package/dist/core/identity/role/module.mjs.map +1 -0
  135. package/dist/core/identity/role/types.d.ts +14 -0
  136. package/dist/core/identity/role/types.d.ts.map +1 -0
  137. package/dist/core/identity/role/types.mjs +1 -0
  138. package/dist/core/index.mjs +2 -1
  139. package/dist/core/oauth2/token/issuer/access/module.d.ts +4 -1
  140. package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
  141. package/dist/core/oauth2/token/issuer/access/module.mjs +24 -2
  142. package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
  143. package/dist/core/provisioning/entities/permission/types.d.ts +8 -0
  144. package/dist/core/provisioning/entities/permission/types.d.ts.map +1 -1
  145. package/dist/core/provisioning/synchronizer/permission/module.d.ts +5 -1
  146. package/dist/core/provisioning/synchronizer/permission/module.d.ts.map +1 -1
  147. package/dist/core/provisioning/synchronizer/permission/module.mjs +23 -0
  148. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  149. package/dist/core/provisioning/synchronizer/permission/types.d.ts +4 -1
  150. package/dist/core/provisioning/synchronizer/permission/types.d.ts.map +1 -1
  151. package/dist/core/provisioning/synchronizer/policy/module.d.ts.map +1 -1
  152. package/dist/core/provisioning/synchronizer/policy/module.mjs +4 -2
  153. package/dist/core/provisioning/synchronizer/policy/module.mjs.map +1 -1
  154. package/dist/index.mjs +18 -20
  155. package/dist/path.d.ts +2 -1
  156. package/dist/path.d.ts.map +1 -1
  157. package/dist/path.mjs +3 -2
  158. package/dist/path.mjs.map +1 -1
  159. package/dist/swagger.json +14 -0
  160. package/dist/ui/client/.vite/ssr-manifest.json +2777 -0
  161. package/dist/ui/client/assets/fa-brands-400-BP5tdqmh.woff2 +0 -0
  162. package/dist/ui/client/assets/fa-regular-400-nyy7hhHF.woff2 +0 -0
  163. package/dist/ui/client/assets/fa-solid-900-DRAAbZTg.woff2 +0 -0
  164. package/dist/ui/client/assets/index-AHa03lX_.js +41 -0
  165. package/dist/ui/client/assets/index-BVfayRKv.css +1 -0
  166. package/dist/ui/client/index.html +22 -0
  167. package/dist/ui/server/assets/multipart-parser-pHQi-kA6.js +166 -0
  168. package/dist/ui/server/server.js +79102 -0
  169. package/package.json +30 -13
  170. package/dist/adapters/database/domains/client/repository.d.ts +0 -13
  171. package/dist/adapters/database/domains/client/repository.d.ts.map +0 -1
  172. package/dist/adapters/database/domains/client/repository.mjs +0 -75
  173. package/dist/adapters/database/domains/client/repository.mjs.map +0 -1
  174. package/dist/adapters/database/domains/robot/repository.d.ts +0 -13
  175. package/dist/adapters/database/domains/robot/repository.d.ts.map +0 -1
  176. package/dist/adapters/database/domains/robot/repository.mjs +0 -75
  177. package/dist/adapters/database/domains/robot/repository.mjs.map +0 -1
  178. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts +0 -4
  179. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts.map +0 -1
  180. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs +0 -35
  181. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs.map +0 -1
@@ -2,6 +2,12 @@ import { RealmEntity } from "../../domains/realm/entity.mjs";
2
2
  import { RealmSubscriber } from "../../domains/realm/subscriber.mjs";
3
3
  import { KeyEntity } from "../../domains/key/entity.mjs";
4
4
  import { ClientEntity } from "../../domains/client/entity.mjs";
5
+ import { ClientSubscriber } from "../../domains/client/subscriber.mjs";
6
+ import { RoleEntity } from "../../domains/role/entity.mjs";
7
+ import { RoleAttributeEntity } from "../../domains/role-attribute/entity.mjs";
8
+ import { RoleSubscriber } from "../../domains/role/subscriber.mjs";
9
+ import { ClientRoleEntity } from "../../domains/client-role/entity.mjs";
10
+ import { ClientRoleSubscriber } from "../../domains/client-role/subscriber.mjs";
5
11
  import { PermissionEntity } from "../../domains/permission/entity.mjs";
6
12
  import { PermissionSubscriber } from "../../domains/permission/subscriber.mjs";
7
13
  import { PolicyEntity } from "../../domains/policy/entity.mjs";
@@ -10,14 +16,6 @@ import { PolicyAttributeSubscriber } from "../../domains/policy-attribute/subscr
10
16
  import { PolicySubscriber } from "../../domains/policy/subscriber.mjs";
11
17
  import { ClientPermissionEntity } from "../../domains/client-permission/entity.mjs";
12
18
  import { ClientPermissionSubscriber } from "../../domains/client-permission/subscriber.mjs";
13
- import { RoleEntity } from "../../domains/role/entity.mjs";
14
- import { RoleAttributeEntity } from "../../domains/role-attribute/entity.mjs";
15
- import { RolePermissionEntity } from "../../domains/role-permission/entity.mjs";
16
- import { RolePermissionSubscriber } from "../../domains/role-permission/subscriber.mjs";
17
- import { RoleSubscriber } from "../../domains/role/subscriber.mjs";
18
- import { ClientRoleEntity } from "../../domains/client-role/entity.mjs";
19
- import { ClientRoleSubscriber } from "../../domains/client-role/subscriber.mjs";
20
- import { ClientSubscriber } from "../../domains/client/subscriber.mjs";
21
19
  import { ScopeEntity } from "../../domains/scope/entity.mjs";
22
20
  import { ScopeSubscriber } from "../../domains/scope/subscriber.mjs";
23
21
  import { ClientScopeEntity } from "../../domains/client-scope/entity.mjs";
@@ -29,10 +27,6 @@ import { IdentityProviderSubscriber } from "../../domains/identity-provider/subs
29
27
  import { UserEntity } from "../../domains/user/entity.mjs";
30
28
  import { UserAttributeEntity } from "../../domains/user-attribute/entity.mjs";
31
29
  import { UserAttributeSubscriber } from "../../domains/user-attribute/subscriber.mjs";
32
- import { UserPermissionEntity } from "../../domains/user-permission/entity.mjs";
33
- import { UserPermissionSubscriber } from "../../domains/user-permission/subscriber.mjs";
34
- import { UserRoleEntity } from "../../domains/user-role/entity.mjs";
35
- import { UserRoleSubscriber } from "../../domains/user-role/subscriber.mjs";
36
30
  import { UserSubscriber } from "../../domains/user/subscriber.mjs";
37
31
  import { IdentityProviderAccountEntity } from "../../domains/identity-provider-account/entity.mjs";
38
32
  import { IdentityProviderAccountSubscriber } from "../../domains/identity-provider-account/subscriber.mjs";
@@ -41,14 +35,20 @@ import { IdentityProviderPermissionMappingEntity } from "../../domains/identity-
41
35
  import { IdentityProviderRoleMappingEntity } from "../../domains/identity-provider-role-mapping/entity.mjs";
42
36
  import { IdentityProviderRoleSubscriber } from "../../domains/identity-provider-role-mapping/subscriber.mjs";
43
37
  import { RobotEntity } from "../../domains/robot/entity.mjs";
44
- import { RobotRoleEntity } from "../../domains/robot-role/entity.mjs";
45
- import { RobotRoleSubscriber } from "../../domains/robot-role/subscriber.mjs";
46
- import { RobotPermissionEntity } from "../../domains/robot-permission/entity.mjs";
47
- import { RobotPermissionSubscriber } from "../../domains/robot-permission/subscriber.mjs";
48
38
  import { RobotSubscriber } from "../../domains/robot/subscriber.mjs";
49
39
  import { SessionEntity } from "../../domains/session/entity.mjs";
50
40
  import { PermissionPolicyEntity } from "../../domains/permission-policy/entity.mjs";
41
+ import { RobotPermissionEntity } from "../../domains/robot-permission/entity.mjs";
42
+ import { RobotPermissionSubscriber } from "../../domains/robot-permission/subscriber.mjs";
43
+ import { RobotRoleEntity } from "../../domains/robot-role/entity.mjs";
44
+ import { RobotRoleSubscriber } from "../../domains/robot-role/subscriber.mjs";
51
45
  import { RoleAttributeSubscriber } from "../../domains/role-attribute/subscriber.mjs";
46
+ import { RolePermissionEntity } from "../../domains/role-permission/entity.mjs";
47
+ import { RolePermissionSubscriber } from "../../domains/role-permission/subscriber.mjs";
48
+ import { UserPermissionEntity } from "../../domains/user-permission/entity.mjs";
49
+ import { UserPermissionSubscriber } from "../../domains/user-permission/subscriber.mjs";
50
+ import { UserRoleEntity } from "../../domains/user-role/entity.mjs";
51
+ import { UserRoleSubscriber } from "../../domains/user-role/subscriber.mjs";
52
52
  import "../../domains/index.mjs";
53
53
  import { AuthupError } from "@authup/errors";
54
54
  import { CodeTransformation, isCodeTransformation, readDataSourceOptionsFromEnv, transformFilePath } from "typeorm-extension";
@@ -1,4 +1,3 @@
1
1
  export * from './entity.ts';
2
- export * from './repository.ts';
3
2
  export * from './subscriber.ts';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/client/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/client/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
@@ -1,4 +1,3 @@
1
1
  import { ClientEntity } from "./entity.mjs";
2
- import { ClientRepository } from "./repository.mjs";
3
2
  import { ClientSubscriber } from "./subscriber.mjs";
4
- export { ClientEntity, ClientRepository, ClientSubscriber };
3
+ export { ClientEntity, ClientSubscriber };
@@ -6,6 +6,16 @@ import "./realm/index.mjs";
6
6
  import { KeyEntity } from "./key/entity.mjs";
7
7
  import "./key/index.mjs";
8
8
  import { ClientEntity } from "./client/entity.mjs";
9
+ import { ClientSubscriber } from "./client/subscriber.mjs";
10
+ import "./client/index.mjs";
11
+ import { RoleEntity } from "./role/entity.mjs";
12
+ import { RoleAttributeEntity } from "./role-attribute/entity.mjs";
13
+ import { RoleRepository } from "./role/repository.mjs";
14
+ import { RoleSubscriber } from "./role/subscriber.mjs";
15
+ import "./role/index.mjs";
16
+ import { ClientRoleEntity } from "./client-role/entity.mjs";
17
+ import { ClientRoleSubscriber } from "./client-role/subscriber.mjs";
18
+ import "./client-role/index.mjs";
9
19
  import { PermissionEntity } from "./permission/entity.mjs";
10
20
  import { PermissionSubscriber } from "./permission/subscriber.mjs";
11
21
  import "./permission/index.mjs";
@@ -19,20 +29,6 @@ import "./policy/index.mjs";
19
29
  import { ClientPermissionEntity } from "./client-permission/entity.mjs";
20
30
  import { ClientPermissionSubscriber } from "./client-permission/subscriber.mjs";
21
31
  import "./client-permission/index.mjs";
22
- import { RoleEntity } from "./role/entity.mjs";
23
- import { RoleAttributeEntity } from "./role-attribute/entity.mjs";
24
- import { RolePermissionEntity } from "./role-permission/entity.mjs";
25
- import { RolePermissionSubscriber } from "./role-permission/subscriber.mjs";
26
- import "./role-permission/index.mjs";
27
- import { RoleRepository } from "./role/repository.mjs";
28
- import { RoleSubscriber } from "./role/subscriber.mjs";
29
- import "./role/index.mjs";
30
- import { ClientRoleEntity } from "./client-role/entity.mjs";
31
- import { ClientRoleSubscriber } from "./client-role/subscriber.mjs";
32
- import "./client-role/index.mjs";
33
- import { ClientRepository } from "./client/repository.mjs";
34
- import { ClientSubscriber } from "./client/subscriber.mjs";
35
- import "./client/index.mjs";
36
32
  import { ScopeEntity } from "./scope/entity.mjs";
37
33
  import { ScopeSubscriber } from "./scope/subscriber.mjs";
38
34
  import "./scope/index.mjs";
@@ -50,12 +46,6 @@ import { UserEntity } from "./user/entity.mjs";
50
46
  import { UserAttributeEntity } from "./user-attribute/entity.mjs";
51
47
  import { UserAttributeSubscriber } from "./user-attribute/subscriber.mjs";
52
48
  import "./user-attribute/index.mjs";
53
- import { UserPermissionEntity } from "./user-permission/entity.mjs";
54
- import { UserPermissionSubscriber } from "./user-permission/subscriber.mjs";
55
- import "./user-permission/index.mjs";
56
- import { UserRoleEntity } from "./user-role/entity.mjs";
57
- import { UserRoleSubscriber } from "./user-role/subscriber.mjs";
58
- import "./user-role/index.mjs";
59
49
  import { UserRepository } from "./user/repository.mjs";
60
50
  import { UserSubscriber } from "./user/subscriber.mjs";
61
51
  import "./user/index.mjs";
@@ -70,19 +60,27 @@ import { IdentityProviderRoleMappingEntity } from "./identity-provider-role-mapp
70
60
  import { IdentityProviderRoleSubscriber } from "./identity-provider-role-mapping/subscriber.mjs";
71
61
  import "./identity-provider-role-mapping/index.mjs";
72
62
  import { RobotEntity } from "./robot/entity.mjs";
73
- import { RobotRoleEntity } from "./robot-role/entity.mjs";
74
- import { RobotRoleSubscriber } from "./robot-role/subscriber.mjs";
75
- import "./robot-role/index.mjs";
76
- import { RobotPermissionEntity } from "./robot-permission/entity.mjs";
77
- import { RobotPermissionSubscriber } from "./robot-permission/subscriber.mjs";
78
- import "./robot-permission/index.mjs";
79
- import { RobotRepository } from "./robot/repository.mjs";
80
63
  import { RobotSubscriber } from "./robot/subscriber.mjs";
81
64
  import "./robot/index.mjs";
82
65
  import { SessionEntity } from "./session/entity.mjs";
83
66
  import "./session/index.mjs";
84
67
  import { PermissionPolicyEntity } from "./permission-policy/entity.mjs";
85
68
  import "./permission-policy/index.mjs";
69
+ import { RobotPermissionEntity } from "./robot-permission/entity.mjs";
70
+ import { RobotPermissionSubscriber } from "./robot-permission/subscriber.mjs";
71
+ import "./robot-permission/index.mjs";
72
+ import { RobotRoleEntity } from "./robot-role/entity.mjs";
73
+ import { RobotRoleSubscriber } from "./robot-role/subscriber.mjs";
74
+ import "./robot-role/index.mjs";
86
75
  import { RoleAttributeSubscriber } from "./role-attribute/subscriber.mjs";
87
76
  import "./role-attribute/index.mjs";
88
- export { CachePrefix, ClientEntity, ClientPermissionEntity, ClientPermissionSubscriber, ClientRepository, ClientRoleEntity, ClientRoleSubscriber, ClientScopeEntity, ClientScopeSubscriber, ClientSubscriber, IdentityProviderAccountEntity, IdentityProviderAccountSubscriber, IdentityProviderAttributeEntity, IdentityProviderAttributeMappingEntity, IdentityProviderAttributeSubscriber, IdentityProviderEntity, IdentityProviderPermissionMappingEntity, IdentityProviderRepository, IdentityProviderRoleMappingEntity, IdentityProviderRoleSubscriber, IdentityProviderSubscriber, KeyEntity, PermissionEntity, PermissionPolicyEntity, PermissionSubscriber, PolicyAttributeEntity, PolicyAttributeSubscriber, PolicyEntity, PolicyRepository, PolicySubscriber, RealmEntity, RealmRepository, RealmSubscriber, RobotEntity, RobotPermissionEntity, RobotPermissionSubscriber, RobotRepository, RobotRoleEntity, RobotRoleSubscriber, RobotSubscriber, RoleAttributeEntity, RoleAttributeSubscriber, RoleEntity, RolePermissionEntity, RolePermissionSubscriber, RoleRepository, RoleSubscriber, ScopeEntity, ScopeSubscriber, SessionEntity, UserAttributeEntity, UserAttributeSubscriber, UserEntity, UserPermissionEntity, UserPermissionSubscriber, UserRepository, UserRoleEntity, UserRoleSubscriber, UserSubscriber };
77
+ import { RolePermissionEntity } from "./role-permission/entity.mjs";
78
+ import { RolePermissionSubscriber } from "./role-permission/subscriber.mjs";
79
+ import "./role-permission/index.mjs";
80
+ import { UserPermissionEntity } from "./user-permission/entity.mjs";
81
+ import { UserPermissionSubscriber } from "./user-permission/subscriber.mjs";
82
+ import "./user-permission/index.mjs";
83
+ import { UserRoleEntity } from "./user-role/entity.mjs";
84
+ import { UserRoleSubscriber } from "./user-role/subscriber.mjs";
85
+ import "./user-role/index.mjs";
86
+ export { CachePrefix, ClientEntity, ClientPermissionEntity, ClientPermissionSubscriber, ClientRoleEntity, ClientRoleSubscriber, ClientScopeEntity, ClientScopeSubscriber, ClientSubscriber, IdentityProviderAccountEntity, IdentityProviderAccountSubscriber, IdentityProviderAttributeEntity, IdentityProviderAttributeMappingEntity, IdentityProviderAttributeSubscriber, IdentityProviderEntity, IdentityProviderPermissionMappingEntity, IdentityProviderRepository, IdentityProviderRoleMappingEntity, IdentityProviderRoleSubscriber, IdentityProviderSubscriber, KeyEntity, PermissionEntity, PermissionPolicyEntity, PermissionSubscriber, PolicyAttributeEntity, PolicyAttributeSubscriber, PolicyEntity, PolicyRepository, PolicySubscriber, RealmEntity, RealmRepository, RealmSubscriber, RobotEntity, RobotPermissionEntity, RobotPermissionSubscriber, RobotRoleEntity, RobotRoleSubscriber, RobotSubscriber, RoleAttributeEntity, RoleAttributeSubscriber, RoleEntity, RolePermissionEntity, RolePermissionSubscriber, RoleRepository, RoleSubscriber, ScopeEntity, ScopeSubscriber, SessionEntity, UserAttributeEntity, UserAttributeSubscriber, UserEntity, UserPermissionEntity, UserPermissionSubscriber, UserRepository, UserRoleEntity, UserRoleSubscriber, UserSubscriber };
@@ -1,7 +1,7 @@
1
1
  import { CachePrefix } from "../constants.mjs";
2
- import { PolicyEntity } from "./entity.mjs";
3
2
  import { EATreeRepository } from "../../extra-attribute-repository/tree/repository.mjs";
4
3
  import "../../extra-attribute-repository/index.mjs";
4
+ import { PolicyEntity } from "./entity.mjs";
5
5
  import { PolicyAttributeEntity } from "../policy-attribute/entity.mjs";
6
6
  import "../policy-attribute/index.mjs";
7
7
  import { EntityNotFoundError } from "typeorm";
@@ -1,4 +1,3 @@
1
1
  export * from './entity.ts';
2
- export * from './repository.ts';
3
2
  export * from './subscriber.ts';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/robot/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/robot/index.ts"],"names":[],"mappings":"AAOA,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
@@ -1,4 +1,3 @@
1
1
  import { RobotEntity } from "./entity.mjs";
2
- import { RobotRepository } from "./repository.mjs";
3
2
  import { RobotSubscriber } from "./subscriber.mjs";
4
- export { RobotEntity, RobotRepository, RobotSubscriber };
3
+ export { RobotEntity, RobotSubscriber };
@@ -1,14 +1,8 @@
1
1
  import type { DataSource, EntityManager } from 'typeorm';
2
- import type { Role } from '@authup/core-kit';
3
- import type { PermissionPolicyBinding } from '@authup/access';
4
2
  import { EARepository } from '../../extra-attribute-repository/index.ts';
5
3
  import { RoleAttributeEntity } from '../role-attribute/entity.ts';
6
4
  import { RoleEntity } from './entity.ts';
7
5
  export declare class RoleRepository extends EARepository<RoleEntity, RoleAttributeEntity> {
8
6
  constructor(instance: DataSource | EntityManager);
9
- getBoundPermissionsForMany(ids: (string | Role)[]): Promise<PermissionPolicyBinding[]>;
10
- clearBoundPermissionsCache(entity: string | Role): Promise<void>;
11
- getBoundPermissions(entity: string | Role): Promise<PermissionPolicyBinding[]>;
12
- private loadPolicyTrees;
13
7
  }
14
8
  //# sourceMappingURL=repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/role/repository.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAc,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIzC,qBAAa,cAAe,SAAQ,YAAY,CAAC,UAAU,EAAE,mBAAmB,CAAC;gBACjE,QAAQ,EAAE,UAAU,GAAG,aAAa;IAgB1C,0BAA0B,CAC5B,GAAG,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GACtB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAYhC,0BAA0B,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAkBhD,mBAAmB,CACrB,MAAM,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,uBAAuB,EAAE,CAAC;YA2CxB,eAAe;CAiBhC"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/role/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,qBAAa,cAAe,SAAQ,YAAY,CAAC,UAAU,EAAE,mBAAmB,CAAC;gBACjE,QAAQ,EAAE,UAAU,GAAG,aAAa;CAenD"}
@@ -1,13 +1,8 @@
1
1
  import { CachePrefix } from "../constants.mjs";
2
+ import { RoleEntity } from "./entity.mjs";
2
3
  import { EARepository } from "../../extra-attribute-repository/repository.mjs";
3
4
  import "../../extra-attribute-repository/index.mjs";
4
- import { PolicyRepository } from "../policy/repository.mjs";
5
- import "../policy/index.mjs";
6
- import { RoleEntity } from "./entity.mjs";
7
5
  import { RoleAttributeEntity } from "../role-attribute/entity.mjs";
8
- import { RolePermissionEntity } from "../role-permission/entity.mjs";
9
- import "../role-permission/index.mjs";
10
- import { buildRedisKeyPath } from "@authup/server-kit";
11
6
  //#region src/adapters/database/domains/role/repository.ts
12
7
  var RoleRepository = class extends EARepository {
13
8
  constructor(instance) {
@@ -24,58 +19,6 @@ var RoleRepository = class extends EARepository {
24
19
  cachePrefix: CachePrefix.ROLE_OWNED_PERMISSIONS
25
20
  });
26
21
  }
27
- async getBoundPermissionsForMany(ids) {
28
- const promises = [];
29
- for (const id of ids) promises.push(this.getBoundPermissions(id));
30
- return (await Promise.all(promises)).flat();
31
- }
32
- async clearBoundPermissionsCache(entity) {
33
- let id;
34
- if (typeof entity === "string") id = entity;
35
- else id = entity.id;
36
- if (!this.manager.connection.queryResultCache) return;
37
- await this.manager.connection.queryResultCache.remove([buildRedisKeyPath({
38
- prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,
39
- key: id
40
- })]);
41
- }
42
- async getBoundPermissions(entity) {
43
- let id;
44
- if (typeof entity === "string") id = entity;
45
- else id = entity.id;
46
- const entities = await this.manager.getRepository(RolePermissionEntity).find({
47
- where: { role_id: id },
48
- relations: { permission: true },
49
- cache: {
50
- id: buildRedisKeyPath({
51
- prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,
52
- key: id
53
- }),
54
- milliseconds: 6e4
55
- }
56
- });
57
- const policyIds = /* @__PURE__ */ new Set();
58
- for (const entry of entities) if (entry.policy_id) policyIds.add(entry.policy_id);
59
- const policyTrees = await this.loadPolicyTrees([...policyIds]);
60
- return entities.map((entry) => {
61
- const policies = [];
62
- if (entry.policy_id && policyTrees[entry.policy_id]) policies.push(policyTrees[entry.policy_id]);
63
- return {
64
- permission: entry.permission,
65
- policies: policies.length > 0 ? policies : void 0
66
- };
67
- });
68
- }
69
- async loadPolicyTrees(policyIds) {
70
- if (policyIds.length === 0) return {};
71
- const policyRepository = new PolicyRepository(this.manager);
72
- const result = {};
73
- for (const id of policyIds) {
74
- const tree = await policyRepository.findDescendantsTreeById(id);
75
- if (tree) result[id] = tree;
76
- }
77
- return result;
78
- }
79
22
  };
80
23
  //#endregion
81
24
  export { RoleRepository };
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["buildRedisKeyPath","CachePrefix","EARepository","RoleAttributeEntity","RoleEntity","RolePermissionEntity","PolicyRepository","RoleRepository","instance","attributeProperties","input","parent","role_id","id","realm_id","entity","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","ROLE_OWNED_PERMISSIONS","getBoundPermissionsForMany","ids","promises","push","getBoundPermissions","abilities","Promise","all","flat","clearBoundPermissionsCache","manager","connection","queryResultCache","remove","prefix","key","repository","getRepository","entities","find","where","relations","permission","cache","milliseconds","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","map","policies","length","undefined","policyRepository","result","tree","findDescendantsTreeById"],"sources":["../../../../../src/adapters/database/domains/role/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-2021.\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 { buildRedisKeyPath } from '@authup/server-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport type { Role } from '@authup/core-kit';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport { CachePrefix } from '../constants.ts';\nimport { EARepository } from '../../extra-attribute-repository/index.ts';\nimport { RoleAttributeEntity } from '../role-attribute/entity.ts';\nimport { RoleEntity } from './entity.ts';\nimport { RolePermissionEntity } from '../role-permission/index.ts';\nimport { PolicyRepository } from '../policy/index.ts';\n\nexport class RoleRepository extends EARepository<RoleEntity, RoleAttributeEntity> {\n constructor(instance: DataSource | EntityManager) {\n super(instance, {\n attributeProperties: (input, parent) => {\n input.role_id = parent.id;\n input.realm_id = parent.realm_id;\n\n return input;\n },\n entity: RoleEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: RoleAttributeEntity,\n attributeForeignColumn: 'role_id',\n cachePrefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n });\n }\n\n async getBoundPermissionsForMany(\n ids: (string | Role)[],\n ) : Promise<PermissionPolicyBinding[]> {\n const promises : Promise<PermissionPolicyBinding[]>[] = [];\n\n for (const id of ids) {\n promises.push(this.getBoundPermissions(id));\n }\n\n const abilities = await Promise.all(promises);\n\n return abilities.flat();\n }\n\n async clearBoundPermissionsCache(entity: string | Role) {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n if (!this.manager.connection.queryResultCache) {\n return;\n }\n\n await this.manager.connection.queryResultCache.remove([buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: id,\n })]);\n }\n\n async getBoundPermissions(\n entity: string | Role,\n ) : Promise<PermissionPolicyBinding[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const repository = this.manager.getRepository(RolePermissionEntity);\n const entities = await repository.find({\n where: { role_id: id },\n relations: { permission: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entities) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await this.loadPolicyTrees([...policyIds]);\n\n return entities.map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n }\n\n private async loadPolicyTrees(policyIds: string[]): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(this.manager);\n const result: Record<string, BasePolicy> = {};\n\n for (const id of policyIds) {\n const tree = await policyRepository.findDescendantsTreeById(id);\n if (tree) {\n result[id] = tree;\n }\n }\n\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;AAkBA,IAAaO,iBAAb,cAAoCL,aAAAA;CAChC,YAAYM,UAAsC;AAC9C,QAAMA,UAAU;GACZC,sBAAsBC,OAAOC,WAAAA;AACzBD,UAAME,UAAUD,OAAOE;AACvBH,UAAMI,WAAWH,OAAOG;AAExB,WAAOJ;;GAEXK,QAAQX;GACRY,qBAAqB;GACrBC,iBAAiBd;GACjBe,wBAAwB;GACxBC,aAAalB,YAAYmB;GAC7B,CAAA;;CAGJ,MAAMC,2BACFC,KACmC;EACnC,MAAMC,WAAkD,EAAE;AAE1D,OAAK,MAAMV,MAAMS,IACbC,UAASC,KAAK,KAAKC,oBAAoBZ,GAAAA,CAAAA;AAK3C,UAAOa,MAFiBC,QAAQC,IAAIL,SAAAA,EAEnBM,MAAI;;CAGzB,MAAMC,2BAA2Bf,QAAuB;EACpD,IAAIF;AACJ,MAAI,OAAOE,WAAW,SAClBF,MAAKE;MAELF,MAAKE,OAAOF;AAGhB,MAAI,CAAC,KAAKkB,QAAQC,WAAWC,iBACzB;AAGJ,QAAM,KAAKF,QAAQC,WAAWC,iBAAiBC,OAAO,CAAClC,kBAAkB;GACrEmC,QAAQlC,YAAYmB;GACpBgB,KAAKvB;GACT,CAAA,CAAG,CAAA;;CAGP,MAAMY,oBACFV,QACmC;EACnC,IAAIF;AACJ,MAAI,OAAOE,WAAW,SAClBF,MAAKE;MAELF,MAAKE,OAAOF;EAIhB,MAAM0B,WAAW,MADE,KAAKR,QAAQO,cAAcjC,qBACvBgC,CAAWG,KAAK;GACnCC,OAAO,EAAE7B,SAASC,IAAG;GACrB6B,WAAW,EAAEC,YAAY,MAAK;GAC9BC,OAAO;IACH/B,IAAIb,kBAAkB;KAClBmC,QAAQlC,YAAYmB;KACpBgB,KAAKvB;KACT,CAAA;IACAgC,cAAc;IAClB;GACJ,CAAA;EAEA,MAAMC,4BAAY,IAAIC,KAAAA;AACtB,OAAK,MAAMC,SAAST,SAChB,KAAIS,MAAMC,UACNH,WAAUI,IAAIF,MAAMC,UAAS;EAIrC,MAAME,cAAc,MAAM,KAAKC,gBAAgB,CAAA,GAAIN,UAAU,CAAA;AAE7D,SAAOP,SAASc,KAAKL,UAAAA;GACjB,MAAMM,WAAyB,EAAE;AACjC,OAAIN,MAAMC,aAAaE,YAAYH,MAAMC,WACrCK,UAAS9B,KAAK2B,YAAYH,MAAMC,WAAU;AAG9C,UAAO;IACHN,YAAaK,MAAML;IACnBW,UAAUA,SAASC,SAAS,IAAID,WAAWE,KAAAA;IAC/C;IACJ;;CAGJ,MAAcJ,gBAAgBN,WAA0D;AACpF,MAAIA,UAAUS,WAAW,EACrB,QAAO,EAAC;EAGZ,MAAME,mBAAmB,IAAInD,iBAAiB,KAAKyB,QAAO;EAC1D,MAAM2B,SAAqC,EAAC;AAE5C,OAAK,MAAM7C,MAAMiC,WAAW;GACxB,MAAMa,OAAO,MAAMF,iBAAiBG,wBAAwB/C,GAAAA;AAC5D,OAAI8C,KACAD,QAAO7C,MAAM8C;;AAIrB,SAAOD"}
1
+ {"version":3,"file":"repository.mjs","names":["CachePrefix","EARepository","RoleAttributeEntity","RoleEntity","RoleRepository","instance","attributeProperties","input","parent","role_id","id","realm_id","entity","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","ROLE_OWNED_PERMISSIONS"],"sources":["../../../../../src/adapters/database/domains/role/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-2021.\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 { DataSource, EntityManager } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { EARepository } from '../../extra-attribute-repository/index.ts';\nimport { RoleAttributeEntity } from '../role-attribute/entity.ts';\nimport { RoleEntity } from './entity.ts';\n\nexport class RoleRepository extends EARepository<RoleEntity, RoleAttributeEntity> {\n constructor(instance: DataSource | EntityManager) {\n super(instance, {\n attributeProperties: (input, parent) => {\n input.role_id = parent.id;\n input.realm_id = parent.realm_id;\n\n return input;\n },\n entity: RoleEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: RoleAttributeEntity,\n attributeForeignColumn: 'role_id',\n cachePrefix: CachePrefix.ROLE_OWNED_PERMISSIONS,\n });\n }\n}\n"],"mappings":";;;;;;AAaA,IAAaI,iBAAb,cAAoCH,aAAAA;CAChC,YAAYI,UAAsC;AAC9C,QAAMA,UAAU;GACZC,sBAAsBC,OAAOC,WAAAA;AACzBD,UAAME,UAAUD,OAAOE;AACvBH,UAAMI,WAAWH,OAAOG;AAExB,WAAOJ;;GAEXK,QAAQT;GACRU,qBAAqB;GACrBC,iBAAiBZ;GACjBa,wBAAwB;GACxBC,aAAahB,YAAYiB;GAC7B,CAAA"}
@@ -1,10 +1,10 @@
1
1
  import { RealmEntity } from "../realm/entity.mjs";
2
2
  import "../realm/index.mjs";
3
+ import { RoleEntity } from "../role/entity.mjs";
3
4
  import { PermissionEntity } from "../permission/entity.mjs";
4
5
  import "../permission/index.mjs";
5
6
  import { PolicyEntity } from "../policy/entity.mjs";
6
7
  import "../policy/index.mjs";
7
- import { RoleEntity } from "../role/entity.mjs";
8
8
  import { Column, CreateDateColumn, Entity, Index, JoinColumn, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn } from "typeorm";
9
9
  //#region src/adapters/database/domains/role-permission/entity.ts
10
10
  function _ts_decorate(decorators, target, key, desc) {
@@ -1,11 +1,7 @@
1
- import type { Role, User, UserAttribute } from '@authup/core-kit';
2
- import type { PermissionPolicyBinding } from '@authup/access';
1
+ import type { User, UserAttribute } from '@authup/core-kit';
3
2
  import type { DataSource, EntityManager } from 'typeorm';
4
3
  import { EARepository } from '../../extra-attribute-repository/index.ts';
5
4
  export declare class UserRepository extends EARepository<User, UserAttribute> {
6
5
  constructor(instance: DataSource | EntityManager);
7
- getBoundRoles(entity: string | User): Promise<Role[]>;
8
- getBoundPermissions(entity: string | User): Promise<PermissionPolicyBinding[]>;
9
- private loadPolicyTrees;
10
6
  }
11
7
  //# sourceMappingURL=repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/user/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,IAAI,EACJ,IAAI,EACJ,aAAa,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAc,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAOzE,qBAAa,cAAe,SAAQ,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC;gBACrD,QAAQ,EAAE,UAAU,GAAG,aAAa;IAkB1C,aAAa,CACf,MAAM,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,IAAI,EAAE,CAAC;IAyBb,mBAAmB,CACrB,MAAM,EAAE,MAAM,GAAG,IAAI,GACrB,OAAO,CAAC,uBAAuB,EAAE,CAAC;YA4CxB,eAAe;CAiBhC"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/domains/user/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEzD,OAAO,EAAE,YAAY,EAAE,MAAM,2CAA2C,CAAC;AAIzE,qBAAa,cAAe,SAAQ,YAAY,CAAC,IAAI,EAAE,aAAa,CAAC;gBACrD,QAAQ,EAAE,UAAU,GAAG,aAAa;CAenD"}
@@ -1,16 +1,9 @@
1
1
  import { CachePrefix } from "../constants.mjs";
2
2
  import { EARepository } from "../../extra-attribute-repository/repository.mjs";
3
3
  import "../../extra-attribute-repository/index.mjs";
4
- import { PolicyRepository } from "../policy/repository.mjs";
5
- import "../policy/index.mjs";
6
4
  import { UserEntity } from "./entity.mjs";
7
5
  import { UserAttributeEntity } from "../user-attribute/entity.mjs";
8
6
  import "../user-attribute/index.mjs";
9
- import { UserPermissionEntity } from "../user-permission/entity.mjs";
10
- import "../user-permission/index.mjs";
11
- import { UserRoleEntity } from "../user-role/entity.mjs";
12
- import "../user-role/index.mjs";
13
- import { buildRedisKeyPath } from "@authup/server-kit";
14
7
  //#region src/adapters/database/domains/user/repository.ts
15
8
  var UserRepository = class extends EARepository {
16
9
  constructor(instance) {
@@ -27,59 +20,6 @@ var UserRepository = class extends EARepository {
27
20
  cachePrefix: CachePrefix.USER_OWNED_ATTRIBUTES
28
21
  });
29
22
  }
30
- async getBoundRoles(entity) {
31
- let id;
32
- if (typeof entity === "string") id = entity;
33
- else id = entity.id;
34
- return (await this.manager.getRepository(UserRoleEntity).find({
35
- where: { user_id: id },
36
- relations: { role: true },
37
- cache: {
38
- id: buildRedisKeyPath({
39
- prefix: CachePrefix.USER_OWNED_ROLES,
40
- key: id
41
- }),
42
- milliseconds: 6e4
43
- }
44
- })).map((relation) => relation.role);
45
- }
46
- async getBoundPermissions(entity) {
47
- let id;
48
- if (typeof entity === "string") id = entity;
49
- else id = entity.id;
50
- const entities = await this.manager.getRepository(UserPermissionEntity).find({
51
- where: { user_id: id },
52
- relations: { permission: true },
53
- cache: {
54
- id: buildRedisKeyPath({
55
- prefix: CachePrefix.USER_OWNED_PERMISSIONS,
56
- key: id
57
- }),
58
- milliseconds: 6e4
59
- }
60
- });
61
- const policyIds = /* @__PURE__ */ new Set();
62
- for (const entry of entities) if (entry.policy_id) policyIds.add(entry.policy_id);
63
- const policyTrees = await this.loadPolicyTrees([...policyIds]);
64
- return entities.map((entry) => {
65
- const policies = [];
66
- if (entry.policy_id && policyTrees[entry.policy_id]) policies.push(policyTrees[entry.policy_id]);
67
- return {
68
- permission: entry.permission,
69
- policies: policies.length > 0 ? policies : void 0
70
- };
71
- });
72
- }
73
- async loadPolicyTrees(policyIds) {
74
- if (policyIds.length === 0) return {};
75
- const policyRepository = new PolicyRepository(this.manager);
76
- const result = {};
77
- for (const id of policyIds) {
78
- const tree = await policyRepository.findDescendantsTreeById(id);
79
- if (tree) result[id] = tree;
80
- }
81
- return result;
82
- }
83
23
  };
84
24
  //#endregion
85
25
  export { UserRepository };
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["buildRedisKeyPath","CachePrefix","EARepository","UserAttributeEntity","UserPermissionEntity","UserRoleEntity","PolicyRepository","UserEntity","UserRepository","instance","attributeProperties","input","parent","user_id","id","realm_id","entity","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","USER_OWNED_ATTRIBUTES","getBoundRoles","items","manager","getRepository","find","where","relations","role","cache","prefix","USER_OWNED_ROLES","key","milliseconds","map","relation","getBoundPermissions","repository","entities","permission","USER_OWNED_PERMISSIONS","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","policies","push","length","undefined","policyRepository","result","tree","findDescendantsTreeById"],"sources":["../../../../../src/adapters/database/domains/user/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-2021.\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 {\n Role,\n User,\n UserAttribute,\n} from '@authup/core-kit';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { EARepository } from '../../extra-attribute-repository/index.ts';\nimport { UserAttributeEntity } from '../user-attribute/index.ts';\nimport { UserPermissionEntity } from '../user-permission/index.ts';\nimport { UserRoleEntity } from '../user-role/index.ts';\nimport { PolicyRepository } from '../policy/index.ts';\nimport { UserEntity } from './entity.ts';\n\nexport class UserRepository extends EARepository<User, UserAttribute> {\n constructor(instance: DataSource | EntityManager) {\n super(instance, {\n attributeProperties: (input, parent) => {\n input.user_id = parent.id;\n input.realm_id = parent.realm_id;\n\n return input;\n },\n entity: UserEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: UserAttributeEntity,\n attributeForeignColumn: 'user_id',\n cachePrefix: CachePrefix.USER_OWNED_ATTRIBUTES,\n });\n }\n\n // ------------------------------------------------------------------\n\n async getBoundRoles(\n entity: string | User,\n ) : Promise<Role[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const items = await this.manager\n .getRepository(UserRoleEntity)\n .find({\n where: { user_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return items.map((relation) => relation.role);\n }\n\n async getBoundPermissions(\n entity: string | User,\n ) : Promise<PermissionPolicyBinding[]> {\n let id : string;\n if (typeof entity === 'string') {\n id = entity;\n } else {\n id = entity.id;\n }\n\n const repository = this.manager.getRepository(UserPermissionEntity);\n\n const entities = await repository.find({\n where: { user_id: id },\n relations: { permission: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.USER_OWNED_PERMISSIONS,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entities) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await this.loadPolicyTrees([...policyIds]);\n\n return entities.map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n }\n\n private async loadPolicyTrees(policyIds: string[]): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(this.manager);\n const result: Record<string, BasePolicy> = {};\n\n for (const id of policyIds) {\n const tree = await policyRepository.findDescendantsTreeById(id);\n if (tree) {\n result[id] = tree;\n }\n }\n\n return result;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAuBA,IAAaQ,iBAAb,cAAoCN,aAAAA;CAChC,YAAYO,UAAsC;AAC9C,QAAMA,UAAU;GACZC,sBAAsBC,OAAOC,WAAAA;AACzBD,UAAME,UAAUD,OAAOE;AACvBH,UAAMI,WAAWH,OAAOG;AAExB,WAAOJ;;GAEXK,QAAQT;GACRU,qBAAqB;GACrBC,iBAAiBf;GACjBgB,wBAAwB;GACxBC,aAAanB,YAAYoB;GAC7B,CAAA;;CAKJ,MAAMC,cACFN,QACgB;EAChB,IAAIF;AACJ,MAAI,OAAOE,WAAW,SAClBF,MAAKE;MAELF,MAAKE,OAAOF;AAiBhB,UAAOS,MAda,KAAKC,QACpBC,cAAcpB,eAAAA,CACdqB,KAAK;GACFC,OAAO,EAAEd,SAASC,IAAG;GACrBc,WAAW,EAAEC,MAAM,MAAK;GACxBC,OAAO;IACHhB,IAAId,kBAAkB;KAClB+B,QAAQ9B,YAAY+B;KACpBC,KAAKnB;KACT,CAAA;IACAoB,cAAc;IAClB;GACJ,CAAA,EAESC,KAAKC,aAAaA,SAASP,KAAI;;CAGhD,MAAMQ,oBACFrB,QACmC;EACnC,IAAIF;AACJ,MAAI,OAAOE,WAAW,SAClBF,MAAKE;MAELF,MAAKE,OAAOF;EAKhB,MAAMyB,WAAW,MAFE,KAAKf,QAAQC,cAAcrB,qBAEvBkC,CAAWZ,KAAK;GACnCC,OAAO,EAAEd,SAASC,IAAG;GACrBc,WAAW,EAAEY,YAAY,MAAK;GAC9BV,OAAO;IACHhB,IAAId,kBAAkB;KAClB+B,QAAQ9B,YAAYwC;KACpBR,KAAKnB;KACT,CAAA;IACAoB,cAAc;IAClB;GACJ,CAAA;EAEA,MAAMQ,4BAAY,IAAIC,KAAAA;AACtB,OAAK,MAAMC,SAASL,SAChB,KAAIK,MAAMC,UACNH,WAAUI,IAAIF,MAAMC,UAAS;EAIrC,MAAME,cAAc,MAAM,KAAKC,gBAAgB,CAAA,GAAIN,UAAU,CAAA;AAE7D,SAAOH,SAASJ,KAAKS,UAAAA;GACjB,MAAMK,WAAyB,EAAE;AACjC,OAAIL,MAAMC,aAAaE,YAAYH,MAAMC,WACrCI,UAASC,KAAKH,YAAYH,MAAMC,WAAU;AAG9C,UAAO;IACHL,YAAaI,MAAMJ;IACnBS,UAAUA,SAASE,SAAS,IAAIF,WAAWG,KAAAA;IAC/C;IACJ;;CAGJ,MAAcJ,gBAAgBN,WAA0D;AACpF,MAAIA,UAAUS,WAAW,EACrB,QAAO,EAAC;EAGZ,MAAME,mBAAmB,IAAI/C,iBAAiB,KAAKkB,QAAO;EAC1D,MAAM8B,SAAqC,EAAC;AAE5C,OAAK,MAAMxC,MAAM4B,WAAW;GACxB,MAAMa,OAAO,MAAMF,iBAAiBG,wBAAwB1C,GAAAA;AAC5D,OAAIyC,KACAD,QAAOxC,MAAMyC;;AAIrB,SAAOD"}
1
+ {"version":3,"file":"repository.mjs","names":["CachePrefix","EARepository","UserAttributeEntity","UserEntity","UserRepository","instance","attributeProperties","input","parent","user_id","id","realm_id","entity","entityPrimaryColumn","attributeEntity","attributeForeignColumn","cachePrefix","USER_OWNED_ATTRIBUTES"],"sources":["../../../../../src/adapters/database/domains/user/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2021-2021.\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 { User, UserAttribute } from '@authup/core-kit';\nimport type { DataSource, EntityManager } from 'typeorm';\nimport { CachePrefix } from '../constants.ts';\nimport { EARepository } from '../../extra-attribute-repository/index.ts';\nimport { UserAttributeEntity } from '../user-attribute/index.ts';\nimport { UserEntity } from './entity.ts';\n\nexport class UserRepository extends EARepository<User, UserAttribute> {\n constructor(instance: DataSource | EntityManager) {\n super(instance, {\n attributeProperties: (input, parent) => {\n input.user_id = parent.id;\n input.realm_id = parent.realm_id;\n\n return input;\n },\n entity: UserEntity,\n entityPrimaryColumn: 'id',\n attributeEntity: UserAttributeEntity,\n attributeForeignColumn: 'user_id',\n cachePrefix: CachePrefix.USER_OWNED_ATTRIBUTES,\n });\n }\n}\n"],"mappings":";;;;;;;AAcA,IAAaI,iBAAb,cAAoCH,aAAAA;CAChC,YAAYI,UAAsC;AAC9C,QAAMA,UAAU;GACZC,sBAAsBC,OAAOC,WAAAA;AACzBD,UAAME,UAAUD,OAAOE;AACvBH,UAAMI,WAAWH,OAAOG;AAExB,WAAOJ;;GAEXK,QAAQT;GACRU,qBAAqB;GACrBC,iBAAiBZ;GACjBa,wBAAwB;GACxBC,aAAahB,YAAYiB;GAC7B,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/extra-attribute-repository/tree/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../src/adapters/database/extra-attribute-repository/tree/repository.ts"],"names":[],"mappings":"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"}
@@ -66,6 +66,7 @@ import { FindOptionsUtils, InstanceChecker, TreeRepository, TreeRepositoryUtils
66
66
  depth: -1,
67
67
  ...options
68
68
  });
69
+ await this.extendOneWithEA(entity);
69
70
  return entity;
70
71
  }
71
72
  async findAncestors(entity, options) {
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["FindOptionsUtils","InstanceChecker","TreeRepository","TreeRepositoryUtils","ExtraAttributesTreeRepositoryAdapter","EATreeRepository","adapter","options","instance","entity","attributeEntity","ctx","isDataSource","manager","repository","attributeRepository","getRepository","create","entityLike","Array","isArray","map","i","preserveExtraAttributes","source","columns","Set","col","metadata","add","propertyName","rel","relations","key","Object","keys","has","saveOneWithEA","input","attributes","saveWithEA","findOneWithEA","extraOptions","findOneWithEAByPrimaryColumn","value","findManyWithEA","findWithEA","extendOneWithEA","output","extendManyWithEA","entities","findRoots","findDescendantsTree","qb","createDescendantsQueryBuilder","applyOptionsToTreeQueryBuilder","getRawAndEntities","relationMaps","createRelationMaps","raw","buildChildrenEntityTree","depth","findAncestors","findAncestorsTree","createAncestorsQueryBuilder","buildParentEntityTree","updateClosureTable","primaryKeyValue","primaryColumns","getEntityValue","closureTable","closureJunctionTable","executeClosureTableUpdate","connection","transaction","tableName","ancestorColumn","ancestorColumns","descendantColumn","descendantColumns","param","index","driver","createParameter","ancestors","query","databasePath","treeParentRelation","parentId","joinColumns","ancestorIds","filter","ancestor","length","descendants","descendantIds","descendant","placeholders","_","join","ancestorsOfDescendants","acc","reduce","curr","push","ancestorsOfDescendent","ancestorId","indexOf","descendantId"],"sources":["../../../../../src/adapters/database/extra-attribute-repository/tree/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2024-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 {\n DataSource, \n DeepPartial, \n EntityManager, \n FindManyOptions, \n FindOneOptions, \n FindTreeOptions,\n SelectQueryBuilder,\n} from 'typeorm';\nimport {\n FindOptionsUtils,\n InstanceChecker,\n TreeRepository, \n TreeRepositoryUtils,\n} from 'typeorm';\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { ExtraAttributesRepositoryAdapter } from '../adapter.ts';\nimport type {\n EARepositoryEntityBase, \n EARepositoryFindOptions, \n EARepositoryOptions, \n EARepositorySaveOptions, \n IEARepository,\n} from '../types.ts';\nimport { ExtraAttributesTreeRepositoryAdapter } from './adapter.ts';\n\n/**\n * @see https://github.com/typeorm/typeorm/blob/master/src/repository/TreeRepository.ts\n */\nexport class EATreeRepository<\n T extends ObjectLiteral = ObjectLiteral,\n A extends EARepositoryEntityBase = EARepositoryEntityBase,\n> extends TreeRepository<T> implements IEARepository<T> {\n protected adapter: ExtraAttributesRepositoryAdapter<T, A>;\n\n protected options: EARepositoryOptions<T, A>;\n\n constructor(\n instance: DataSource | EntityManager,\n options: EARepositoryOptions<T, A>,\n ) {\n const {\n entity,\n attributeEntity,\n ...ctx\n } = options;\n\n super(\n entity,\n InstanceChecker.isDataSource(instance) ? instance.manager : instance,\n );\n\n this.options = options;\n this.adapter = new ExtraAttributesTreeRepositoryAdapter<T, A>({\n ...ctx,\n repository: this,\n attributeRepository: this.manager.getRepository(attributeEntity),\n });\n }\n\n // ------------------------------------------------------------------------------\n\n override create(): T;\n\n override create(entityLikeArray: DeepPartial<T>[]): T[];\n\n override create(entityLike: DeepPartial<T>): T;\n\n override create(entityLike?: DeepPartial<T> | DeepPartial<T>[]): T | T[] {\n if (!entityLike) {\n return super.create();\n }\n\n if (Array.isArray(entityLike)) {\n return super.create(entityLike).map((entity, i) => {\n this.preserveExtraAttributes(entity, entityLike[i]);\n return entity;\n });\n }\n\n const entity = super.create(entityLike);\n this.preserveExtraAttributes(entity, entityLike);\n return entity;\n }\n\n private preserveExtraAttributes(entity: T, source: DeepPartial<T>): void {\n const columns = new Set<string>();\n for (const col of this.metadata.columns) {\n columns.add(col.propertyName);\n }\n for (const rel of this.metadata.relations) {\n columns.add(rel.propertyName);\n }\n\n for (const key of Object.keys(source)) {\n if (!columns.has(key) && !(key in entity)) {\n (entity as Record<string, any>)[key] = (source as Record<string, any>)[key];\n }\n }\n }\n\n // ------------------------------------------------------------------------------\n\n async saveOneWithEA<E extends Record<string, any>>(\n input: T & E,\n attributes?: E,\n options?: EARepositorySaveOptions<T>,\n ): Promise<T & E> {\n return this.adapter.saveWithEA(input, attributes, options);\n }\n\n // ------------------------------------------------------------------------------\n\n async findOneWithEA(\n options: FindOneOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<T | undefined> {\n return this.adapter.findOneWithEA(options, extraOptions);\n }\n\n async findOneWithEAByPrimaryColumn<E extends Record<string, any>>(\n value: T[keyof T],\n extraOptions?: EARepositoryFindOptions,\n ): Promise<E> {\n return this.adapter.findOneWithEAByPrimaryColumn(value, extraOptions);\n }\n\n async findManyWithEA<\n E extends Record<string, any>,\n >(\n options: FindManyOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<(T & E)[]> {\n return this.adapter.findWithEA(options, extraOptions);\n }\n\n // ------------------------------------------------------------------------------\n\n async extendOneWithEA<E extends Record<string, any>>(\n entity: T,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<T & E> {\n const [output] = await this.extendManyWithEA([entity], extraOptions);\n\n return output as (T & E);\n }\n\n async extendManyWithEA<E extends Record<string, any>>(\n entities: T[],\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<(T & E)[]> {\n return this.adapter.extendManyWithEA(entities, extraOptions);\n }\n\n // -------------------------------------------------------------------------------\n\n async findRoots(options?: FindTreeOptions): Promise<T[]> {\n const entities = await super.findRoots(options);\n\n await this.extendManyWithEA(entities);\n\n return entities;\n }\n\n async findDescendantsTree(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T> {\n const qb: SelectQueryBuilder<T> = this.createDescendantsQueryBuilder(\n 'treeEntity',\n 'treeClosure',\n entity,\n );\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options);\n\n const entities = await qb.getRawAndEntities();\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n 'treeEntity',\n entities.raw,\n );\n\n await this.extendManyWithEA(entities.entities);\n\n TreeRepositoryUtils.buildChildrenEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n {\n depth: -1,\n ...options,\n },\n );\n\n return entity;\n }\n\n async findAncestors(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T[]> {\n const entities = await super.findAncestors(entity, options);\n\n await this.extendManyWithEA(entities);\n\n return entities;\n }\n\n // -------------------------------------------------------------------------------\n\n async findAncestorsTree(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T> {\n const qb = this.createAncestorsQueryBuilder(\n 'treeEntity',\n 'treeClosure',\n entity,\n );\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options);\n\n const entities = await qb.getRawAndEntities();\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n 'treeEntity',\n entities.raw,\n );\n\n await this.extendManyWithEA(entities.entities);\n\n TreeRepositoryUtils.buildParentEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n );\n return entity;\n }\n\n // -------------------------------------------------------------------------------\n\n async updateClosureTable(entity: T, manager?: EntityManager) {\n const primaryKeyValue = this.metadata.primaryColumns[0].getEntityValue(entity);\n if (!primaryKeyValue) {\n return;\n }\n\n const closureTable = this.metadata.closureJunctionTable;\n if (!closureTable) {\n return;\n }\n\n if (manager) {\n await this.executeClosureTableUpdate(entity, manager);\n } else {\n await this.manager.connection.transaction(async (manager) => {\n await this.executeClosureTableUpdate(entity, manager);\n });\n }\n }\n\n private async executeClosureTableUpdate(entity: T, manager: EntityManager) {\n const primaryKeyValue = this.metadata.primaryColumns[0].getEntityValue(entity);\n\n const { tableName } = this.metadata.closureJunctionTable;\n const ancestorColumn = this.metadata.closureJunctionTable.ancestorColumns[0];\n const descendantColumn = this.metadata.closureJunctionTable.descendantColumns[0];\n\n const param = (index: number) => manager.connection.driver.createParameter(`p${index}`, index);\n\n // 1. Get All ancestors of current entity\n const ancestors = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${descendantColumn.databasePath} = ${param(0)} AND\n ${ancestorColumn.databasePath} != ${param(1)}`,\n [primaryKeyValue, primaryKeyValue],\n );\n\n if (!this.metadata.treeParentRelation) {\n return;\n }\n\n const parentId = this.metadata.treeParentRelation.joinColumns[0].getEntityValue(entity);\n\n let ancestorIds : string[];\n if (parentId) {\n ancestorIds = [\n parentId,\n ...ancestors\n .filter((ancestor) => ancestor[ancestorColumn.databasePath] !== parentId)\n .map((ancestor) => ancestor[ancestorColumn.databasePath]),\n ];\n } else {\n ancestorIds = ancestors.map((ancestor) => ancestor[ancestorColumn.databasePath]);\n }\n\n if (ancestorIds.length === 0) {\n return;\n }\n\n // 2. Get All descendants of current entity.\n const descendants = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${ancestorColumn.databasePath} = ${param(0)} AND\n ${descendantColumn.databasePath} != ${param(1)}`,\n [primaryKeyValue, primaryKeyValue],\n );\n\n if (parentId) {\n // 3. get all descendant\n const descendantIds = descendants\n .map((descendant) => descendant[descendantColumn.databasePath]);\n\n if (descendantIds.length > 0) {\n // 4. get all ancestors of each descendant\n const placeholders = descendantIds.map((_, i) => param(i + 1)).join(',');\n const ancestorsOfDescendants = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE\n ${ancestorColumn.databasePath} != ${param(0)} AND\n ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${descendantColumn.databasePath} IN (${placeholders})`,\n [primaryKeyValue, ...descendantIds],\n );\n\n const acc = ancestorsOfDescendants.reduce((acc, curr) => {\n if (!acc[curr[descendantColumn.databasePath]]) {\n acc[curr[descendantColumn.databasePath]] = [];\n }\n\n acc[curr[descendantColumn.databasePath]].push(curr[ancestorColumn.databasePath]);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 5. Check if for each child a relation exists with each ancestor (create if not exist)\n for (const descendant of descendantIds) {\n const ancestorsOfDescendent = acc[descendant] ?? [];\n\n for (const ancestorId of ancestorIds) {\n const index = ancestorsOfDescendent.indexOf(ancestorId);\n if (index === -1) {\n await manager.query(\n `INSERT INTO ${tableName}\n (${ancestorColumn.databasePath}, ${descendantColumn.databasePath})\n VALUES (${param(0)}, ${param(1)})`,\n [ancestorId, descendant],\n );\n }\n }\n }\n }\n } else {\n const descendantIds = [\n primaryKeyValue,\n ...descendants.map((descendant) => descendant[descendantColumn.databasePath]),\n ];\n\n for (const ancestorId of ancestorIds) {\n for (const descendantId of descendantIds) {\n await manager.query(\n `DELETE FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} = ${param(0)}\n AND ${descendantColumn.databasePath} = ${param(1)}`,\n [ancestorId, descendantId],\n );\n }\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"repository.mjs","names":["FindOptionsUtils","InstanceChecker","TreeRepository","TreeRepositoryUtils","ExtraAttributesTreeRepositoryAdapter","EATreeRepository","adapter","options","instance","entity","attributeEntity","ctx","isDataSource","manager","repository","attributeRepository","getRepository","create","entityLike","Array","isArray","map","i","preserveExtraAttributes","source","columns","Set","col","metadata","add","propertyName","rel","relations","key","Object","keys","has","saveOneWithEA","input","attributes","saveWithEA","findOneWithEA","extraOptions","findOneWithEAByPrimaryColumn","value","findManyWithEA","findWithEA","extendOneWithEA","output","extendManyWithEA","entities","findRoots","findDescendantsTree","qb","createDescendantsQueryBuilder","applyOptionsToTreeQueryBuilder","getRawAndEntities","relationMaps","createRelationMaps","raw","buildChildrenEntityTree","depth","findAncestors","findAncestorsTree","createAncestorsQueryBuilder","buildParentEntityTree","updateClosureTable","primaryKeyValue","primaryColumns","getEntityValue","closureTable","closureJunctionTable","executeClosureTableUpdate","connection","transaction","tableName","ancestorColumn","ancestorColumns","descendantColumn","descendantColumns","param","index","driver","createParameter","ancestors","query","databasePath","treeParentRelation","parentId","joinColumns","ancestorIds","filter","ancestor","length","descendants","descendantIds","descendant","placeholders","_","join","ancestorsOfDescendants","acc","reduce","curr","push","ancestorsOfDescendent","ancestorId","indexOf","descendantId"],"sources":["../../../../../src/adapters/database/extra-attribute-repository/tree/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2024-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 {\n DataSource, \n DeepPartial, \n EntityManager, \n FindManyOptions, \n FindOneOptions, \n FindTreeOptions,\n SelectQueryBuilder,\n} from 'typeorm';\nimport {\n FindOptionsUtils,\n InstanceChecker,\n TreeRepository, \n TreeRepositoryUtils,\n} from 'typeorm';\nimport type { ObjectLiteral } from '@authup/kit';\nimport type { ExtraAttributesRepositoryAdapter } from '../adapter.ts';\nimport type {\n EARepositoryEntityBase, \n EARepositoryFindOptions, \n EARepositoryOptions, \n EARepositorySaveOptions, \n IEARepository,\n} from '../types.ts';\nimport { ExtraAttributesTreeRepositoryAdapter } from './adapter.ts';\n\n/**\n * @see https://github.com/typeorm/typeorm/blob/master/src/repository/TreeRepository.ts\n */\nexport class EATreeRepository<\n T extends ObjectLiteral = ObjectLiteral,\n A extends EARepositoryEntityBase = EARepositoryEntityBase,\n> extends TreeRepository<T> implements IEARepository<T> {\n protected adapter: ExtraAttributesRepositoryAdapter<T, A>;\n\n protected options: EARepositoryOptions<T, A>;\n\n constructor(\n instance: DataSource | EntityManager,\n options: EARepositoryOptions<T, A>,\n ) {\n const {\n entity,\n attributeEntity,\n ...ctx\n } = options;\n\n super(\n entity,\n InstanceChecker.isDataSource(instance) ? instance.manager : instance,\n );\n\n this.options = options;\n this.adapter = new ExtraAttributesTreeRepositoryAdapter<T, A>({\n ...ctx,\n repository: this,\n attributeRepository: this.manager.getRepository(attributeEntity),\n });\n }\n\n // ------------------------------------------------------------------------------\n\n override create(): T;\n\n override create(entityLikeArray: DeepPartial<T>[]): T[];\n\n override create(entityLike: DeepPartial<T>): T;\n\n override create(entityLike?: DeepPartial<T> | DeepPartial<T>[]): T | T[] {\n if (!entityLike) {\n return super.create();\n }\n\n if (Array.isArray(entityLike)) {\n return super.create(entityLike).map((entity, i) => {\n this.preserveExtraAttributes(entity, entityLike[i]);\n return entity;\n });\n }\n\n const entity = super.create(entityLike);\n this.preserveExtraAttributes(entity, entityLike);\n return entity;\n }\n\n private preserveExtraAttributes(entity: T, source: DeepPartial<T>): void {\n const columns = new Set<string>();\n for (const col of this.metadata.columns) {\n columns.add(col.propertyName);\n }\n for (const rel of this.metadata.relations) {\n columns.add(rel.propertyName);\n }\n\n for (const key of Object.keys(source)) {\n if (!columns.has(key) && !(key in entity)) {\n (entity as Record<string, any>)[key] = (source as Record<string, any>)[key];\n }\n }\n }\n\n // ------------------------------------------------------------------------------\n\n async saveOneWithEA<E extends Record<string, any>>(\n input: T & E,\n attributes?: E,\n options?: EARepositorySaveOptions<T>,\n ): Promise<T & E> {\n return this.adapter.saveWithEA(input, attributes, options);\n }\n\n // ------------------------------------------------------------------------------\n\n async findOneWithEA(\n options: FindOneOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<T | undefined> {\n return this.adapter.findOneWithEA(options, extraOptions);\n }\n\n async findOneWithEAByPrimaryColumn<E extends Record<string, any>>(\n value: T[keyof T],\n extraOptions?: EARepositoryFindOptions,\n ): Promise<E> {\n return this.adapter.findOneWithEAByPrimaryColumn(value, extraOptions);\n }\n\n async findManyWithEA<\n E extends Record<string, any>,\n >(\n options: FindManyOptions<T>,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<(T & E)[]> {\n return this.adapter.findWithEA(options, extraOptions);\n }\n\n // ------------------------------------------------------------------------------\n\n async extendOneWithEA<E extends Record<string, any>>(\n entity: T,\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<T & E> {\n const [output] = await this.extendManyWithEA([entity], extraOptions);\n\n return output as (T & E);\n }\n\n async extendManyWithEA<E extends Record<string, any>>(\n entities: T[],\n extraOptions: EARepositoryFindOptions = {},\n ): Promise<(T & E)[]> {\n return this.adapter.extendManyWithEA(entities, extraOptions);\n }\n\n // -------------------------------------------------------------------------------\n\n async findRoots(options?: FindTreeOptions): Promise<T[]> {\n const entities = await super.findRoots(options);\n\n await this.extendManyWithEA(entities);\n\n return entities;\n }\n\n async findDescendantsTree(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T> {\n const qb: SelectQueryBuilder<T> = this.createDescendantsQueryBuilder(\n 'treeEntity',\n 'treeClosure',\n entity,\n );\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options);\n\n const entities = await qb.getRawAndEntities();\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n 'treeEntity',\n entities.raw,\n );\n\n await this.extendManyWithEA(entities.entities);\n\n TreeRepositoryUtils.buildChildrenEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n {\n depth: -1,\n ...options,\n },\n );\n\n // The descendants closure may include the root, but `entity` here is a\n // different reference than the one in `entities.entities`, so its own EA\n // fields are not populated. Load them explicitly so leaf-as-root callers\n // (e.g. policies bound directly to permissions/junctions) see EA.\n await this.extendOneWithEA(entity);\n\n return entity;\n }\n\n async findAncestors(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T[]> {\n const entities = await super.findAncestors(entity, options);\n\n await this.extendManyWithEA(entities);\n\n return entities;\n }\n\n // -------------------------------------------------------------------------------\n\n async findAncestorsTree(\n entity: T,\n options?: FindTreeOptions,\n ): Promise<T> {\n const qb = this.createAncestorsQueryBuilder(\n 'treeEntity',\n 'treeClosure',\n entity,\n );\n FindOptionsUtils.applyOptionsToTreeQueryBuilder(qb, options);\n\n const entities = await qb.getRawAndEntities();\n const relationMaps = TreeRepositoryUtils.createRelationMaps(\n this.manager,\n this.metadata,\n 'treeEntity',\n entities.raw,\n );\n\n await this.extendManyWithEA(entities.entities);\n\n TreeRepositoryUtils.buildParentEntityTree(\n this.metadata,\n entity,\n entities.entities,\n relationMaps,\n );\n return entity;\n }\n\n // -------------------------------------------------------------------------------\n\n async updateClosureTable(entity: T, manager?: EntityManager) {\n const primaryKeyValue = this.metadata.primaryColumns[0].getEntityValue(entity);\n if (!primaryKeyValue) {\n return;\n }\n\n const closureTable = this.metadata.closureJunctionTable;\n if (!closureTable) {\n return;\n }\n\n if (manager) {\n await this.executeClosureTableUpdate(entity, manager);\n } else {\n await this.manager.connection.transaction(async (manager) => {\n await this.executeClosureTableUpdate(entity, manager);\n });\n }\n }\n\n private async executeClosureTableUpdate(entity: T, manager: EntityManager) {\n const primaryKeyValue = this.metadata.primaryColumns[0].getEntityValue(entity);\n\n const { tableName } = this.metadata.closureJunctionTable;\n const ancestorColumn = this.metadata.closureJunctionTable.ancestorColumns[0];\n const descendantColumn = this.metadata.closureJunctionTable.descendantColumns[0];\n\n const param = (index: number) => manager.connection.driver.createParameter(`p${index}`, index);\n\n // 1. Get All ancestors of current entity\n const ancestors = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${descendantColumn.databasePath} = ${param(0)} AND\n ${ancestorColumn.databasePath} != ${param(1)}`,\n [primaryKeyValue, primaryKeyValue],\n );\n\n if (!this.metadata.treeParentRelation) {\n return;\n }\n\n const parentId = this.metadata.treeParentRelation.joinColumns[0].getEntityValue(entity);\n\n let ancestorIds : string[];\n if (parentId) {\n ancestorIds = [\n parentId,\n ...ancestors\n .filter((ancestor) => ancestor[ancestorColumn.databasePath] !== parentId)\n .map((ancestor) => ancestor[ancestorColumn.databasePath]),\n ];\n } else {\n ancestorIds = ancestors.map((ancestor) => ancestor[ancestorColumn.databasePath]);\n }\n\n if (ancestorIds.length === 0) {\n return;\n }\n\n // 2. Get All descendants of current entity.\n const descendants = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${ancestorColumn.databasePath} = ${param(0)} AND\n ${descendantColumn.databasePath} != ${param(1)}`,\n [primaryKeyValue, primaryKeyValue],\n );\n\n if (parentId) {\n // 3. get all descendant\n const descendantIds = descendants\n .map((descendant) => descendant[descendantColumn.databasePath]);\n\n if (descendantIds.length > 0) {\n // 4. get all ancestors of each descendant\n const placeholders = descendantIds.map((_, i) => param(i + 1)).join(',');\n const ancestorsOfDescendants = await manager.query<Record<string, any>[]>(\n `SELECT *\n FROM ${tableName}\n WHERE\n ${ancestorColumn.databasePath} != ${param(0)} AND\n ${ancestorColumn.databasePath} != ${descendantColumn.databasePath} AND\n ${descendantColumn.databasePath} IN (${placeholders})`,\n [primaryKeyValue, ...descendantIds],\n );\n\n const acc = ancestorsOfDescendants.reduce((acc, curr) => {\n if (!acc[curr[descendantColumn.databasePath]]) {\n acc[curr[descendantColumn.databasePath]] = [];\n }\n\n acc[curr[descendantColumn.databasePath]].push(curr[ancestorColumn.databasePath]);\n return acc;\n }, {} as Record<string, string[]>);\n\n // 5. Check if for each child a relation exists with each ancestor (create if not exist)\n for (const descendant of descendantIds) {\n const ancestorsOfDescendent = acc[descendant] ?? [];\n\n for (const ancestorId of ancestorIds) {\n const index = ancestorsOfDescendent.indexOf(ancestorId);\n if (index === -1) {\n await manager.query(\n `INSERT INTO ${tableName}\n (${ancestorColumn.databasePath}, ${descendantColumn.databasePath})\n VALUES (${param(0)}, ${param(1)})`,\n [ancestorId, descendant],\n );\n }\n }\n }\n }\n } else {\n const descendantIds = [\n primaryKeyValue,\n ...descendants.map((descendant) => descendant[descendantColumn.databasePath]),\n ];\n\n for (const ancestorId of ancestorIds) {\n for (const descendantId of descendantIds) {\n await manager.query(\n `DELETE FROM ${tableName}\n WHERE ${ancestorColumn.databasePath} = ${param(0)}\n AND ${descendantColumn.databasePath} = ${param(1)}`,\n [ancestorId, descendantId],\n );\n }\n }\n }\n }\n}\n"],"mappings":"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"}