@authup/server-core 1.0.0-beta.50 → 1.0.0-beta.51

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 (230) hide show
  1. package/dist/adapters/database/domains/client-permission/entity.d.ts +2 -1
  2. package/dist/adapters/database/domains/client-permission/entity.d.ts.map +1 -1
  3. package/dist/adapters/database/domains/client-permission/entity.mjs +6 -0
  4. package/dist/adapters/database/domains/client-permission/entity.mjs.map +1 -1
  5. package/dist/adapters/database/domains/robot-permission/entity.d.ts +2 -1
  6. package/dist/adapters/database/domains/robot-permission/entity.d.ts.map +1 -1
  7. package/dist/adapters/database/domains/robot-permission/entity.mjs +6 -0
  8. package/dist/adapters/database/domains/robot-permission/entity.mjs.map +1 -1
  9. package/dist/adapters/database/domains/robot-role/entity.mjs +1 -1
  10. package/dist/adapters/database/domains/robot-role/entity.mjs.map +1 -1
  11. package/dist/adapters/database/domains/role-permission/entity.d.ts +2 -1
  12. package/dist/adapters/database/domains/role-permission/entity.d.ts.map +1 -1
  13. package/dist/adapters/database/domains/role-permission/entity.mjs +6 -0
  14. package/dist/adapters/database/domains/role-permission/entity.mjs.map +1 -1
  15. package/dist/adapters/database/domains/user-permission/entity.d.ts +2 -1
  16. package/dist/adapters/database/domains/user-permission/entity.d.ts.map +1 -1
  17. package/dist/adapters/database/domains/user-permission/entity.mjs +6 -0
  18. package/dist/adapters/database/domains/user-permission/entity.mjs.map +1 -1
  19. package/dist/adapters/database/migrations/mysql/1779300000000-Default.d.ts +7 -0
  20. package/dist/adapters/database/migrations/mysql/1779300000000-Default.d.ts.map +1 -0
  21. package/dist/adapters/database/migrations/mysql/1779300000000-Default.mjs +85 -0
  22. package/dist/adapters/database/migrations/mysql/1779300000000-Default.mjs.map +1 -0
  23. package/dist/adapters/database/migrations/postgres/1779300000000-Default.d.ts +7 -0
  24. package/dist/adapters/database/migrations/postgres/1779300000000-Default.d.ts.map +1 -0
  25. package/dist/adapters/database/migrations/postgres/1779300000000-Default.mjs +87 -0
  26. package/dist/adapters/database/migrations/postgres/1779300000000-Default.mjs.map +1 -0
  27. package/dist/adapters/http/adapters/index.mjs +2 -2
  28. package/dist/adapters/http/adapters/oauth2/grant-types/index.mjs +2 -2
  29. package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts +2 -1
  30. package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts.map +1 -1
  31. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +12 -4
  32. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
  33. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts +2 -1
  34. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts.map +1 -1
  35. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts +1 -0
  36. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts.map +1 -1
  37. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs +1 -1
  38. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs.map +1 -1
  39. package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.mjs +2 -2
  40. package/dist/adapters/http/adapters/oauth2/index.mjs +2 -2
  41. package/dist/adapters/http/controllers/entities/identity-provider/module.d.ts.map +1 -1
  42. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +24 -9
  43. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs.map +1 -1
  44. package/dist/adapters/http/controllers/workflows/token/module.d.ts.map +1 -1
  45. package/dist/adapters/http/controllers/workflows/token/module.mjs +2 -1
  46. package/dist/adapters/http/controllers/workflows/token/module.mjs.map +1 -1
  47. package/dist/adapters/http/controllers/workflows/token/types.d.ts +2 -1
  48. package/dist/adapters/http/controllers/workflows/token/types.d.ts.map +1 -1
  49. package/dist/adapters/http/index.mjs +3 -3
  50. package/dist/adapters/http/request/helpers/identity.d.ts +0 -1
  51. package/dist/adapters/http/request/helpers/identity.d.ts.map +1 -1
  52. package/dist/adapters/http/request/helpers/identity.mjs +2 -5
  53. package/dist/adapters/http/request/helpers/identity.mjs.map +1 -1
  54. package/dist/adapters/http/request/helpers/index.mjs +2 -2
  55. package/dist/adapters/http/request/index.mjs +2 -2
  56. package/dist/adapters/http/request/permission/module.mjs +2 -2
  57. package/dist/adapters/http/request/permission/module.mjs.map +1 -1
  58. package/dist/app/modules/database/repositories/bindings.d.ts +2 -0
  59. package/dist/app/modules/database/repositories/bindings.d.ts.map +1 -1
  60. package/dist/app/modules/database/repositories/bindings.mjs +3 -1
  61. package/dist/app/modules/database/repositories/bindings.mjs.map +1 -1
  62. package/dist/app/modules/database/repositories/identity-provider/repository.d.ts.map +1 -1
  63. package/dist/app/modules/database/repositories/identity-provider/repository.mjs +4 -2
  64. package/dist/app/modules/database/repositories/identity-provider/repository.mjs.map +1 -1
  65. package/dist/app/modules/database/repositories/permission-provider/module.d.ts +2 -2
  66. package/dist/app/modules/database/repositories/permission-provider/module.d.ts.map +1 -1
  67. package/dist/app/modules/database/repositories/permission-provider/module.mjs +4 -3
  68. package/dist/app/modules/database/repositories/permission-provider/module.mjs.map +1 -1
  69. package/dist/app/modules/database/repositories/realm/repository.d.ts.map +1 -1
  70. package/dist/app/modules/database/repositories/realm/repository.mjs +6 -2
  71. package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
  72. package/dist/app/modules/http/modules/controller.d.ts +2 -0
  73. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  74. package/dist/app/modules/http/modules/controller.mjs +18 -0
  75. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  76. package/dist/app/modules/identity/repositories/client.mjs +2 -2
  77. package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
  78. package/dist/app/modules/identity/repositories/robot.mjs +2 -2
  79. package/dist/app/modules/identity/repositories/robot.mjs.map +1 -1
  80. package/dist/app/modules/identity/repositories/user.mjs +2 -2
  81. package/dist/app/modules/identity/repositories/user.mjs.map +1 -1
  82. package/dist/app/modules/oauth2/repositories/client/repository.mjs +2 -2
  83. package/dist/app/modules/oauth2/repositories/client/repository.mjs.map +1 -1
  84. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  85. package/dist/app/modules/provisioning/module.mjs +0 -1
  86. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  87. package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
  88. package/dist/app/modules/provisioning/sources/default/module.mjs +14 -56
  89. package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
  90. package/dist/core/entities/client/service.mjs +25 -7
  91. package/dist/core/entities/client/service.mjs.map +1 -1
  92. package/dist/core/entities/client-permission/service.d.ts +7 -4
  93. package/dist/core/entities/client-permission/service.d.ts.map +1 -1
  94. package/dist/core/entities/client-permission/service.mjs +59 -19
  95. package/dist/core/entities/client-permission/service.mjs.map +1 -1
  96. package/dist/core/entities/client-role/service.d.ts +3 -2
  97. package/dist/core/entities/client-role/service.d.ts.map +1 -1
  98. package/dist/core/entities/client-role/service.mjs +12 -5
  99. package/dist/core/entities/client-role/service.mjs.map +1 -1
  100. package/dist/core/entities/client-scope/service.d.ts +3 -2
  101. package/dist/core/entities/client-scope/service.d.ts.map +1 -1
  102. package/dist/core/entities/client-scope/service.mjs +12 -5
  103. package/dist/core/entities/client-scope/service.mjs.map +1 -1
  104. package/dist/core/entities/identity-provider-role-mapping/service.d.ts +7 -4
  105. package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -1
  106. package/dist/core/entities/identity-provider-role-mapping/service.mjs +29 -6
  107. package/dist/core/entities/identity-provider-role-mapping/service.mjs.map +1 -1
  108. package/dist/core/entities/permission/service.d.ts +3 -5
  109. package/dist/core/entities/permission/service.d.ts.map +1 -1
  110. package/dist/core/entities/permission/service.mjs +30 -24
  111. package/dist/core/entities/permission/service.mjs.map +1 -1
  112. package/dist/core/entities/permission-policy/service.d.ts +3 -2
  113. package/dist/core/entities/permission-policy/service.d.ts.map +1 -1
  114. package/dist/core/entities/permission-policy/service.mjs +12 -5
  115. package/dist/core/entities/permission-policy/service.mjs.map +1 -1
  116. package/dist/core/entities/policy/service.d.ts.map +1 -1
  117. package/dist/core/entities/policy/service.mjs +16 -7
  118. package/dist/core/entities/policy/service.mjs.map +1 -1
  119. package/dist/core/entities/realm/service.mjs +4 -4
  120. package/dist/core/entities/realm/service.mjs.map +1 -1
  121. package/dist/core/entities/realm/types.d.ts +4 -0
  122. package/dist/core/entities/realm/types.d.ts.map +1 -1
  123. package/dist/core/entities/robot/service.d.ts.map +1 -1
  124. package/dist/core/entities/robot/service.mjs +29 -11
  125. package/dist/core/entities/robot/service.mjs.map +1 -1
  126. package/dist/core/entities/robot-permission/service.d.ts +7 -4
  127. package/dist/core/entities/robot-permission/service.d.ts.map +1 -1
  128. package/dist/core/entities/robot-permission/service.mjs +59 -19
  129. package/dist/core/entities/robot-permission/service.mjs.map +1 -1
  130. package/dist/core/entities/robot-role/service.d.ts +3 -2
  131. package/dist/core/entities/robot-role/service.d.ts.map +1 -1
  132. package/dist/core/entities/robot-role/service.mjs +12 -5
  133. package/dist/core/entities/robot-role/service.mjs.map +1 -1
  134. package/dist/core/entities/role/service.d.ts.map +1 -1
  135. package/dist/core/entities/role/service.mjs +16 -7
  136. package/dist/core/entities/role/service.mjs.map +1 -1
  137. package/dist/core/entities/role-attribute/service.d.ts.map +1 -1
  138. package/dist/core/entities/role-attribute/service.mjs +24 -6
  139. package/dist/core/entities/role-attribute/service.mjs.map +1 -1
  140. package/dist/core/entities/role-permission/service.d.ts +7 -4
  141. package/dist/core/entities/role-permission/service.d.ts.map +1 -1
  142. package/dist/core/entities/role-permission/service.mjs +61 -21
  143. package/dist/core/entities/role-permission/service.mjs.map +1 -1
  144. package/dist/core/entities/scope/service.d.ts.map +1 -1
  145. package/dist/core/entities/scope/service.mjs +16 -7
  146. package/dist/core/entities/scope/service.mjs.map +1 -1
  147. package/dist/core/entities/user/service.d.ts.map +1 -1
  148. package/dist/core/entities/user/service.mjs +28 -10
  149. package/dist/core/entities/user/service.mjs.map +1 -1
  150. package/dist/core/entities/user-attribute/service.d.ts.map +1 -1
  151. package/dist/core/entities/user-attribute/service.mjs +18 -6
  152. package/dist/core/entities/user-attribute/service.mjs.map +1 -1
  153. package/dist/core/entities/user-permission/service.d.ts +7 -4
  154. package/dist/core/entities/user-permission/service.d.ts.map +1 -1
  155. package/dist/core/entities/user-permission/service.mjs +59 -19
  156. package/dist/core/entities/user-permission/service.mjs.map +1 -1
  157. package/dist/core/entities/user-role/service.d.ts +3 -2
  158. package/dist/core/entities/user-role/service.d.ts.map +1 -1
  159. package/dist/core/entities/user-role/service.mjs +12 -5
  160. package/dist/core/entities/user-role/service.mjs.map +1 -1
  161. package/dist/core/identity/index.mjs +2 -1
  162. package/dist/core/identity/permission/checker/service.d.ts.map +1 -1
  163. package/dist/core/identity/permission/checker/service.mjs +6 -4
  164. package/dist/core/identity/permission/checker/service.mjs.map +1 -1
  165. package/dist/core/identity/permission/index.d.ts +1 -0
  166. package/dist/core/identity/permission/index.d.ts.map +1 -1
  167. package/dist/core/identity/permission/index.mjs +2 -1
  168. package/dist/core/identity/permission/junction-grant.d.ts +49 -0
  169. package/dist/core/identity/permission/junction-grant.d.ts.map +1 -0
  170. package/dist/core/identity/permission/junction-grant.mjs +57 -0
  171. package/dist/core/identity/permission/junction-grant.mjs.map +1 -0
  172. package/dist/core/identity/permission/module.d.ts +2 -3
  173. package/dist/core/identity/permission/module.d.ts.map +1 -1
  174. package/dist/core/identity/permission/module.mjs +52 -14
  175. package/dist/core/identity/permission/module.mjs.map +1 -1
  176. package/dist/core/identity/permission/types.d.ts +22 -2
  177. package/dist/core/identity/permission/types.d.ts.map +1 -1
  178. package/dist/core/index.mjs +2 -1
  179. package/dist/core/provisioning/entities/role/types.d.ts +8 -5
  180. package/dist/core/provisioning/entities/role/types.d.ts.map +1 -1
  181. package/dist/core/provisioning/synchronizer/base.d.ts +3 -0
  182. package/dist/core/provisioning/synchronizer/base.d.ts.map +1 -1
  183. package/dist/core/provisioning/synchronizer/base.mjs +3 -0
  184. package/dist/core/provisioning/synchronizer/base.mjs.map +1 -1
  185. package/dist/core/provisioning/synchronizer/client/module.d.ts.map +1 -1
  186. package/dist/core/provisioning/synchronizer/client/module.mjs +1 -0
  187. package/dist/core/provisioning/synchronizer/client/module.mjs.map +1 -1
  188. package/dist/core/provisioning/synchronizer/entity-resolver.d.ts.map +1 -1
  189. package/dist/core/provisioning/synchronizer/entity-resolver.mjs +3 -0
  190. package/dist/core/provisioning/synchronizer/entity-resolver.mjs.map +1 -1
  191. package/dist/core/provisioning/synchronizer/index.mjs +1 -0
  192. package/dist/core/provisioning/synchronizer/permission/module.d.ts.map +1 -1
  193. package/dist/core/provisioning/synchronizer/permission/module.mjs +2 -1
  194. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  195. package/dist/core/provisioning/synchronizer/policy/module.d.ts +2 -0
  196. package/dist/core/provisioning/synchronizer/policy/module.d.ts.map +1 -1
  197. package/dist/core/provisioning/synchronizer/policy/module.mjs +19 -1
  198. package/dist/core/provisioning/synchronizer/policy/module.mjs.map +1 -1
  199. package/dist/core/provisioning/synchronizer/realm/module.d.ts.map +1 -1
  200. package/dist/core/provisioning/synchronizer/realm/module.mjs +1 -0
  201. package/dist/core/provisioning/synchronizer/realm/module.mjs.map +1 -1
  202. package/dist/core/provisioning/synchronizer/robot/module.d.ts.map +1 -1
  203. package/dist/core/provisioning/synchronizer/robot/module.mjs +1 -0
  204. package/dist/core/provisioning/synchronizer/robot/module.mjs.map +1 -1
  205. package/dist/core/provisioning/synchronizer/role/module.d.ts +2 -3
  206. package/dist/core/provisioning/synchronizer/role/module.d.ts.map +1 -1
  207. package/dist/core/provisioning/synchronizer/role/module.mjs +14 -20
  208. package/dist/core/provisioning/synchronizer/role/module.mjs.map +1 -1
  209. package/dist/core/provisioning/synchronizer/role/types.d.ts +1 -2
  210. package/dist/core/provisioning/synchronizer/role/types.d.ts.map +1 -1
  211. package/dist/core/provisioning/synchronizer/scope/module.d.ts.map +1 -1
  212. package/dist/core/provisioning/synchronizer/scope/module.mjs +1 -0
  213. package/dist/core/provisioning/synchronizer/scope/module.mjs.map +1 -1
  214. package/dist/core/provisioning/synchronizer/user/module.d.ts.map +1 -1
  215. package/dist/core/provisioning/synchronizer/user/module.mjs +1 -0
  216. package/dist/core/provisioning/synchronizer/user/module.mjs.map +1 -1
  217. package/dist/core/security/policy/evaluator.d.ts +4 -4
  218. package/dist/core/security/policy/evaluator.d.ts.map +1 -1
  219. package/dist/core/security/policy/evaluator.mjs +19 -18
  220. package/dist/core/security/policy/evaluator.mjs.map +1 -1
  221. package/dist/index.mjs +3 -3
  222. package/dist/swagger.json +54 -0
  223. package/dist/ui/client/.vite/ssr-manifest.json +1017 -639
  224. package/dist/ui/client/assets/index-Cd3uWit-.js +127 -0
  225. package/dist/ui/client/assets/index-DoCTwJ8M.css +2 -0
  226. package/dist/ui/client/index.html +2 -2
  227. package/dist/ui/server/server.js +11086 -2362
  228. package/package.json +37 -35
  229. package/dist/ui/client/assets/index-BFXs98mu.js +0 -102
  230. package/dist/ui/client/assets/index-C_-HM1P-.css +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","ValidatorGroup","isUUID","EntityNotFoundError","PermissionName","RobotValidator","AbstractEntityService","RobotCredentialsService","RobotService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_READ","ROBOT_UPDATE","ROBOT_DELETE","data","entities","meta","findMany","total","entity","identity","type","id","push","evaluateOneOf","input","ATTRIBUTES","getOne","idOrName","realmId","permissionNames","isMe","findOne","create","save","undefined","update","updateOnly","options","group","realm","realm_id","resolve","where","findOneBy","isSelfEdit","preEvaluate","e","ROBOT_SELF_MANAGE","UPDATE","ROBOT_CREATE","CREATE","validated","run","validateJoinColumns","checkUniqueness","credentialsService","evaluate","merge","secret","protect","created","actorRealmId","getActorRealmId","generateSecret","delete","isOwner","user_id","isSelfDelete","entityId","remove"],"sources":["../../../../src/core/entities/robot/service.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 { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { ValidatorGroup, isUUID } from '@authup/kit';\nimport { EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n RobotValidator,\n} from '@authup/core-kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport { RobotCredentialsService } from '../../authentication/credential/entities/robot/module.ts';\nimport type { IRobotRepository, IRobotService } from './types.ts';\n\nexport type RobotServiceContext = {\n repository: IRobotRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class RobotService extends AbstractEntityService implements IRobotService {\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: RobotValidator;\n\n constructor(ctx: RobotServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new RobotValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Robot>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: Robot[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n if (\n actor.identity &&\n actor.identity.type === 'robot' &&\n actor.identity.data.id === entity.id\n ) {\n data.push(entity);\n continue;\n }\n\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n data.push(entity);\n } catch {\n total -= 1;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n query?: Record<string, any>,\n realmId?: string,\n ): Promise<Robot> {\n const permissionNames = [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ];\n\n let isMe = !!actor.identity &&\n actor.identity.type === 'robot' &&\n (\n actor.identity.data.id === idOrName ||\n actor.identity.data.name === idOrName\n );\n\n if (!isMe) {\n await actor.permissionEvaluator.preEvaluateOneOf({ name: permissionNames });\n }\n\n const entity = await this.repository.findOne(idOrName, query, realmId);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (isMe && actor.identity!.data.id !== entity.id) {\n isMe = false;\n await actor.permissionEvaluator.preEvaluateOneOf({ name: permissionNames });\n }\n\n if (!isMe) {\n await actor.permissionEvaluator.evaluateOneOf({\n name: permissionNames,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Robot> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Robot> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Robot,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Robot | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n let isSelfEdit = false;\n if (entity) {\n try {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_UPDATE });\n } catch (e) {\n if (\n !actor.identity ||\n actor.identity.type !== 'robot' ||\n actor.identity.data.id !== entity.id\n ) {\n throw e;\n }\n isSelfEdit = true;\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_SELF_MANAGE });\n }\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n await this.repository.checkUniqueness(validated, entity || undefined);\n\n const credentialsService = new RobotCredentialsService();\n\n if (entity) {\n if (isSelfEdit) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_SELF_MANAGE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n } else {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n }\n\n entity = this.repository.merge(entity, validated);\n if (validated.secret) {\n entity.secret = await credentialsService.protect(validated.secret);\n }\n\n await this.repository.save(entity);\n\n if (validated.secret) {\n entity.secret = validated.secret;\n }\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!validated.realm_id) {\n const actorRealmId = this.getActorRealmId(actor);\n if (actorRealmId) {\n validated.realm_id = actorRealmId;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n if (!validated.secret) {\n validated.secret = credentialsService.generateSecret();\n }\n\n entity = this.repository.create(validated);\n entity.secret = await credentialsService.protect(validated.secret);\n await this.repository.save(entity);\n entity.secret = validated.secret;\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Robot> {\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n const isOwner = entity.user_id &&\n actor.identity &&\n actor.identity.type === 'user' &&\n actor.identity.data.id === entity.user_id;\n\n let isSelfDelete = false;\n try {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_DELETE });\n } catch (e) {\n if (!isOwner) {\n throw e;\n }\n isSelfDelete = true;\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_SELF_MANAGE });\n }\n\n if (isSelfDelete) {\n // Delete carries no attributes to validate; pass an empty input so\n // the ATTRIBUTE_NAMES denylist has no keys to reject.\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_SELF_MANAGE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {} }),\n });\n } else {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n }\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","definePolicyData","ValidatorGroup","isUUID","EntityNotFoundError","PermissionName","RobotValidator","AbstractEntityService","RobotCredentialsService","RobotService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_READ","ROBOT_UPDATE","ROBOT_DELETE","data","entities","meta","findMany","total","entity","identity","type","id","push","evaluateOneOf","ATTRIBUTES","resourceRealmMatch","getOne","idOrName","realmId","permissionNames","isMe","findOne","create","save","undefined","update","updateOnly","options","group","realm","realm_id","resolve","where","findOneBy","isSelfEdit","preEvaluate","e","ROBOT_SELF_MANAGE","UPDATE","ROBOT_CREATE","CREATE","validated","run","validateJoinColumns","checkUniqueness","credentialsService","evaluate","REALM_MATCH","merge","secret","protect","created","actorRealmId","getActorRealmId","generateSecret","delete","isOwner","user_id","isSelfDelete","entityId","remove"],"sources":["../../../../src/core/entities/robot/service.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 { BuiltInPolicyType, definePolicyData } from '@authup/access';\nimport { ValidatorGroup, isUUID } from '@authup/kit';\nimport { EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n RobotValidator,\n} from '@authup/core-kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport { RobotCredentialsService } from '../../authentication/credential/entities/robot/module.ts';\nimport type { IRobotRepository, IRobotService } from './types.ts';\n\nexport type RobotServiceContext = {\n repository: IRobotRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class RobotService extends AbstractEntityService implements IRobotService {\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: RobotValidator;\n\n constructor(ctx: RobotServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new RobotValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Robot>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: Robot[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n if (\n actor.identity &&\n actor.identity.type === 'robot' &&\n actor.identity.data.id === entity.id\n ) {\n data.push(entity);\n continue;\n }\n\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity, ...this.resourceRealmMatch(entity) }),\n });\n\n data.push(entity);\n } catch {\n total -= 1;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n query?: Record<string, any>,\n realmId?: string,\n ): Promise<Robot> {\n const permissionNames = [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ];\n\n let isMe = !!actor.identity &&\n actor.identity.type === 'robot' &&\n (\n actor.identity.data.id === idOrName ||\n actor.identity.data.name === idOrName\n );\n\n if (!isMe) {\n await actor.permissionEvaluator.preEvaluateOneOf({ name: permissionNames });\n }\n\n const entity = await this.repository.findOne(idOrName, query, realmId);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (isMe && actor.identity!.data.id !== entity.id) {\n isMe = false;\n await actor.permissionEvaluator.preEvaluateOneOf({ name: permissionNames });\n }\n\n if (!isMe) {\n await actor.permissionEvaluator.evaluateOneOf({\n name: permissionNames,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity, ...this.resourceRealmMatch(entity) }),\n });\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Robot> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Robot> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Robot,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Robot | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n let isSelfEdit = false;\n if (entity) {\n try {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_UPDATE });\n } catch (e) {\n if (\n !actor.identity ||\n actor.identity.type !== 'robot' ||\n actor.identity.data.id !== entity.id\n ) {\n throw e;\n }\n isSelfEdit = true;\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_SELF_MANAGE });\n }\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n await this.repository.checkUniqueness(validated, entity || undefined);\n\n const credentialsService = new RobotCredentialsService();\n\n if (entity) {\n if (isSelfEdit) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_SELF_MANAGE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated, ...this.resourceRealmMatch(validated) }),\n });\n } else {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n [BuiltInPolicyType.REALM_MATCH]: validated.realm_id ?? entity.realm_id ?? null,\n }),\n });\n }\n\n entity = this.repository.merge(entity, validated);\n if (validated.secret) {\n entity.secret = await credentialsService.protect(validated.secret);\n }\n\n await this.repository.save(entity);\n\n if (validated.secret) {\n entity.secret = validated.secret;\n }\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!validated.realm_id) {\n const actorRealmId = this.getActorRealmId(actor);\n if (actorRealmId) {\n validated.realm_id = actorRealmId;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_CREATE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated, ...this.resourceRealmMatch(validated) }),\n });\n\n if (!validated.secret) {\n validated.secret = credentialsService.generateSecret();\n }\n\n entity = this.repository.create(validated);\n entity.secret = await credentialsService.protect(validated.secret);\n await this.repository.save(entity);\n entity.secret = validated.secret;\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Robot> {\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n const isOwner = entity.user_id &&\n actor.identity &&\n actor.identity.type === 'user' &&\n actor.identity.data.id === entity.user_id;\n\n let isSelfDelete = false;\n try {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_DELETE });\n } catch (e) {\n if (!isOwner) {\n throw e;\n }\n isSelfDelete = true;\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_SELF_MANAGE });\n }\n\n if (isSelfDelete) {\n // Delete carries no attributes to validate; pass an empty input so\n // the ATTRIBUTE_NAMES denylist has no keys to reject.\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_SELF_MANAGE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {} }),\n });\n } else {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_DELETE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity, ...this.resourceRealmMatch(entity) }),\n });\n }\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
@@ -1,15 +1,18 @@
1
1
  import { RobotPermissionValidator } from '@authup/core-kit';
2
- import type { RobotPermission } from '@authup/core-kit';
2
+ import type { Permission, RobotPermission } from '@authup/core-kit';
3
3
  import type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';
4
- import type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';
5
- import { AbstractEntityService } from '@authup/server-kit';
4
+ import type { ActorContext, EntityRepositoryFindManyResult, IEntityRepository } from '@authup/server-kit';
5
+ import { JunctionEntityService } from '@authup/server-kit';
6
6
  import type { IRobotPermissionRepository, IRobotPermissionService } from './types.ts';
7
7
  export type RobotPermissionServiceContext = {
8
8
  repository: IRobotPermissionRepository;
9
+ permissionRepository: IEntityRepository<Permission>;
9
10
  identityPermissionProvider: IIdentityPermissionProvider;
10
11
  };
11
- export declare class RobotPermissionService extends AbstractEntityService implements IRobotPermissionService {
12
+ export declare class RobotPermissionService extends JunctionEntityService implements IRobotPermissionService {
13
+ protected readonly ownerRealmKey = "robot_realm_id";
12
14
  protected repository: IRobotPermissionRepository;
15
+ protected permissionRepository: IEntityRepository<Permission>;
13
16
  protected identityPermissionProvider: IIdentityPermissionProvider;
14
17
  protected validator: RobotPermissionValidator;
15
18
  constructor(ctx: RobotPermissionServiceContext);
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot-permission/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,MAAM,6BAA6B,GAAG;IACxC,UAAU,EAAE,0BAA0B,CAAC;IACvC,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,qBAAsB,YAAW,uBAAuB;IAChG,SAAS,CAAC,UAAU,EAAE,0BAA0B,CAAC;IAEjD,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,wBAAwB,CAAC;gBAElC,GAAG,EAAE,6BAA6B;IAOxC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,eAAe,CAAC,CAAC;IAWrD,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;IAgBrB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;IA6DrB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;IAyBrB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;CAmB9B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot-permission/service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAkB,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AAEtF,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1G,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,0BAA0B,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAEtF,MAAM,MAAM,6BAA6B,GAAG;IACxC,UAAU,EAAE,0BAA0B,CAAC;IACvC,oBAAoB,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACpD,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,qBAAsB,YAAW,uBAAuB;IAChG,SAAS,CAAC,QAAQ,CAAC,aAAa,oBAAoB;IAEpD,SAAS,CAAC,UAAU,EAAE,0BAA0B,CAAC;IAEjD,SAAS,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAE9D,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,wBAAwB,CAAC;gBAElC,GAAG,EAAE,6BAA6B;IAQxC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,eAAe,CAAC,CAAC;IAWrD,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;IAgBrB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;IA4DrB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;IAgErB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,eAAe,CAAC;CAsB9B"}
@@ -1,19 +1,23 @@
1
1
  import "node:path";
2
2
  import "node:url";
3
3
  import.meta.url;
4
+ import { applyJunctionCreateGrant, buildJunctionUpdateData } from "../../identity/permission/junction-grant.mjs";
4
5
  import { ValidatorGroup } from "@authup/kit";
5
6
  import { PermissionName, RobotPermissionValidator } from "@authup/core-kit";
6
- import { AbstractEntityService } from "@authup/server-kit";
7
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
7
+ import { JunctionEntityService } from "@authup/server-kit";
8
+ import { BuiltInPolicyType, RealmScope, definePolicyData } from "@authup/access";
8
9
  import { EntityConflictError, EntityNotFoundError } from "@authup/errors";
9
10
  //#region src/core/entities/robot-permission/service.ts
10
- var RobotPermissionService = class extends AbstractEntityService {
11
+ var RobotPermissionService = class extends JunctionEntityService {
12
+ ownerRealmKey = "robot_realm_id";
11
13
  repository;
14
+ permissionRepository;
12
15
  identityPermissionProvider;
13
16
  validator;
14
17
  constructor(ctx) {
15
18
  super();
16
19
  this.repository = ctx.repository;
20
+ this.permissionRepository = ctx.permissionRepository;
17
21
  this.identityPermissionProvider = ctx.identityPermissionProvider;
18
22
  this.validator = new RobotPermissionValidator();
19
23
  }
@@ -44,20 +48,21 @@ var RobotPermissionService = class extends AbstractEntityService {
44
48
  });
45
49
  }
46
50
  if (validated.robot) validated.robot_realm_id = validated.robot.realm_id;
47
- if (validated.permission && actor.identity && typeof validated.policy_id === "undefined") {
48
- const junctionPolicy = await this.identityPermissionProvider.resolveJunctionPolicy({
49
- type: actor.identity.type,
50
- id: actor.identity.data.id
51
- }, {
52
- name: validated.permission.name,
53
- realmId: validated.permission.realm_id,
54
- clientId: validated.permission.client_id
55
- });
56
- if (junctionPolicy) validated.policy_id = junctionPolicy.id;
57
- }
51
+ if (validated.permission && actor.identity) applyJunctionCreateGrant(validated, await this.identityPermissionProvider.resolveJunctionGrant({
52
+ type: actor.identity.type,
53
+ id: actor.identity.data.id
54
+ }, {
55
+ name: validated.permission.name,
56
+ realmId: validated.permission.realm_id,
57
+ clientId: validated.permission.client_id,
58
+ realmScope: validated.realm_scope ?? RealmScope.OWN
59
+ }));
58
60
  await actor.permissionEvaluator.evaluate({
59
61
  name: PermissionName.ROBOT_PERMISSION_CREATE,
60
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
62
+ data: definePolicyData({
63
+ [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(validated),
64
+ [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(validated)
65
+ })
61
66
  });
62
67
  let entity = this.repository.create(validated);
63
68
  entity = await this.repository.save(entity);
@@ -67,13 +72,45 @@ var RobotPermissionService = class extends AbstractEntityService {
67
72
  await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_UPDATE });
68
73
  const entity = await this.repository.findOneBy({ id });
69
74
  if (!entity) throw new EntityNotFoundError();
70
- const updateData = {};
71
- if (Object.prototype.hasOwnProperty.call(data, "policy_id")) updateData.policy_id = data.policy_id;
75
+ const validated = await this.validator.run(data, { group: ValidatorGroup.UPDATE });
76
+ const permission = await this.permissionRepository.findOneById(entity.permission_id);
77
+ if (permission) await actor.permissionEvaluator.preEvaluate({
78
+ name: permission.name,
79
+ realmId: permission.realm_id,
80
+ clientId: permission.client_id
81
+ });
82
+ let actorScope = RealmScope.ANY;
83
+ let actorPolicyFree = true;
84
+ let actorPolicyId = null;
85
+ if (actor.identity && permission) {
86
+ const grant = await this.identityPermissionProvider.resolveJunctionGrant({
87
+ type: actor.identity.type,
88
+ id: actor.identity.data.id
89
+ }, {
90
+ name: permission.name,
91
+ realmId: permission.realm_id,
92
+ clientId: permission.client_id,
93
+ realmScope: validated.realm_scope ?? entity.realm_scope
94
+ });
95
+ actorScope = grant.realmScope;
96
+ actorPolicyFree = !grant.policy;
97
+ actorPolicyId = grant.policy ? grant.policy.id : null;
98
+ } else if (actor.identity) actorScope = RealmScope.OWN;
99
+ const updateData = buildJunctionUpdateData({
100
+ data: validated,
101
+ existingScope: entity.realm_scope,
102
+ actorScope,
103
+ actorPolicyFree,
104
+ actorPolicyId
105
+ });
72
106
  await this.repository.validateJoinColumns(updateData);
73
107
  const merged = this.repository.merge(entity, updateData);
74
108
  await actor.permissionEvaluator.evaluate({
75
109
  name: PermissionName.ROBOT_PERMISSION_UPDATE,
76
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: merged })
110
+ data: definePolicyData({
111
+ [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(merged),
112
+ [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(merged)
113
+ })
77
114
  });
78
115
  return this.repository.save(merged);
79
116
  }
@@ -83,7 +120,10 @@ var RobotPermissionService = class extends AbstractEntityService {
83
120
  if (!entity) throw new EntityNotFoundError();
84
121
  await actor.permissionEvaluator.evaluate({
85
122
  name: PermissionName.ROBOT_PERMISSION_DELETE,
86
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
123
+ data: definePolicyData({
124
+ [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(entity),
125
+ [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(entity)
126
+ })
87
127
  });
88
128
  const { id: entityId } = entity;
89
129
  await this.repository.remove(entity);
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","EntityConflictError","EntityNotFoundError","ValidatorGroup","PermissionName","RobotPermissionValidator","AbstractEntityService","RobotPermissionService","repository","identityPermissionProvider","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_PERMISSION_CREATE","ROBOT_PERMISSION_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validated","run","group","CREATE","validateJoinColumns","existing","permission_id","robot_id","permission","permission_realm_id","realm_id","realmId","clientId","client_id","robot","robot_realm_id","identity","policy_id","junctionPolicy","resolveJunctionPolicy","type","evaluate","input","ATTRIBUTES","save","update","ROBOT_PERMISSION_UPDATE","updateData","Object","prototype","hasOwnProperty","call","merged","merge","delete","entityId","remove"],"sources":["../../../../src/core/entities/robot-permission/service.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 { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { EntityConflictError, EntityNotFoundError } from '@authup/errors';\nimport { ValidatorGroup } from '@authup/kit';\nimport { PermissionName, RobotPermissionValidator } from '@authup/core-kit';\nimport type { RobotPermission } from '@authup/core-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IRobotPermissionRepository, IRobotPermissionService } from './types.ts';\n\nexport type RobotPermissionServiceContext = {\n repository: IRobotPermissionRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class RobotPermissionService extends AbstractEntityService implements IRobotPermissionService {\n protected repository: IRobotPermissionRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n protected validator: RobotPermissionValidator;\n\n constructor(ctx: RobotPermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n this.validator = new RobotPermissionValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RobotPermission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_PERMISSION_CREATE,\n PermissionName.ROBOT_PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_PERMISSION_CREATE,\n PermissionName.ROBOT_PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_CREATE });\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.CREATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const existing = await this.repository.findOneBy({\n permission_id: validated.permission_id,\n robot_id: validated.robot_id,\n });\n if (existing) {\n throw new EntityConflictError({ entity: 'robot-permission' });\n }\n\n if (validated.permission) {\n validated.permission_realm_id = validated.permission.realm_id;\n\n await actor.permissionEvaluator.preEvaluate({\n name: validated.permission.name,\n realmId: validated.permission.realm_id,\n clientId: validated.permission.client_id,\n });\n }\n\n if (validated.robot) {\n validated.robot_realm_id = validated.robot.realm_id;\n }\n\n if (\n validated.permission &&\n actor.identity &&\n typeof validated.policy_id === 'undefined'\n ) {\n const junctionPolicy = await this.identityPermissionProvider.resolveJunctionPolicy(\n {\n type: actor.identity.type,\n id: actor.identity.data.id,\n },\n {\n name: validated.permission.name,\n realmId: validated.permission.realm_id,\n clientId: validated.permission.client_id,\n },\n );\n if (junctionPolicy) {\n validated.policy_id = junctionPolicy.id;\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n let entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n const updateData: Record<string, any> = {};\n if (Object.prototype.hasOwnProperty.call(data, 'policy_id')) {\n updateData.policy_id = data.policy_id;\n }\n\n await this.repository.validateJoinColumns(updateData);\n\n const merged = this.repository.merge(entity, updateData);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: merged }),\n });\n\n return this.repository.save(merged);\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","RealmScope","definePolicyData","EntityConflictError","EntityNotFoundError","ValidatorGroup","PermissionName","RobotPermissionValidator","applyJunctionCreateGrant","buildJunctionUpdateData","JunctionEntityService","RobotPermissionService","ownerRealmKey","repository","permissionRepository","identityPermissionProvider","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_PERMISSION_CREATE","ROBOT_PERMISSION_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","validated","run","group","CREATE","validateJoinColumns","existing","permission_id","robot_id","permission","permission_realm_id","realm_id","realmId","clientId","client_id","robot","robot_realm_id","identity","grant","resolveJunctionGrant","type","realmScope","realm_scope","OWN","evaluate","ATTRIBUTES","junctionAttributes","REALM_MATCH","junctionResourceRealm","save","update","ROBOT_PERMISSION_UPDATE","UPDATE","findOneById","actorScope","ANY","actorPolicyFree","actorPolicyId","policy","updateData","existingScope","merged","merge","delete","entityId","remove"],"sources":["../../../../src/core/entities/robot-permission/service.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 {\n BuiltInPolicyType,\n RealmScope,\n definePolicyData,\n} from '@authup/access';\nimport { EntityConflictError, EntityNotFoundError } from '@authup/errors';\nimport { ValidatorGroup } from '@authup/kit';\nimport { PermissionName, RobotPermissionValidator } from '@authup/core-kit';\nimport type { Permission, RobotPermission } from '@authup/core-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport { applyJunctionCreateGrant, buildJunctionUpdateData } from '../../identity/permission/junction-grant.ts';\nimport type { ActorContext, EntityRepositoryFindManyResult, IEntityRepository } from '@authup/server-kit';\nimport { JunctionEntityService } from '@authup/server-kit';\nimport type { IRobotPermissionRepository, IRobotPermissionService } from './types.ts';\n\nexport type RobotPermissionServiceContext = {\n repository: IRobotPermissionRepository;\n permissionRepository: IEntityRepository<Permission>;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class RobotPermissionService extends JunctionEntityService implements IRobotPermissionService {\n protected readonly ownerRealmKey = 'robot_realm_id';\n\n protected repository: IRobotPermissionRepository;\n\n protected permissionRepository: IEntityRepository<Permission>;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n protected validator: RobotPermissionValidator;\n\n constructor(ctx: RobotPermissionServiceContext) {\n super();\n this.repository = ctx.repository;\n this.permissionRepository = ctx.permissionRepository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n this.validator = new RobotPermissionValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RobotPermission>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_PERMISSION_CREATE,\n PermissionName.ROBOT_PERMISSION_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_PERMISSION_CREATE,\n PermissionName.ROBOT_PERMISSION_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_CREATE });\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.CREATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const existing = await this.repository.findOneBy({\n permission_id: validated.permission_id,\n robot_id: validated.robot_id,\n });\n if (existing) {\n throw new EntityConflictError({ entity: 'robot-permission' });\n }\n\n if (validated.permission) {\n validated.permission_realm_id = validated.permission.realm_id;\n\n await actor.permissionEvaluator.preEvaluate({\n name: validated.permission.name,\n realmId: validated.permission.realm_id,\n clientId: validated.permission.client_id,\n });\n }\n\n if (validated.robot) {\n validated.robot_realm_id = validated.robot.realm_id;\n }\n\n if (validated.permission && actor.identity) {\n const grant = await this.identityPermissionProvider.resolveJunctionGrant(\n {\n type: actor.identity.type,\n id: actor.identity.data.id,\n },\n {\n name: validated.permission.name,\n realmId: validated.permission.realm_id,\n clientId: validated.permission.client_id,\n realmScope: validated.realm_scope ?? RealmScope.OWN,\n },\n );\n\n applyJunctionCreateGrant(validated, grant);\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_CREATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(validated),\n [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(validated),\n }),\n });\n\n let entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.UPDATE });\n\n const permission = await this.permissionRepository.findOneById(entity.permission_id);\n if (permission) {\n // Member-permission gate: an actor may only modify a binding for a permission it\n // holds (mirrors create()).\n await actor.permissionEvaluator.preEvaluate({\n name: permission.name,\n realmId: permission.realm_id,\n clientId: permission.client_id,\n });\n }\n\n let actorScope: `${RealmScope}` = RealmScope.ANY;\n let actorPolicyFree = true;\n let actorPolicyId: string | null = null;\n if (actor.identity && permission) {\n const grant = await this.identityPermissionProvider.resolveJunctionGrant(\n { type: actor.identity.type, id: actor.identity.data.id },\n {\n name: permission.name,\n realmId: permission.realm_id,\n clientId: permission.client_id,\n realmScope: validated.realm_scope ?? entity.realm_scope,\n },\n );\n actorScope = grant.realmScope;\n actorPolicyFree = !grant.policy;\n actorPolicyId = grant.policy ? grant.policy.id : null;\n } else if (actor.identity) {\n actorScope = RealmScope.OWN;\n }\n\n const updateData = buildJunctionUpdateData({\n data: validated,\n existingScope: entity.realm_scope,\n actorScope,\n actorPolicyFree,\n actorPolicyId,\n });\n\n await this.repository.validateJoinColumns(updateData);\n\n const merged = this.repository.merge(entity, updateData);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(merged),\n [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(merged),\n }),\n });\n\n return this.repository.save(merged);\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RobotPermission> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_PERMISSION_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_PERMISSION_DELETE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(entity),\n [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(entity),\n }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
@@ -1,14 +1,15 @@
1
1
  import { RobotRoleValidator } from '@authup/core-kit';
2
2
  import type { RobotRole } from '@authup/core-kit';
3
3
  import type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';
4
- import { AbstractEntityService } from '@authup/server-kit';
4
+ import { JunctionEntityService } from '@authup/server-kit';
5
5
  import type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';
6
6
  import type { IRobotRoleRepository, IRobotRoleService } from './types.ts';
7
7
  export type RobotRoleServiceContext = {
8
8
  repository: IRobotRoleRepository;
9
9
  identityPermissionProvider: IIdentityPermissionProvider;
10
10
  };
11
- export declare class RobotRoleService extends AbstractEntityService implements IRobotRoleService {
11
+ export declare class RobotRoleService extends JunctionEntityService implements IRobotRoleService {
12
+ protected readonly ownerRealmKey = "robot_realm_id";
12
13
  protected repository: IRobotRoleRepository;
13
14
  protected identityPermissionProvider: IIdentityPermissionProvider;
14
15
  protected validator: RobotRoleValidator;
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot-role/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,uBAAuB,GAAG;IAClC,UAAU,EAAE,oBAAoB,CAAC;IACjC,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,qBAAsB,YAAW,iBAAiB;IACpF,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE3C,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAE5B,GAAG,EAAE,uBAAuB;IAOlC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC;IAY/C,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,SAAS,CAAC;IAiBf,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,SAAS,CAAC;IAmDf,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,SAAS,CAAC;CAmBxB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot-role/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,MAAM,uBAAuB,GAAG;IAClC,UAAU,EAAE,oBAAoB,CAAC;IACjC,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,gBAAiB,SAAQ,qBAAsB,YAAW,iBAAiB;IACpF,SAAS,CAAC,QAAQ,CAAC,aAAa,oBAAoB;IAEpD,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAE3C,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,kBAAkB,CAAC;gBAE5B,GAAG,EAAE,uBAAuB;IAOlC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC;IAY/C,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,SAAS,CAAC;IAiBf,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,SAAS,CAAC;IAuDf,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,SAAS,CAAC;CAuBxB"}
@@ -3,11 +3,12 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { ValidatorGroup } from "@authup/kit";
5
5
  import { PermissionName, RobotRoleValidator } from "@authup/core-kit";
6
- import { AbstractEntityService } from "@authup/server-kit";
7
- import { BuiltInPolicyType, PermissionError, PolicyData } from "@authup/access";
6
+ import { JunctionEntityService } from "@authup/server-kit";
7
+ import { BuiltInPolicyType, PermissionError, definePolicyData } from "@authup/access";
8
8
  import { EntityConflictError, EntityNotFoundError } from "@authup/errors";
9
9
  //#region src/core/entities/robot-role/service.ts
10
- var RobotRoleService = class extends AbstractEntityService {
10
+ var RobotRoleService = class extends JunctionEntityService {
11
+ ownerRealmKey = "robot_realm_id";
11
12
  repository;
12
13
  identityPermissionProvider;
13
14
  validator;
@@ -57,7 +58,10 @@ var RobotRoleService = class extends AbstractEntityService {
57
58
  }
58
59
  await actor.permissionEvaluator.evaluate({
59
60
  name: PermissionName.ROBOT_ROLE_CREATE,
60
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
61
+ data: definePolicyData({
62
+ [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(validated),
63
+ [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(validated)
64
+ })
61
65
  });
62
66
  let entity = this.repository.create(validated);
63
67
  entity = await this.repository.save(entity);
@@ -69,7 +73,10 @@ var RobotRoleService = class extends AbstractEntityService {
69
73
  if (!entity) throw new EntityNotFoundError();
70
74
  await actor.permissionEvaluator.evaluate({
71
75
  name: PermissionName.ROBOT_ROLE_DELETE,
72
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
76
+ data: definePolicyData({
77
+ [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(entity),
78
+ [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(entity)
79
+ })
73
80
  });
74
81
  const { id: entityId } = entity;
75
82
  await this.repository.remove(entity);
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PermissionError","PolicyData","EntityConflictError","EntityNotFoundError","ValidatorGroup","PermissionName","RobotRoleValidator","AbstractEntityService","RobotRoleService","repository","identityPermissionProvider","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_ROLE_READ","ROBOT_ROLE_UPDATE","ROBOT_ROLE_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","ROBOT_ROLE_CREATE","validated","run","group","CREATE","validateJoinColumns","existing","role_id","robot_id","role","role_realm_id","realm_id","robot","robot_realm_id","identity","hasPermissions","isSuperset","type","clientId","client_id","message","evaluate","input","ATTRIBUTES","save","delete","entityId","remove"],"sources":["../../../../src/core/entities/robot-role/service.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 { BuiltInPolicyType, PermissionError, PolicyData } from '@authup/access';\nimport { EntityConflictError, EntityNotFoundError } from '@authup/errors';\nimport { ValidatorGroup } from '@authup/kit';\nimport { PermissionName, RobotRoleValidator } from '@authup/core-kit';\nimport type { RobotRole } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { IRobotRoleRepository, IRobotRoleService } from './types.ts';\n\nexport type RobotRoleServiceContext = {\n repository: IRobotRoleRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class RobotRoleService extends AbstractEntityService implements IRobotRoleService {\n protected repository: IRobotRoleRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n protected validator: RobotRoleValidator;\n\n constructor(ctx: RobotRoleServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n this.validator = new RobotRoleValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RobotRole>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_ROLE_READ,\n PermissionName.ROBOT_ROLE_UPDATE,\n PermissionName.ROBOT_ROLE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_ROLE_READ,\n PermissionName.ROBOT_ROLE_UPDATE,\n PermissionName.ROBOT_ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_ROLE_CREATE });\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.CREATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const existing = await this.repository.findOneBy({\n role_id: validated.role_id,\n robot_id: validated.robot_id,\n });\n if (existing) {\n throw new EntityConflictError({ entity: 'robot-role' });\n }\n\n if (validated.role) {\n validated.role_realm_id = validated.role.realm_id;\n }\n\n if (validated.robot) {\n validated.robot_realm_id = validated.robot.realm_id;\n }\n\n if (validated.role && actor.identity) {\n const hasPermissions = await this.identityPermissionProvider.isSuperset(\n {\n type: actor.identity.type,\n id: actor.identity.data.id,\n },\n {\n type: 'role',\n id: validated.role_id,\n clientId: validated.role.client_id,\n },\n );\n if (!hasPermissions) {\n throw new PermissionError({ message: 'You don\\'t own the required permissions.' });\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_ROLE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n let entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_ROLE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":";;;;;;;;;AAsBA,IAAaS,mBAAb,cAAsCD,sBAAAA;CACxBE;CAEAC;CAEAC;CAEV,YAAYC,KAA8B;EACtC,MAAK;EACL,KAAKH,aAAaG,IAAIH;EACtB,KAAKC,6BAA6BE,IAAIF;EACtC,KAAKC,YAAY,IAAIL,mBAAAA;CACzB;CAEA,MAAMO,QACFC,OACAC,OACkD;EAClD,MAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFb,eAAec;GACfd,eAAee;GACff,eAAegB;IAEvB,CAAA;EAEA,OAAO,KAAKZ,WAAWa,SAASR,KAAAA;CACpC;CAEA,MAAMS,OACFC,IACAT,OACkB;EAClB,MAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFb,eAAec;GACfd,eAAee;GACff,eAAegB;IAEvB,CAAA;EAEA,MAAMI,SAAS,MAAM,KAAKhB,WAAWiB,UAAU,EAAEF,GAAG,CAAA;EACpD,IAAI,CAACC,QACD,MAAM,IAAItB,oBAAAA;EAGd,OAAOsB;CACX;CAEA,MAAME,OACFC,MACAb,OACkB;EAClB,MAAMA,MAAMC,oBAAoBa,YAAY,EAAEX,MAAMb,eAAeyB,kBAAkB,CAAA;EAErF,MAAMC,YAAY,MAAM,KAAKpB,UAAUqB,IAAIJ,MAAM,EAAEK,OAAO7B,eAAe8B,OAAO,CAAA;EAEhF,MAAM,KAAKzB,WAAW0B,oBAAoBJ,SAAAA;EAM1C,IAAIK,MAJmB,KAAK3B,WAAWiB,UAAU;GAC7CW,SAASN,UAAUM;GACnBC,UAAUP,UAAUO;EACxB,CAAA,GAEI,MAAM,IAAIpC,oBAAoB,EAAEuB,QAAQ,aAAa,CAAA;EAGzD,IAAIM,UAAUQ,MACVR,UAAUS,gBAAgBT,UAAUQ,KAAKE;EAG7C,IAAIV,UAAUW,OACVX,UAAUY,iBAAiBZ,UAAUW,MAAMD;EAG/C,IAAIV,UAAUQ,QAAQxB,MAAM6B;OAYpB,CAACC,MAXwB,KAAKnC,2BAA2BoC,WACzD;IACIC,MAAMhC,MAAM6B,SAASG;IACrBvB,IAAIT,MAAM6B,SAAShB,KAAKJ;GAC5B,GACA;IACIuB,MAAM;IACNvB,IAAIO,UAAUM;IACdW,UAAUjB,UAAUQ,KAAKU;GAC7B,CAAA,GAGA,MAAM,IAAIjD,gBAAgB,EAAEkD,SAAS,0CAA2C,CAAA;EAAA;EAIxF,MAAMnC,MAAMC,oBAAoBmC,SAAS;GACrCjC,MAAMb,eAAeyB;GACrBsB,OAAO,IAAInD,WAAW,GAAGF,kBAAkBsD,aAAatB,UAAU,CAAA;EACtE,CAAA;EAEA,IAAIN,SAAS,KAAKhB,WAAWkB,OAAOI,SAAAA;EACpCN,SAAS,MAAM,KAAKhB,WAAW6C,KAAK7B,MAAAA;EAEpC,OAAOA;CACX;CAEA,MAAM8B,OACF/B,IACAT,OACkB;EAClB,MAAMA,MAAMC,oBAAoBa,YAAY,EAAEX,MAAMb,eAAegB,kBAAkB,CAAA;EAErF,MAAMI,SAAS,MAAM,KAAKhB,WAAWiB,UAAU,EAAEF,GAAG,CAAA;EACpD,IAAI,CAACC,QACD,MAAM,IAAItB,oBAAAA;EAGd,MAAMY,MAAMC,oBAAoBmC,SAAS;GACrCjC,MAAMb,eAAegB;GACrB+B,OAAO,IAAInD,WAAW,GAAGF,kBAAkBsD,aAAa5B,OAAO,CAAA;EACnE,CAAA;EAEA,MAAM,EAAED,IAAIgC,aAAa/B;EACzB,MAAM,KAAKhB,WAAWgD,OAAOhC,MAAAA;EAC7BA,OAAOD,KAAKgC;EAEZ,OAAO/B;CACX;AACJ"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PermissionError","definePolicyData","EntityConflictError","EntityNotFoundError","ValidatorGroup","PermissionName","RobotRoleValidator","JunctionEntityService","RobotRoleService","ownerRealmKey","repository","identityPermissionProvider","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROBOT_ROLE_READ","ROBOT_ROLE_UPDATE","ROBOT_ROLE_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","ROBOT_ROLE_CREATE","validated","run","group","CREATE","validateJoinColumns","existing","role_id","robot_id","role","role_realm_id","realm_id","robot","robot_realm_id","identity","hasPermissions","isSuperset","type","clientId","client_id","message","evaluate","ATTRIBUTES","junctionAttributes","REALM_MATCH","junctionResourceRealm","save","delete","entityId","remove"],"sources":["../../../../src/core/entities/robot-role/service.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 { BuiltInPolicyType, PermissionError, definePolicyData } from '@authup/access';\nimport { EntityConflictError, EntityNotFoundError } from '@authup/errors';\nimport { ValidatorGroup } from '@authup/kit';\nimport { PermissionName, RobotRoleValidator } from '@authup/core-kit';\nimport type { RobotRole } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport { JunctionEntityService } from '@authup/server-kit';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { IRobotRoleRepository, IRobotRoleService } from './types.ts';\n\nexport type RobotRoleServiceContext = {\n repository: IRobotRoleRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class RobotRoleService extends JunctionEntityService implements IRobotRoleService {\n protected readonly ownerRealmKey = 'robot_realm_id';\n\n protected repository: IRobotRoleRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n protected validator: RobotRoleValidator;\n\n constructor(ctx: RobotRoleServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n this.validator = new RobotRoleValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RobotRole>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_ROLE_READ,\n PermissionName.ROBOT_ROLE_UPDATE,\n PermissionName.ROBOT_ROLE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_ROLE_READ,\n PermissionName.ROBOT_ROLE_UPDATE,\n PermissionName.ROBOT_ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_ROLE_CREATE });\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.CREATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const existing = await this.repository.findOneBy({\n role_id: validated.role_id,\n robot_id: validated.robot_id,\n });\n if (existing) {\n throw new EntityConflictError({ entity: 'robot-role' });\n }\n\n if (validated.role) {\n validated.role_realm_id = validated.role.realm_id;\n }\n\n if (validated.robot) {\n validated.robot_realm_id = validated.robot.realm_id;\n }\n\n if (validated.role && actor.identity) {\n const hasPermissions = await this.identityPermissionProvider.isSuperset(\n {\n type: actor.identity.type,\n id: actor.identity.data.id,\n },\n {\n type: 'role',\n id: validated.role_id,\n clientId: validated.role.client_id,\n },\n );\n if (!hasPermissions) {\n throw new PermissionError({ message: 'You don\\'t own the required permissions.' });\n }\n }\n\n // Stamp the owner (robot) realm so the realm_scope factor gates cross-realm writes.\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_ROLE_CREATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(validated),\n [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(validated),\n }),\n });\n\n let entity = this.repository.create(validated);\n entity = await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RobotRole> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n // Stamp the owner (robot) realm so the realm_scope factor gates cross-realm writes.\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROBOT_ROLE_DELETE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: this.junctionAttributes(entity),\n [BuiltInPolicyType.REALM_MATCH]: this.junctionResourceRealm(entity),\n }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/role/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAGH,aAAa,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG;IAC7B,UAAU,EAAE,eAAe,CAAC;IAC5B,eAAe,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,qBAAa,WAAY,SAAQ,qBAAsB,YAAW,YAAY;IAC1E,SAAS,CAAC,UAAU,EAAE,eAAe,CAAC;IAEtC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC;gBAEvB,GAAG,EAAE,kBAAkB;IAO7B,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;IAY1C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IAiBV,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IAKV,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IAKV,IAAI,CACN,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC;QACP,MAAM,EAAE,IAAI,CAAC;QACb,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;IAiFI,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;CAuBnB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/role/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAGH,aAAa,EAChB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG;IAC7B,UAAU,EAAE,eAAe,CAAC;IAC5B,eAAe,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,qBAAa,WAAY,SAAQ,qBAAsB,YAAW,YAAY;IAC1E,SAAS,CAAC,UAAU,EAAE,eAAe,CAAC;IAEtC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,SAAS,EAAE,aAAa,CAAC;gBAEvB,GAAG,EAAE,kBAAkB;IAO7B,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;IAY1C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IAiBV,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IAKV,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IAKV,IAAI,CACN,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAO,GACvC,OAAO,CAAC;QACP,MAAM,EAAE,IAAI,CAAC;QACb,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;IAkFI,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;CAuBnB"}
@@ -4,7 +4,7 @@ import.meta.url;
4
4
  import { ValidatorGroup, isPropertySet, isUUID } from "@authup/kit";
5
5
  import { PermissionName, ROLE_ADMIN_NAME, RoleValidator } from "@authup/core-kit";
6
6
  import { AbstractEntityService } from "@authup/server-kit";
7
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
7
+ import { BuiltInPolicyType, definePolicyData } from "@authup/access";
8
8
  import { BadRequestError, EntityNotFoundError } from "@authup/errors";
9
9
  //#region src/core/entities/role/service.ts
10
10
  var RoleService = class extends AbstractEntityService {
@@ -67,10 +67,13 @@ var RoleService = class extends AbstractEntityService {
67
67
  if (entity) {
68
68
  await actor.permissionEvaluator.evaluate({
69
69
  name: PermissionName.ROLE_UPDATE,
70
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {
71
- ...entity,
72
- ...validated
73
- } })
70
+ data: definePolicyData({
71
+ [BuiltInPolicyType.ATTRIBUTES]: {
72
+ ...entity,
73
+ ...validated
74
+ },
75
+ [BuiltInPolicyType.REALM_MATCH]: validated.realm_id ?? entity.realm_id ?? null
76
+ })
74
77
  });
75
78
  entity = this.repository.merge(entity, validated);
76
79
  await this.repository.checkUniqueness(validated, entity);
@@ -83,7 +86,10 @@ var RoleService = class extends AbstractEntityService {
83
86
  if (!isPropertySet(validated, "realm_id") && actor.identity) validated.realm_id = this.getActorRealmId(actor) || null;
84
87
  await actor.permissionEvaluator.evaluate({
85
88
  name: PermissionName.ROLE_CREATE,
86
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
89
+ data: definePolicyData({
90
+ [BuiltInPolicyType.ATTRIBUTES]: validated,
91
+ ...this.resourceRealmMatch(validated)
92
+ })
87
93
  });
88
94
  await this.repository.checkUniqueness(validated);
89
95
  entity = this.repository.create(validated);
@@ -100,7 +106,10 @@ var RoleService = class extends AbstractEntityService {
100
106
  if (entity.name === ROLE_ADMIN_NAME) throw new BadRequestError("The default admin role can not be deleted.");
101
107
  await actor.permissionEvaluator.evaluate({
102
108
  name: PermissionName.ROLE_DELETE,
103
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
109
+ data: definePolicyData({
110
+ [BuiltInPolicyType.ATTRIBUTES]: entity,
111
+ ...this.resourceRealmMatch(entity)
112
+ })
104
113
  });
105
114
  const { id: entityId } = entity;
106
115
  await this.repository.remove(entity);
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","ValidatorGroup","isPropertySet","isUUID","BadRequestError","EntityNotFoundError","PermissionName","ROLE_ADMIN_NAME","RoleValidator","AbstractEntityService","RoleService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROLE_READ","ROLE_UPDATE","ROLE_DELETE","findMany","getOne","idOrName","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","ROLE_CREATE","CREATE","validated","run","validateJoinColumns","evaluate","input","ATTRIBUTES","merge","checkUniqueness","created","identity","getActorRealmId","delete","entityId","remove"],"sources":["../../../../src/core/entities/role/service.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 { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { ValidatorGroup, isPropertySet, isUUID } from '@authup/kit';\nimport { BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n ROLE_ADMIN_NAME,\n RoleValidator,\n} from '@authup/core-kit';\nimport type { Role } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IRoleRepository, IRoleService } from './types.ts';\n\nexport type RoleServiceContext = {\n repository: IRoleRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class RoleService extends AbstractEntityService implements IRoleService {\n protected repository: IRoleRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: RoleValidator;\n\n constructor(ctx: RoleServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new RoleValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Role>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n ): Promise<Role> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Role> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Role> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Role,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Role | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n }),\n });\n\n entity = this.repository.merge(entity, validated);\n await this.repository.checkUniqueness(validated, entity);\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_CREATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Role> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.name === ROLE_ADMIN_NAME) {\n throw new BadRequestError('The default admin role can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_DELETE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","definePolicyData","ValidatorGroup","isPropertySet","isUUID","BadRequestError","EntityNotFoundError","PermissionName","ROLE_ADMIN_NAME","RoleValidator","AbstractEntityService","RoleService","repository","realmRepository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROLE_READ","ROLE_UPDATE","ROLE_DELETE","findMany","getOne","idOrName","entity","findOneByIdOrName","create","data","save","undefined","update","updateOnly","options","group","realm","realm_id","resolve","where","id","findOneBy","preEvaluate","UPDATE","ROLE_CREATE","CREATE","validated","run","validateJoinColumns","evaluate","ATTRIBUTES","REALM_MATCH","merge","checkUniqueness","created","identity","getActorRealmId","resourceRealmMatch","delete","entityId","remove"],"sources":["../../../../src/core/entities/role/service.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 { BuiltInPolicyType, definePolicyData } from '@authup/access';\nimport { ValidatorGroup, isPropertySet, isUUID } from '@authup/kit';\nimport { BadRequestError, EntityNotFoundError } from '@authup/errors';\nimport {\n PermissionName,\n ROLE_ADMIN_NAME,\n RoleValidator,\n} from '@authup/core-kit';\nimport type { Role } from '@authup/core-kit';\nimport type { ActorContext, EntityRepositoryFindManyResult } from '@authup/server-kit';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '@authup/server-kit';\nimport type { IRoleRepository, IRoleService } from './types.ts';\n\nexport type RoleServiceContext = {\n repository: IRoleRepository;\n realmRepository: IRealmRepository;\n};\n\nexport class RoleService extends AbstractEntityService implements IRoleService {\n protected repository: IRoleRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected validator: RoleValidator;\n\n constructor(ctx: RoleServiceContext) {\n super();\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.validator = new RoleValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<Role>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n idOrName: string,\n actor: ActorContext,\n ): Promise<Role> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneByIdOrName(idOrName);\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Role> {\n const { entity } = await this.save(undefined, data, actor);\n return entity;\n }\n\n async update(\n idOrName: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<Role> {\n const { entity } = await this.save(idOrName, data, actor, { updateOnly: true });\n return entity;\n }\n\n async save(\n idOrName: string | undefined,\n data: Record<string, any>,\n actor: ActorContext,\n options: { updateOnly?: boolean } = {},\n ): Promise<{\n entity: Role,\n created: boolean \n }> {\n let group: string;\n\n const realm = typeof data.realm_id === 'string' ?\n await this.realmRepository.resolve(data.realm_id) :\n undefined;\n\n let entity: Role | null | undefined;\n if (idOrName) {\n const where: Record<string, any> = {};\n if (isUUID(idOrName)) {\n where.id = idOrName;\n } else {\n where.name = idOrName;\n }\n\n if (realm) {\n where.realm_id = realm.id;\n }\n\n entity = await this.repository.findOneBy(where);\n if (!entity && options.updateOnly) {\n throw new EntityNotFoundError();\n }\n } else if (options.updateOnly) {\n throw new EntityNotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n group = ValidatorGroup.UPDATE;\n } else {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_CREATE });\n group = ValidatorGroup.CREATE;\n }\n\n const validated = await this.validator.run(data, { group });\n\n await this.repository.validateJoinColumns(validated);\n\n if (entity) {\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n data: definePolicyData({\n [BuiltInPolicyType.ATTRIBUTES]: {\n ...entity,\n ...validated,\n },\n [BuiltInPolicyType.REALM_MATCH]: validated.realm_id ?? entity.realm_id ?? null,\n }),\n });\n\n entity = this.repository.merge(entity, validated);\n await this.repository.checkUniqueness(validated, entity);\n await this.repository.save(entity);\n\n return {\n entity,\n created: false, \n };\n }\n\n if (!isPropertySet(validated, 'realm_id') && actor.identity) {\n validated.realm_id = this.getActorRealmId(actor) || null;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_CREATE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated, ...this.resourceRealmMatch(validated) }),\n });\n\n await this.repository.checkUniqueness(validated);\n\n entity = this.repository.create(validated);\n await this.repository.save(entity);\n\n return {\n entity,\n created: true, \n };\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<Role> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new EntityNotFoundError();\n }\n\n if (entity.name === ROLE_ADMIN_NAME) {\n throw new BadRequestError('The default admin role can not be deleted.');\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_DELETE,\n data: definePolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity, ...this.resourceRealmMatch(entity) }),\n });\n\n const { id: entityId } = entity;\n await this.repository.remove(entity);\n entity.id = entityId;\n\n return entity;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/role-attribute/service.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,MAAM,2BAA2B,GAAG;IACtC,UAAU,EAAE,wBAAwB,CAAC;IACrC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,qBAAsB,YAAW,qBAAqB;IAC5F,SAAS,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAE/C,SAAS,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAEjC,GAAG,EAAE,2BAA2B;IAMtC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC;IA0CnD,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IA0BnB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IAuBnB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IA0BnB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;CAmB5B"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/role-attribute/service.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAG,MAAM,oBAAoB,CAAC;AACxF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,MAAM,2BAA2B,GAAG;IACtC,UAAU,EAAE,wBAAwB,CAAC;IACrC,aAAa,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CACvC,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,qBAAsB,YAAW,qBAAqB;IAC5F,SAAS,CAAC,UAAU,EAAE,wBAAwB,CAAC;IAE/C,SAAS,CAAC,aAAa,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;gBAEjC,GAAG,EAAE,2BAA2B;IAMtC,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,aAAa,CAAC,CAAC;IA0CnD,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IA0BnB,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IA0BnB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IAsCnB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;CAmB5B"}
@@ -3,7 +3,7 @@ import "node:url";
3
3
  import.meta.url;
4
4
  import { PermissionName } from "@authup/core-kit";
5
5
  import { AbstractEntityService } from "@authup/server-kit";
6
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
6
+ import { BuiltInPolicyType, definePolicyData } from "@authup/access";
7
7
  import { BadRequestError, EntityNotFoundError } from "@authup/errors";
8
8
  //#region src/core/entities/role-attribute/service.ts
9
9
  var RoleAttributeService = class extends AbstractEntityService {
@@ -30,7 +30,10 @@ var RoleAttributeService = class extends AbstractEntityService {
30
30
  PermissionName.ROLE_UPDATE,
31
31
  PermissionName.ROLE_DELETE
32
32
  ],
33
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
33
+ data: definePolicyData({
34
+ [BuiltInPolicyType.ATTRIBUTES]: entity,
35
+ ...this.resourceRealmMatch(entity)
36
+ })
34
37
  });
35
38
  data.push(entity);
36
39
  } catch {
@@ -58,7 +61,10 @@ var RoleAttributeService = class extends AbstractEntityService {
58
61
  PermissionName.ROLE_UPDATE,
59
62
  PermissionName.ROLE_DELETE
60
63
  ],
61
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
64
+ data: definePolicyData({
65
+ [BuiltInPolicyType.ATTRIBUTES]: entity,
66
+ ...this.resourceRealmMatch(entity)
67
+ })
62
68
  });
63
69
  return entity;
64
70
  }
@@ -70,7 +76,10 @@ var RoleAttributeService = class extends AbstractEntityService {
70
76
  const entity = this.repository.create(data);
71
77
  await actor.permissionEvaluator.evaluate({
72
78
  name: PermissionName.ROLE_UPDATE,
73
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: { [data.name]: data.value } })
79
+ data: definePolicyData({
80
+ [BuiltInPolicyType.ATTRIBUTES]: { [data.name]: data.value },
81
+ ...this.resourceRealmMatch(entity)
82
+ })
74
83
  });
75
84
  await this.repository.save(entity);
76
85
  return entity;
@@ -81,10 +90,16 @@ var RoleAttributeService = class extends AbstractEntityService {
81
90
  if (typeof data.name === "string" && this.reservedNames.has(data.name)) throw new BadRequestError(`The role-attribute name '${data.name}' collides with a Role entity column.`);
82
91
  let entity = await this.repository.findOneBy({ id });
83
92
  if (!entity) throw new EntityNotFoundError();
93
+ delete data.role_id;
94
+ delete data.role;
95
+ delete data.realm_id;
84
96
  entity = this.repository.merge(entity, data);
85
97
  await actor.permissionEvaluator.evaluate({
86
98
  name: PermissionName.ROLE_UPDATE,
87
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: { [entity.name]: entity.value } })
99
+ data: definePolicyData({
100
+ [BuiltInPolicyType.ATTRIBUTES]: { [entity.name]: entity.value },
101
+ ...this.resourceRealmMatch(entity)
102
+ })
88
103
  });
89
104
  await this.repository.save(entity);
90
105
  return entity;
@@ -95,7 +110,10 @@ var RoleAttributeService = class extends AbstractEntityService {
95
110
  if (!entity) throw new EntityNotFoundError();
96
111
  await actor.permissionEvaluator.evaluate({
97
112
  name: PermissionName.ROLE_UPDATE,
98
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
113
+ data: definePolicyData({
114
+ [BuiltInPolicyType.ATTRIBUTES]: entity,
115
+ ...this.resourceRealmMatch(entity)
116
+ })
99
117
  });
100
118
  const { id: entityId } = entity;
101
119
  await this.repository.remove(entity);