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

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 (117) hide show
  1. package/dist/adapters/http/adapters/index.mjs +2 -1
  2. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts +2 -1
  3. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts.map +1 -1
  4. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +10 -1
  5. package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
  6. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.d.ts.map +1 -1
  7. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +5 -13
  8. package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
  9. package/dist/adapters/http/adapters/oauth2/grant-types/index.mjs +2 -1
  10. package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts +2 -1
  11. package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts.map +1 -1
  12. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +11 -2
  13. package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
  14. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts +5 -1
  15. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts.map +1 -1
  16. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +19 -1
  17. package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
  18. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts +6 -1
  19. package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts.map +1 -1
  20. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts +15 -0
  21. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts.map +1 -0
  22. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs +57 -0
  23. package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs.map +1 -0
  24. package/dist/adapters/http/adapters/oauth2/grant-types/utils/guess.mjs +1 -1
  25. package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts +1 -0
  26. package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts.map +1 -1
  27. package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.mjs +2 -1
  28. package/dist/adapters/http/adapters/oauth2/index.mjs +2 -1
  29. package/dist/adapters/http/controllers/entities/client/module.d.ts.map +1 -1
  30. package/dist/adapters/http/controllers/entities/client/module.mjs +1 -1
  31. package/dist/adapters/http/controllers/entities/client/module.mjs.map +1 -1
  32. package/dist/adapters/http/controllers/entities/policy/utils/validation.d.ts.map +1 -1
  33. package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs +1 -1
  34. package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs.map +1 -1
  35. package/dist/adapters/http/controllers/entities/robot/module.d.ts.map +1 -1
  36. package/dist/adapters/http/controllers/entities/robot/module.mjs +1 -1
  37. package/dist/adapters/http/controllers/entities/robot/module.mjs.map +1 -1
  38. package/dist/adapters/http/controllers/workflows/token/module.d.ts.map +1 -1
  39. package/dist/adapters/http/controllers/workflows/token/module.mjs +4 -1
  40. package/dist/adapters/http/controllers/workflows/token/module.mjs.map +1 -1
  41. package/dist/adapters/http/controllers/workflows/token/types.d.ts +2 -1
  42. package/dist/adapters/http/controllers/workflows/token/types.d.ts.map +1 -1
  43. package/dist/adapters/http/index.mjs +2 -1
  44. package/dist/app/modules/database/repositories/client/repository.d.ts +1 -0
  45. package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
  46. package/dist/app/modules/database/repositories/client/repository.mjs +40 -1
  47. package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
  48. package/dist/app/modules/database/repositories/permission/repository.mjs +1 -1
  49. package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
  50. package/dist/app/modules/database/repositories/policy/repository.mjs +1 -1
  51. package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
  52. package/dist/app/modules/database/repositories/realm/repository.mjs +1 -1
  53. package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
  54. package/dist/app/modules/database/repositories/robot/repository.d.ts +1 -0
  55. package/dist/app/modules/database/repositories/robot/repository.d.ts.map +1 -1
  56. package/dist/app/modules/database/repositories/robot/repository.mjs +32 -1
  57. package/dist/app/modules/database/repositories/robot/repository.mjs.map +1 -1
  58. package/dist/app/modules/database/repositories/role/repository.mjs +1 -1
  59. package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
  60. package/dist/app/modules/database/repositories/scope/repository.mjs +1 -1
  61. package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
  62. package/dist/app/modules/database/repositories/user/repository.mjs +2 -2
  63. package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
  64. package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
  65. package/dist/app/modules/http/modules/controller.mjs +2 -0
  66. package/dist/app/modules/http/modules/controller.mjs.map +1 -1
  67. package/dist/core/entities/client/service.d.ts +1 -1
  68. package/dist/core/entities/client/service.d.ts.map +1 -1
  69. package/dist/core/entities/client/service.mjs +12 -19
  70. package/dist/core/entities/client/service.mjs.map +1 -1
  71. package/dist/core/entities/client/types.d.ts +2 -1
  72. package/dist/core/entities/client/types.d.ts.map +1 -1
  73. package/dist/core/entities/robot/service.d.ts +1 -1
  74. package/dist/core/entities/robot/service.d.ts.map +1 -1
  75. package/dist/core/entities/robot/service.mjs +12 -18
  76. package/dist/core/entities/robot/service.mjs.map +1 -1
  77. package/dist/core/entities/robot/types.d.ts +2 -1
  78. package/dist/core/entities/robot/types.d.ts.map +1 -1
  79. package/dist/core/entities/user/service.d.ts.map +1 -1
  80. package/dist/core/entities/user/service.mjs +10 -13
  81. package/dist/core/entities/user/service.mjs.map +1 -1
  82. package/dist/core/identity/password-recovery/service.d.ts.map +1 -1
  83. package/dist/core/identity/password-recovery/service.mjs +4 -4
  84. package/dist/core/identity/password-recovery/service.mjs.map +1 -1
  85. package/dist/core/identity/provider/account/module.d.ts.map +1 -1
  86. package/dist/core/identity/provider/account/module.mjs +3 -2
  87. package/dist/core/identity/provider/account/module.mjs.map +1 -1
  88. package/dist/core/index.mjs +2 -1
  89. package/dist/core/oauth2/authorization/code/verifier/module.d.ts.map +1 -1
  90. package/dist/core/oauth2/authorization/code/verifier/module.mjs +8 -4
  91. package/dist/core/oauth2/authorization/code/verifier/module.mjs.map +1 -1
  92. package/dist/core/oauth2/authorization/code/verifier/types.d.ts +2 -0
  93. package/dist/core/oauth2/authorization/code/verifier/types.d.ts.map +1 -1
  94. package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
  95. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +7 -1
  96. package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
  97. package/dist/core/oauth2/client/authenticator.d.ts +17 -0
  98. package/dist/core/oauth2/client/authenticator.d.ts.map +1 -0
  99. package/dist/core/oauth2/client/authenticator.mjs +34 -0
  100. package/dist/core/oauth2/client/authenticator.mjs.map +1 -0
  101. package/dist/core/oauth2/client/index.d.ts +1 -0
  102. package/dist/core/oauth2/client/index.d.ts.map +1 -1
  103. package/dist/core/oauth2/client/index.mjs +2 -1
  104. package/dist/core/oauth2/grant-types/password.d.ts +7 -3
  105. package/dist/core/oauth2/grant-types/password.d.ts.map +1 -1
  106. package/dist/core/oauth2/grant-types/password.mjs +9 -7
  107. package/dist/core/oauth2/grant-types/password.mjs.map +1 -1
  108. package/dist/core/oauth2/index.mjs +3 -1
  109. package/dist/core/oauth2/token/issuer/base.d.ts.map +1 -1
  110. package/dist/core/oauth2/token/issuer/base.mjs +3 -2
  111. package/dist/core/oauth2/token/issuer/base.mjs.map +1 -1
  112. package/dist/index.mjs +2 -1
  113. package/dist/ui/client/assets/index-Noe7uiOY.js +41 -0
  114. package/dist/ui/client/index.html +1 -1
  115. package/dist/ui/server/server.js +21 -7
  116. package/package.json +9 -9
  117. package/dist/ui/client/assets/index-AHa03lX_.js +0 -41
@@ -1 +1 @@
1
- {"version":3,"file":"validation.mjs","names":["BuiltInPolicyType","isPolicyNameValid","isObject","Container","createValidationChain","createValidator","RequestHandlerOperation","PolicyAttributesValidator","PolicyValidator","initialize","nameValidator","chain","exists","notEmpty","isString","isLength","min","max","custom","value","throwOnFailure","mount","group","CREATE","UPDATE","optional","values","isBoolean","isUUID","ctx","Array","isArray","undefined","data","type","COMPOSITE","promises","map","child","run","flat","path","Promise","all"],"sources":["../../../../../../../src/adapters/http/controllers/entities/policy/utils/validation.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 } from '@authup/access';\nimport { isPolicyNameValid } from '@authup/core-kit';\nimport { isObject } from 'smob';\nimport type { ValidatorContext } from 'validup';\nimport { Container } from 'validup';\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport type { PolicyEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\n\nexport class PolicyValidator extends Container<PolicyEntity & { parent_id?: string | null }> {\n protected initialize() {\n super.initialize();\n\n const nameValidator = createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .isLength({\n min: 3,\n max: 128,\n })\n .custom((value) => isPolicyNameValid(value, { throwOnFailure: true }));\n });\n\n this.mount('name', { group: RequestHandlerOperation.CREATE }, nameValidator);\n this.mount('name', {\n group: RequestHandlerOperation.UPDATE,\n optional: true, \n }, nameValidator);\n\n this.mount(\n 'display_name',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isString()\n .isLength({\n min: 3,\n max: 256, \n })\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'invert',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isBoolean();\n }),\n );\n\n this.mount(\n 'type',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isString()\n .isLength({\n min: 3,\n max: 128, \n });\n }),\n );\n\n this.mount(\n 'parent_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'realm_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount({ optional: true }, new PolicyAttributesValidator({}));\n\n this.mount(\n 'children',\n { optional: true },\n async (ctx: ValidatorContext) => {\n if (!Array.isArray(ctx.value)) {\n // todo: throw error\n return undefined;\n }\n\n if (\n isObject(ctx.data) &&\n ctx.data.type !== BuiltInPolicyType.COMPOSITE\n ) {\n return undefined;\n }\n\n const promises = ctx.value.map((child) => this.run(child, {\n group: ctx.group,\n flat: false,\n path: ctx.path,\n }));\n\n return Promise.all(promises);\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaQ,kBAAb,cAAqCL,UAAAA;CACvBM,aAAa;AACnB,QAAMA,YAAAA;EAEN,MAAMC,gBAAgBL,sBAAgB;AAElC,UADcD,uBACPO,CACFC,QAAM,CACNC,UAAQ,CACRC,UAAQ,CACRC,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA,CACCC,QAAQC,UAAUlB,kBAAkBkB,OAAO,EAAEC,gBAAgB,MAAK,CAAA,CAAA;IAC3E;AAEA,OAAKC,MAAM,QAAQ,EAAEC,OAAOhB,wBAAwBiB,QAAO,EAAGb,cAAAA;AAC9D,OAAKW,MAAM,QAAQ;GACfC,OAAOhB,wBAAwBkB;GAC/BC,UAAU;GACd,EAAGf,cAAAA;AAEH,OAAKW,MACD,gBACA,EAAEI,UAAU,MAAK,EACjBpB,sBAAgB;AAEZ,UADcD,uBACPO,CACFG,UAAQ,CACRC,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA,CACCQ,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MACD,UACA,EAAEI,UAAU,MAAK,EACjBpB,sBAAgB;AAEZ,UADcD,uBACPO,CACFgB,WAAS;IAClB,CAAA;AAGJ,OAAKN,MACD,QACA,EAAEC,OAAOhB,wBAAwBiB,QAAO,EACxClB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNE,UAAQ,CACRC,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA;IACR,CAAA;AAGJ,OAAKI,MACD,aACA,EAAEI,UAAU,MAAK,EACjBpB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNgB,QAAM,CACNH,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MACD,YACA,EAAEC,OAAOhB,wBAAwBiB,QAAO,EACxClB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNgB,QAAM,CACNH,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MAAM,EAAEI,UAAU,MAAK,EAAG,IAAIlB,0BAA0B,EAAC,CAAA,CAAA;AAE9D,OAAKc,MACD,YACA,EAAEI,UAAU,MAAK,EACjB,OAAOI,QAAAA;AACH,OAAI,CAACC,MAAMC,QAAQF,IAAIV,MAAK,CAExB;AAGJ,OACIjB,SAAS2B,IAAII,KAAI,IACjBJ,IAAII,KAAKC,SAASlC,kBAAkBmC,UAEpC;GAGJ,MAAMC,WAAWP,IAAIV,MAAMkB,KAAKC,UAAU,KAAKC,IAAID,OAAO;IACtDhB,OAAOO,IAAIP;IACXkB,MAAM;IACNC,MAAMZ,IAAIY;IACd,CAAA,CAAA;AAEA,UAAOC,QAAQC,IAAIP,SAAAA;IACvB"}
1
+ {"version":3,"file":"validation.mjs","names":["BuiltInPolicyType","isPolicyNameValid","isObject","Container","createValidationChain","createValidator","RequestHandlerOperation","PolicyAttributesValidator","PolicyValidator","initialize","nameValidator","chain","exists","notEmpty","isString","trim","toLowerCase","isLength","min","max","custom","value","throwOnFailure","mount","group","CREATE","UPDATE","optional","values","isBoolean","isUUID","ctx","Array","isArray","undefined","data","type","COMPOSITE","promises","map","child","run","flat","path","Promise","all"],"sources":["../../../../../../../src/adapters/http/controllers/entities/policy/utils/validation.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 } from '@authup/access';\nimport { isPolicyNameValid } from '@authup/core-kit';\nimport { isObject } from 'smob';\nimport type { ValidatorContext } from 'validup';\nimport { Container } from 'validup';\nimport { createValidationChain, createValidator } from '@validup/adapter-validator';\nimport type { PolicyEntity } from '../../../../../database/domains/index.ts';\nimport { RequestHandlerOperation } from '../../../../request/index.ts';\nimport { PolicyAttributesValidator } from './attributes-validator.ts';\n\nexport class PolicyValidator extends Container<PolicyEntity & { parent_id?: string | null }> {\n protected initialize() {\n super.initialize();\n\n const nameValidator = createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .notEmpty()\n .isString()\n .trim()\n .toLowerCase()\n .isLength({\n min: 3,\n max: 128,\n })\n .custom((value) => isPolicyNameValid(value, { throwOnFailure: true }));\n });\n\n this.mount('name', { group: RequestHandlerOperation.CREATE }, nameValidator);\n this.mount('name', {\n group: RequestHandlerOperation.UPDATE,\n optional: true, \n }, nameValidator);\n\n this.mount(\n 'display_name',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isString()\n .isLength({\n min: 3,\n max: 256, \n })\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'invert',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .isBoolean();\n }),\n );\n\n this.mount(\n 'type',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isString()\n .isLength({\n min: 3,\n max: 128, \n });\n }),\n );\n\n this.mount(\n 'parent_id',\n { optional: true },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount(\n 'realm_id',\n { group: RequestHandlerOperation.CREATE },\n createValidator(() => {\n const chain = createValidationChain();\n return chain\n .exists()\n .isUUID()\n .optional({ values: 'null' });\n }),\n );\n\n this.mount({ optional: true }, new PolicyAttributesValidator({}));\n\n this.mount(\n 'children',\n { optional: true },\n async (ctx: ValidatorContext) => {\n if (!Array.isArray(ctx.value)) {\n // todo: throw error\n return undefined;\n }\n\n if (\n isObject(ctx.data) &&\n ctx.data.type !== BuiltInPolicyType.COMPOSITE\n ) {\n return undefined;\n }\n\n const promises = ctx.value.map((child) => this.run(child, {\n group: ctx.group,\n flat: false,\n path: ctx.path,\n }));\n\n return Promise.all(promises);\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;AAiBA,IAAaQ,kBAAb,cAAqCL,UAAAA;CACvBM,aAAa;AACnB,QAAMA,YAAAA;EAEN,MAAMC,gBAAgBL,sBAAgB;AAElC,UADcD,uBACPO,CACFC,QAAM,CACNC,UAAQ,CACRC,UAAQ,CACRC,MAAI,CACJC,aAAW,CACXC,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA,CACCC,QAAQC,UAAUpB,kBAAkBoB,OAAO,EAAEC,gBAAgB,MAAK,CAAA,CAAA;IAC3E;AAEA,OAAKC,MAAM,QAAQ,EAAEC,OAAOlB,wBAAwBmB,QAAO,EAAGf,cAAAA;AAC9D,OAAKa,MAAM,QAAQ;GACfC,OAAOlB,wBAAwBoB;GAC/BC,UAAU;GACd,EAAGjB,cAAAA;AAEH,OAAKa,MACD,gBACA,EAAEI,UAAU,MAAK,EACjBtB,sBAAgB;AAEZ,UADcD,uBACPO,CACFG,UAAQ,CACRG,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA,CACCQ,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MACD,UACA,EAAEI,UAAU,MAAK,EACjBtB,sBAAgB;AAEZ,UADcD,uBACPO,CACFkB,WAAS;IAClB,CAAA;AAGJ,OAAKN,MACD,QACA,EAAEC,OAAOlB,wBAAwBmB,QAAO,EACxCpB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNE,UAAQ,CACRG,SAAS;IACNC,KAAK;IACLC,KAAK;IACT,CAAA;IACR,CAAA;AAGJ,OAAKI,MACD,aACA,EAAEI,UAAU,MAAK,EACjBtB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNkB,QAAM,CACNH,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MACD,YACA,EAAEC,OAAOlB,wBAAwBmB,QAAO,EACxCpB,sBAAgB;AAEZ,UADcD,uBACPO,CACFC,QAAM,CACNkB,QAAM,CACNH,SAAS,EAAEC,QAAQ,QAAO,CAAA;IACnC,CAAA;AAGJ,OAAKL,MAAM,EAAEI,UAAU,MAAK,EAAG,IAAIpB,0BAA0B,EAAC,CAAA,CAAA;AAE9D,OAAKgB,MACD,YACA,EAAEI,UAAU,MAAK,EACjB,OAAOI,QAAAA;AACH,OAAI,CAACC,MAAMC,QAAQF,IAAIV,MAAK,CAExB;AAGJ,OACInB,SAAS6B,IAAII,KAAI,IACjBJ,IAAII,KAAKC,SAASpC,kBAAkBqC,UAEpC;GAGJ,MAAMC,WAAWP,IAAIV,MAAMkB,KAAKC,UAAU,KAAKC,IAAID,OAAO;IACtDhB,OAAOO,IAAIP;IACXkB,MAAM;IACNC,MAAMZ,IAAIY;IACd,CAAA,CAAA;AAEA,UAAOC,QAAQC,IAAIP,SAAAA;IACvB"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAWtG,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,EAAE,gBAAgB,CAAC;IAClC,UAAU,EAAE,UAAU,CAAC;CAC1B,CAAC;AAEF,qBAEa,eAAe;IACxB,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC;IAEjC,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;gBAErB,GAAG,EAAE,sBAAsB;IAQjC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAcT,GAAG,CACI,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAQT,MAAM,CACK,EAAE,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IA8ET,IAAI,CACO,EAAE,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAaT,GAAG,CACQ,EAAE,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAmBT,IAAI,CACO,EAAE,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;CAMlB"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAWtG,MAAM,MAAM,sBAAsB,GAAG;IACjC,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,eAAe,EAAE,gBAAgB,CAAC;IAClC,UAAU,EAAE,UAAU,CAAC;CAC1B,CAAC;AAEF,qBAEa,eAAe;IACxB,SAAS,CAAC,OAAO,EAAE,aAAa,CAAC;IAEjC,SAAS,CAAC,UAAU,EAAE,gBAAgB,CAAC;IAEvC,SAAS,CAAC,eAAe,EAAE,gBAAgB,CAAC;IAE5C,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;gBAErB,GAAG,EAAE,sBAAsB;IAQjC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAcT,GAAG,CACI,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAQT,MAAM,CACK,EAAE,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IA+ET,IAAI,CACO,EAAE,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAaT,GAAG,CACQ,EAAE,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,EACN,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;IAmBT,IAAI,CACO,EAAE,EAAE,MAAM,EACX,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,GAAG,CAAC;CAMlB"}
@@ -79,7 +79,7 @@ var RobotController = class {
79
79
  }
80
80
  } else {
81
81
  const actor = buildActorContext(req);
82
- entity = await this.service.getOne(id, actor, useRequestParam(req, "realmId"));
82
+ entity = await this.service.getOne(id, actor, useRequestQuery(req), useRequestParam(req, "realmId"));
83
83
  return send(res, entity);
84
84
  }
85
85
  if (!entity) throw new NotFoundError();
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","isUUID","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","RobotEntity","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","RobotController","service","repository","realmRepository","dataSource","ctx","getMany","req","res","actor","data","meta","add","entity","save","undefined","getOne","id","identity","isMe","type","realm","resolve","realmId","name","attributesResolver","attributes","resolveFor","ROBOT","resolvedId","findOneByIdOrName","robotRepository","getRepository","validAttributes","metadata","columns","map","column","databaseName","attribute","isValid","includes","withSecret","findOneWithSecret","secret","edit","updateOnly","put","created","drop","delete"],"sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport type { Robot } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { DataSource } from 'typeorm';\nimport type { IRealmRepository, IRobotRepository, IRobotService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { RobotEntity } from '../../../../database/domains/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type RobotControllerContext = {\n service: IRobotService,\n repository: IRobotRepository,\n realmRepository: IRealmRepository,\n dataSource: DataSource,\n};\n\n@DTags('robot')\n@DController('/robots')\nexport class RobotController {\n protected service: IRobotService;\n\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected dataSource: DataSource;\n\n constructor(ctx: RobotControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.dataSource = ctx.dataSource;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(undefined, data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n let isMe = false;\n\n if (\n isSelfToken(id) &&\n identity &&\n identity.type === 'robot'\n ) {\n isMe = true;\n } else if (isUUID(id)) {\n if (\n identity &&\n identity.type === 'robot' &&\n id === identity.id\n ) {\n isMe = true;\n }\n } else if (\n identity &&\n identity.type === 'robot'\n ) {\n const realm = await this.realmRepository.resolve(useRequestParam(req, 'realmId'), true);\n if (\n identity.realmId === realm.id &&\n identity.data &&\n identity.data.name === id\n ) {\n isMe = true;\n }\n }\n\n let entity: Robot | null;\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.ROBOT, useRequestScopes(req));\n\n const resolvedId = isSelfToken(id) ? identity!.id : id;\n entity = await this.repository.findOneByIdOrName(\n resolvedId,\n useRequestParam(req, 'realmId'),\n );\n\n if (entity) {\n const robotRepository = this.dataSource.getRepository(RobotEntity);\n const validAttributes = robotRepository.metadata.columns.map(\n (column) => column.databaseName,\n );\n for (const attribute of attributes) {\n const isValid = validAttributes.includes(attribute);\n if (isValid && attribute === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n }\n } else {\n const actor = buildActorContext(req);\n entity = await this.service.getOne(\n id,\n actor,\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(\n id,\n data,\n actor,\n { updateOnly: true },\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"module.mjs","names":["OAuth2SubKind","DBody","DController","DDelete","DGet","DPath","DPost","DPut","DRequest","DResponse","DTags","isUUID","NotFoundError","send","sendAccepted","sendCreated","useRequestParam","useRequestQuery","OAuth2ScopeAttributesResolver","RobotEntity","ForceLoggedInMiddleware","isSelfToken","buildActorContext","useRequestIdentity","useRequestScopes","RobotController","service","repository","realmRepository","dataSource","ctx","getMany","req","res","actor","data","meta","add","entity","save","undefined","getOne","id","identity","isMe","type","realm","resolve","realmId","name","attributesResolver","attributes","resolveFor","ROBOT","resolvedId","findOneByIdOrName","robotRepository","getRepository","validAttributes","metadata","columns","map","column","databaseName","attribute","isValid","includes","withSecret","findOneWithSecret","secret","edit","updateOnly","put","created","drop","delete"],"sources":["../../../../../../src/adapters/http/controllers/entities/robot/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\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 { OAuth2SubKind } from '@authup/specs';\nimport {\n DBody, \n DController, \n DDelete, \n DGet, \n DPath, \n DPost, \n DPut, \n DRequest, \n DResponse, \n DTags,\n} from '@routup/decorators';\nimport { isUUID } from '@authup/kit';\nimport { NotFoundError } from '@ebec/http';\nimport type { Robot } from '@authup/core-kit';\nimport {\n send, \n sendAccepted, \n sendCreated, \n useRequestParam,\n} from 'routup';\nimport { useRequestQuery } from '@routup/basic/query';\nimport type { DataSource } from 'typeorm';\nimport type { IRealmRepository, IRobotRepository, IRobotService } from '../../../../../core/index.ts';\nimport { OAuth2ScopeAttributesResolver } from '../../../../../core/index.ts';\nimport { RobotEntity } from '../../../../database/domains/index.ts';\nimport { ForceLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { isSelfToken } from '../../../../../utils/index.ts';\nimport {\n buildActorContext,\n useRequestIdentity,\n useRequestScopes,\n} from '../../../request/index.ts';\n\nexport type RobotControllerContext = {\n service: IRobotService,\n repository: IRobotRepository,\n realmRepository: IRealmRepository,\n dataSource: DataSource,\n};\n\n@DTags('robot')\n@DController('/robots')\nexport class RobotController {\n protected service: IRobotService;\n\n protected repository: IRobotRepository;\n\n protected realmRepository: IRealmRepository;\n\n protected dataSource: DataSource;\n\n constructor(ctx: RobotControllerContext) {\n this.service = ctx.service;\n this.repository = ctx.repository;\n this.realmRepository = ctx.realmRepository;\n this.dataSource = ctx.dataSource;\n }\n\n @DGet('', [ForceLoggedInMiddleware])\n async getMany(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n data, \n meta, \n } = await this.service.getMany(useRequestQuery(req), actor);\n\n return send(res, {\n data,\n meta, \n });\n }\n\n @DPost('', [ForceLoggedInMiddleware])\n async add(\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(undefined, data, actor);\n\n return sendCreated(res, entity);\n }\n\n @DGet('/:id', [ForceLoggedInMiddleware])\n async getOne(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const identity = useRequestIdentity(req);\n let isMe = false;\n\n if (\n isSelfToken(id) &&\n identity &&\n identity.type === 'robot'\n ) {\n isMe = true;\n } else if (isUUID(id)) {\n if (\n identity &&\n identity.type === 'robot' &&\n id === identity.id\n ) {\n isMe = true;\n }\n } else if (\n identity &&\n identity.type === 'robot'\n ) {\n const realm = await this.realmRepository.resolve(useRequestParam(req, 'realmId'), true);\n if (\n identity.realmId === realm.id &&\n identity.data &&\n identity.data.name === id\n ) {\n isMe = true;\n }\n }\n\n let entity: Robot | null;\n\n if (isMe) {\n const attributesResolver = new OAuth2ScopeAttributesResolver();\n const attributes = attributesResolver.resolveFor(OAuth2SubKind.ROBOT, useRequestScopes(req));\n\n const resolvedId = isSelfToken(id) ? identity!.id : id;\n entity = await this.repository.findOneByIdOrName(\n resolvedId,\n useRequestParam(req, 'realmId'),\n );\n\n if (entity) {\n const robotRepository = this.dataSource.getRepository(RobotEntity);\n const validAttributes = robotRepository.metadata.columns.map(\n (column) => column.databaseName,\n );\n for (const attribute of attributes) {\n const isValid = validAttributes.includes(attribute);\n if (isValid && attribute === 'secret') {\n const withSecret = await this.repository.findOneWithSecret({ id: entity.id });\n if (withSecret) {\n entity.secret = withSecret.secret;\n }\n }\n }\n }\n } else {\n const actor = buildActorContext(req);\n entity = await this.service.getOne(\n id,\n actor,\n useRequestQuery(req),\n useRequestParam(req, 'realmId'),\n );\n\n return send(res, entity);\n }\n\n if (!entity) {\n throw new NotFoundError();\n }\n\n return send(res, entity);\n }\n\n @DPost('/:id', [ForceLoggedInMiddleware])\n async edit(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const { entity } = await this.service.save(\n id,\n data,\n actor,\n { updateOnly: true },\n );\n\n return sendAccepted(res, entity);\n }\n\n @DPut('/:id', [ForceLoggedInMiddleware])\n async put(\n @DPath('id') id: string,\n @DBody() data: any,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const {\n entity, \n created, \n } = await this.service.save(\n id || undefined,\n data,\n actor,\n );\n\n if (created) {\n return sendCreated(res, entity);\n }\n\n return sendAccepted(res, entity);\n }\n\n @DDelete('/:id', [ForceLoggedInMiddleware])\n async drop(\n @DPath('id') id: string,\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<any> {\n const actor = buildActorContext(req);\n const entity = await this.service.delete(id, actor);\n\n return sendAccepted(res, entity);\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,gCAAgC,EAAyB,MAAM,eAAe,CAAC;AACvH,OAAO,EAAe,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAS9D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EACR,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAWnE,qBAEa,eAAe;IACxB,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAEjD,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAEhD,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE9C,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE5C,SAAS,CAAC,gBAAgB,EAAG,iBAAiB,CAAC;IAE/C,SAAS,CAAC,0BAA0B,EAAG,2BAA2B,CAAC;IAEnE,SAAS,CAAC,WAAW,EAAG,MAAM,CAAC,GAAG,gBAAgB,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAI5D,GAAG,EAAE,sBAAsB;IA4CjC,aAAa,CACH,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,gCAAgC,CAAC;IAKtC,cAAc,CACJ,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,gCAAgC,CAAC;IA4DtC,WAAW,CACD,GAAG,EAAE,OAAO,EACX,GAAG,EAAE,QAAQ;IAkBxB,WAAW,CACD,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,wBAAwB,CAAC;CAavC"}
1
+ {"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,wBAAwB,EAAE,gCAAgC,EAAyB,MAAM,eAAe,CAAC;AACvH,OAAO,EAAe,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAS9D,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAIhD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACzD,OAAO,KAAK,EACR,2BAA2B,EAC3B,iBAAiB,EACjB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAWnE,qBAEa,eAAe;IACxB,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;IAEjD,SAAS,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;IAEhD,SAAS,CAAC,aAAa,EAAE,oBAAoB,CAAC;IAE9C,SAAS,CAAC,YAAY,EAAE,mBAAmB,CAAC;IAE5C,SAAS,CAAC,gBAAgB,EAAG,iBAAiB,CAAC;IAE/C,SAAS,CAAC,0BAA0B,EAAG,2BAA2B,CAAC;IAEnE,SAAS,CAAC,WAAW,EAAG,MAAM,CAAC,GAAG,gBAAgB,EAAE,EAAE,gBAAgB,CAAC,CAAC;gBAI5D,GAAG,EAAE,sBAAsB;IA+CjC,aAAa,CACH,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,gCAAgC,CAAC;IAKtC,cAAc,CACJ,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,gCAAgC,CAAC;IA4DtC,WAAW,CACD,GAAG,EAAE,OAAO,EACX,GAAG,EAAE,QAAQ;IAkBxB,WAAW,CACD,GAAG,EAAE,OAAO,GACzB,OAAO,CAAC,wBAAwB,CAAC;CAavC"}
@@ -48,6 +48,7 @@ var TokenController = class {
48
48
  this.tokenGrants = {
49
49
  [OAuth2TokenGrant.AUTHORIZATION_CODE]: new HTTPOAuth2AuthorizeGrant({
50
50
  codeVerifier: ctx.codeVerifier,
51
+ clientAuthenticator: ctx.oauth2ClientAuthenticator,
51
52
  accessTokenIssuer: ctx.accessTokenIssuer,
52
53
  refreshTokenIssuer: ctx.refreshTokenIssuer,
53
54
  sessionManager: ctx.sessionManager
@@ -66,6 +67,7 @@ var TokenController = class {
66
67
  accessTokenIssuer: ctx.accessTokenIssuer,
67
68
  refreshTokenIssuer: ctx.refreshTokenIssuer,
68
69
  authenticator: ctx.userAuthenticator,
70
+ clientAuthenticator: ctx.oauth2ClientAuthenticator,
69
71
  sessionManager: ctx.sessionManager
70
72
  }),
71
73
  [OAuth2TokenGrant.REFRESH_TOKEN]: new HTTPOAuth2RefreshTokenGrant({
@@ -73,7 +75,8 @@ var TokenController = class {
73
75
  refreshTokenIssuer: ctx.refreshTokenIssuer,
74
76
  tokenVerifier: ctx.tokenVerifier,
75
77
  tokenRevoker: ctx.tokenRevoker,
76
- sessionManager: ctx.sessionManager
78
+ sessionManager: ctx.sessionManager,
79
+ clientAuthenticator: ctx.oauth2ClientAuthenticator
77
80
  })
78
81
  };
79
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.mjs","names":["OAuth2Error","OAuth2TokenGrant","DController","DGet","DPost","DRequest","DResponse","DTags","sendAccepted","buildPermissionKey","toOAuth2Error","OAuth2OpenIDClaimsBuilder","HTTPClientCredentialsGrant","HTTPOAuth2AuthorizeGrant","HTTPOAuth2RefreshTokenGrant","HTTPPasswordGrant","HTTPRobotCredentialsGrant","guessOauth2GrantTypeByRequest","extractTokenFromRequest","TokenController","refreshTokenIssuer","accessTokenIssuer","tokenVerifier","tokenRevoker","identityResolver","identityPermissionProvider","tokenGrants","ctx","AUTHORIZATION_CODE","codeVerifier","sessionManager","CLIENT_CREDENTIALS","authenticator","clientAuthenticator","ROBOT_CREDENTIALS","robotAuthenticator","PASSWORD","userAuthenticator","REFRESH_TOKEN","getIntrospect","req","postIntrospect","token","payload","verify","skipActiveCheck","sub","sub_kind","identityInvalid","permissions","getFor","id","type","clientId","client_id","realmId","realm_id","identity","resolve","claimsBuilder","claims","fromIdentity","active","jti","isInactive","Object","values","reduce","acc","binding","key","permission","name","e","revokeToken","res","revoke","createToken","grantType","grantInvalid","grant","runWithRequest"],"sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenIntrospectionResponse, OAuth2TokenPermission } from '@authup/specs';\nimport { OAuth2Error, OAuth2TokenGrant } from '@authup/specs';\nimport {\n DController,\n DGet,\n DPost,\n DRequest,\n DResponse,\n DTags,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport { buildPermissionKey } from '@authup/access';\nimport { toOAuth2Error } from '../../../../../core/oauth2/helpers/index.ts';\nimport type { TokenControllerContext } from './types.ts';\nimport type {\n IIdentityPermissionProvider,\n IIdentityResolver,\n IOAuth2TokenIssuer,\n IOAuth2TokenRevoker,\n IOAuth2TokenVerifier,\n} from '../../../../../core/index.ts';\nimport { OAuth2OpenIDClaimsBuilder } from '../../../../../core/index.ts';\nimport type { IHTTPOAuth2Grant } from '../../../adapters/index.ts';\nimport {\n HTTPClientCredentialsGrant,\n HTTPOAuth2AuthorizeGrant,\n HTTPOAuth2RefreshTokenGrant,\n HTTPPasswordGrant,\n HTTPRobotCredentialsGrant,\n guessOauth2GrantTypeByRequest,\n} from '../../../adapters/index.ts';\nimport { extractTokenFromRequest } from './utils/index.ts';\n\n@DTags('auth')\n@DController('/token')\nexport class TokenController {\n protected refreshTokenIssuer: IOAuth2TokenIssuer;\n\n protected accessTokenIssuer: IOAuth2TokenIssuer;\n\n protected tokenVerifier: IOAuth2TokenVerifier;\n\n protected tokenRevoker: IOAuth2TokenRevoker;\n\n protected identityResolver : IIdentityResolver;\n\n protected identityPermissionProvider : IIdentityPermissionProvider;\n\n protected tokenGrants : Record<`${OAuth2TokenGrant}`, IHTTPOAuth2Grant>;\n\n // -------------------------------------------\n\n constructor(ctx: TokenControllerContext) {\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.tokenVerifier = ctx.tokenVerifier;\n this.tokenRevoker = ctx.tokenRevoker;\n this.identityResolver = ctx.identityResolver;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n\n this.tokenGrants = {\n [OAuth2TokenGrant.AUTHORIZATION_CODE]: new HTTPOAuth2AuthorizeGrant({\n codeVerifier: ctx.codeVerifier,\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.CLIENT_CREDENTIALS]: new HTTPClientCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.clientAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.ROBOT_CREDENTIALS]: new HTTPRobotCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.robotAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.PASSWORD]: new HTTPPasswordGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n authenticator: ctx.userAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.REFRESH_TOKEN]: new HTTPOAuth2RefreshTokenGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n tokenVerifier: ctx.tokenVerifier,\n tokenRevoker: ctx.tokenRevoker,\n sessionManager: ctx.sessionManager,\n }),\n };\n }\n\n // -------------------------------------------\n\n @DGet('/introspect', [])\n async getIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n return this.postIntrospect(req);\n }\n\n @DPost('/introspect', [])\n async postIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n try {\n const token = await extractTokenFromRequest(req);\n const payload = await this.tokenVerifier.verify(token, { skipActiveCheck: true });\n if (!payload.sub || !payload.sub_kind) {\n throw OAuth2Error.identityInvalid();\n }\n\n // todo: only receive client specific permissions\n const permissions = await this.identityPermissionProvider.getFor({\n id: payload.sub,\n type: payload.sub_kind,\n clientId: payload.client_id,\n realmId: payload.realm_id,\n });\n\n const identity = await this.identityResolver.resolve(payload.sub_kind, payload.sub);\n if (!identity) {\n // todo: differentiate between client, robot & user\n throw OAuth2Error.identityInvalid();\n }\n\n const claimsBuilder = new OAuth2OpenIDClaimsBuilder();\n const claims = claimsBuilder.fromIdentity(identity);\n\n let active : boolean;\n if (payload.jti) {\n const isInactive = await this.tokenVerifier.isInactive(payload.jti);\n active = !isInactive;\n } else {\n active = false;\n }\n\n return {\n active,\n // todo: permissions property should be removed.\n permissions: Object.values(\n permissions.reduce((acc, binding) => {\n const key = buildPermissionKey(binding.permission);\n if (!acc[key]) {\n acc[key] = {\n name: binding.permission.name,\n client_id: binding.permission.client_id,\n realm_id: binding.permission.realm_id,\n } as OAuth2TokenPermission;\n }\n return acc;\n }, {} as Record<string, OAuth2TokenPermission>),\n ),\n ...payload,\n ...claims,\n };\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('/revoke', [])\n async revokeToken(\n @DRequest() req: Request,\n @DResponse() res: Response,\n ) {\n try {\n const token = await extractTokenFromRequest(req);\n\n const payload = await this.tokenVerifier.verify(token);\n\n await this.tokenRevoker.revoke(payload);\n\n return await sendAccepted(res);\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('', [])\n async createToken(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenGrantResponse> {\n const grantType = guessOauth2GrantTypeByRequest(req);\n if (!grantType) {\n throw OAuth2Error.grantInvalid();\n }\n\n const grant = this.tokenGrants[grantType];\n if (!grant) {\n throw OAuth2Error.grantInvalid();\n }\n\n return grant.runWithRequest(req);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"module.mjs","names":["OAuth2Error","OAuth2TokenGrant","DController","DGet","DPost","DRequest","DResponse","DTags","sendAccepted","buildPermissionKey","toOAuth2Error","OAuth2OpenIDClaimsBuilder","HTTPClientCredentialsGrant","HTTPOAuth2AuthorizeGrant","HTTPOAuth2RefreshTokenGrant","HTTPPasswordGrant","HTTPRobotCredentialsGrant","guessOauth2GrantTypeByRequest","extractTokenFromRequest","TokenController","refreshTokenIssuer","accessTokenIssuer","tokenVerifier","tokenRevoker","identityResolver","identityPermissionProvider","tokenGrants","ctx","AUTHORIZATION_CODE","codeVerifier","clientAuthenticator","oauth2ClientAuthenticator","sessionManager","CLIENT_CREDENTIALS","authenticator","ROBOT_CREDENTIALS","robotAuthenticator","PASSWORD","userAuthenticator","REFRESH_TOKEN","getIntrospect","req","postIntrospect","token","payload","verify","skipActiveCheck","sub","sub_kind","identityInvalid","permissions","getFor","id","type","clientId","client_id","realmId","realm_id","identity","resolve","claimsBuilder","claims","fromIdentity","active","jti","isInactive","Object","values","reduce","acc","binding","key","permission","name","e","revokeToken","res","revoke","createToken","grantType","grantInvalid","grant","runWithRequest"],"sources":["../../../../../../src/adapters/http/controllers/workflows/token/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2022.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { OAuth2TokenGrantResponse, OAuth2TokenIntrospectionResponse, OAuth2TokenPermission } from '@authup/specs';\nimport { OAuth2Error, OAuth2TokenGrant } from '@authup/specs';\nimport {\n DController,\n DGet,\n DPost,\n DRequest,\n DResponse,\n DTags,\n} from '@routup/decorators';\nimport type { Request, Response } from 'routup';\nimport { sendAccepted } from 'routup';\nimport { buildPermissionKey } from '@authup/access';\nimport { toOAuth2Error } from '../../../../../core/oauth2/helpers/index.ts';\nimport type { TokenControllerContext } from './types.ts';\nimport type {\n IIdentityPermissionProvider,\n IIdentityResolver,\n IOAuth2TokenIssuer,\n IOAuth2TokenRevoker,\n IOAuth2TokenVerifier,\n} from '../../../../../core/index.ts';\nimport { OAuth2OpenIDClaimsBuilder } from '../../../../../core/index.ts';\nimport type { IHTTPOAuth2Grant } from '../../../adapters/index.ts';\nimport {\n HTTPClientCredentialsGrant,\n HTTPOAuth2AuthorizeGrant,\n HTTPOAuth2RefreshTokenGrant,\n HTTPPasswordGrant,\n HTTPRobotCredentialsGrant,\n guessOauth2GrantTypeByRequest,\n} from '../../../adapters/index.ts';\nimport { extractTokenFromRequest } from './utils/index.ts';\n\n@DTags('auth')\n@DController('/token')\nexport class TokenController {\n protected refreshTokenIssuer: IOAuth2TokenIssuer;\n\n protected accessTokenIssuer: IOAuth2TokenIssuer;\n\n protected tokenVerifier: IOAuth2TokenVerifier;\n\n protected tokenRevoker: IOAuth2TokenRevoker;\n\n protected identityResolver : IIdentityResolver;\n\n protected identityPermissionProvider : IIdentityPermissionProvider;\n\n protected tokenGrants : Record<`${OAuth2TokenGrant}`, IHTTPOAuth2Grant>;\n\n // -------------------------------------------\n\n constructor(ctx: TokenControllerContext) {\n this.refreshTokenIssuer = ctx.refreshTokenIssuer;\n this.accessTokenIssuer = ctx.accessTokenIssuer;\n this.tokenVerifier = ctx.tokenVerifier;\n this.tokenRevoker = ctx.tokenRevoker;\n this.identityResolver = ctx.identityResolver;\n this.identityPermissionProvider = ctx.identityPermissionProvider;\n\n this.tokenGrants = {\n [OAuth2TokenGrant.AUTHORIZATION_CODE]: new HTTPOAuth2AuthorizeGrant({\n codeVerifier: ctx.codeVerifier,\n clientAuthenticator: ctx.oauth2ClientAuthenticator,\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.CLIENT_CREDENTIALS]: new HTTPClientCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.clientAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.ROBOT_CREDENTIALS]: new HTTPRobotCredentialsGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n authenticator: ctx.robotAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.PASSWORD]: new HTTPPasswordGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n authenticator: ctx.userAuthenticator,\n clientAuthenticator: ctx.oauth2ClientAuthenticator,\n sessionManager: ctx.sessionManager,\n }),\n [OAuth2TokenGrant.REFRESH_TOKEN]: new HTTPOAuth2RefreshTokenGrant({\n accessTokenIssuer: ctx.accessTokenIssuer,\n refreshTokenIssuer: ctx.refreshTokenIssuer,\n tokenVerifier: ctx.tokenVerifier,\n tokenRevoker: ctx.tokenRevoker,\n sessionManager: ctx.sessionManager,\n clientAuthenticator: ctx.oauth2ClientAuthenticator,\n }),\n };\n }\n\n // -------------------------------------------\n\n @DGet('/introspect', [])\n async getIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n return this.postIntrospect(req);\n }\n\n @DPost('/introspect', [])\n async postIntrospect(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenIntrospectionResponse> {\n try {\n const token = await extractTokenFromRequest(req);\n const payload = await this.tokenVerifier.verify(token, { skipActiveCheck: true });\n if (!payload.sub || !payload.sub_kind) {\n throw OAuth2Error.identityInvalid();\n }\n\n // todo: only receive client specific permissions\n const permissions = await this.identityPermissionProvider.getFor({\n id: payload.sub,\n type: payload.sub_kind,\n clientId: payload.client_id,\n realmId: payload.realm_id,\n });\n\n const identity = await this.identityResolver.resolve(payload.sub_kind, payload.sub);\n if (!identity) {\n // todo: differentiate between client, robot & user\n throw OAuth2Error.identityInvalid();\n }\n\n const claimsBuilder = new OAuth2OpenIDClaimsBuilder();\n const claims = claimsBuilder.fromIdentity(identity);\n\n let active : boolean;\n if (payload.jti) {\n const isInactive = await this.tokenVerifier.isInactive(payload.jti);\n active = !isInactive;\n } else {\n active = false;\n }\n\n return {\n active,\n // todo: permissions property should be removed.\n permissions: Object.values(\n permissions.reduce((acc, binding) => {\n const key = buildPermissionKey(binding.permission);\n if (!acc[key]) {\n acc[key] = {\n name: binding.permission.name,\n client_id: binding.permission.client_id,\n realm_id: binding.permission.realm_id,\n } as OAuth2TokenPermission;\n }\n return acc;\n }, {} as Record<string, OAuth2TokenPermission>),\n ),\n ...payload,\n ...claims,\n };\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('/revoke', [])\n async revokeToken(\n @DRequest() req: Request,\n @DResponse() res: Response,\n ) {\n try {\n const token = await extractTokenFromRequest(req);\n\n const payload = await this.tokenVerifier.verify(token);\n\n await this.tokenRevoker.revoke(payload);\n\n return await sendAccepted(res);\n } catch (e) {\n throw toOAuth2Error(e);\n }\n }\n\n // ----------------------------------------------------------\n\n @DPost('', [])\n async createToken(\n @DRequest() req: Request,\n ): Promise<OAuth2TokenGrantResponse> {\n const grantType = guessOauth2GrantTypeByRequest(req);\n if (!grantType) {\n throw OAuth2Error.grantInvalid();\n }\n\n const grant = this.tokenGrants[grantType];\n if (!grant) {\n throw OAuth2Error.grantInvalid();\n }\n\n return grant.runWithRequest(req);\n }\n}\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { Client, Robot, User } from '@authup/core-kit';
2
- import type { ICredentialsAuthenticator, IIdentityPermissionProvider, IIdentityResolver, IOAuth2AuthorizationCodeVerifier, IOAuth2TokenIssuer, IOAuth2TokenRevoker, IOAuth2TokenVerifier, ISessionManager } from '../../../../../core/index.ts';
2
+ import type { ICredentialsAuthenticator, IIdentityPermissionProvider, IIdentityResolver, IOAuth2AuthorizationCodeVerifier, IOAuth2TokenIssuer, IOAuth2TokenRevoker, IOAuth2TokenVerifier, ISessionManager, OAuth2ClientAuthenticator } from '../../../../../core/index.ts';
3
3
  export type TokenControllerContext = {
4
4
  codeVerifier: IOAuth2AuthorizationCodeVerifier;
5
5
  accessTokenIssuer: IOAuth2TokenIssuer;
@@ -12,5 +12,6 @@ export type TokenControllerContext = {
12
12
  clientAuthenticator: ICredentialsAuthenticator<Client>;
13
13
  robotAuthenticator: ICredentialsAuthenticator<Robot>;
14
14
  userAuthenticator: ICredentialsAuthenticator<User>;
15
+ oauth2ClientAuthenticator: OAuth2ClientAuthenticator;
15
16
  };
16
17
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACR,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EAClB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,sBAAsB,GAAG;IACjC,YAAY,EAAE,gCAAgC,CAAC;IAE/C,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,aAAa,EAAE,oBAAoB,CAAC;IACpC,YAAY,EAAE,mBAAmB,CAAC;IAElC,cAAc,EAAE,eAAe,CAAC;IAEhC,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,0BAA0B,EAAE,2BAA2B,CAAC;IAExD,mBAAmB,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACtD,kBAAkB,EAAE,yBAAyB,CAAC,KAAK,CAAC,CAAA;IACpD,iBAAiB,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAA;CACrD,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/token/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EACR,yBAAyB,EACzB,2BAA2B,EAC3B,iBAAiB,EACjB,gCAAgC,EAChC,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,eAAe,EACf,yBAAyB,EAC5B,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,sBAAsB,GAAG;IACjC,YAAY,EAAE,gCAAgC,CAAC;IAE/C,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,kBAAkB,EAAE,kBAAkB,CAAC;IACvC,aAAa,EAAE,oBAAoB,CAAC;IACpC,YAAY,EAAE,mBAAmB,CAAC;IAElC,cAAc,EAAE,eAAe,CAAC;IAEhC,gBAAgB,EAAE,iBAAiB,CAAC;IACpC,0BAA0B,EAAE,2BAA2B,CAAC;IAExD,mBAAmB,EAAE,yBAAyB,CAAC,MAAM,CAAC,CAAA;IACtD,kBAAkB,EAAE,yBAAyB,CAAC,KAAK,CAAC,CAAA;IACpD,iBAAiB,EAAE,yBAAyB,CAAC,IAAI,CAAC,CAAA;IAElD,yBAAyB,EAAE,yBAAyB,CAAA;CACvD,CAAC"}
@@ -9,6 +9,7 @@ import { setRequestToken, useRequestToken } from "./request/helpers/token.mjs";
9
9
  import { RequestPermissionEvaluator } from "./request/permission/module.mjs";
10
10
  import "./request/index.mjs";
11
11
  import { HTTPOAuth2Authorizer } from "./adapters/oauth2/authorization/module.mjs";
12
+ import { extractClientCredentialsFromRequest } from "./adapters/oauth2/grant-types/utils/credentials.mjs";
12
13
  import { guessOauth2GrantTypeByRequest } from "./adapters/oauth2/grant-types/utils/guess.mjs";
13
14
  import { HTTPOAuth2AuthorizeGrant } from "./adapters/oauth2/grant-types/authorize.mjs";
14
15
  import { HTTPClientCredentialsGrant } from "./adapters/oauth2/grant-types/client-credentials.mjs";
@@ -78,4 +79,4 @@ import { createHttpServer } from "./server/module.mjs";
78
79
  import "./server/index.mjs";
79
80
  import { Swagger } from "./swagger/module.mjs";
80
81
  import "./swagger/index.mjs";
81
- export { ActivateController, AuthorizationMiddleware, AuthorizeController, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, HTTPRobotCredentialsGrant, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RobotController, RobotPermissionController, RobotPermissionRequestValidator, RobotRoleController, RobotRoleRequestValidator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, StatusController, Swagger, TokenController, UserAttributeController, UserAttributeRequestValidator, UserController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, buildActorContext, createAuthorizationMiddleware, createHttpServer, createLoggerMiddleware, createSwaggerMiddleware, getJwkRouteHandler, getJwksRouteHandler, getRequestBodyRealmID, getRequestParamID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, isRequestIdentityMasterRealmMember, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, setRequestIdentity, setRequestPermissionEvaluator, setRequestScopes, setRequestToken, useRequestIdentity, useRequestIdentityOrFail, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestToken };
82
+ export { ActivateController, AuthorizationMiddleware, AuthorizeController, ClientController, ClientPermissionController, ClientPermissionRequestValidator, ClientRoleController, ClientRoleRequestValidator, ClientScopeController, ClientScopeRequestValidator, ForceLoggedInMiddleware, ForceUserLoggedInMiddleware, HTTPClientCredentialsGrant, HTTPOAuth2AuthorizeGrant, HTTPOAuth2Authorizer, HTTPOAuth2IdentityGrantType, HTTPOAuth2RefreshTokenGrant, HTTPPasswordGrant, HTTPRobotCredentialsGrant, IdentityProviderController, IdentityProviderRoleMappingController, JwkController, OpenIDController, PasswordForgotController, PasswordResetController, PermissionController, PermissionPolicyController, PolicyAttributesValidator, PolicyController, PolicyValidator, RealmController, RegisterController, RequestHandlerOperation, RequestIdentity, RequestPermissionEvaluator, RobotController, RobotPermissionController, RobotPermissionRequestValidator, RobotRoleController, RobotRoleRequestValidator, RoleAttributeController, RoleAttributeRequestValidator, RoleController, RolePermissionController, RolePermissionRequestValidator, ScopeController, StatusController, Swagger, TokenController, UserAttributeController, UserAttributeRequestValidator, UserController, UserPermissionController, UserPermissionRequestValidator, UserRoleController, UserRoleRequestValidator, buildActorContext, createAuthorizationMiddleware, createHttpServer, createLoggerMiddleware, createSwaggerMiddleware, extractClientCredentialsFromRequest, getJwkRouteHandler, getJwksRouteHandler, getRequestBodyRealmID, getRequestParamID, getRequestStringParam, getRequestStringParamOrFail, guessOauth2GrantTypeByRequest, isRequestIdentityMasterRealmMember, registerAssetsMiddleware, registerBasicMiddleware, registerCorsMiddleware, registerErrorMiddleware, registerPrometheusMiddleware, registerRateLimitMiddleware, setRequestIdentity, setRequestPermissionEvaluator, setRequestScopes, setRequestToken, useRequestIdentity, useRequestIdentityOrFail, useRequestParamID, useRequestPermissionEvaluator, useRequestScopes, useRequestToken };
@@ -13,6 +13,7 @@ export declare class ClientRepositoryAdapter implements IClientRepository {
13
13
  findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Client>>;
14
14
  findOneById(id: string): Promise<Client | null>;
15
15
  findOneByName(name: string, realmKey?: string): Promise<Client | null>;
16
+ findOne(id: string, query?: Record<string, any>, realmKey?: string): Promise<Client | null>;
16
17
  findOneByIdOrName(idOrName: string, realm?: string): Promise<Client | null>;
17
18
  findManyBy(where: Record<string, any>): Promise<Client[]>;
18
19
  findOneBy(where: Record<string, any>): Promise<Client | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/client/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,iBAAiB,EAAoB,MAAM,8BAA8B,CAAC;AAYxH,MAAM,MAAM,8BAA8B,GAAG;IACzC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CACtC,CAAC;AAEF,qBAAa,uBAAwB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAEhD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;gBAEvC,GAAG,EAAE,8BAA8B;IAKzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAkD3F,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIzC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IActE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM3E,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI7D,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY3E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAIrC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAI9C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAmBvD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAUzF"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/client/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,8BAA8B,EAAE,iBAAiB,EAAoB,MAAM,8BAA8B,CAAC;AAYxH,MAAM,MAAM,8BAA8B,GAAG;IACzC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/B,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CACtC,CAAC;AAEF,qBAAa,uBAAwB,YAAW,iBAAiB;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqB;IAEhD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;gBAEvC,GAAG,EAAE,8BAA8B;IAKzC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC;IAkD3F,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAIzC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IActE,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IA+C3F,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAM3E,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIzD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAI7D,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY3E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAIrC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM;IAI9C,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAmBvD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAUzF"}
@@ -79,13 +79,52 @@ var ClientRepositoryAdapter = class {
79
79
  }
80
80
  async findOneByName(name, realmKey) {
81
81
  const qb = this.repository.createQueryBuilder("client");
82
- qb.where("client.name LIKE :name", { name });
82
+ qb.where("client.name = :name", { name });
83
83
  if (realmKey) {
84
84
  const realm = await this.realmRepository.resolve(realmKey);
85
85
  if (realm) qb.andWhere("client.realm_id = :realmId", { realmId: realm.id });
86
86
  }
87
87
  return qb.getOne();
88
88
  }
89
+ async findOne(id, query, realmKey) {
90
+ const qb = this.repository.createQueryBuilder("client");
91
+ if (isUUID(id)) qb.where("client.id = :id", { id });
92
+ else {
93
+ qb.where("client.name = :name", { name: id });
94
+ if (realmKey) {
95
+ const realm = await this.realmRepository.resolve(realmKey);
96
+ if (!realm) return null;
97
+ qb.andWhere("client.realm_id = :realmId", { realmId: realm.id });
98
+ }
99
+ }
100
+ applyQuery(qb, query || {}, {
101
+ defaultAlias: "client",
102
+ fields: {
103
+ default: [
104
+ "id",
105
+ "active",
106
+ "built_in",
107
+ "name",
108
+ "display_name",
109
+ "description",
110
+ "secret_hashed",
111
+ "secret_encrypted",
112
+ "base_url",
113
+ "root_url",
114
+ "redirect_uri",
115
+ "grant_types",
116
+ "scope",
117
+ "is_confidential",
118
+ "realm_id",
119
+ "updated_at",
120
+ "created_at"
121
+ ],
122
+ allowed: ["secret"]
123
+ },
124
+ relations: { allowed: ["realm"] }
125
+ });
126
+ return qb.getOne();
127
+ }
89
128
  async findOneByIdOrName(idOrName, realm) {
90
129
  return isUUID(idOrName) ? this.findOneById(idOrName) : this.findOneByName(idOrName, realm);
91
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["buildRedisKeyPath","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","loadBoundPermissions","CachePrefix","ClientEntity","ClientPermissionEntity","ClientRoleEntity","RealmRepositoryAdapter","ClientRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","default","allowed","filters","maxLimit","relations","onJoin","_property","key","q","addGroupBy","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","findOneWithSecret","Object","entries","forEach","value","addSelect","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","getBoundRoles","getRepository","find","client_id","role","cache","prefix","CLIENT_OWNED_ROLES","milliseconds","map","entry","getBoundPermissions","junctionTarget","cachePrefix","CLIENT_OWNED_PERMISSIONS","cacheKey"],"sources":["../../../../../../src/app/modules/database/repositories/client/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client, Realm, Role } from '@authup/core-kit';\nimport type { PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IClientRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { loadBoundPermissions } from '../bindings.ts';\nimport {\n CachePrefix,\n ClientEntity,\n ClientPermissionEntity,\n ClientRoleEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type ClientRepositoryAdapterContext = {\n repository: Repository<Client>,\n realmRepository: Repository<Realm>,\n};\n\nexport class ClientRepositoryAdapter implements IClientRepository {\n private readonly repository: Repository<Client>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: ClientRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Client>> {\n const qb = this.repository.createQueryBuilder('client');\n qb.groupBy('client.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'client',\n fields: {\n default: [\n 'id',\n 'active',\n 'built_in',\n 'name',\n 'display_name',\n 'description',\n 'secret_hashed',\n 'secret_encrypted',\n 'base_url',\n 'root_url',\n 'redirect_uri',\n 'grant_types',\n 'scope',\n 'is_confidential',\n 'realm_id',\n 'updated_at',\n 'created_at',\n ],\n allowed: ['secret'],\n },\n filters: { allowed: ['id', 'name', 'realm_id', 'realm.name'] },\n pagination: { maxLimit: 50 },\n relations: {\n allowed: ['realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Client | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n qb.where('client.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('client.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Client | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Client[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Client | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneWithSecret(where: Record<string, any>): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n\n Object.entries(where).forEach(([key, value]) => {\n qb.andWhere(`client.${key} = :${key}`, { [key]: value });\n });\n\n qb.addSelect('client.secret');\n\n return qb.getOne();\n }\n\n create(data: Partial<Client>): Client {\n return this.repository.create(data);\n }\n\n merge(entity: Client, data: Partial<Client>): Client {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Client): Promise<Client> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Client): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Client>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Client>, existing?: Client): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundRoles(entity: string | Client): Promise<Role[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n const entries = await this.repository.manager\n .getRepository(ClientRoleEntity)\n .find({\n where: { client_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return entries.map((entry) => entry.role);\n }\n\n async getBoundPermissions(entity: string | Client): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: ClientPermissionEntity,\n where: { client_id: id },\n cachePrefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"repository.mjs","names":["buildRedisKeyPath","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","loadBoundPermissions","CachePrefix","ClientEntity","ClientPermissionEntity","ClientRoleEntity","RealmRepositoryAdapter","ClientRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","default","allowed","filters","maxLimit","relations","onJoin","_property","key","q","addGroupBy","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOne","findOneByIdOrName","idOrName","findManyBy","findBy","findOneWithSecret","Object","entries","forEach","value","addSelect","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","getBoundRoles","getRepository","find","client_id","role","cache","prefix","CLIENT_OWNED_ROLES","milliseconds","map","entry","getBoundPermissions","junctionTarget","cachePrefix","CLIENT_OWNED_PERMISSIONS","cacheKey"],"sources":["../../../../../../src/app/modules/database/repositories/client/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client, Realm, Role } from '@authup/core-kit';\nimport type { PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IClientRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { loadBoundPermissions } from '../bindings.ts';\nimport {\n CachePrefix,\n ClientEntity,\n ClientPermissionEntity,\n ClientRoleEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type ClientRepositoryAdapterContext = {\n repository: Repository<Client>,\n realmRepository: Repository<Realm>,\n};\n\nexport class ClientRepositoryAdapter implements IClientRepository {\n private readonly repository: Repository<Client>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: ClientRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Client>> {\n const qb = this.repository.createQueryBuilder('client');\n qb.groupBy('client.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'client',\n fields: {\n default: [\n 'id',\n 'active',\n 'built_in',\n 'name',\n 'display_name',\n 'description',\n 'secret_hashed',\n 'secret_encrypted',\n 'base_url',\n 'root_url',\n 'redirect_uri',\n 'grant_types',\n 'scope',\n 'is_confidential',\n 'realm_id',\n 'updated_at',\n 'created_at',\n ],\n allowed: ['secret'],\n },\n filters: { allowed: ['id', 'name', 'realm_id', 'realm.name'] },\n pagination: { maxLimit: 50 },\n relations: {\n allowed: ['realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Client | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n qb.where('client.name = :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('client.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOne(id: string, query?: Record<string, any>, realmKey?: string): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n\n if (isUUID(id)) {\n qb.where('client.id = :id', { id });\n } else {\n qb.where('client.name = :name', { name: id });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (!realm) {\n return null;\n }\n qb.andWhere('client.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n applyQuery(qb, query || {}, {\n defaultAlias: 'client',\n fields: {\n default: [\n 'id',\n 'active',\n 'built_in',\n 'name',\n 'display_name',\n 'description',\n 'secret_hashed',\n 'secret_encrypted',\n 'base_url',\n 'root_url',\n 'redirect_uri',\n 'grant_types',\n 'scope',\n 'is_confidential',\n 'realm_id',\n 'updated_at',\n 'created_at',\n ],\n allowed: ['secret'],\n },\n relations: { allowed: ['realm'] },\n });\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Client | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Client[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Client | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneWithSecret(where: Record<string, any>): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n\n Object.entries(where).forEach(([key, value]) => {\n qb.andWhere(`client.${key} = :${key}`, { [key]: value });\n });\n\n qb.addSelect('client.secret');\n\n return qb.getOne();\n }\n\n create(data: Partial<Client>): Client {\n return this.repository.create(data);\n }\n\n merge(entity: Client, data: Partial<Client>): Client {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Client): Promise<Client> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Client): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Client>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Client>, existing?: Client): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundRoles(entity: string | Client): Promise<Role[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n const entries = await this.repository.manager\n .getRepository(ClientRoleEntity)\n .find({\n where: { client_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return entries.map((entry) => entry.role);\n }\n\n async getBoundPermissions(entity: string | Client): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: ClientPermissionEntity,\n where: { client_id: id },\n cachePrefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n}\n"],"mappings":"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"}
@@ -48,7 +48,7 @@ var PermissionRepositoryAdapter = class {
48
48
  }
49
49
  async findOneByName(name, realmKey) {
50
50
  const qb = this.repository.createQueryBuilder("permission");
51
- qb.where("permission.name LIKE :name", { name });
51
+ qb.where("permission.name = :name", { name });
52
52
  if (realmKey) {
53
53
  const realm = await this.realmRepository.resolve(realmKey);
54
54
  if (realm) qb.andWhere("permission.realm_id = :realmId", { realmId: realm.id });
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","PermissionEntity","RealmRepositoryAdapter","PermissionRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","maxLimit","relations","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","result","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting"],"sources":["../../../../../../src/app/modules/database/repositories/permission/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Permission, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IPermissionRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { PermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PermissionRepositoryAdapterContext = {\n repository: Repository<Permission>,\n realmRepository: Repository<Realm>,\n};\n\nexport class PermissionRepositoryAdapter implements IPermissionRepository {\n private readonly repository: Repository<Permission>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PermissionRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Permission>> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.groupBy('permission.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'permission',\n filters: { allowed: ['id', 'display_name', 'name', 'built_in'] },\n pagination: { maxLimit: 50 },\n relations: { allowed: [] },\n sort: { allowed: ['id', 'name', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Permission | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Permission | null> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.where('permission.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('permission.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Permission | null> {\n const result = isUUID(idOrName) ?\n await this.findOneById(idOrName) :\n await this.findOneByName(idOrName, realm);\n\n return result;\n }\n\n async findManyBy(where: Record<string, any>): Promise<Permission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Permission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Permission>): Permission {\n return this.repository.create(data);\n }\n\n merge(entity: Permission, data: Partial<Permission>): Permission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Permission): Promise<Permission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Permission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Permission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Permission>, existing?: Permission): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n"],"mappings":";;;;;;;;;AAsBA,IAAaQ,8BAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAyC;AACjD,OAAKF,aAAaE,IAAIF;AACtB,OAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,gBAAe;;CAGzE,MAAME,SAASC,OAAiF;EAC5F,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,aAAA;AAC9CD,KAAGE,QAAQ,gBAAA;EAEX,MAAM,EAAEC,eAAehB,WAAWa,IAAID,OAAO;GACzCK,cAAc;GACdC,SAAS,EAAEC,SAAS;IAAC;IAAM;IAAgB;IAAQ;IAAW,EAAC;GAC/DH,YAAY,EAAEI,UAAU,IAAG;GAC3BC,WAAW,EAAEF,SAAS,EAAE,EAAC;GACzBG,MAAM,EAAEH,SAAS;IAAC;IAAM;IAAQ;IAAc;IAAa,EAAC;GAChE,CAAA;EAEA,MAAM,CAACI,UAAUC,SAAS,MAAMX,GAAGY,iBAAe;AAElD,SAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGR;IACP;GACJ;;CAGJY,YAAYC,IAAwC;AAChD,SAAO,KAAKC,UAAU,EAAED,IAAG,CAAA;;CAG/B,MAAME,cAAcC,MAAcC,UAA+C;EAC7E,MAAMpB,KAAK,KAAKL,WAAWM,mBAAmB,aAAA;AAC9CD,KAAGqB,MAAM,8BAA8B,EAAEF,MAAK,CAAA;AAE9C,MAAIC,UAAU;GACV,MAAME,QAAQ,MAAM,KAAK1B,gBAAgB2B,QAAQH,SAAAA;AACjD,OAAIE,MACAtB,IAAGwB,SAAS,kCAAkC,EAAEC,SAASH,MAAMN,IAAG,CAAA;;AAI1E,SAAOhB,GAAG0B,QAAM;;CAGpB,MAAMC,kBAAkBC,UAAkBN,OAA4C;AAKlF,SAJepC,OAAO0C,SAAAA,GAClB,MAAM,KAAKb,YAAYa,SAAAA,GACvB,MAAM,KAAKV,cAAcU,UAAUN,MAAAA;;CAK3C,MAAMQ,WAAWT,OAAmD;AAChE,SAAO,KAAK1B,WAAWoC,OAAOxC,yBAAyB8B,MAAAA,CAAAA;;CAG3D,MAAMJ,UAAUI,OAAwD;AACpE,SAAO,KAAK1B,WAAWsB,UAAU1B,yBAAyB8B,MAAAA,CAAAA;;CAG9DW,OAAOnB,MAAuC;AAC1C,SAAO,KAAKlB,WAAWqC,OAAOnB,KAAAA;;CAGlCoB,MAAMC,QAAoBrB,MAAuC;AAC7D,SAAO,KAAKlB,WAAWsC,MAAMC,QAAQrB,KAAAA;;CAGzC,MAAMsB,KAAKD,QAAyC;AAChD,SAAO,KAAKvC,WAAWwC,KAAKD,OAAAA;;CAGhC,MAAME,OAAOF,QAAmC;AAC5C,QAAM,KAAKvC,WAAWyC,OAAOF,OAAAA;;CAGjC,MAAMG,oBAAoBxB,MAA0C;AAChE,QAAMxB,0BAA0BwB,MAAM;GAClCyB,YAAY,KAAK3C,WAAW4C,QAAQC;GACpCC,cAAcjD;GAClB,CAAA;;CAGJ,MAAMkD,gBAAgB7B,MAA2B8B,UAAsC;AAQnF,MAAI,CAACC,MAPkBxD,eAAe;GAClCkD,YAAY,KAAK3C,WAAW4C,QAAQC;GACpCC,cAAcjD;GACd0C,QAAQrB;GACRgC,gBAAgBF;GACpB,CAAA,CAGI,OAAM,IAAIrD,uBAAAA"}
1
+ {"version":3,"file":"repository.mjs","names":["isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","PermissionEntity","RealmRepositoryAdapter","PermissionRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","filters","allowed","maxLimit","relations","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","result","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting"],"sources":["../../../../../../src/app/modules/database/repositories/permission/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Permission, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IPermissionRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { PermissionEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PermissionRepositoryAdapterContext = {\n repository: Repository<Permission>,\n realmRepository: Repository<Realm>,\n};\n\nexport class PermissionRepositoryAdapter implements IPermissionRepository {\n private readonly repository: Repository<Permission>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PermissionRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Permission>> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.groupBy('permission.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'permission',\n filters: { allowed: ['id', 'display_name', 'name', 'built_in'] },\n pagination: { maxLimit: 50 },\n relations: { allowed: [] },\n sort: { allowed: ['id', 'name', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Permission | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Permission | null> {\n const qb = this.repository.createQueryBuilder('permission');\n qb.where('permission.name = :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('permission.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Permission | null> {\n const result = isUUID(idOrName) ?\n await this.findOneById(idOrName) :\n await this.findOneByName(idOrName, realm);\n\n return result;\n }\n\n async findManyBy(where: Record<string, any>): Promise<Permission[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Permission | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Permission>): Permission {\n return this.repository.create(data);\n }\n\n merge(entity: Permission, data: Partial<Permission>): Permission {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Permission): Promise<Permission> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Permission): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Permission>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Permission>, existing?: Permission): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PermissionEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n}\n"],"mappings":";;;;;;;;;AAsBA,IAAaQ,8BAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAyC;AACjD,OAAKF,aAAaE,IAAIF;AACtB,OAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,gBAAe;;CAGzE,MAAME,SAASC,OAAiF;EAC5F,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,aAAA;AAC9CD,KAAGE,QAAQ,gBAAA;EAEX,MAAM,EAAEC,eAAehB,WAAWa,IAAID,OAAO;GACzCK,cAAc;GACdC,SAAS,EAAEC,SAAS;IAAC;IAAM;IAAgB;IAAQ;IAAW,EAAC;GAC/DH,YAAY,EAAEI,UAAU,IAAG;GAC3BC,WAAW,EAAEF,SAAS,EAAE,EAAC;GACzBG,MAAM,EAAEH,SAAS;IAAC;IAAM;IAAQ;IAAc;IAAa,EAAC;GAChE,CAAA;EAEA,MAAM,CAACI,UAAUC,SAAS,MAAMX,GAAGY,iBAAe;AAElD,SAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGR;IACP;GACJ;;CAGJY,YAAYC,IAAwC;AAChD,SAAO,KAAKC,UAAU,EAAED,IAAG,CAAA;;CAG/B,MAAME,cAAcC,MAAcC,UAA+C;EAC7E,MAAMpB,KAAK,KAAKL,WAAWM,mBAAmB,aAAA;AAC9CD,KAAGqB,MAAM,2BAA2B,EAAEF,MAAK,CAAA;AAE3C,MAAIC,UAAU;GACV,MAAME,QAAQ,MAAM,KAAK1B,gBAAgB2B,QAAQH,SAAAA;AACjD,OAAIE,MACAtB,IAAGwB,SAAS,kCAAkC,EAAEC,SAASH,MAAMN,IAAG,CAAA;;AAI1E,SAAOhB,GAAG0B,QAAM;;CAGpB,MAAMC,kBAAkBC,UAAkBN,OAA4C;AAKlF,SAJepC,OAAO0C,SAAAA,GAClB,MAAM,KAAKb,YAAYa,SAAAA,GACvB,MAAM,KAAKV,cAAcU,UAAUN,MAAAA;;CAK3C,MAAMQ,WAAWT,OAAmD;AAChE,SAAO,KAAK1B,WAAWoC,OAAOxC,yBAAyB8B,MAAAA,CAAAA;;CAG3D,MAAMJ,UAAUI,OAAwD;AACpE,SAAO,KAAK1B,WAAWsB,UAAU1B,yBAAyB8B,MAAAA,CAAAA;;CAG9DW,OAAOnB,MAAuC;AAC1C,SAAO,KAAKlB,WAAWqC,OAAOnB,KAAAA;;CAGlCoB,MAAMC,QAAoBrB,MAAuC;AAC7D,SAAO,KAAKlB,WAAWsC,MAAMC,QAAQrB,KAAAA;;CAGzC,MAAMsB,KAAKD,QAAyC;AAChD,SAAO,KAAKvC,WAAWwC,KAAKD,OAAAA;;CAGhC,MAAME,OAAOF,QAAmC;AAC5C,QAAM,KAAKvC,WAAWyC,OAAOF,OAAAA;;CAGjC,MAAMG,oBAAoBxB,MAA0C;AAChE,QAAMxB,0BAA0BwB,MAAM;GAClCyB,YAAY,KAAK3C,WAAW4C,QAAQC;GACpCC,cAAcjD;GAClB,CAAA;;CAGJ,MAAMkD,gBAAgB7B,MAA2B8B,UAAsC;AAQnF,MAAI,CAACC,MAPkBxD,eAAe;GAClCkD,YAAY,KAAK3C,WAAW4C,QAAQC;GACpCC,cAAcjD;GACd0C,QAAQrB;GACRgC,gBAAgBF;GACpB,CAAA,CAGI,OAAM,IAAIrD,uBAAAA"}
@@ -70,7 +70,7 @@ var PolicyRepositoryAdapter = class {
70
70
  }
71
71
  async findOneByName(name, realmKey) {
72
72
  const qb = this.repository.createQueryBuilder("policy");
73
- qb.where("policy.name LIKE :name", { name });
73
+ qb.where("policy.name = :name", { name });
74
74
  if (realmKey) {
75
75
  const realm = await this.realmRepository.resolve(realmKey);
76
76
  if (realm) qb.andWhere("policy.realm_id = :realmId", { realmId: realm.id });
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","PolicyEntity","translateWhereConditions","RealmRepositoryAdapter","PolicyRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","relations","allowed","onJoin","_property","key","q","addGroupBy","fields","default","filters","sort","maxLimit","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","saveWithEA","saveOneWithEA","updateClosureTable","deleteFromTree","treeRepository","getTreeRepository"],"sources":["../../../../../../src/app/modules/database/repositories/policy/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Policy, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IPolicyRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { PolicyRepository } from '../../../../../adapters/database/domains/index.ts';\nimport { PolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PolicyRepositoryAdapterContext = {\n repository: PolicyRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class PolicyRepositoryAdapter implements IPolicyRepository {\n private readonly repository: PolicyRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PolicyRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Policy>> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.groupBy('policy.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'policy',\n relations: {\n // @ts-expect-error onJoin is not in the type definition\n allowed: ['children', 'realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n fields: {\n default: [\n 'id',\n 'built_in',\n 'type',\n 'display_name',\n 'name',\n 'description',\n 'invert',\n 'parent_id',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: {\n // @ts-expect-error realm.name filter requires relation join\n allowed: ['id', 'name', 'type', 'parent_id', 'realm_id', 'realm.name'],\n },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<Policy | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Policy | null> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.where('policy.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('policy.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Policy | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Policy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Policy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Policy>): Policy {\n return this.repository.create(data);\n }\n\n merge(entity: Policy, data: Partial<Policy>): Policy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Policy): Promise<Policy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Policy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Policy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Policy>, existing?: Policy): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async saveWithEA(entity: Policy, data?: Record<string, any>): Promise<Policy> {\n await this.repository.saveOneWithEA(entity, data);\n await this.repository.updateClosureTable(entity, this.repository.manager);\n\n return entity;\n }\n\n async deleteFromTree(entity: Policy): Promise<void> {\n const treeRepository = this.repository.manager.connection.getTreeRepository(PolicyEntity);\n await treeRepository.remove(entity);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"repository.mjs","names":["isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","PolicyEntity","translateWhereConditions","RealmRepositoryAdapter","PolicyRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","relations","allowed","onJoin","_property","key","q","addGroupBy","fields","default","filters","sort","maxLimit","entities","total","getManyAndCount","extendManyWithEA","data","meta","findOneById","id","entity","findOneBy","extendOneWithEA","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","saveWithEA","saveOneWithEA","updateClosureTable","deleteFromTree","treeRepository","getTreeRepository"],"sources":["../../../../../../src/app/modules/database/repositories/policy/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Policy, Realm } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IPolicyRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport type { PolicyRepository } from '../../../../../adapters/database/domains/index.ts';\nimport { PolicyEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type PolicyRepositoryAdapterContext = {\n repository: PolicyRepository,\n realmRepository: Repository<Realm>,\n};\n\nexport class PolicyRepositoryAdapter implements IPolicyRepository {\n private readonly repository: PolicyRepository;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: PolicyRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Policy>> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.groupBy('policy.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'policy',\n relations: {\n // @ts-expect-error onJoin is not in the type definition\n allowed: ['children', 'realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n fields: {\n default: [\n 'id',\n 'built_in',\n 'type',\n 'display_name',\n 'name',\n 'description',\n 'invert',\n 'parent_id',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: {\n // @ts-expect-error realm.name filter requires relation join\n allowed: ['id', 'name', 'type', 'parent_id', 'realm_id', 'realm.name'],\n },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n pagination: { maxLimit: 50 },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n await this.repository.extendManyWithEA(entities);\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneById(id: string): Promise<Policy | null> {\n const entity = await this.findOneBy({ id });\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Policy | null> {\n const qb = this.repository.createQueryBuilder('policy');\n qb.where('policy.name = :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('policy.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n const entity = await qb.getOne();\n if (entity) {\n await this.repository.extendOneWithEA(entity);\n }\n return entity;\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Policy | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Policy[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Policy | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Policy>): Policy {\n return this.repository.create(data);\n }\n\n merge(entity: Policy, data: Partial<Policy>): Policy {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Policy): Promise<Policy> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Policy): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Policy>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Policy>, existing?: Policy): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: PolicyEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async saveWithEA(entity: Policy, data?: Record<string, any>): Promise<Policy> {\n await this.repository.saveOneWithEA(entity, data);\n await this.repository.updateClosureTable(entity, this.repository.manager);\n\n return entity;\n }\n\n async deleteFromTree(entity: Policy): Promise<void> {\n const treeRepository = this.repository.manager.connection.getTreeRepository(PolicyEntity);\n await treeRepository.remove(entity);\n }\n}\n"],"mappings":"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"}
@@ -15,7 +15,7 @@ var RealmRepositoryAdapter = class {
15
15
  }
16
16
  findOneByName(name) {
17
17
  const qb = this.repository.createQueryBuilder("realm");
18
- qb.where("realm.name LIKE :name", { name });
18
+ qb.where("realm.name = :name", { name });
19
19
  return qb.getOne();
20
20
  }
21
21
  async findMany(query) {
@@ -1 +1 @@
1
- {"version":3,"file":"repository.mjs","names":["REALM_MASTER_NAME","isUUID","applyQuery","validateEntityJoinColumns","RealmEntity","translateWhereConditions","RealmRepositoryAdapter","repository","findOneById","id","findOneBy","findOneByName","name","qb","createQueryBuilder","where","getOne","findMany","query","groupBy","pagination","defaultAlias","filters","allowed","maxLimit","fields","sort","entities","total","getManyAndCount","data","meta","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","resolve","withFallback"],"sources":["../../../../../../src/app/modules/database/repositories/realm/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository } from '../../../../../core/index.ts';\nimport { RealmEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RealmRepositoryAdapter implements IRealmRepository {\n private readonly repository: Repository<Realm>;\n\n constructor(repository: Repository<Realm>) {\n this.repository = repository;\n }\n\n findOneById(id: string): Promise<Realm | null> {\n return this.findOneBy({ id });\n }\n\n findOneByName(name: string): Promise<Realm | null> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.where('realm.name LIKE :name', { name });\n\n return qb.getOne();\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Realm>> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.groupBy('realm.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'realm',\n filters: { allowed: ['id', 'built_in', 'display_name', 'name'] },\n pagination: { maxLimit: 50 },\n fields: { allowed: ['id', 'name', 'description', 'built_in', 'created_at', 'updated_at'] },\n sort: { allowed: ['id', 'name', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneByIdOrName(idOrName: string): Promise<Realm | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Realm[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Realm | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Realm>): Realm {\n return this.repository.create(data);\n }\n\n merge(entity: Realm, data: Partial<Realm>): Realm {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Realm): Promise<Realm> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Realm): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Realm>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RealmEntity,\n });\n }\n\n async resolve(id: string | undefined, withFallback: true): Promise<Realm>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null> {\n let entity: Realm | null = null;\n\n if (id) {\n entity = await this.findOneByIdOrName(id);\n }\n\n if (!entity && withFallback) {\n entity = await this.findOneBy({ name: REALM_MASTER_NAME });\n }\n\n return entity;\n }\n}\n"],"mappings":";;;;;;;AAgBA,IAAaM,yBAAb,MAAaA;CACQC;CAEjB,YAAYA,YAA+B;AACvC,OAAKA,aAAaA;;CAGtBC,YAAYC,IAAmC;AAC3C,SAAO,KAAKC,UAAU,EAAED,IAAG,CAAA;;CAG/BE,cAAcC,MAAqC;EAC/C,MAAMC,KAAK,KAAKN,WAAWO,mBAAmB,QAAA;AAC9CD,KAAGE,MAAM,yBAAyB,EAAEH,MAAK,CAAA;AAEzC,SAAOC,GAAGG,QAAM;;CAGpB,MAAMC,SAASC,OAA4E;EACvF,MAAML,KAAK,KAAKN,WAAWO,mBAAmB,QAAA;AAC9CD,KAAGM,QAAQ,WAAA;EAEX,MAAM,EAAEC,eAAelB,WAAWW,IAAIK,OAAO;GACzCG,cAAc;GACdC,SAAS,EAAEC,SAAS;IAAC;IAAM;IAAY;IAAgB;IAAO,EAAC;GAC/DH,YAAY,EAAEI,UAAU,IAAG;GAC3BC,QAAQ,EAAEF,SAAS;IAAC;IAAM;IAAQ;IAAe;IAAY;IAAc;IAAa,EAAC;GACzFG,MAAM,EAAEH,SAAS;IAAC;IAAM;IAAQ;IAAc;IAAa,EAAC;GAChE,CAAA;EAEA,MAAM,CAACI,UAAUC,SAAS,MAAMf,GAAGgB,iBAAe;AAElD,SAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGR;IACP;GACJ;;CAGJ,MAAMY,kBAAkBC,UAAyC;AAC7D,SAAOhC,OAAOgC,SAAAA,GACV,KAAKzB,YAAYyB,SAAAA,GACjB,KAAKtB,cAAcsB,SAAAA;;CAG3B,MAAMC,WAAWnB,OAA8C;AAC3D,SAAO,KAAKR,WAAW4B,OAAO9B,yBAAyBU,MAAAA,CAAAA;;CAG3D,MAAML,UAAUK,OAAmD;AAC/D,SAAO,KAAKR,WAAWG,UAAUL,yBAAyBU,MAAAA,CAAAA;;CAG9DqB,OAAON,MAA6B;AAChC,SAAO,KAAKvB,WAAW6B,OAAON,KAAAA;;CAGlCO,MAAMC,QAAeR,MAA6B;AAC9C,SAAO,KAAKvB,WAAW8B,MAAMC,QAAQR,KAAAA;;CAGzC,MAAMS,KAAKD,QAA+B;AACtC,SAAO,KAAK/B,WAAWgC,KAAKD,OAAAA;;CAGhC,MAAME,OAAOF,QAA8B;AACvC,QAAM,KAAK/B,WAAWiC,OAAOF,OAAAA;;CAGjC,MAAMG,oBAAoBX,MAAqC;AAC3D,QAAM3B,0BAA0B2B,MAAM;GAClCY,YAAY,KAAKnC,WAAWoC,QAAQC;GACpCC,cAAczC;GAClB,CAAA;;CAOJ,MAAM0C,QAAQrC,IAAwBsC,cAA+C;EACjF,IAAIT,SAAuB;AAE3B,MAAI7B,GACA6B,UAAS,MAAM,KAAKN,kBAAkBvB,GAAAA;AAG1C,MAAI,CAAC6B,UAAUS,aACXT,UAAS,MAAM,KAAK5B,UAAU,EAAEE,MAAMZ,mBAAkB,CAAA;AAG5D,SAAOsC"}
1
+ {"version":3,"file":"repository.mjs","names":["REALM_MASTER_NAME","isUUID","applyQuery","validateEntityJoinColumns","RealmEntity","translateWhereConditions","RealmRepositoryAdapter","repository","findOneById","id","findOneBy","findOneByName","name","qb","createQueryBuilder","where","getOne","findMany","query","groupBy","pagination","defaultAlias","filters","allowed","maxLimit","fields","sort","entities","total","getManyAndCount","data","meta","findOneByIdOrName","idOrName","findManyBy","findBy","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","resolve","withFallback"],"sources":["../../../../../../src/app/modules/database/repositories/realm/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Realm } from '@authup/core-kit';\nimport { REALM_MASTER_NAME } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository } from '../../../../../core/index.ts';\nimport { RealmEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\n\nexport class RealmRepositoryAdapter implements IRealmRepository {\n private readonly repository: Repository<Realm>;\n\n constructor(repository: Repository<Realm>) {\n this.repository = repository;\n }\n\n findOneById(id: string): Promise<Realm | null> {\n return this.findOneBy({ id });\n }\n\n findOneByName(name: string): Promise<Realm | null> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.where('realm.name = :name', { name });\n\n return qb.getOne();\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Realm>> {\n const qb = this.repository.createQueryBuilder('realm');\n qb.groupBy('realm.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'realm',\n filters: { allowed: ['id', 'built_in', 'display_name', 'name'] },\n pagination: { maxLimit: 50 },\n fields: { allowed: ['id', 'name', 'description', 'built_in', 'created_at', 'updated_at'] },\n sort: { allowed: ['id', 'name', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n async findOneByIdOrName(idOrName: string): Promise<Realm | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Realm[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Realm | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n create(data: Partial<Realm>): Realm {\n return this.repository.create(data);\n }\n\n merge(entity: Realm, data: Partial<Realm>): Realm {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Realm): Promise<Realm> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Realm): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Realm>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RealmEntity,\n });\n }\n\n async resolve(id: string | undefined, withFallback: true): Promise<Realm>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null>;\n\n async resolve(id: string | undefined, withFallback?: boolean): Promise<Realm | null> {\n let entity: Realm | null = null;\n\n if (id) {\n entity = await this.findOneByIdOrName(id);\n }\n\n if (!entity && withFallback) {\n entity = await this.findOneBy({ name: REALM_MASTER_NAME });\n }\n\n return entity;\n }\n}\n"],"mappings":";;;;;;;AAgBA,IAAaM,yBAAb,MAAaA;CACQC;CAEjB,YAAYA,YAA+B;AACvC,OAAKA,aAAaA;;CAGtBC,YAAYC,IAAmC;AAC3C,SAAO,KAAKC,UAAU,EAAED,IAAG,CAAA;;CAG/BE,cAAcC,MAAqC;EAC/C,MAAMC,KAAK,KAAKN,WAAWO,mBAAmB,QAAA;AAC9CD,KAAGE,MAAM,sBAAsB,EAAEH,MAAK,CAAA;AAEtC,SAAOC,GAAGG,QAAM;;CAGpB,MAAMC,SAASC,OAA4E;EACvF,MAAML,KAAK,KAAKN,WAAWO,mBAAmB,QAAA;AAC9CD,KAAGM,QAAQ,WAAA;EAEX,MAAM,EAAEC,eAAelB,WAAWW,IAAIK,OAAO;GACzCG,cAAc;GACdC,SAAS,EAAEC,SAAS;IAAC;IAAM;IAAY;IAAgB;IAAO,EAAC;GAC/DH,YAAY,EAAEI,UAAU,IAAG;GAC3BC,QAAQ,EAAEF,SAAS;IAAC;IAAM;IAAQ;IAAe;IAAY;IAAc;IAAa,EAAC;GACzFG,MAAM,EAAEH,SAAS;IAAC;IAAM;IAAQ;IAAc;IAAa,EAAC;GAChE,CAAA;EAEA,MAAM,CAACI,UAAUC,SAAS,MAAMf,GAAGgB,iBAAe;AAElD,SAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGR;IACP;GACJ;;CAGJ,MAAMY,kBAAkBC,UAAyC;AAC7D,SAAOhC,OAAOgC,SAAAA,GACV,KAAKzB,YAAYyB,SAAAA,GACjB,KAAKtB,cAAcsB,SAAAA;;CAG3B,MAAMC,WAAWnB,OAA8C;AAC3D,SAAO,KAAKR,WAAW4B,OAAO9B,yBAAyBU,MAAAA,CAAAA;;CAG3D,MAAML,UAAUK,OAAmD;AAC/D,SAAO,KAAKR,WAAWG,UAAUL,yBAAyBU,MAAAA,CAAAA;;CAG9DqB,OAAON,MAA6B;AAChC,SAAO,KAAKvB,WAAW6B,OAAON,KAAAA;;CAGlCO,MAAMC,QAAeR,MAA6B;AAC9C,SAAO,KAAKvB,WAAW8B,MAAMC,QAAQR,KAAAA;;CAGzC,MAAMS,KAAKD,QAA+B;AACtC,SAAO,KAAK/B,WAAWgC,KAAKD,OAAAA;;CAGhC,MAAME,OAAOF,QAA8B;AACvC,QAAM,KAAK/B,WAAWiC,OAAOF,OAAAA;;CAGjC,MAAMG,oBAAoBX,MAAqC;AAC3D,QAAM3B,0BAA0B2B,MAAM;GAClCY,YAAY,KAAKnC,WAAWoC,QAAQC;GACpCC,cAAczC;GAClB,CAAA;;CAOJ,MAAM0C,QAAQrC,IAAwBsC,cAA+C;EACjF,IAAIT,SAAuB;AAE3B,MAAI7B,GACA6B,UAAS,MAAM,KAAKN,kBAAkBvB,GAAAA;AAG1C,MAAI,CAAC6B,UAAUS,aACXT,UAAS,MAAM,KAAK5B,UAAU,EAAEE,MAAMZ,mBAAkB,CAAA;AAG5D,SAAOsC"}
@@ -14,6 +14,7 @@ export declare class RobotRepositoryAdapter implements IRobotRepository {
14
14
  findOneById(id: string): Promise<Robot | null>;
15
15
  findOneByName(name: string, realmKey?: string): Promise<Robot | null>;
16
16
  findOneByIdOrName(idOrName: string, realm?: string): Promise<Robot | null>;
17
+ findOne(id: string, query?: Record<string, any>, realmKey?: string): Promise<Robot | null>;
17
18
  findManyBy(where: Record<string, any>): Promise<Robot[]>;
18
19
  findOneBy(where: Record<string, any>): Promise<Robot | null>;
19
20
  findOneWithSecret(where: Record<string, any>): Promise<Robot | null>;
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/robot/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,8BAA8B,EAAoB,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAYvH,MAAM,MAAM,6BAA6B,GAAG;IACxC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CACtC,CAAC;AAEF,qBAAa,sBAAuB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAE/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;gBAEvC,GAAG,EAAE,6BAA6B;IAKxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;IA6C1F,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIxC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAcrE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAM1E,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAIxD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI5D,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAY1E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;IAInC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;IAI3C,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAInC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxD,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAatE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAmBtD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAUxF"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/robot/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAG9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,8BAA8B,EAAoB,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAYvH,MAAM,MAAM,6BAA6B,GAAG;IACxC,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC9B,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CACtC,CAAC;AAEF,qBAAa,sBAAuB,YAAW,gBAAgB;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAE/C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;gBAEvC,GAAG,EAAE,6BAA6B;IAKxC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,8BAA8B,CAAC,KAAK,CAAC,CAAC;IA6C1F,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIxC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAcrE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAM1E,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA0C1F,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAIxD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI5D,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAY1E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;IAInC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK;IAI3C,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAInC,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxD,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAatE,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAmBtD,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAUxF"}