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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. package/dist/adapters/database/data-source/options/module.mjs +16 -16
  2. package/dist/adapters/database/domains/client/index.d.ts +0 -1
  3. package/dist/adapters/database/domains/client/index.d.ts.map +1 -1
  4. package/dist/adapters/database/domains/client/index.mjs +1 -2
  5. package/dist/adapters/database/domains/index.mjs +26 -28
  6. package/dist/adapters/database/domains/policy/repository.mjs +1 -1
  7. package/dist/adapters/database/domains/robot/index.d.ts +0 -1
  8. package/dist/adapters/database/domains/robot/index.d.ts.map +1 -1
  9. package/dist/adapters/database/domains/robot/index.mjs +1 -2
  10. package/dist/adapters/database/domains/role/repository.d.ts +0 -6
  11. package/dist/adapters/database/domains/role/repository.d.ts.map +1 -1
  12. package/dist/adapters/database/domains/role/repository.mjs +1 -58
  13. package/dist/adapters/database/domains/role/repository.mjs.map +1 -1
  14. package/dist/adapters/database/domains/role-permission/entity.mjs +1 -1
  15. package/dist/adapters/database/domains/user/repository.d.ts +1 -5
  16. package/dist/adapters/database/domains/user/repository.d.ts.map +1 -1
  17. package/dist/adapters/database/domains/user/repository.mjs +0 -60
  18. package/dist/adapters/database/domains/user/repository.mjs.map +1 -1
  19. package/dist/adapters/database/extra-attribute-repository/tree/repository.d.ts.map +1 -1
  20. package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs +1 -0
  21. package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs.map +1 -1
  22. package/dist/adapters/database/index.mjs +18 -20
  23. package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +1 -1
  24. package/dist/adapters/http/controllers/entities/permission/module.mjs +1 -1
  25. package/dist/adapters/http/controllers/entities/policy/module.mjs +1 -1
  26. package/dist/adapters/http/controllers/entities/policy/utils/attributes-validator.mjs +1 -1
  27. package/dist/adapters/http/controllers/workflows/authorize/module.d.ts.map +1 -1
  28. package/dist/adapters/http/controllers/workflows/authorize/module.mjs +5 -6
  29. package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
  30. package/dist/adapters/http/middleware/built-in/assets.mjs +3 -3
  31. package/dist/adapters/http/middleware/built-in/assets.mjs.map +1 -1
  32. package/dist/app/modules/database/repositories/bindings.d.ts +17 -0
  33. package/dist/app/modules/database/repositories/bindings.d.ts.map +1 -0
  34. package/dist/app/modules/database/repositories/bindings.mjs +40 -0
  35. package/dist/app/modules/database/repositories/bindings.mjs.map +1 -0
  36. package/dist/app/modules/database/repositories/client/repository.d.ts +4 -1
  37. package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
  38. package/dist/app/modules/database/repositories/client/repository.mjs +29 -0
  39. package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
  40. package/dist/app/modules/database/repositories/robot/repository.d.ts +4 -1
  41. package/dist/app/modules/database/repositories/robot/repository.d.ts.map +1 -1
  42. package/dist/app/modules/database/repositories/robot/repository.mjs +29 -0
  43. package/dist/app/modules/database/repositories/robot/repository.mjs.map +1 -1
  44. package/dist/app/modules/database/repositories/role/repository.d.ts +3 -0
  45. package/dist/app/modules/database/repositories/role/repository.d.ts.map +1 -1
  46. package/dist/app/modules/database/repositories/role/repository.mjs +16 -0
  47. package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
  48. package/dist/app/modules/database/repositories/user/repository.d.ts +4 -1
  49. package/dist/app/modules/database/repositories/user/repository.d.ts.map +1 -1
  50. package/dist/app/modules/database/repositories/user/repository.mjs +29 -0
  51. package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
  52. package/dist/app/modules/http/modules/controller.d.ts +1 -2
  53. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  54. package/dist/app/modules/http/modules/controller.mjs +30 -34
  55. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  56. package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
  57. package/dist/app/modules/http/modules/middleware.mjs +2 -15
  58. package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
  59. package/dist/app/modules/identity/constants.d.ts +3 -1
  60. package/dist/app/modules/identity/constants.d.ts.map +1 -1
  61. package/dist/app/modules/identity/constants.mjs +2 -0
  62. package/dist/app/modules/identity/constants.mjs.map +1 -1
  63. package/dist/app/modules/identity/module.d.ts.map +1 -1
  64. package/dist/app/modules/identity/module.mjs +42 -5
  65. package/dist/app/modules/identity/module.mjs.map +1 -1
  66. package/dist/app/modules/identity/repositories/client.d.ts +2 -2
  67. package/dist/app/modules/identity/repositories/client.d.ts.map +1 -1
  68. package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
  69. package/dist/app/modules/identity/repositories/robot.d.ts +2 -2
  70. package/dist/app/modules/identity/repositories/robot.d.ts.map +1 -1
  71. package/dist/app/modules/identity/repositories/robot.mjs.map +1 -1
  72. package/dist/app/modules/oauth2/module.d.ts.map +1 -1
  73. package/dist/app/modules/oauth2/module.mjs +5 -2
  74. package/dist/app/modules/oauth2/module.mjs.map +1 -1
  75. package/dist/app/modules/provisioning/module.d.ts.map +1 -1
  76. package/dist/app/modules/provisioning/module.mjs +14 -9
  77. package/dist/app/modules/provisioning/module.mjs.map +1 -1
  78. package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
  79. package/dist/app/modules/provisioning/sources/default/module.mjs +66 -10
  80. package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
  81. package/dist/components/database/unique-entries/module.mjs +1 -1
  82. package/dist/core/entities/client/service.d.ts.map +1 -1
  83. package/dist/core/entities/client/service.mjs +15 -4
  84. package/dist/core/entities/client/service.mjs.map +1 -1
  85. package/dist/core/entities/client/types.d.ts +4 -1
  86. package/dist/core/entities/client/types.d.ts.map +1 -1
  87. package/dist/core/entities/client-scope/service.d.ts.map +1 -1
  88. package/dist/core/entities/client-scope/service.mjs +2 -0
  89. package/dist/core/entities/client-scope/service.mjs.map +1 -1
  90. package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -1
  91. package/dist/core/entities/identity-provider-role-mapping/service.mjs +2 -0
  92. package/dist/core/entities/identity-provider-role-mapping/service.mjs.map +1 -1
  93. package/dist/core/entities/permission/service.mjs +1 -1
  94. package/dist/core/entities/policy/attributes-validator.mjs +1 -1
  95. package/dist/core/entities/policy/service.mjs +1 -1
  96. package/dist/core/entities/realm/service.mjs +1 -1
  97. package/dist/core/entities/robot/service.d.ts.map +1 -1
  98. package/dist/core/entities/robot/service.mjs +29 -8
  99. package/dist/core/entities/robot/service.mjs.map +1 -1
  100. package/dist/core/entities/robot/types.d.ts +4 -1
  101. package/dist/core/entities/robot/types.d.ts.map +1 -1
  102. package/dist/core/entities/role/service.mjs +1 -1
  103. package/dist/core/entities/role/types.d.ts +3 -0
  104. package/dist/core/entities/role/types.d.ts.map +1 -1
  105. package/dist/core/entities/role-attribute/service.d.ts +2 -0
  106. package/dist/core/entities/role-attribute/service.d.ts.map +1 -1
  107. package/dist/core/entities/role-attribute/service.mjs +7 -3
  108. package/dist/core/entities/role-attribute/service.mjs.map +1 -1
  109. package/dist/core/entities/scope/service.mjs +1 -1
  110. package/dist/core/entities/user/service.d.ts.map +1 -1
  111. package/dist/core/entities/user/service.mjs +10 -12
  112. package/dist/core/entities/user/service.mjs.map +1 -1
  113. package/dist/core/entities/user/types.d.ts +4 -1
  114. package/dist/core/entities/user/types.d.ts.map +1 -1
  115. package/dist/core/entities/user-attribute/service.d.ts +3 -1
  116. package/dist/core/entities/user-attribute/service.d.ts.map +1 -1
  117. package/dist/core/entities/user-attribute/service.mjs +44 -17
  118. package/dist/core/entities/user-attribute/service.mjs.map +1 -1
  119. package/dist/core/identity/index.d.ts +1 -0
  120. package/dist/core/identity/index.d.ts.map +1 -1
  121. package/dist/core/identity/index.mjs +2 -1
  122. package/dist/core/identity/permission/module.d.ts +12 -6
  123. package/dist/core/identity/permission/module.d.ts.map +1 -1
  124. package/dist/core/identity/permission/module.mjs +11 -19
  125. package/dist/core/identity/permission/module.mjs.map +1 -1
  126. package/dist/core/identity/permission/types.d.ts +11 -13
  127. package/dist/core/identity/permission/types.d.ts.map +1 -1
  128. package/dist/core/identity/role/index.d.ts +3 -0
  129. package/dist/core/identity/role/index.d.ts.map +1 -0
  130. package/dist/core/identity/role/index.mjs +2 -0
  131. package/dist/core/identity/role/module.d.ts +15 -0
  132. package/dist/core/identity/role/module.d.ts.map +1 -0
  133. package/dist/core/identity/role/module.mjs +27 -0
  134. package/dist/core/identity/role/module.mjs.map +1 -0
  135. package/dist/core/identity/role/types.d.ts +14 -0
  136. package/dist/core/identity/role/types.d.ts.map +1 -0
  137. package/dist/core/identity/role/types.mjs +1 -0
  138. package/dist/core/index.mjs +2 -1
  139. package/dist/core/oauth2/token/issuer/access/module.d.ts +4 -1
  140. package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
  141. package/dist/core/oauth2/token/issuer/access/module.mjs +24 -2
  142. package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
  143. package/dist/core/provisioning/entities/permission/types.d.ts +8 -0
  144. package/dist/core/provisioning/entities/permission/types.d.ts.map +1 -1
  145. package/dist/core/provisioning/synchronizer/permission/module.d.ts +5 -1
  146. package/dist/core/provisioning/synchronizer/permission/module.d.ts.map +1 -1
  147. package/dist/core/provisioning/synchronizer/permission/module.mjs +23 -0
  148. package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
  149. package/dist/core/provisioning/synchronizer/permission/types.d.ts +4 -1
  150. package/dist/core/provisioning/synchronizer/permission/types.d.ts.map +1 -1
  151. package/dist/core/provisioning/synchronizer/policy/module.d.ts.map +1 -1
  152. package/dist/core/provisioning/synchronizer/policy/module.mjs +4 -2
  153. package/dist/core/provisioning/synchronizer/policy/module.mjs.map +1 -1
  154. package/dist/index.mjs +18 -20
  155. package/dist/path.d.ts +2 -1
  156. package/dist/path.d.ts.map +1 -1
  157. package/dist/path.mjs +3 -2
  158. package/dist/path.mjs.map +1 -1
  159. package/dist/swagger.json +14 -0
  160. package/dist/ui/client/.vite/ssr-manifest.json +2777 -0
  161. package/dist/ui/client/assets/fa-brands-400-BP5tdqmh.woff2 +0 -0
  162. package/dist/ui/client/assets/fa-regular-400-nyy7hhHF.woff2 +0 -0
  163. package/dist/ui/client/assets/fa-solid-900-DRAAbZTg.woff2 +0 -0
  164. package/dist/ui/client/assets/index-AHa03lX_.js +41 -0
  165. package/dist/ui/client/assets/index-BVfayRKv.css +1 -0
  166. package/dist/ui/client/index.html +22 -0
  167. package/dist/ui/server/assets/multipart-parser-pHQi-kA6.js +166 -0
  168. package/dist/ui/server/server.js +79102 -0
  169. package/package.json +30 -13
  170. package/dist/adapters/database/domains/client/repository.d.ts +0 -13
  171. package/dist/adapters/database/domains/client/repository.d.ts.map +0 -1
  172. package/dist/adapters/database/domains/client/repository.mjs +0 -75
  173. package/dist/adapters/database/domains/client/repository.mjs.map +0 -1
  174. package/dist/adapters/database/domains/robot/repository.d.ts +0 -13
  175. package/dist/adapters/database/domains/robot/repository.d.ts.map +0 -1
  176. package/dist/adapters/database/domains/robot/repository.mjs +0 -75
  177. package/dist/adapters/database/domains/robot/repository.mjs.map +0 -1
  178. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts +0 -4
  179. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts.map +0 -1
  180. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs +0 -35
  181. package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs.map +0 -1
@@ -13,6 +13,7 @@ var ClientScopeService = class extends AbstractEntityService {
13
13
  }
14
14
  async getMany(query, actor) {
15
15
  await actor.permissionEvaluator.preEvaluateOneOf({ name: [
16
+ PermissionName.CLIENT_SCOPE_READ,
16
17
  PermissionName.CLIENT_READ,
17
18
  PermissionName.CLIENT_UPDATE,
18
19
  PermissionName.CLIENT_DELETE
@@ -21,6 +22,7 @@ var ClientScopeService = class extends AbstractEntityService {
21
22
  }
22
23
  async getOne(id, actor) {
23
24
  await actor.permissionEvaluator.preEvaluateOneOf({ name: [
25
+ PermissionName.CLIENT_SCOPE_READ,
24
26
  PermissionName.CLIENT_READ,
25
27
  PermissionName.CLIENT_UPDATE,
26
28
  PermissionName.CLIENT_DELETE
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","ConflictError","NotFoundError","ClientScopeValidator","PermissionName","ValidatorGroup","AbstractEntityService","ClientScopeService","repository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","CLIENT_READ","CLIENT_UPDATE","CLIENT_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","CLIENT_SCOPE_CREATE","validated","run","group","CREATE","validateJoinColumns","existing","client_id","scope_id","client","client_realm_id","realm_id","scope","scope_realm_id","evaluate","input","ATTRIBUTES","save","delete","CLIENT_SCOPE_DELETE","entityId","remove"],"sources":["../../../../src/core/entities/client-scope/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 { ConflictError, NotFoundError } from '@ebec/http';\nimport { ClientScopeValidator, PermissionName, ValidatorGroup } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IClientScopeRepository, IClientScopeService } from './types.ts';\n\nexport type ClientScopeServiceContext = {\n repository: IClientScopeRepository;\n};\n\nexport class ClientScopeService extends AbstractEntityService implements IClientScopeService {\n protected repository: IClientScopeRepository;\n\n protected validator: ClientScopeValidator;\n\n constructor(ctx: ClientScopeServiceContext) {\n super();\n this.repository = ctx.repository;\n this.validator = new ClientScopeValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<ClientScope>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<ClientScope> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<ClientScope> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_SCOPE_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 client_id: validated.client_id,\n scope_id: validated.scope_id,\n });\n if (existing) {\n throw new ConflictError('The client-scope assignment already exists.');\n }\n\n if (validated.client) {\n validated.client_realm_id = validated.client.realm_id;\n }\n\n if (validated.scope) {\n validated.scope_realm_id = validated.scope.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_SCOPE_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<ClientScope> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_SCOPE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_SCOPE_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":";;;;;AAoBA,IAAaQ,qBAAb,cAAwCD,sBAAAA;CAC1BE;CAEAC;CAEV,YAAYC,KAAgC;AACxC,SAAK;AACL,OAAKF,aAAaE,IAAIF;AACtB,OAAKC,YAAY,IAAIN,sBAAAA;;CAGzB,MAAMQ,QACFC,OACAC,OACoD;AACpD,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFZ,eAAea;GACfb,eAAec;GACfd,eAAee;GAClB,EACL,CAAA;AAEA,SAAO,KAAKX,WAAWY,SAASR,MAAAA;;CAGpC,MAAMS,OACFC,IACAT,OACoB;AACpB,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFZ,eAAea;GACfb,eAAec;GACfd,eAAee;GAClB,EACL,CAAA;EAEA,MAAMI,SAAS,MAAM,KAAKf,WAAWgB,UAAU,EAAEF,IAAG,CAAA;AACpD,MAAI,CAACC,OACD,OAAM,IAAIrB,eAAAA;AAGd,SAAOqB;;CAGX,MAAME,OACFC,MACAb,OACoB;AACpB,QAAMA,MAAMC,oBAAoBa,YAAY,EAAEX,MAAMZ,eAAewB,qBAAoB,CAAA;EAEvF,MAAMC,YAAY,MAAM,KAAKpB,UAAUqB,IAAIJ,MAAM,EAAEK,OAAO1B,eAAe2B,QAAO,CAAA;AAEhF,QAAM,KAAKxB,WAAWyB,oBAAoBJ,UAAAA;AAM1C,MAAIK,MAJmB,KAAK1B,WAAWgB,UAAU;GAC7CW,WAAWN,UAAUM;GACrBC,UAAUP,UAAUO;GACxB,CAAA,CAEI,OAAM,IAAInC,cAAc,8CAAA;AAG5B,MAAI4B,UAAUQ,OACVR,WAAUS,kBAAkBT,UAAUQ,OAAOE;AAGjD,MAAIV,UAAUW,MACVX,WAAUY,iBAAiBZ,UAAUW,MAAMD;AAG/C,QAAM1B,MAAMC,oBAAoB4B,SAAS;GACrC1B,MAAMZ,eAAewB;GACrBe,OAAO,IAAI3C,WAAW,GAAGD,kBAAkB6C,aAAaf,WAAU,CAAA;GACtE,CAAA;EAEA,IAAIN,SAAS,KAAKf,WAAWiB,OAAOI,UAAAA;AACpCN,WAAS,MAAM,KAAKf,WAAWqC,KAAKtB,OAAAA;AAEpC,SAAOA;;CAGX,MAAMuB,OACFxB,IACAT,OACoB;AACpB,QAAMA,MAAMC,oBAAoBa,YAAY,EAAEX,MAAMZ,eAAe2C,qBAAoB,CAAA;EAEvF,MAAMxB,SAAS,MAAM,KAAKf,WAAWgB,UAAU,EAAEF,IAAG,CAAA;AACpD,MAAI,CAACC,OACD,OAAM,IAAIrB,eAAAA;AAGd,QAAMW,MAAMC,oBAAoB4B,SAAS;GACrC1B,MAAMZ,eAAe2C;GACrBJ,OAAO,IAAI3C,WAAW,GAAGD,kBAAkB6C,aAAarB,QAAO,CAAA;GACnE,CAAA;EAEA,MAAM,EAAED,IAAI0B,aAAazB;AACzB,QAAM,KAAKf,WAAWyC,OAAO1B,OAAAA;AAC7BA,SAAOD,KAAK0B;AAEZ,SAAOzB"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","ConflictError","NotFoundError","ClientScopeValidator","PermissionName","ValidatorGroup","AbstractEntityService","ClientScopeService","repository","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","CLIENT_SCOPE_READ","CLIENT_READ","CLIENT_UPDATE","CLIENT_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","CLIENT_SCOPE_CREATE","validated","run","group","CREATE","validateJoinColumns","existing","client_id","scope_id","client","client_realm_id","realm_id","scope","scope_realm_id","evaluate","input","ATTRIBUTES","save","delete","CLIENT_SCOPE_DELETE","entityId","remove"],"sources":["../../../../src/core/entities/client-scope/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 { ConflictError, NotFoundError } from '@ebec/http';\nimport { ClientScopeValidator, PermissionName, ValidatorGroup } from '@authup/core-kit';\nimport type { ClientScope } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IClientScopeRepository, IClientScopeService } from './types.ts';\n\nexport type ClientScopeServiceContext = {\n repository: IClientScopeRepository;\n};\n\nexport class ClientScopeService extends AbstractEntityService implements IClientScopeService {\n protected repository: IClientScopeRepository;\n\n protected validator: ClientScopeValidator;\n\n constructor(ctx: ClientScopeServiceContext) {\n super();\n this.repository = ctx.repository;\n this.validator = new ClientScopeValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<ClientScope>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_SCOPE_READ,\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<ClientScope> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.CLIENT_SCOPE_READ,\n PermissionName.CLIENT_READ,\n PermissionName.CLIENT_UPDATE,\n PermissionName.CLIENT_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<ClientScope> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_SCOPE_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 client_id: validated.client_id,\n scope_id: validated.scope_id,\n });\n if (existing) {\n throw new ConflictError('The client-scope assignment already exists.');\n }\n\n if (validated.client) {\n validated.client_realm_id = validated.client.realm_id;\n }\n\n if (validated.scope) {\n validated.scope_realm_id = validated.scope.realm_id;\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_SCOPE_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<ClientScope> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.CLIENT_SCOPE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.CLIENT_SCOPE_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":";;;;;AAoBA,IAAaQ,qBAAb,cAAwCD,sBAAAA;CAC1BE;CAEAC;CAEV,YAAYC,KAAgC;AACxC,SAAK;AACL,OAAKF,aAAaE,IAAIF;AACtB,OAAKC,YAAY,IAAIN,sBAAAA;;CAGzB,MAAMQ,QACFC,OACAC,OACoD;AACpD,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFZ,eAAea;GACfb,eAAec;GACfd,eAAee;GACff,eAAegB;GAClB,EACL,CAAA;AAEA,SAAO,KAAKZ,WAAWa,SAAST,MAAAA;;CAGpC,MAAMU,OACFC,IACAV,OACoB;AACpB,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFZ,eAAea;GACfb,eAAec;GACfd,eAAee;GACff,eAAegB;GAClB,EACL,CAAA;EAEA,MAAMI,SAAS,MAAM,KAAKhB,WAAWiB,UAAU,EAAEF,IAAG,CAAA;AACpD,MAAI,CAACC,OACD,OAAM,IAAItB,eAAAA;AAGd,SAAOsB;;CAGX,MAAME,OACFC,MACAd,OACoB;AACpB,QAAMA,MAAMC,oBAAoBc,YAAY,EAAEZ,MAAMZ,eAAeyB,qBAAoB,CAAA;EAEvF,MAAMC,YAAY,MAAM,KAAKrB,UAAUsB,IAAIJ,MAAM,EAAEK,OAAO3B,eAAe4B,QAAO,CAAA;AAEhF,QAAM,KAAKzB,WAAW0B,oBAAoBJ,UAAAA;AAM1C,MAAIK,MAJmB,KAAK3B,WAAWiB,UAAU;GAC7CW,WAAWN,UAAUM;GACrBC,UAAUP,UAAUO;GACxB,CAAA,CAEI,OAAM,IAAIpC,cAAc,8CAAA;AAG5B,MAAI6B,UAAUQ,OACVR,WAAUS,kBAAkBT,UAAUQ,OAAOE;AAGjD,MAAIV,UAAUW,MACVX,WAAUY,iBAAiBZ,UAAUW,MAAMD;AAG/C,QAAM3B,MAAMC,oBAAoB6B,SAAS;GACrC3B,MAAMZ,eAAeyB;GACrBe,OAAO,IAAI5C,WAAW,GAAGD,kBAAkB8C,aAAaf,WAAU,CAAA;GACtE,CAAA;EAEA,IAAIN,SAAS,KAAKhB,WAAWkB,OAAOI,UAAAA;AACpCN,WAAS,MAAM,KAAKhB,WAAWsC,KAAKtB,OAAAA;AAEpC,SAAOA;;CAGX,MAAMuB,OACFxB,IACAV,OACoB;AACpB,QAAMA,MAAMC,oBAAoBc,YAAY,EAAEZ,MAAMZ,eAAe4C,qBAAoB,CAAA;EAEvF,MAAMxB,SAAS,MAAM,KAAKhB,WAAWiB,UAAU,EAAEF,IAAG,CAAA;AACpD,MAAI,CAACC,OACD,OAAM,IAAItB,eAAAA;AAGd,QAAMW,MAAMC,oBAAoB6B,SAAS;GACrC3B,MAAMZ,eAAe4C;GACrBJ,OAAO,IAAI5C,WAAW,GAAGD,kBAAkB8C,aAAarB,QAAO,CAAA;GACnE,CAAA;EAEA,MAAM,EAAED,IAAI0B,aAAazB;AACzB,QAAM,KAAKhB,WAAW0C,OAAO1B,OAAAA;AAC7BA,SAAOD,KAAK0B;AAEZ,SAAOzB"}
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/identity-provider-role-mapping/service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,oCAAoC,EAAkC,MAAM,kBAAkB,CAAC;AACxG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,sCAAsC,EAAE,mCAAmC,EAAE,MAAM,YAAY,CAAC;AAE9G,MAAM,MAAM,yCAAyC,GAAG;IACpD,UAAU,EAAE,sCAAsC,CAAC;IACnD,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,kCAAmC,SAAQ,qBAAsB,YAAW,mCAAmC;IACxH,SAAS,CAAC,UAAU,EAAE,sCAAsC,CAAC;IAE7D,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,oCAAoC,CAAC;gBAE9C,GAAG,EAAE,yCAAyC;IAOpD,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,2BAA2B,CAAC,CAAC;IAYjE,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;IAiBjC,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;IA2DjC,MAAM,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;IAsBjC,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;CAmB1C"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/identity-provider-role-mapping/service.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,oCAAoC,EAAkC,MAAM,kBAAkB,CAAC;AACxG,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,oCAAoC,CAAC;AACtF,OAAO,KAAK,EAAE,sCAAsC,EAAE,mCAAmC,EAAE,MAAM,YAAY,CAAC;AAE9G,MAAM,MAAM,yCAAyC,GAAG;IACpD,UAAU,EAAE,sCAAsC,CAAC;IACnD,0BAA0B,EAAE,2BAA2B,CAAC;CAC3D,CAAC;AAEF,qBAAa,kCAAmC,SAAQ,qBAAsB,YAAW,mCAAmC;IACxH,SAAS,CAAC,UAAU,EAAE,sCAAsC,CAAC;IAE7D,SAAS,CAAC,0BAA0B,EAAE,2BAA2B,CAAC;IAElE,SAAS,CAAC,SAAS,EAAE,oCAAoC,CAAC;gBAE9C,GAAG,EAAE,yCAAyC;IAOpD,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,2BAA2B,CAAC,CAAC;IAajE,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;IAkBjC,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;IA2DjC,MAAM,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;IAsBjC,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,2BAA2B,CAAC;CAmB1C"}
@@ -15,6 +15,7 @@ var IdentityProviderRoleMappingService = class extends AbstractEntityService {
15
15
  }
16
16
  async getMany(query, actor) {
17
17
  await actor.permissionEvaluator.preEvaluateOneOf({ name: [
18
+ PermissionName.IDENTITY_PROVIDER_ROLE_READ,
18
19
  PermissionName.IDENTITY_PROVIDER_READ,
19
20
  PermissionName.IDENTITY_PROVIDER_UPDATE,
20
21
  PermissionName.IDENTITY_PROVIDER_DELETE
@@ -23,6 +24,7 @@ var IdentityProviderRoleMappingService = class extends AbstractEntityService {
23
24
  }
24
25
  async getOne(id, actor) {
25
26
  await actor.permissionEvaluator.preEvaluateOneOf({ name: [
27
+ PermissionName.IDENTITY_PROVIDER_ROLE_READ,
26
28
  PermissionName.IDENTITY_PROVIDER_READ,
27
29
  PermissionName.IDENTITY_PROVIDER_UPDATE,
28
30
  PermissionName.IDENTITY_PROVIDER_DELETE
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","BadRequestError","ConflictError","ForbiddenError","NotFoundError","IdentityProviderRoleMappingValidator","PermissionName","ValidatorGroup","AbstractEntityService","IdentityProviderRoleMappingService","repository","identityPermissionProvider","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","IDENTITY_PROVIDER_READ","IDENTITY_PROVIDER_UPDATE","IDENTITY_PROVIDER_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","IDENTITY_PROVIDER_ROLE_CREATE","validated","run","group","CREATE","validateJoinColumns","existing","provider_id","role_id","provider","provider_realm_id","realm_id","role","role_realm_id","identity","hasPermissions","isSuperset","type","clientId","client_id","evaluate","input","ATTRIBUTES","save","update","IDENTITY_PROVIDER_ROLE_UPDATE","UPDATE","merged","merge","delete","IDENTITY_PROVIDER_ROLE_DELETE","entityId","remove"],"sources":["../../../../src/core/entities/identity-provider-role-mapping/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { \n BadRequestError, \n ConflictError, \n ForbiddenError, \n NotFoundError, \n} from '@ebec/http';\nimport { IdentityProviderRoleMappingValidator, PermissionName, ValidatorGroup } from '@authup/core-kit';\nimport type { IdentityProviderRoleMapping } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { IIdentityProviderRoleMappingRepository, IIdentityProviderRoleMappingService } from './types.ts';\n\nexport type IdentityProviderRoleMappingServiceContext = {\n repository: IIdentityProviderRoleMappingRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class IdentityProviderRoleMappingService extends AbstractEntityService implements IIdentityProviderRoleMappingService {\n protected repository: IIdentityProviderRoleMappingRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n protected validator: IdentityProviderRoleMappingValidator;\n\n constructor(ctx: IdentityProviderRoleMappingServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n this.validator = new IdentityProviderRoleMappingValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<IdentityProviderRoleMapping>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.IDENTITY_PROVIDER_READ,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.IDENTITY_PROVIDER_READ,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_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 provider_id: validated.provider_id,\n role_id: validated.role_id,\n });\n if (existing) {\n throw new ConflictError('The identity-provider-role-mapping already exists.');\n }\n\n if (validated.provider) {\n validated.provider_realm_id = validated.provider.realm_id;\n }\n\n if (validated.role) {\n validated.role_realm_id = validated.role.realm_id;\n }\n\n if (\n validated.role_realm_id &&\n validated.provider_realm_id &&\n validated.role_realm_id !== validated.provider_realm_id\n ) {\n throw new BadRequestError('It is not possible to map an identity provider to a role of another realm.');\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 ForbiddenError('You don\\'t own the required permissions.');\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_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 update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_ROLE_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.UPDATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const merged = this.repository.merge(entity, validated);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_ROLE_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<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_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":";;;;;AA2BA,IAAaU,qCAAb,cAAwDD,sBAAAA;CAC1CE;CAEAC;CAEAC;CAEV,YAAYC,KAAgD;AACxD,SAAK;AACL,OAAKH,aAAaG,IAAIH;AACtB,OAAKC,6BAA6BE,IAAIF;AACtC,OAAKC,YAAY,IAAIP,sCAAAA;;CAGzB,MAAMS,QACFC,OACAC,OACoE;AACpE,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFb,eAAec;GACfd,eAAee;GACff,eAAegB;GAClB,EACL,CAAA;AAEA,SAAO,KAAKZ,WAAWa,SAASR,MAAAA;;CAGpC,MAAMS,OACFC,IACAT,OACoC;AACpC,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFb,eAAec;GACfd,eAAee;GACff,eAAegB;GAClB,EACL,CAAA;EAEA,MAAMI,SAAS,MAAM,KAAKhB,WAAWiB,UAAU,EAAEF,IAAG,CAAA;AACpD,MAAI,CAACC,OACD,OAAM,IAAItB,eAAAA;AAGd,SAAOsB;;CAGX,MAAME,OACFC,MACAb,OACoC;AACpC,QAAMA,MAAMC,oBAAoBa,YAAY,EAAEX,MAAMb,eAAeyB,+BAA8B,CAAA;EAEjG,MAAMC,YAAY,MAAM,KAAKpB,UAAUqB,IAAIJ,MAAM,EAAEK,OAAO3B,eAAe4B,QAAO,CAAA;AAEhF,QAAM,KAAKzB,WAAW0B,oBAAoBJ,UAAAA;AAM1C,MAAIK,MAJmB,KAAK3B,WAAWiB,UAAU;GAC7CW,aAAaN,UAAUM;GACvBC,SAASP,UAAUO;GACvB,CAAA,CAEI,OAAM,IAAIrC,cAAc,qDAAA;AAG5B,MAAI8B,UAAUQ,SACVR,WAAUS,oBAAoBT,UAAUQ,SAASE;AAGrD,MAAIV,UAAUW,KACVX,WAAUY,gBAAgBZ,UAAUW,KAAKD;AAG7C,MACIV,UAAUY,iBACVZ,UAAUS,qBACVT,UAAUY,kBAAkBZ,UAAUS,kBAEtC,OAAM,IAAIxC,gBAAgB,6EAAA;AAG9B,MAAI+B,UAAUW,QAAQ3B,MAAM6B;OAYpB,CAACC,MAXwB,KAAKnC,2BAA2BoC,WACzD;IACIC,MAAMhC,MAAM6B,SAASG;IACrBvB,IAAIT,MAAM6B,SAAShB,KAAKJ;IAC5B,EACA;IACIuB,MAAM;IACNvB,IAAIO,UAAUO;IACdU,UAAUjB,UAAUW,KAAKO;IAC7B,CAAA,CAGA,OAAM,IAAI/C,eAAe,0CAAA;;AAIjC,QAAMa,MAAMC,oBAAoBkC,SAAS;GACrChC,MAAMb,eAAeyB;GACrBqB,OAAO,IAAIpD,WAAW,GAAGD,kBAAkBsD,aAAarB,WAAU,CAAA;GACtE,CAAA;EAEA,IAAIN,SAAS,KAAKhB,WAAWkB,OAAOI,UAAAA;AACpCN,WAAS,MAAM,KAAKhB,WAAW4C,KAAK5B,OAAAA;AAEpC,SAAOA;;CAGX,MAAM6B,OACF9B,IACAI,MACAb,OACoC;AACpC,QAAMA,MAAMC,oBAAoBa,YAAY,EAAEX,MAAMb,eAAekD,+BAA8B,CAAA;EAEjG,MAAM9B,SAAS,MAAM,KAAKhB,WAAWiB,UAAU,EAAEF,IAAG,CAAA;AACpD,MAAI,CAACC,OACD,OAAM,IAAItB,eAAAA;EAGd,MAAM4B,YAAY,MAAM,KAAKpB,UAAUqB,IAAIJ,MAAM,EAAEK,OAAO3B,eAAekD,QAAO,CAAA;AAEhF,QAAM,KAAK/C,WAAW0B,oBAAoBJ,UAAAA;EAE1C,MAAM0B,SAAS,KAAKhD,WAAWiD,MAAMjC,QAAQM,UAAAA;AAE7C,QAAMhB,MAAMC,oBAAoBkC,SAAS;GACrChC,MAAMb,eAAekD;GACrBJ,OAAO,IAAIpD,WAAW,GAAGD,kBAAkBsD,aAAaK,QAAO,CAAA;GACnE,CAAA;AAEA,SAAO,KAAKhD,WAAW4C,KAAKI,OAAAA;;CAGhC,MAAME,OACFnC,IACAT,OACoC;AACpC,QAAMA,MAAMC,oBAAoBa,YAAY,EAAEX,MAAMb,eAAeuD,+BAA8B,CAAA;EAEjG,MAAMnC,SAAS,MAAM,KAAKhB,WAAWiB,UAAU,EAAEF,IAAG,CAAA;AACpD,MAAI,CAACC,OACD,OAAM,IAAItB,eAAAA;AAGd,QAAMY,MAAMC,oBAAoBkC,SAAS;GACrChC,MAAMb,eAAeuD;GACrBT,OAAO,IAAIpD,WAAW,GAAGD,kBAAkBsD,aAAa3B,QAAO,CAAA;GACnE,CAAA;EAEA,MAAM,EAAED,IAAIqC,aAAapC;AACzB,QAAM,KAAKhB,WAAWqD,OAAOrC,OAAAA;AAC7BA,SAAOD,KAAKqC;AAEZ,SAAOpC"}
1
+ {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","BadRequestError","ConflictError","ForbiddenError","NotFoundError","IdentityProviderRoleMappingValidator","PermissionName","ValidatorGroup","AbstractEntityService","IdentityProviderRoleMappingService","repository","identityPermissionProvider","validator","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","IDENTITY_PROVIDER_ROLE_READ","IDENTITY_PROVIDER_READ","IDENTITY_PROVIDER_UPDATE","IDENTITY_PROVIDER_DELETE","findMany","getOne","id","entity","findOneBy","create","data","preEvaluate","IDENTITY_PROVIDER_ROLE_CREATE","validated","run","group","CREATE","validateJoinColumns","existing","provider_id","role_id","provider","provider_realm_id","realm_id","role","role_realm_id","identity","hasPermissions","isSuperset","type","clientId","client_id","evaluate","input","ATTRIBUTES","save","update","IDENTITY_PROVIDER_ROLE_UPDATE","UPDATE","merged","merge","delete","IDENTITY_PROVIDER_ROLE_DELETE","entityId","remove"],"sources":["../../../../src/core/entities/identity-provider-role-mapping/service.ts"],"sourcesContent":["/*\n * Copyright (c) 2026.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport { BuiltInPolicyType, PolicyData } from '@authup/access';\nimport { \n BadRequestError, \n ConflictError, \n ForbiddenError, \n NotFoundError, \n} from '@ebec/http';\nimport { IdentityProviderRoleMappingValidator, PermissionName, ValidatorGroup } from '@authup/core-kit';\nimport type { IdentityProviderRoleMapping } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IIdentityPermissionProvider } from '../../identity/permission/types.ts';\nimport type { IIdentityProviderRoleMappingRepository, IIdentityProviderRoleMappingService } from './types.ts';\n\nexport type IdentityProviderRoleMappingServiceContext = {\n repository: IIdentityProviderRoleMappingRepository;\n identityPermissionProvider: IIdentityPermissionProvider;\n};\n\nexport class IdentityProviderRoleMappingService extends AbstractEntityService implements IIdentityProviderRoleMappingService {\n protected repository: IIdentityProviderRoleMappingRepository;\n\n protected identityPermissionProvider: IIdentityPermissionProvider;\n\n protected validator: IdentityProviderRoleMappingValidator;\n\n constructor(ctx: IdentityProviderRoleMappingServiceContext) {\n super();\n this.repository = ctx.repository;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n this.validator = new IdentityProviderRoleMappingValidator();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<IdentityProviderRoleMapping>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.IDENTITY_PROVIDER_ROLE_READ,\n PermissionName.IDENTITY_PROVIDER_READ,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n ],\n });\n\n return this.repository.findMany(query);\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.IDENTITY_PROVIDER_ROLE_READ,\n PermissionName.IDENTITY_PROVIDER_READ,\n PermissionName.IDENTITY_PROVIDER_UPDATE,\n PermissionName.IDENTITY_PROVIDER_DELETE,\n ],\n });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_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 provider_id: validated.provider_id,\n role_id: validated.role_id,\n });\n if (existing) {\n throw new ConflictError('The identity-provider-role-mapping already exists.');\n }\n\n if (validated.provider) {\n validated.provider_realm_id = validated.provider.realm_id;\n }\n\n if (validated.role) {\n validated.role_realm_id = validated.role.realm_id;\n }\n\n if (\n validated.role_realm_id &&\n validated.provider_realm_id &&\n validated.role_realm_id !== validated.provider_realm_id\n ) {\n throw new BadRequestError('It is not possible to map an identity provider to a role of another realm.');\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 ForbiddenError('You don\\'t own the required permissions.');\n }\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_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 update(\n id: string,\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_ROLE_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n const validated = await this.validator.run(data, { group: ValidatorGroup.UPDATE });\n\n await this.repository.validateJoinColumns(validated);\n\n const merged = this.repository.merge(entity, validated);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_ROLE_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<IdentityProviderRoleMapping> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.IDENTITY_PROVIDER_ROLE_DELETE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.IDENTITY_PROVIDER_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,7 +1,7 @@
1
1
  import { AbstractEntityService } from "../service.mjs";
2
2
  import { PermissionName, PermissionValidator, ROLE_ADMIN_NAME, ROLE_REALM_ADMIN_NAME, ValidatorGroup } from "@authup/core-kit";
3
- import { BuiltInPolicyType, PolicyData, SystemPolicyName } from "@authup/access";
4
3
  import { isPropertySet, isUUID } from "@authup/kit";
4
+ import { BuiltInPolicyType, PolicyData, SystemPolicyName } from "@authup/access";
5
5
  import { BadRequestError, NotFoundError } from "@ebec/http";
6
6
  import { AuthupError } from "@authup/errors";
7
7
  //#region src/core/entities/permission/service.ts
@@ -1,5 +1,5 @@
1
- import { AttributeNamesPolicyValidator, AttributesPolicyValidator, BuiltInPolicyType, DatePolicyValidator, TimePolicyValidator } from "@authup/access";
2
1
  import { omitRecord } from "@authup/kit";
2
+ import { AttributeNamesPolicyValidator, AttributesPolicyValidator, BuiltInPolicyType, DatePolicyValidator, TimePolicyValidator } from "@authup/access";
3
3
  import { Container } from "validup";
4
4
  //#region src/core/entities/policy/attributes-validator.ts
5
5
  var PolicyAttributesValidator = class extends Container {
@@ -1,8 +1,8 @@
1
1
  import { AbstractEntityService } from "../service.mjs";
2
2
  import { PolicyAttributesValidator } from "./attributes-validator.mjs";
3
3
  import { PermissionName, PolicyValidator, ValidatorGroup } from "@authup/core-kit";
4
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
5
4
  import { extendObject, isPropertySet, isUUID, removeObjectProperty } from "@authup/kit";
5
+ import { BuiltInPolicyType, PolicyData } from "@authup/access";
6
6
  import { BadRequestError, NotFoundError } from "@ebec/http";
7
7
  //#region src/core/entities/policy/service.ts
8
8
  var PolicyService = class extends AbstractEntityService {
@@ -1,7 +1,7 @@
1
1
  import { AbstractEntityService } from "../service.mjs";
2
2
  import { PermissionName, REALM_MASTER_NAME, RealmValidator, ValidatorGroup } from "@authup/core-kit";
3
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
4
3
  import { isPropertySet, isUUID } from "@authup/kit";
4
+ import { BuiltInPolicyType, PolicyData } from "@authup/access";
5
5
  import { BadRequestError, NotFoundError } from "@ebec/http";
6
6
  //#region src/core/entities/realm/service.ts
7
7
  var RealmService = class extends AbstractEntityService {
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAEH,cAAc,EAEjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,qBAAa,YAAa,SAAQ,qBAAsB,YAAW,aAAa;IAC5E,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC;gBAExB,GAAG,EAAE,mBAAmB;IAO9B,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;IAoD3C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,KAAK,CAAC;IAwCX,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,KAAK,CAAC;IAKX,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,KAAK,CAAC;IAKX,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,KAAK,CAAC;QACd,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;IAmGI,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,KAAK,CAAC;CA0BpB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAEH,cAAc,EAEjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAElE,MAAM,MAAM,mBAAmB,GAAG;IAC9B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF,qBAAa,YAAa,SAAQ,qBAAsB,YAAW,aAAa;IAC5E,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC;gBAExB,GAAG,EAAE,mBAAmB;IAO9B,OAAO,CACT,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;IAoD3C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,KAAK,CAAC;IAwCX,MAAM,CACR,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,KAAK,CAAC;IAKX,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,KAAK,CAAC;IAKX,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,KAAK,CAAC;QACd,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC;IAuHI,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,KAAK,CAAC;CA0CpB"}
@@ -1,8 +1,8 @@
1
1
  import { RobotCredentialsService } from "../../authentication/credential/entities/robot/module.mjs";
2
2
  import { AbstractEntityService } from "../service.mjs";
3
3
  import { PermissionName, RobotValidator, ValidatorGroup } from "@authup/core-kit";
4
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
5
4
  import { isUUID } from "@authup/kit";
5
+ import { BuiltInPolicyType, PolicyData } from "@authup/access";
6
6
  import { NotFoundError } from "@ebec/http";
7
7
  //#region src/core/entities/robot/service.ts
8
8
  var RobotService = class extends AbstractEntityService {
@@ -97,8 +97,15 @@ var RobotService = class extends AbstractEntityService {
97
97
  entity = await this.repository.findOneBy(where);
98
98
  if (!entity && options.updateOnly) throw new NotFoundError();
99
99
  } else if (options.updateOnly) throw new NotFoundError();
100
+ let isSelfEdit = false;
100
101
  if (entity) {
101
- await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_UPDATE });
102
+ try {
103
+ await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_UPDATE });
104
+ } catch (e) {
105
+ if (!actor.identity || actor.identity.type !== "robot" || actor.identity.data.id !== entity.id) throw e;
106
+ isSelfEdit = true;
107
+ await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_SELF_MANAGE });
108
+ }
102
109
  group = ValidatorGroup.UPDATE;
103
110
  } else {
104
111
  await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_CREATE });
@@ -109,7 +116,11 @@ var RobotService = class extends AbstractEntityService {
109
116
  await this.repository.checkUniqueness(validated, entity || void 0);
110
117
  const credentialsService = new RobotCredentialsService();
111
118
  if (entity) {
112
- await actor.permissionEvaluator.evaluate({
119
+ if (isSelfEdit) await actor.permissionEvaluator.evaluate({
120
+ name: PermissionName.ROBOT_SELF_MANAGE,
121
+ input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
122
+ });
123
+ else await actor.permissionEvaluator.evaluate({
113
124
  name: PermissionName.ROBOT_UPDATE,
114
125
  input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {
115
126
  ...entity,
@@ -146,13 +157,23 @@ var RobotService = class extends AbstractEntityService {
146
157
  async delete(id, actor) {
147
158
  const entity = await this.repository.findOneBy({ id });
148
159
  if (!entity) throw new NotFoundError();
149
- if (!(entity.user_id && actor.identity && actor.identity.type === "user" && actor.identity.data.id === entity.user_id)) {
160
+ const isOwner = entity.user_id && actor.identity && actor.identity.type === "user" && actor.identity.data.id === entity.user_id;
161
+ let isSelfDelete = false;
162
+ try {
150
163
  await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_DELETE });
151
- await actor.permissionEvaluator.evaluate({
152
- name: PermissionName.ROBOT_DELETE,
153
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
154
- });
164
+ } catch (e) {
165
+ if (!isOwner) throw e;
166
+ isSelfDelete = true;
167
+ await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_SELF_MANAGE });
155
168
  }
169
+ if (isSelfDelete) await actor.permissionEvaluator.evaluate({
170
+ name: PermissionName.ROBOT_SELF_MANAGE,
171
+ input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {} })
172
+ });
173
+ else await actor.permissionEvaluator.evaluate({
174
+ name: PermissionName.ROBOT_DELETE,
175
+ input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
176
+ });
156
177
  const { id: entityId } = entity;
157
178
  await this.repository.remove(entity);
158
179
  entity.id = entityId;
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","isUUID","NotFoundError","PermissionName","RobotValidator","ValidatorGroup","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","findOneById","realm","resolve","findOneBy","realm_id","findOneByName","create","save","undefined","update","updateOnly","options","group","where","preEvaluate","UPDATE","ROBOT_CREATE","CREATE","validated","run","validateJoinColumns","checkUniqueness","credentialsService","evaluate","merge","secret","protect","created","actorRealmId","getActorRealmId","generateSecret","delete","isOwner","user_id","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 { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n RobotValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\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 realmId?: string,\n ): Promise<Robot> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n });\n\n let entity: Robot | null;\n if (isUUID(idOrName)) {\n entity = await this.repository.findOneById(idOrName);\n } else if (realmId) {\n const realm = await this.realmRepository.resolve(realmId);\n entity = realm ?\n await this.repository.findOneBy({\n name: idOrName,\n realm_id: realm.id, \n }) :\n null;\n } else {\n entity = await this.repository.findOneByName(idOrName);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\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 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 NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\n }\n\n if (entity) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_UPDATE });\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 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 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 NotFoundError();\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 if (!isOwner) {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROBOT_DELETE });\n\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","PolicyData","isUUID","NotFoundError","PermissionName","RobotValidator","ValidatorGroup","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","findOneById","realm","resolve","findOneBy","realm_id","findOneByName","create","save","undefined","update","updateOnly","options","group","where","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 { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport {\n PermissionName,\n RobotValidator,\n ValidatorGroup,\n} from '@authup/core-kit';\nimport type { Robot } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport type { IRealmRepository } from '../realm/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\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 realmId?: string,\n ): Promise<Robot> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROBOT_READ,\n PermissionName.ROBOT_UPDATE,\n PermissionName.ROBOT_DELETE,\n ],\n });\n\n let entity: Robot | null;\n if (isUUID(idOrName)) {\n entity = await this.repository.findOneById(idOrName);\n } else if (realmId) {\n const realm = await this.realmRepository.resolve(realmId);\n entity = realm ?\n await this.repository.findOneBy({\n name: idOrName,\n realm_id: realm.id, \n }) :\n null;\n } else {\n entity = await this.repository.findOneByName(idOrName);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\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 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 NotFoundError();\n }\n } else if (options.updateOnly) {\n throw new NotFoundError();\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 NotFoundError();\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,9 +1,12 @@
1
- import type { Robot } from '@authup/core-kit';
1
+ import type { Robot, Role } from '@authup/core-kit';
2
+ import type { PermissionPolicyBinding } from '@authup/access';
2
3
  import type { ActorContext } from '../actor/types.ts';
3
4
  import type { EntityRepositoryFindManyResult, IEntityRepository } from '../types.ts';
4
5
  export interface IRobotRepository extends IEntityRepository<Robot> {
5
6
  checkUniqueness(data: Partial<Robot>, existing?: Robot): Promise<void>;
6
7
  findOneWithSecret(where: Record<string, any>): Promise<Robot | null>;
8
+ getBoundRoles(entity: string | Robot): Promise<Role[]>;
9
+ getBoundPermissions(entity: string | Robot): Promise<PermissionPolicyBinding[]>;
7
10
  }
8
11
  export interface IRobotService {
9
12
  getMany(query: Record<string, any>, actor: ActorContext): Promise<EntityRepositoryFindManyResult<Robot>>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB,CAAC,KAAK,CAAC;IAC9D,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;IACzG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzF,IAAI,CACA,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC,OAAO,CAAC;QACP,MAAM,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAC3D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/robot/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,gBAAiB,SAAQ,iBAAiB,CAAC,KAAK,CAAC;IAC9D,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAErE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAEvD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,aAAa;IAC1B,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC,CAAC;IACzG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAChF,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACvE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IACzF,IAAI,CACA,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC,OAAO,CAAC;QACP,MAAM,EAAE,KAAK,CAAC;QACd,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;CAC3D"}
@@ -1,7 +1,7 @@
1
1
  import { AbstractEntityService } from "../service.mjs";
2
2
  import { PermissionName, ROLE_ADMIN_NAME, RoleValidator, ValidatorGroup } from "@authup/core-kit";
3
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
4
3
  import { isPropertySet, isUUID } from "@authup/kit";
4
+ import { BuiltInPolicyType, PolicyData } from "@authup/access";
5
5
  import { BadRequestError, NotFoundError } from "@ebec/http";
6
6
  //#region src/core/entities/role/service.ts
7
7
  var RoleService = class extends AbstractEntityService {
@@ -1,8 +1,11 @@
1
1
  import type { Role } from '@authup/core-kit';
2
+ import type { PermissionPolicyBinding } from '@authup/access';
2
3
  import type { ActorContext } from '../actor/types.ts';
3
4
  import type { EntityRepositoryFindManyResult, IEntityRepository } from '../types.ts';
4
5
  export interface IRoleRepository extends IEntityRepository<Role> {
5
6
  checkUniqueness(data: Partial<Role>, existing?: Role): Promise<void>;
7
+ getBoundPermissions(entity: string | Role): Promise<PermissionPolicyBinding[]>;
8
+ getBoundPermissionsForMany(entities: (string | Role)[]): Promise<PermissionPolicyBinding[]>;
6
9
  }
7
10
  export interface IRoleService {
8
11
  getMany(query: Record<string, any>, actor: ActorContext): Promise<EntityRepositoryFindManyResult<Role>>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/role/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,eAAgB,SAAQ,iBAAiB,CAAC,IAAI,CAAC;IAC5D,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,IAAI,CACA,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC,OAAO,CAAC;QACP,MAAM,EAAE,IAAI,CAAC;QACb,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/role/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErF,MAAM,WAAW,eAAgB,SAAQ,iBAAiB,CAAC,IAAI,CAAC;IAC5D,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErE,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;IAE/E,0BAA0B,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAAC;CAC/F;AAED,MAAM,WAAW,YAAY;IACzB,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC,CAAC;IACxG,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,IAAI,CACA,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,EACnB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GACnC,OAAO,CAAC;QACP,MAAM,EAAE,IAAI,CAAC;QACb,OAAO,EAAE,OAAO,CAAA;KACnB,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D"}
@@ -5,9 +5,11 @@ import type { EntityRepositoryFindManyResult } from '../types.ts';
5
5
  import type { IRoleAttributeRepository, IRoleAttributeService } from './types.ts';
6
6
  export type RoleAttributeServiceContext = {
7
7
  repository: IRoleAttributeRepository;
8
+ reservedNames?: ReadonlySet<string>;
8
9
  };
9
10
  export declare class RoleAttributeService extends AbstractEntityService implements IRoleAttributeService {
10
11
  protected repository: IRoleAttributeRepository;
12
+ protected reservedNames: ReadonlySet<string>;
11
13
  constructor(ctx: RoleAttributeServiceContext);
12
14
  getMany(query: Record<string, any>, actor: ActorContext): Promise<EntityRepositoryFindManyResult<RoleAttribute>>;
13
15
  getOne(id: string, actor: ActorContext): Promise<RoleAttribute>;
@@ -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,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,KAAK,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAElF,MAAM,MAAM,2BAA2B,GAAG;IACtC,UAAU,EAAE,wBAAwB,CAAC;CACxC,CAAC;AAEF,qBAAa,oBAAqB,SAAQ,qBAAsB,YAAW,qBAAqB;IAC5F,SAAS,CAAC,UAAU,EAAE,wBAAwB,CAAC;gBAEnC,GAAG,EAAE,2BAA2B;IAKtC,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;IAmBnB,MAAM,CACR,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACzB,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,aAAa,CAAC;IAsBnB,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,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAClE,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,13 +1,15 @@
1
1
  import { AbstractEntityService } from "../service.mjs";
2
2
  import { PermissionName } from "@authup/core-kit";
3
3
  import { BuiltInPolicyType, PolicyData } from "@authup/access";
4
- import { NotFoundError } from "@ebec/http";
4
+ import { BadRequestError, NotFoundError } from "@ebec/http";
5
5
  //#region src/core/entities/role-attribute/service.ts
6
6
  var RoleAttributeService = class extends AbstractEntityService {
7
7
  repository;
8
+ reservedNames;
8
9
  constructor(ctx) {
9
10
  super();
10
11
  this.repository = ctx.repository;
12
+ this.reservedNames = ctx.reservedNames ?? /* @__PURE__ */ new Set();
11
13
  }
12
14
  async getMany(query, actor) {
13
15
  await actor.permissionEvaluator.preEvaluateOneOf({ name: [
@@ -60,11 +62,12 @@ var RoleAttributeService = class extends AbstractEntityService {
60
62
  async create(data, actor) {
61
63
  await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });
62
64
  await this.repository.validateJoinColumns(data);
65
+ 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.`);
63
66
  data.realm_id = data.role.realm_id;
64
67
  const entity = this.repository.create(data);
65
68
  await actor.permissionEvaluator.evaluate({
66
69
  name: PermissionName.ROLE_UPDATE,
67
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
70
+ input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: { [data.name]: data.value } })
68
71
  });
69
72
  await this.repository.save(entity);
70
73
  return entity;
@@ -72,12 +75,13 @@ var RoleAttributeService = class extends AbstractEntityService {
72
75
  async update(id, data, actor) {
73
76
  await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });
74
77
  await this.repository.validateJoinColumns(data);
78
+ 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.`);
75
79
  let entity = await this.repository.findOneBy({ id });
76
80
  if (!entity) throw new NotFoundError();
77
81
  entity = this.repository.merge(entity, data);
78
82
  await actor.permissionEvaluator.evaluate({
79
83
  name: PermissionName.ROLE_UPDATE,
80
- input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
84
+ input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: { [entity.name]: entity.value } })
81
85
  });
82
86
  await this.repository.save(entity);
83
87
  return entity;
@@ -1 +1 @@
1
- {"version":3,"file":"service.mjs","names":["BuiltInPolicyType","PolicyData","NotFoundError","PermissionName","AbstractEntityService","RoleAttributeService","repository","ctx","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROLE_READ","ROLE_UPDATE","ROLE_DELETE","data","entities","meta","findMany","total","entity","evaluateOneOf","input","ATTRIBUTES","push","getOne","id","findOneBy","create","preEvaluate","validateJoinColumns","realm_id","role","evaluate","save","update","merge","delete","entityId","remove"],"sources":["../../../../src/core/entities/role-attribute/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 { NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { RoleAttribute } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRoleAttributeRepository, IRoleAttributeService } from './types.ts';\n\nexport type RoleAttributeServiceContext = {\n repository: IRoleAttributeRepository;\n};\n\nexport class RoleAttributeService extends AbstractEntityService implements IRoleAttributeService {\n protected repository: IRoleAttributeRepository;\n\n constructor(ctx: RoleAttributeServiceContext) {\n super();\n this.repository = ctx.repository;\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RoleAttribute>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: RoleAttribute[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n data.push(entity);\n } catch {\n total--;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\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.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n data.realm_id = data.role.realm_id;\n\n const entity = this.repository.create(data);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n 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<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n let entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n entity = this.repository.merge(entity, data);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\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","PolicyData","BadRequestError","NotFoundError","PermissionName","AbstractEntityService","RoleAttributeService","repository","reservedNames","ctx","Set","getMany","query","actor","permissionEvaluator","preEvaluateOneOf","name","ROLE_READ","ROLE_UPDATE","ROLE_DELETE","data","entities","meta","findMany","total","entity","evaluateOneOf","input","ATTRIBUTES","push","getOne","id","findOneBy","create","preEvaluate","validateJoinColumns","has","realm_id","role","evaluate","value","save","update","merge","delete","entityId","remove"],"sources":["../../../../src/core/entities/role-attribute/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 { BadRequestError, NotFoundError } from '@ebec/http';\nimport { PermissionName } from '@authup/core-kit';\nimport type { RoleAttribute } from '@authup/core-kit';\nimport type { ActorContext } from '../actor/types.ts';\nimport { AbstractEntityService } from '../service.ts';\nimport type { EntityRepositoryFindManyResult } from '../types.ts';\nimport type { IRoleAttributeRepository, IRoleAttributeService } from './types.ts';\n\nexport type RoleAttributeServiceContext = {\n repository: IRoleAttributeRepository;\n reservedNames?: ReadonlySet<string>;\n};\n\nexport class RoleAttributeService extends AbstractEntityService implements IRoleAttributeService {\n protected repository: IRoleAttributeRepository;\n\n protected reservedNames: ReadonlySet<string>;\n\n constructor(ctx: RoleAttributeServiceContext) {\n super();\n this.repository = ctx.repository;\n this.reservedNames = ctx.reservedNames ?? new Set();\n }\n\n async getMany(\n query: Record<string, any>,\n actor: ActorContext,\n ): Promise<EntityRepositoryFindManyResult<RoleAttribute>> {\n await actor.permissionEvaluator.preEvaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n });\n\n const {\n data: entities, \n meta, \n } = await this.repository.findMany(query);\n\n const data: RoleAttribute[] = [];\n let { total } = meta;\n\n for (const entity of entities) {\n try {\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n data.push(entity);\n } catch {\n total--;\n }\n }\n\n return {\n data,\n meta: {\n ...meta,\n total, \n }, \n };\n }\n\n async getOne(\n id: string,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\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.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluateOneOf({\n name: [\n PermissionName.ROLE_READ,\n PermissionName.ROLE_UPDATE,\n PermissionName.ROLE_DELETE,\n ],\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity }),\n });\n\n return entity;\n }\n\n async create(\n data: Record<string, any>,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (typeof data.name === 'string' && this.reservedNames.has(data.name)) {\n throw new BadRequestError(`The role-attribute name '${data.name}' collides with a Role entity column.`);\n }\n\n data.realm_id = data.role.realm_id;\n\n const entity = this.repository.create(data);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: { [data.name]: data.value } }),\n });\n\n 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<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n await this.repository.validateJoinColumns(data);\n\n if (typeof data.name === 'string' && this.reservedNames.has(data.name)) {\n throw new BadRequestError(`The role-attribute name '${data.name}' collides with a Role entity column.`);\n }\n\n let entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n entity = this.repository.merge(entity, data);\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\n input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: { [entity.name]: entity.value } }),\n });\n\n await this.repository.save(entity);\n\n return entity;\n }\n\n async delete(\n id: string,\n actor: ActorContext,\n ): Promise<RoleAttribute> {\n await actor.permissionEvaluator.preEvaluate({ name: PermissionName.ROLE_UPDATE });\n\n const entity = await this.repository.findOneBy({ id });\n if (!entity) {\n throw new NotFoundError();\n }\n\n await actor.permissionEvaluator.evaluate({\n name: PermissionName.ROLE_UPDATE,\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":";;;;;AAqBA,IAAaM,uBAAb,cAA0CD,sBAAAA;CAC5BE;CAEAC;CAEV,YAAYC,KAAkC;AAC1C,SAAK;AACL,OAAKF,aAAaE,IAAIF;AACtB,OAAKC,gBAAgBC,IAAID,iCAAiB,IAAIE,KAAAA;;CAGlD,MAAMC,QACFC,OACAC,OACsD;AACtD,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFZ,eAAea;GACfb,eAAec;GACfd,eAAee;GAClB,EACL,CAAA;EAEA,MAAM,EACFC,MAAMC,UACNC,SACA,MAAM,KAAKf,WAAWgB,SAASX,MAAAA;EAEnC,MAAMQ,OAAwB,EAAE;EAChC,IAAI,EAAEI,UAAUF;AAEhB,OAAK,MAAMG,UAAUJ,SACjB,KAAI;AACA,SAAMR,MAAMC,oBAAoBY,cAAc;IAC1CV,MAAM;KACFZ,eAAea;KACfb,eAAec;KACfd,eAAee;KAClB;IACDQ,OAAO,IAAI1B,WAAW,GAAGD,kBAAkB4B,aAAaH,QAAO,CAAA;IACnE,CAAA;AACAL,QAAKS,KAAKJ,OAAAA;UACN;AACJD;;AAIR,SAAO;GACHJ;GACAE,MAAM;IACF,GAAGA;IACHE;IACJ;GACJ;;CAGJ,MAAMM,OACFC,IACAlB,OACsB;AACtB,QAAMA,MAAMC,oBAAoBC,iBAAiB,EAC7CC,MAAM;GACFZ,eAAea;GACfb,eAAec;GACfd,eAAee;GAClB,EACL,CAAA;EAEA,MAAMM,SAAS,MAAM,KAAKlB,WAAWyB,UAAU,EAAED,IAAG,CAAA;AACpD,MAAI,CAACN,OACD,OAAM,IAAItB,eAAAA;AAGd,QAAMU,MAAMC,oBAAoBY,cAAc;GAC1CV,MAAM;IACFZ,eAAea;IACfb,eAAec;IACfd,eAAee;IAClB;GACDQ,OAAO,IAAI1B,WAAW,GAAGD,kBAAkB4B,aAAaH,QAAO,CAAA;GACnE,CAAA;AAEA,SAAOA;;CAGX,MAAMQ,OACFb,MACAP,OACsB;AACtB,QAAMA,MAAMC,oBAAoBoB,YAAY,EAAElB,MAAMZ,eAAec,aAAY,CAAA;AAE/E,QAAM,KAAKX,WAAW4B,oBAAoBf,KAAAA;AAE1C,MAAI,OAAOA,KAAKJ,SAAS,YAAY,KAAKR,cAAc4B,IAAIhB,KAAKJ,KAAI,CACjE,OAAM,IAAId,gBAAgB,4BAA4BkB,KAAKJ,KAAK,uCAAsC;AAG1GI,OAAKiB,WAAWjB,KAAKkB,KAAKD;EAE1B,MAAMZ,SAAS,KAAKlB,WAAW0B,OAAOb,KAAAA;AAEtC,QAAMP,MAAMC,oBAAoByB,SAAS;GACrCvB,MAAMZ,eAAec;GACrBS,OAAO,IAAI1B,WAAW,GAAGD,kBAAkB4B,aAAa,GAAGR,KAAKJ,OAAOI,KAAKoB,OAAM,EAAE,CAAA;GACxF,CAAA;AAEA,QAAM,KAAKjC,WAAWkC,KAAKhB,OAAAA;AAE3B,SAAOA;;CAGX,MAAMiB,OACFX,IACAX,MACAP,OACsB;AACtB,QAAMA,MAAMC,oBAAoBoB,YAAY,EAAElB,MAAMZ,eAAec,aAAY,CAAA;AAE/E,QAAM,KAAKX,WAAW4B,oBAAoBf,KAAAA;AAE1C,MAAI,OAAOA,KAAKJ,SAAS,YAAY,KAAKR,cAAc4B,IAAIhB,KAAKJ,KAAI,CACjE,OAAM,IAAId,gBAAgB,4BAA4BkB,KAAKJ,KAAK,uCAAsC;EAG1G,IAAIS,SAAS,MAAM,KAAKlB,WAAWyB,UAAU,EAAED,IAAG,CAAA;AAClD,MAAI,CAACN,OACD,OAAM,IAAItB,eAAAA;AAGdsB,WAAS,KAAKlB,WAAWoC,MAAMlB,QAAQL,KAAAA;AAEvC,QAAMP,MAAMC,oBAAoByB,SAAS;GACrCvB,MAAMZ,eAAec;GACrBS,OAAO,IAAI1B,WAAW,GAAGD,kBAAkB4B,aAAa,GAAGH,OAAOT,OAAOS,OAAOe,OAAM,EAAE,CAAA;GAC5F,CAAA;AAEA,QAAM,KAAKjC,WAAWkC,KAAKhB,OAAAA;AAE3B,SAAOA;;CAGX,MAAMmB,OACFb,IACAlB,OACsB;AACtB,QAAMA,MAAMC,oBAAoBoB,YAAY,EAAElB,MAAMZ,eAAec,aAAY,CAAA;EAE/E,MAAMO,SAAS,MAAM,KAAKlB,WAAWyB,UAAU,EAAED,IAAG,CAAA;AACpD,MAAI,CAACN,OACD,OAAM,IAAItB,eAAAA;AAGd,QAAMU,MAAMC,oBAAoByB,SAAS;GACrCvB,MAAMZ,eAAec;GACrBS,OAAO,IAAI1B,WAAW,GAAGD,kBAAkB4B,aAAaH,QAAO,CAAA;GACnE,CAAA;EAEA,MAAM,EAAEM,IAAIc,aAAapB;AACzB,QAAM,KAAKlB,WAAWuC,OAAOrB,OAAAA;AAC7BA,SAAOM,KAAKc;AAEZ,SAAOpB"}
@@ -1,7 +1,7 @@
1
1
  import { AbstractEntityService } from "../service.mjs";
2
2
  import { PermissionName, ScopeValidator, ValidatorGroup } from "@authup/core-kit";
3
- import { BuiltInPolicyType, PolicyData } from "@authup/access";
4
3
  import { isPropertySet, isUUID } from "@authup/kit";
4
+ import { BuiltInPolicyType, PolicyData } from "@authup/access";
5
5
  import { NotFoundError } from "@ebec/http";
6
6
  //#region src/core/entities/scope/service.ts
7
7
  var ScopeService = class extends AbstractEntityService {
@@ -1 +1 @@
1
- {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/user/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAEH,aAAa,EAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAElE,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;IAoD1C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyCV,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;IAuII,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;CA2BnB"}
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../../src/core/entities/user/service.ts"],"names":[],"mappings":"AAUA,OAAO,EAEH,aAAa,EAEhB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC;AAElE,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;IAoD1C,MAAM,CACR,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,EACnB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,OAAO,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC;IAyCV,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;IAqII,MAAM,CACR,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;CA2BnB"}
@@ -1,8 +1,8 @@
1
1
  import { UserCredentialsService } from "../../authentication/credential/entities/user/module.mjs";
2
2
  import { AbstractEntityService } from "../service.mjs";
3
3
  import { PermissionName, UserValidator, ValidatorGroup } from "@authup/core-kit";
4
+ import { isUUID } from "@authup/kit";
4
5
  import { BuiltInPolicyType, PolicyData } from "@authup/access";
5
- import { isUUID, removeObjectProperty } from "@authup/kit";
6
6
  import { BadRequestError, NotFoundError } from "@ebec/http";
7
7
  //#region src/core/entities/user/service.ts
8
8
  var UserService = class extends AbstractEntityService {
@@ -94,38 +94,36 @@ var UserService = class extends AbstractEntityService {
94
94
  entity = await this.repository.findOneBy(where);
95
95
  if (!entity && options.updateOnly) throw new NotFoundError();
96
96
  } else if (options.updateOnly) throw new NotFoundError();
97
- let hasAbility;
97
+ let isSelfEdit = false;
98
98
  if (entity) {
99
99
  try {
100
100
  await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_UPDATE });
101
- hasAbility = true;
102
101
  } catch (e) {
103
102
  if (!actor.identity || actor.identity.type !== "user" || actor.identity.data.id !== entity.id) throw e;
103
+ isSelfEdit = true;
104
+ await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_SELF_MANAGE });
104
105
  }
105
106
  group = ValidatorGroup.UPDATE;
106
107
  } else {
107
108
  await actor.permissionEvaluator.preEvaluate({ name: PermissionName.USER_CREATE });
108
- hasAbility = true;
109
109
  group = ValidatorGroup.CREATE;
110
110
  }
111
111
  const validated = await this.validator.run(data, { group });
112
112
  await this.repository.validateJoinColumns(validated);
113
- if (!hasAbility) {
114
- removeObjectProperty(validated, "name_locked");
115
- removeObjectProperty(validated, "active");
116
- removeObjectProperty(validated, "status");
117
- removeObjectProperty(validated, "status_message");
118
- }
119
113
  const credentialsService = new UserCredentialsService();
120
114
  if (entity) {
121
115
  const originalName = entity.name;
122
116
  const originalNameLocked = entity.name_locked;
117
+ if (isSelfEdit) await actor.permissionEvaluator.evaluate({
118
+ name: PermissionName.USER_SELF_MANAGE,
119
+ input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: validated })
120
+ });
123
121
  entity = this.repository.merge(entity, validated);
124
122
  if (validated.name && validated.name !== originalName) {
125
123
  if (validated.name_locked) entity.name_locked = validated.name_locked;
126
124
  if (originalNameLocked && validated.name_locked !== false) entity.name = originalName;
127
125
  }
128
- if (hasAbility) await actor.permissionEvaluator.evaluate({
126
+ if (!isSelfEdit) await actor.permissionEvaluator.evaluate({
129
127
  name: PermissionName.USER_UPDATE,
130
128
  input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: {
131
129
  ...entity,
@@ -144,7 +142,7 @@ var UserService = class extends AbstractEntityService {
144
142
  if (actorRealmId) validated.realm_id = actorRealmId;
145
143
  }
146
144
  entity = this.repository.create(validated);
147
- if (hasAbility) await actor.permissionEvaluator.evaluate({
145
+ await actor.permissionEvaluator.evaluate({
148
146
  name: PermissionName.USER_CREATE,
149
147
  input: new PolicyData({ [BuiltInPolicyType.ATTRIBUTES]: entity })
150
148
  });