@authup/server-core 1.0.0-beta.37 → 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.
- package/dist/adapters/database/data-source/options/module.mjs +16 -16
- package/dist/adapters/database/domains/client/index.d.ts +0 -1
- package/dist/adapters/database/domains/client/index.d.ts.map +1 -1
- package/dist/adapters/database/domains/client/index.mjs +1 -2
- package/dist/adapters/database/domains/index.mjs +26 -28
- package/dist/adapters/database/domains/policy/repository.mjs +1 -1
- package/dist/adapters/database/domains/robot/index.d.ts +0 -1
- package/dist/adapters/database/domains/robot/index.d.ts.map +1 -1
- package/dist/adapters/database/domains/robot/index.mjs +1 -2
- package/dist/adapters/database/domains/role/repository.d.ts +0 -6
- package/dist/adapters/database/domains/role/repository.d.ts.map +1 -1
- package/dist/adapters/database/domains/role/repository.mjs +1 -58
- package/dist/adapters/database/domains/role/repository.mjs.map +1 -1
- package/dist/adapters/database/domains/role-permission/entity.mjs +1 -1
- package/dist/adapters/database/domains/user/repository.d.ts +1 -5
- package/dist/adapters/database/domains/user/repository.d.ts.map +1 -1
- package/dist/adapters/database/domains/user/repository.mjs +0 -60
- package/dist/adapters/database/domains/user/repository.mjs.map +1 -1
- package/dist/adapters/database/extra-attribute-repository/tree/repository.d.ts.map +1 -1
- package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs +1 -0
- package/dist/adapters/database/extra-attribute-repository/tree/repository.mjs.map +1 -1
- package/dist/adapters/database/index.mjs +18 -20
- package/dist/adapters/http/adapters/index.mjs +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs +10 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/authorize.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs +5 -13
- package/dist/adapters/http/adapters/oauth2/grant-types/client-credentials.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/index.mjs +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts +2 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs +11 -2
- package/dist/adapters/http/adapters/oauth2/grant-types/password.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts +5 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs +19 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/refresh_token.mjs.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts +6 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/types.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts +15 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.d.ts.map +1 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs +57 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/credentials.mjs.map +1 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/guess.mjs +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts +1 -0
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.d.ts.map +1 -1
- package/dist/adapters/http/adapters/oauth2/grant-types/utils/index.mjs +2 -1
- package/dist/adapters/http/adapters/oauth2/index.mjs +2 -1
- package/dist/adapters/http/controllers/entities/client/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/client/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/client/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/identity-provider/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/permission/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/attributes-validator.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/validation.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs +1 -1
- package/dist/adapters/http/controllers/entities/policy/utils/validation.mjs.map +1 -1
- package/dist/adapters/http/controllers/entities/robot/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/entities/robot/module.mjs +1 -1
- package/dist/adapters/http/controllers/entities/robot/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/authorize/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/authorize/module.mjs +5 -6
- package/dist/adapters/http/controllers/workflows/authorize/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/token/module.d.ts.map +1 -1
- package/dist/adapters/http/controllers/workflows/token/module.mjs +4 -1
- package/dist/adapters/http/controllers/workflows/token/module.mjs.map +1 -1
- package/dist/adapters/http/controllers/workflows/token/types.d.ts +2 -1
- package/dist/adapters/http/controllers/workflows/token/types.d.ts.map +1 -1
- package/dist/adapters/http/index.mjs +2 -1
- package/dist/adapters/http/middleware/built-in/assets.mjs +3 -3
- package/dist/adapters/http/middleware/built-in/assets.mjs.map +1 -1
- package/dist/app/modules/database/repositories/bindings.d.ts +17 -0
- package/dist/app/modules/database/repositories/bindings.d.ts.map +1 -0
- package/dist/app/modules/database/repositories/bindings.mjs +40 -0
- package/dist/app/modules/database/repositories/bindings.mjs.map +1 -0
- package/dist/app/modules/database/repositories/client/repository.d.ts +5 -1
- package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/client/repository.mjs +69 -1
- package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/permission/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/permission/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/policy/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/policy/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/realm/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/realm/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/robot/repository.d.ts +5 -1
- package/dist/app/modules/database/repositories/robot/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/robot/repository.mjs +61 -1
- package/dist/app/modules/database/repositories/robot/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/role/repository.d.ts +3 -0
- package/dist/app/modules/database/repositories/role/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/role/repository.mjs +17 -1
- package/dist/app/modules/database/repositories/role/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/scope/repository.mjs +1 -1
- package/dist/app/modules/database/repositories/scope/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/user/repository.d.ts +4 -1
- package/dist/app/modules/database/repositories/user/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/user/repository.mjs +31 -2
- package/dist/app/modules/database/repositories/user/repository.mjs.map +1 -1
- package/dist/app/modules/http/modules/controller.d.ts +1 -2
- package/dist/app/modules/http/modules/controller.d.ts.map +1 -1
- package/dist/app/modules/http/modules/controller.mjs +32 -34
- package/dist/app/modules/http/modules/controller.mjs.map +1 -1
- package/dist/app/modules/http/modules/middleware.d.ts.map +1 -1
- package/dist/app/modules/http/modules/middleware.mjs +2 -15
- package/dist/app/modules/http/modules/middleware.mjs.map +1 -1
- package/dist/app/modules/identity/constants.d.ts +3 -1
- package/dist/app/modules/identity/constants.d.ts.map +1 -1
- package/dist/app/modules/identity/constants.mjs +2 -0
- package/dist/app/modules/identity/constants.mjs.map +1 -1
- package/dist/app/modules/identity/module.d.ts.map +1 -1
- package/dist/app/modules/identity/module.mjs +42 -5
- package/dist/app/modules/identity/module.mjs.map +1 -1
- package/dist/app/modules/identity/repositories/client.d.ts +2 -2
- package/dist/app/modules/identity/repositories/client.d.ts.map +1 -1
- package/dist/app/modules/identity/repositories/client.mjs.map +1 -1
- package/dist/app/modules/identity/repositories/robot.d.ts +2 -2
- package/dist/app/modules/identity/repositories/robot.d.ts.map +1 -1
- package/dist/app/modules/identity/repositories/robot.mjs.map +1 -1
- package/dist/app/modules/oauth2/module.d.ts.map +1 -1
- package/dist/app/modules/oauth2/module.mjs +5 -2
- package/dist/app/modules/oauth2/module.mjs.map +1 -1
- package/dist/app/modules/provisioning/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/module.mjs +14 -9
- package/dist/app/modules/provisioning/module.mjs.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.d.ts.map +1 -1
- package/dist/app/modules/provisioning/sources/default/module.mjs +66 -10
- package/dist/app/modules/provisioning/sources/default/module.mjs.map +1 -1
- package/dist/components/database/unique-entries/module.mjs +1 -1
- package/dist/core/entities/client/service.d.ts +1 -1
- package/dist/core/entities/client/service.d.ts.map +1 -1
- package/dist/core/entities/client/service.mjs +27 -23
- package/dist/core/entities/client/service.mjs.map +1 -1
- package/dist/core/entities/client/types.d.ts +6 -2
- package/dist/core/entities/client/types.d.ts.map +1 -1
- package/dist/core/entities/client-scope/service.d.ts.map +1 -1
- package/dist/core/entities/client-scope/service.mjs +2 -0
- package/dist/core/entities/client-scope/service.mjs.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/service.d.ts.map +1 -1
- package/dist/core/entities/identity-provider-role-mapping/service.mjs +2 -0
- package/dist/core/entities/identity-provider-role-mapping/service.mjs.map +1 -1
- package/dist/core/entities/permission/service.mjs +1 -1
- package/dist/core/entities/policy/attributes-validator.mjs +1 -1
- package/dist/core/entities/policy/service.mjs +1 -1
- package/dist/core/entities/realm/service.mjs +1 -1
- package/dist/core/entities/robot/service.d.ts +1 -1
- package/dist/core/entities/robot/service.d.ts.map +1 -1
- package/dist/core/entities/robot/service.mjs +41 -26
- package/dist/core/entities/robot/service.mjs.map +1 -1
- package/dist/core/entities/robot/types.d.ts +6 -2
- package/dist/core/entities/robot/types.d.ts.map +1 -1
- package/dist/core/entities/role/service.mjs +1 -1
- package/dist/core/entities/role/types.d.ts +3 -0
- package/dist/core/entities/role/types.d.ts.map +1 -1
- package/dist/core/entities/role-attribute/service.d.ts +2 -0
- package/dist/core/entities/role-attribute/service.d.ts.map +1 -1
- package/dist/core/entities/role-attribute/service.mjs +7 -3
- package/dist/core/entities/role-attribute/service.mjs.map +1 -1
- package/dist/core/entities/scope/service.mjs +1 -1
- package/dist/core/entities/user/service.d.ts.map +1 -1
- package/dist/core/entities/user/service.mjs +20 -25
- package/dist/core/entities/user/service.mjs.map +1 -1
- package/dist/core/entities/user/types.d.ts +4 -1
- package/dist/core/entities/user/types.d.ts.map +1 -1
- package/dist/core/entities/user-attribute/service.d.ts +3 -1
- package/dist/core/entities/user-attribute/service.d.ts.map +1 -1
- package/dist/core/entities/user-attribute/service.mjs +44 -17
- package/dist/core/entities/user-attribute/service.mjs.map +1 -1
- package/dist/core/identity/index.d.ts +1 -0
- package/dist/core/identity/index.d.ts.map +1 -1
- package/dist/core/identity/index.mjs +2 -1
- package/dist/core/identity/password-recovery/service.d.ts.map +1 -1
- package/dist/core/identity/password-recovery/service.mjs +4 -4
- package/dist/core/identity/password-recovery/service.mjs.map +1 -1
- package/dist/core/identity/permission/module.d.ts +12 -6
- package/dist/core/identity/permission/module.d.ts.map +1 -1
- package/dist/core/identity/permission/module.mjs +11 -19
- package/dist/core/identity/permission/module.mjs.map +1 -1
- package/dist/core/identity/permission/types.d.ts +11 -13
- package/dist/core/identity/permission/types.d.ts.map +1 -1
- package/dist/core/identity/provider/account/module.d.ts.map +1 -1
- package/dist/core/identity/provider/account/module.mjs +3 -2
- package/dist/core/identity/provider/account/module.mjs.map +1 -1
- package/dist/core/identity/role/index.d.ts +3 -0
- package/dist/core/identity/role/index.d.ts.map +1 -0
- package/dist/core/identity/role/index.mjs +2 -0
- package/dist/core/identity/role/module.d.ts +15 -0
- package/dist/core/identity/role/module.d.ts.map +1 -0
- package/dist/core/identity/role/module.mjs +27 -0
- package/dist/core/identity/role/module.mjs.map +1 -0
- package/dist/core/identity/role/types.d.ts +14 -0
- package/dist/core/identity/role/types.d.ts.map +1 -0
- package/dist/core/identity/role/types.mjs +1 -0
- package/dist/core/index.mjs +3 -1
- package/dist/core/oauth2/authorization/code/verifier/module.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/code/verifier/module.mjs +8 -4
- package/dist/core/oauth2/authorization/code/verifier/module.mjs.map +1 -1
- package/dist/core/oauth2/authorization/code/verifier/types.d.ts +2 -0
- package/dist/core/oauth2/authorization/code/verifier/types.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.d.ts.map +1 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.mjs +7 -1
- package/dist/core/oauth2/authorization/code-request/verifier/module.mjs.map +1 -1
- package/dist/core/oauth2/client/authenticator.d.ts +17 -0
- package/dist/core/oauth2/client/authenticator.d.ts.map +1 -0
- package/dist/core/oauth2/client/authenticator.mjs +34 -0
- package/dist/core/oauth2/client/authenticator.mjs.map +1 -0
- package/dist/core/oauth2/client/index.d.ts +1 -0
- package/dist/core/oauth2/client/index.d.ts.map +1 -1
- package/dist/core/oauth2/client/index.mjs +2 -1
- package/dist/core/oauth2/grant-types/password.d.ts +7 -3
- package/dist/core/oauth2/grant-types/password.d.ts.map +1 -1
- package/dist/core/oauth2/grant-types/password.mjs +9 -7
- package/dist/core/oauth2/grant-types/password.mjs.map +1 -1
- package/dist/core/oauth2/index.mjs +3 -1
- package/dist/core/oauth2/token/issuer/access/module.d.ts +4 -1
- package/dist/core/oauth2/token/issuer/access/module.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/access/module.mjs +24 -2
- package/dist/core/oauth2/token/issuer/access/module.mjs.map +1 -1
- package/dist/core/oauth2/token/issuer/base.d.ts.map +1 -1
- package/dist/core/oauth2/token/issuer/base.mjs +3 -2
- package/dist/core/oauth2/token/issuer/base.mjs.map +1 -1
- package/dist/core/provisioning/entities/permission/types.d.ts +8 -0
- package/dist/core/provisioning/entities/permission/types.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/permission/module.d.ts +5 -1
- package/dist/core/provisioning/synchronizer/permission/module.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/permission/module.mjs +23 -0
- package/dist/core/provisioning/synchronizer/permission/module.mjs.map +1 -1
- package/dist/core/provisioning/synchronizer/permission/types.d.ts +4 -1
- package/dist/core/provisioning/synchronizer/permission/types.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/policy/module.d.ts.map +1 -1
- package/dist/core/provisioning/synchronizer/policy/module.mjs +4 -2
- package/dist/core/provisioning/synchronizer/policy/module.mjs.map +1 -1
- package/dist/index.mjs +19 -20
- package/dist/path.d.ts +2 -1
- package/dist/path.d.ts.map +1 -1
- package/dist/path.mjs +3 -2
- package/dist/path.mjs.map +1 -1
- package/dist/swagger.json +14 -0
- package/dist/ui/client/.vite/ssr-manifest.json +2777 -0
- package/dist/ui/client/assets/fa-brands-400-BP5tdqmh.woff2 +0 -0
- package/dist/ui/client/assets/fa-regular-400-nyy7hhHF.woff2 +0 -0
- package/dist/ui/client/assets/fa-solid-900-DRAAbZTg.woff2 +0 -0
- package/dist/ui/client/assets/index-BVfayRKv.css +1 -0
- package/dist/ui/client/assets/index-Noe7uiOY.js +41 -0
- package/dist/ui/client/index.html +22 -0
- package/dist/ui/server/assets/multipart-parser-pHQi-kA6.js +166 -0
- package/dist/ui/server/server.js +79116 -0
- package/package.json +30 -13
- package/dist/adapters/database/domains/client/repository.d.ts +0 -13
- package/dist/adapters/database/domains/client/repository.d.ts.map +0 -1
- package/dist/adapters/database/domains/client/repository.mjs +0 -75
- package/dist/adapters/database/domains/client/repository.mjs.map +0 -1
- package/dist/adapters/database/domains/robot/repository.d.ts +0 -13
- package/dist/adapters/database/domains/robot/repository.d.ts.map +0 -1
- package/dist/adapters/database/domains/robot/repository.mjs +0 -75
- package/dist/adapters/database/domains/robot/repository.mjs.map +0 -1
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts +0 -4
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.d.ts.map +0 -1
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs +0 -35
- package/dist/adapters/http/controllers/entities/user-attribute/utils/authorization.mjs.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Client, Realm } from '@authup/core-kit';
|
|
1
|
+
import type { Client, Realm, Role } from '@authup/core-kit';
|
|
2
|
+
import type { PermissionPolicyBinding } from '@authup/access';
|
|
2
3
|
import type { Repository } from 'typeorm';
|
|
3
4
|
import type { EntityRepositoryFindManyResult, IClientRepository } from '../../../../../core/index.ts';
|
|
4
5
|
export type ClientRepositoryAdapterContext = {
|
|
@@ -12,6 +13,7 @@ export declare class ClientRepositoryAdapter implements IClientRepository {
|
|
|
12
13
|
findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Client>>;
|
|
13
14
|
findOneById(id: string): Promise<Client | null>;
|
|
14
15
|
findOneByName(name: string, realmKey?: string): Promise<Client | null>;
|
|
16
|
+
findOne(id: string, query?: Record<string, any>, realmKey?: string): Promise<Client | null>;
|
|
15
17
|
findOneByIdOrName(idOrName: string, realm?: string): Promise<Client | null>;
|
|
16
18
|
findManyBy(where: Record<string, any>): Promise<Client[]>;
|
|
17
19
|
findOneBy(where: Record<string, any>): Promise<Client | null>;
|
|
@@ -22,5 +24,7 @@ export declare class ClientRepositoryAdapter implements IClientRepository {
|
|
|
22
24
|
remove(entity: Client): Promise<void>;
|
|
23
25
|
validateJoinColumns(data: Partial<Client>): Promise<void>;
|
|
24
26
|
checkUniqueness(data: Partial<Client>, existing?: Client): Promise<void>;
|
|
27
|
+
getBoundRoles(entity: string | Client): Promise<Role[]>;
|
|
28
|
+
getBoundPermissions(entity: string | Client): Promise<PermissionPolicyBinding[]>;
|
|
25
29
|
}
|
|
26
30
|
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -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,MAAM,kBAAkB,CAAC;
|
|
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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { CachePrefix } from "../../../../../adapters/database/domains/constants.mjs";
|
|
1
2
|
import { ClientEntity } from "../../../../../adapters/database/domains/client/entity.mjs";
|
|
3
|
+
import { ClientRoleEntity } from "../../../../../adapters/database/domains/client-role/entity.mjs";
|
|
4
|
+
import { ClientPermissionEntity } from "../../../../../adapters/database/domains/client-permission/entity.mjs";
|
|
2
5
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
3
6
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
4
7
|
import "../../../../../adapters/database/index.mjs";
|
|
5
8
|
import { translateWhereConditions } from "../helpers.mjs";
|
|
9
|
+
import { loadBoundPermissions } from "../bindings.mjs";
|
|
6
10
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
11
|
+
import { buildRedisKeyPath } from "@authup/server-kit";
|
|
7
12
|
import { isUUID } from "@authup/kit";
|
|
8
13
|
import { applyQuery, isEntityUnique, validateEntityJoinColumns } from "typeorm-extension";
|
|
9
14
|
//#region src/app/modules/database/repositories/client/repository.ts
|
|
@@ -74,13 +79,52 @@ var ClientRepositoryAdapter = class {
|
|
|
74
79
|
}
|
|
75
80
|
async findOneByName(name, realmKey) {
|
|
76
81
|
const qb = this.repository.createQueryBuilder("client");
|
|
77
|
-
qb.where("client.name
|
|
82
|
+
qb.where("client.name = :name", { name });
|
|
78
83
|
if (realmKey) {
|
|
79
84
|
const realm = await this.realmRepository.resolve(realmKey);
|
|
80
85
|
if (realm) qb.andWhere("client.realm_id = :realmId", { realmId: realm.id });
|
|
81
86
|
}
|
|
82
87
|
return qb.getOne();
|
|
83
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
|
+
}
|
|
84
128
|
async findOneByIdOrName(idOrName, realm) {
|
|
85
129
|
return isUUID(idOrName) ? this.findOneById(idOrName) : this.findOneByName(idOrName, realm);
|
|
86
130
|
}
|
|
@@ -124,6 +168,30 @@ var ClientRepositoryAdapter = class {
|
|
|
124
168
|
entityExisting: existing
|
|
125
169
|
})) throw new DatabaseConflictError();
|
|
126
170
|
}
|
|
171
|
+
async getBoundRoles(entity) {
|
|
172
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
173
|
+
return (await this.repository.manager.getRepository(ClientRoleEntity).find({
|
|
174
|
+
where: { client_id: id },
|
|
175
|
+
relations: { role: true },
|
|
176
|
+
cache: {
|
|
177
|
+
id: buildRedisKeyPath({
|
|
178
|
+
prefix: CachePrefix.CLIENT_OWNED_ROLES,
|
|
179
|
+
key: id
|
|
180
|
+
}),
|
|
181
|
+
milliseconds: 6e4
|
|
182
|
+
}
|
|
183
|
+
})).map((entry) => entry.role);
|
|
184
|
+
}
|
|
185
|
+
async getBoundPermissions(entity) {
|
|
186
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
187
|
+
return loadBoundPermissions({
|
|
188
|
+
manager: this.repository.manager,
|
|
189
|
+
junctionTarget: ClientPermissionEntity,
|
|
190
|
+
where: { client_id: id },
|
|
191
|
+
cachePrefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,
|
|
192
|
+
cacheKey: id
|
|
193
|
+
});
|
|
194
|
+
}
|
|
127
195
|
};
|
|
128
196
|
//#endregion
|
|
129
197
|
export { ClientRepositoryAdapter };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mjs","names":["isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","ClientEntity","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"],"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 } from '@authup/core-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 { ClientEntity } 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"],"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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Realm, Robot } from '@authup/core-kit';
|
|
1
|
+
import type { Realm, Robot, Role } from '@authup/core-kit';
|
|
2
|
+
import type { PermissionPolicyBinding } from '@authup/access';
|
|
2
3
|
import type { Repository } from 'typeorm';
|
|
3
4
|
import type { EntityRepositoryFindManyResult, IRobotRepository } from '../../../../../core/index.ts';
|
|
4
5
|
export type RobotRepositoryAdapterContext = {
|
|
@@ -13,6 +14,7 @@ export declare class RobotRepositoryAdapter implements IRobotRepository {
|
|
|
13
14
|
findOneById(id: string): Promise<Robot | null>;
|
|
14
15
|
findOneByName(name: string, realmKey?: string): Promise<Robot | null>;
|
|
15
16
|
findOneByIdOrName(idOrName: string, realm?: string): Promise<Robot | null>;
|
|
17
|
+
findOne(id: string, query?: Record<string, any>, realmKey?: string): Promise<Robot | null>;
|
|
16
18
|
findManyBy(where: Record<string, any>): Promise<Robot[]>;
|
|
17
19
|
findOneBy(where: Record<string, any>): Promise<Robot | null>;
|
|
18
20
|
findOneWithSecret(where: Record<string, any>): Promise<Robot | null>;
|
|
@@ -22,5 +24,7 @@ export declare class RobotRepositoryAdapter implements IRobotRepository {
|
|
|
22
24
|
remove(entity: Robot): Promise<void>;
|
|
23
25
|
validateJoinColumns(data: Partial<Robot>): Promise<void>;
|
|
24
26
|
checkUniqueness(data: Partial<Robot>, existing?: Robot): Promise<void>;
|
|
27
|
+
getBoundRoles(entity: string | Robot): Promise<Role[]>;
|
|
28
|
+
getBoundPermissions(entity: string | Robot): Promise<PermissionPolicyBinding[]>;
|
|
25
29
|
}
|
|
26
30
|
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -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,MAAM,kBAAkB,CAAC;
|
|
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"}
|
|
@@ -1,9 +1,14 @@
|
|
|
1
|
+
import { CachePrefix } from "../../../../../adapters/database/domains/constants.mjs";
|
|
1
2
|
import { RobotEntity } from "../../../../../adapters/database/domains/robot/entity.mjs";
|
|
3
|
+
import { RobotPermissionEntity } from "../../../../../adapters/database/domains/robot-permission/entity.mjs";
|
|
4
|
+
import { RobotRoleEntity } from "../../../../../adapters/database/domains/robot-role/entity.mjs";
|
|
2
5
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
3
6
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
4
7
|
import "../../../../../adapters/database/index.mjs";
|
|
5
8
|
import { translateWhereConditions } from "../helpers.mjs";
|
|
9
|
+
import { loadBoundPermissions } from "../bindings.mjs";
|
|
6
10
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
11
|
+
import { buildRedisKeyPath } from "@authup/server-kit";
|
|
7
12
|
import { isUUID } from "@authup/kit";
|
|
8
13
|
import { applyQuery, isEntityUnique, validateEntityJoinColumns } from "typeorm-extension";
|
|
9
14
|
//#region src/app/modules/database/repositories/robot/repository.ts
|
|
@@ -68,7 +73,7 @@ var RobotRepositoryAdapter = class {
|
|
|
68
73
|
}
|
|
69
74
|
async findOneByName(name, realmKey) {
|
|
70
75
|
const qb = this.repository.createQueryBuilder("robot");
|
|
71
|
-
qb.where("robot.name
|
|
76
|
+
qb.where("robot.name = :name", { name });
|
|
72
77
|
if (realmKey) {
|
|
73
78
|
const realm = await this.realmRepository.resolve(realmKey);
|
|
74
79
|
if (realm) qb.andWhere("robot.realm_id = :realmId", { realmId: realm.id });
|
|
@@ -78,6 +83,37 @@ var RobotRepositoryAdapter = class {
|
|
|
78
83
|
async findOneByIdOrName(idOrName, realm) {
|
|
79
84
|
return isUUID(idOrName) ? this.findOneById(idOrName) : this.findOneByName(idOrName, realm);
|
|
80
85
|
}
|
|
86
|
+
async findOne(id, query, realmKey) {
|
|
87
|
+
const qb = this.repository.createQueryBuilder("robot");
|
|
88
|
+
if (isUUID(id)) qb.where("robot.id = :id", { id });
|
|
89
|
+
else {
|
|
90
|
+
qb.where("robot.name = :name", { name: id });
|
|
91
|
+
if (realmKey) {
|
|
92
|
+
const realm = await this.realmRepository.resolve(realmKey);
|
|
93
|
+
if (!realm) return null;
|
|
94
|
+
qb.andWhere("robot.realm_id = :realmId", { realmId: realm.id });
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
applyQuery(qb, query || {}, {
|
|
98
|
+
defaultAlias: "robot",
|
|
99
|
+
fields: {
|
|
100
|
+
default: [
|
|
101
|
+
"id",
|
|
102
|
+
"name",
|
|
103
|
+
"display_name",
|
|
104
|
+
"description",
|
|
105
|
+
"active",
|
|
106
|
+
"user_id",
|
|
107
|
+
"realm_id",
|
|
108
|
+
"created_at",
|
|
109
|
+
"updated_at"
|
|
110
|
+
],
|
|
111
|
+
allowed: ["secret"]
|
|
112
|
+
},
|
|
113
|
+
relations: { allowed: ["realm", "user"] }
|
|
114
|
+
});
|
|
115
|
+
return qb.getOne();
|
|
116
|
+
}
|
|
81
117
|
async findManyBy(where) {
|
|
82
118
|
return this.repository.findBy(translateWhereConditions(where));
|
|
83
119
|
}
|
|
@@ -118,6 +154,30 @@ var RobotRepositoryAdapter = class {
|
|
|
118
154
|
entityExisting: existing
|
|
119
155
|
})) throw new DatabaseConflictError();
|
|
120
156
|
}
|
|
157
|
+
async getBoundRoles(entity) {
|
|
158
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
159
|
+
return (await this.repository.manager.getRepository(RobotRoleEntity).find({
|
|
160
|
+
where: { robot_id: id },
|
|
161
|
+
relations: { role: true },
|
|
162
|
+
cache: {
|
|
163
|
+
id: buildRedisKeyPath({
|
|
164
|
+
prefix: CachePrefix.ROBOT_OWNED_ROLES,
|
|
165
|
+
key: id
|
|
166
|
+
}),
|
|
167
|
+
milliseconds: 6e4
|
|
168
|
+
}
|
|
169
|
+
})).map((entry) => entry.role);
|
|
170
|
+
}
|
|
171
|
+
async getBoundPermissions(entity) {
|
|
172
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
173
|
+
return loadBoundPermissions({
|
|
174
|
+
manager: this.repository.manager,
|
|
175
|
+
junctionTarget: RobotPermissionEntity,
|
|
176
|
+
where: { robot_id: id },
|
|
177
|
+
cachePrefix: CachePrefix.ROBOT_OWNED_PERMISSIONS,
|
|
178
|
+
cacheKey: id
|
|
179
|
+
});
|
|
180
|
+
}
|
|
121
181
|
};
|
|
122
182
|
//#endregion
|
|
123
183
|
export { RobotRepositoryAdapter };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.mjs","names":["isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","RobotEntity","RealmRepositoryAdapter","RobotRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","allowed","default","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"],"sources":["../../../../../../src/app/modules/database/repositories/robot/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, Robot } from '@authup/core-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IRealmRepository, IRobotRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { RobotEntity } from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type RobotRepositoryAdapterContext = {\n repository: Repository<Robot>,\n realmRepository: Repository<Realm>,\n};\n\nexport class RobotRepositoryAdapter implements IRobotRepository {\n private readonly repository: Repository<Robot>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: RobotRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Robot>> {\n const qb = this.repository.createQueryBuilder('robot');\n qb.groupBy('robot.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'robot',\n fields: {\n allowed: [\n 'secret',\n ],\n default: [\n 'id',\n 'name',\n 'display_name',\n 'description',\n 'active',\n 'user_id',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: { allowed: ['id', 'name', 'realm_id', 'user_id'] },\n pagination: { maxLimit: 50 },\n relations: {\n // @ts-expect-error onJoin is not in the type definition\n allowed: ['realm', 'user'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'realm_id', 'user_id', 'updated_at', 'created_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<Robot | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Robot | null> {\n const qb = this.repository.createQueryBuilder('robot');\n qb.where('robot.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('robot.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Robot | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Robot[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Robot | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneWithSecret(where: Record<string, any>): Promise<Robot | null> {\n const qb = this.repository.createQueryBuilder('robot');\n\n Object.entries(where).forEach(([key, value]) => {\n qb.andWhere(`robot.${key} = :${key}`, { [key]: value });\n });\n\n qb.addSelect('robot.secret');\n\n return qb.getOne();\n }\n\n create(data: Partial<Robot>): Robot {\n return this.repository.create(data);\n }\n\n merge(entity: Robot, data: Partial<Robot>): Robot {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Robot): Promise<Robot> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Robot): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Robot>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RobotEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Robot>, existing?: Robot): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: RobotEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\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","RobotEntity","RobotPermissionEntity","RobotRoleEntity","RealmRepositoryAdapter","RobotRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","allowed","default","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","findOne","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","robot_id","role","cache","prefix","ROBOT_OWNED_ROLES","milliseconds","map","entry","getBoundPermissions","junctionTarget","cachePrefix","ROBOT_OWNED_PERMISSIONS","cacheKey"],"sources":["../../../../../../src/app/modules/database/repositories/robot/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, Robot, 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, IRealmRepository, IRobotRepository } 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 RobotEntity,\n RobotPermissionEntity,\n RobotRoleEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type RobotRepositoryAdapterContext = {\n repository: Repository<Robot>,\n realmRepository: Repository<Realm>,\n};\n\nexport class RobotRepositoryAdapter implements IRobotRepository {\n private readonly repository: Repository<Robot>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: RobotRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Robot>> {\n const qb = this.repository.createQueryBuilder('robot');\n qb.groupBy('robot.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'robot',\n fields: {\n allowed: [\n 'secret',\n ],\n default: [\n 'id',\n 'name',\n 'display_name',\n 'description',\n 'active',\n 'user_id',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n },\n filters: { allowed: ['id', 'name', 'realm_id', 'user_id'] },\n pagination: { maxLimit: 50 },\n relations: {\n // @ts-expect-error onJoin is not in the type definition\n allowed: ['realm', 'user'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'realm_id', 'user_id', 'updated_at', 'created_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<Robot | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Robot | null> {\n const qb = this.repository.createQueryBuilder('robot');\n qb.where('robot.name = :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('robot.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Robot | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findOne(id: string, query?: Record<string, any>, realmKey?: string): Promise<Robot | null> {\n const qb = this.repository.createQueryBuilder('robot');\n\n if (isUUID(id)) {\n qb.where('robot.id = :id', { id });\n } else {\n qb.where('robot.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('robot.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n applyQuery(qb, query || {}, {\n defaultAlias: 'robot',\n fields: {\n default: [\n 'id',\n 'name',\n 'display_name',\n 'description',\n 'active',\n 'user_id',\n 'realm_id',\n 'created_at',\n 'updated_at',\n ],\n allowed: ['secret'],\n },\n relations: {\n // @ts-expect-error 'user' is a valid relation but not in the type definition\n allowed: ['realm', 'user'],\n },\n });\n\n return qb.getOne();\n }\n\n async findManyBy(where: Record<string, any>): Promise<Robot[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Robot | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneWithSecret(where: Record<string, any>): Promise<Robot | null> {\n const qb = this.repository.createQueryBuilder('robot');\n\n Object.entries(where).forEach(([key, value]) => {\n qb.andWhere(`robot.${key} = :${key}`, { [key]: value });\n });\n\n qb.addSelect('robot.secret');\n\n return qb.getOne();\n }\n\n create(data: Partial<Robot>): Robot {\n return this.repository.create(data);\n }\n\n merge(entity: Robot, data: Partial<Robot>): Robot {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Robot): Promise<Robot> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Robot): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Robot>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: RobotEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Robot>, existing?: Robot): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: RobotEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundRoles(entity: string | Robot): Promise<Role[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n const entries = await this.repository.manager\n .getRepository(RobotRoleEntity)\n .find({\n where: { robot_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.ROBOT_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 | Robot): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: RobotPermissionEntity,\n where: { robot_id: id },\n cachePrefix: CachePrefix.ROBOT_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Realm, Role } from '@authup/core-kit';
|
|
2
|
+
import type { PermissionPolicyBinding } from '@authup/access';
|
|
2
3
|
import type { Repository } from 'typeorm';
|
|
3
4
|
import type { EntityRepositoryFindManyResult, IRoleRepository } from '../../../../../core/index.ts';
|
|
4
5
|
export type RoleRepositoryAdapterContext = {
|
|
@@ -21,5 +22,7 @@ export declare class RoleRepositoryAdapter implements IRoleRepository {
|
|
|
21
22
|
remove(entity: Role): Promise<void>;
|
|
22
23
|
validateJoinColumns(data: Partial<Role>): Promise<void>;
|
|
23
24
|
checkUniqueness(data: Partial<Role>, existing?: Role): Promise<void>;
|
|
25
|
+
getBoundPermissions(entity: string | Role): Promise<PermissionPolicyBinding[]>;
|
|
26
|
+
getBoundPermissionsForMany(entities: (string | Role)[]): Promise<PermissionPolicyBinding[]>;
|
|
24
27
|
}
|
|
25
28
|
//# sourceMappingURL=repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/role/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../../../../src/app/modules/database/repositories/role/repository.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,OAAO,KAAK,EAAE,8BAA8B,EAAoB,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAWtH,MAAM,MAAM,4BAA4B,GAAG;IACvC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAC7B,eAAe,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;CACtC,CAAC;AAEF,qBAAa,qBAAsB,YAAW,eAAe;IACzD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAE9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAmB;gBAEvC,GAAG,EAAE,4BAA4B;IAKvC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,8BAA8B,CAAC,IAAI,CAAC,CAAC;IAkCzF,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIvC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAcpE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAMzE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAIvD,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAIjE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIjC,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIxC,IAAI,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjC,MAAM,CAAC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAInC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAOvD,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAapE,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAW9E,0BAA0B,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,uBAAuB,EAAE,CAAC;CAIpG"}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
+
import { CachePrefix } from "../../../../../adapters/database/domains/constants.mjs";
|
|
1
2
|
import { RoleEntity } from "../../../../../adapters/database/domains/role/entity.mjs";
|
|
3
|
+
import { RolePermissionEntity } from "../../../../../adapters/database/domains/role-permission/entity.mjs";
|
|
2
4
|
import "../../../../../adapters/database/domains/index.mjs";
|
|
3
5
|
import { DatabaseConflictError } from "../../../../../adapters/database/errors/conflict.mjs";
|
|
4
6
|
import "../../../../../adapters/database/index.mjs";
|
|
5
7
|
import { translateWhereConditions } from "../helpers.mjs";
|
|
8
|
+
import { loadBoundPermissions } from "../bindings.mjs";
|
|
6
9
|
import { RealmRepositoryAdapter } from "../realm/repository.mjs";
|
|
7
10
|
import { isUUID } from "@authup/kit";
|
|
8
11
|
import { applyQuery, isEntityUnique, validateEntityJoinColumns } from "typeorm-extension";
|
|
@@ -57,7 +60,7 @@ var RoleRepositoryAdapter = class {
|
|
|
57
60
|
}
|
|
58
61
|
async findOneByName(name, realmKey) {
|
|
59
62
|
const qb = this.repository.createQueryBuilder("role");
|
|
60
|
-
qb.where("role.name
|
|
63
|
+
qb.where("role.name = :name", { name });
|
|
61
64
|
if (realmKey) {
|
|
62
65
|
const realm = await this.realmRepository.resolve(realmKey);
|
|
63
66
|
if (realm) qb.andWhere("role.realm_id = :realmId", { realmId: realm.id });
|
|
@@ -99,6 +102,19 @@ var RoleRepositoryAdapter = class {
|
|
|
99
102
|
entityExisting: existing
|
|
100
103
|
})) throw new DatabaseConflictError();
|
|
101
104
|
}
|
|
105
|
+
async getBoundPermissions(entity) {
|
|
106
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
107
|
+
return loadBoundPermissions({
|
|
108
|
+
manager: this.repository.manager,
|
|
109
|
+
junctionTarget: RolePermissionEntity,
|
|
110
|
+
where: { role_id: id },
|
|
111
|
+
cachePrefix: CachePrefix.ROLE_OWNED_PERMISSIONS,
|
|
112
|
+
cacheKey: id
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
async getBoundPermissionsForMany(entities) {
|
|
116
|
+
return (await Promise.all(entities.map((entity) => this.getBoundPermissions(entity)))).flat();
|
|
117
|
+
}
|
|
102
118
|
};
|
|
103
119
|
//#endregion
|
|
104
120
|
export { RoleRepositoryAdapter };
|