@authup/server-core 1.0.0-beta.37 → 1.0.0-beta.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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/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/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 +4 -1
- package/dist/app/modules/database/repositories/client/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/client/repository.mjs +29 -0
- package/dist/app/modules/database/repositories/client/repository.mjs.map +1 -1
- package/dist/app/modules/database/repositories/robot/repository.d.ts +4 -1
- package/dist/app/modules/database/repositories/robot/repository.d.ts.map +1 -1
- package/dist/app/modules/database/repositories/robot/repository.mjs +29 -0
- 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 +16 -0
- package/dist/app/modules/database/repositories/role/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 +29 -0
- 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 +30 -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.map +1 -1
- package/dist/core/entities/client/service.mjs +15 -4
- package/dist/core/entities/client/service.mjs.map +1 -1
- package/dist/core/entities/client/types.d.ts +4 -1
- 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.map +1 -1
- package/dist/core/entities/robot/service.mjs +29 -8
- package/dist/core/entities/robot/service.mjs.map +1 -1
- package/dist/core/entities/robot/types.d.ts +4 -1
- 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 +10 -12
- 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/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/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 +2 -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/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 +18 -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-AHa03lX_.js +41 -0
- package/dist/ui/client/assets/index-BVfayRKv.css +1 -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 +79102 -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
|
@@ -4,6 +4,13 @@ import { CachePrefix } from "./domains/constants.mjs";
|
|
|
4
4
|
import { RealmSubscriber } from "./domains/realm/subscriber.mjs";
|
|
5
5
|
import { KeyEntity } from "./domains/key/entity.mjs";
|
|
6
6
|
import { ClientEntity } from "./domains/client/entity.mjs";
|
|
7
|
+
import { ClientSubscriber } from "./domains/client/subscriber.mjs";
|
|
8
|
+
import { RoleEntity } from "./domains/role/entity.mjs";
|
|
9
|
+
import { RoleAttributeEntity } from "./domains/role-attribute/entity.mjs";
|
|
10
|
+
import { RoleRepository } from "./domains/role/repository.mjs";
|
|
11
|
+
import { RoleSubscriber } from "./domains/role/subscriber.mjs";
|
|
12
|
+
import { ClientRoleEntity } from "./domains/client-role/entity.mjs";
|
|
13
|
+
import { ClientRoleSubscriber } from "./domains/client-role/subscriber.mjs";
|
|
7
14
|
import { PermissionEntity } from "./domains/permission/entity.mjs";
|
|
8
15
|
import { PermissionSubscriber } from "./domains/permission/subscriber.mjs";
|
|
9
16
|
import { PolicyEntity } from "./domains/policy/entity.mjs";
|
|
@@ -13,16 +20,6 @@ import { PolicyRepository } from "./domains/policy/repository.mjs";
|
|
|
13
20
|
import { PolicySubscriber } from "./domains/policy/subscriber.mjs";
|
|
14
21
|
import { ClientPermissionEntity } from "./domains/client-permission/entity.mjs";
|
|
15
22
|
import { ClientPermissionSubscriber } from "./domains/client-permission/subscriber.mjs";
|
|
16
|
-
import { RoleEntity } from "./domains/role/entity.mjs";
|
|
17
|
-
import { RoleAttributeEntity } from "./domains/role-attribute/entity.mjs";
|
|
18
|
-
import { RolePermissionEntity } from "./domains/role-permission/entity.mjs";
|
|
19
|
-
import { RolePermissionSubscriber } from "./domains/role-permission/subscriber.mjs";
|
|
20
|
-
import { RoleRepository } from "./domains/role/repository.mjs";
|
|
21
|
-
import { RoleSubscriber } from "./domains/role/subscriber.mjs";
|
|
22
|
-
import { ClientRoleEntity } from "./domains/client-role/entity.mjs";
|
|
23
|
-
import { ClientRoleSubscriber } from "./domains/client-role/subscriber.mjs";
|
|
24
|
-
import { ClientRepository } from "./domains/client/repository.mjs";
|
|
25
|
-
import { ClientSubscriber } from "./domains/client/subscriber.mjs";
|
|
26
23
|
import { ScopeEntity } from "./domains/scope/entity.mjs";
|
|
27
24
|
import { ScopeSubscriber } from "./domains/scope/subscriber.mjs";
|
|
28
25
|
import { ClientScopeEntity } from "./domains/client-scope/entity.mjs";
|
|
@@ -35,10 +32,6 @@ import { IdentityProviderSubscriber } from "./domains/identity-provider/subscrib
|
|
|
35
32
|
import { UserEntity } from "./domains/user/entity.mjs";
|
|
36
33
|
import { UserAttributeEntity } from "./domains/user-attribute/entity.mjs";
|
|
37
34
|
import { UserAttributeSubscriber } from "./domains/user-attribute/subscriber.mjs";
|
|
38
|
-
import { UserPermissionEntity } from "./domains/user-permission/entity.mjs";
|
|
39
|
-
import { UserPermissionSubscriber } from "./domains/user-permission/subscriber.mjs";
|
|
40
|
-
import { UserRoleEntity } from "./domains/user-role/entity.mjs";
|
|
41
|
-
import { UserRoleSubscriber } from "./domains/user-role/subscriber.mjs";
|
|
42
35
|
import { UserRepository } from "./domains/user/repository.mjs";
|
|
43
36
|
import { UserSubscriber } from "./domains/user/subscriber.mjs";
|
|
44
37
|
import { IdentityProviderAccountEntity } from "./domains/identity-provider-account/entity.mjs";
|
|
@@ -48,15 +41,20 @@ import { IdentityProviderPermissionMappingEntity } from "./domains/identity-prov
|
|
|
48
41
|
import { IdentityProviderRoleMappingEntity } from "./domains/identity-provider-role-mapping/entity.mjs";
|
|
49
42
|
import { IdentityProviderRoleSubscriber } from "./domains/identity-provider-role-mapping/subscriber.mjs";
|
|
50
43
|
import { RobotEntity } from "./domains/robot/entity.mjs";
|
|
51
|
-
import { RobotRoleEntity } from "./domains/robot-role/entity.mjs";
|
|
52
|
-
import { RobotRoleSubscriber } from "./domains/robot-role/subscriber.mjs";
|
|
53
|
-
import { RobotPermissionEntity } from "./domains/robot-permission/entity.mjs";
|
|
54
|
-
import { RobotPermissionSubscriber } from "./domains/robot-permission/subscriber.mjs";
|
|
55
|
-
import { RobotRepository } from "./domains/robot/repository.mjs";
|
|
56
44
|
import { RobotSubscriber } from "./domains/robot/subscriber.mjs";
|
|
57
45
|
import { SessionEntity } from "./domains/session/entity.mjs";
|
|
58
46
|
import { PermissionPolicyEntity } from "./domains/permission-policy/entity.mjs";
|
|
47
|
+
import { RobotPermissionEntity } from "./domains/robot-permission/entity.mjs";
|
|
48
|
+
import { RobotPermissionSubscriber } from "./domains/robot-permission/subscriber.mjs";
|
|
49
|
+
import { RobotRoleEntity } from "./domains/robot-role/entity.mjs";
|
|
50
|
+
import { RobotRoleSubscriber } from "./domains/robot-role/subscriber.mjs";
|
|
59
51
|
import { RoleAttributeSubscriber } from "./domains/role-attribute/subscriber.mjs";
|
|
52
|
+
import { RolePermissionEntity } from "./domains/role-permission/entity.mjs";
|
|
53
|
+
import { RolePermissionSubscriber } from "./domains/role-permission/subscriber.mjs";
|
|
54
|
+
import { UserPermissionEntity } from "./domains/user-permission/entity.mjs";
|
|
55
|
+
import { UserPermissionSubscriber } from "./domains/user-permission/subscriber.mjs";
|
|
56
|
+
import { UserRoleEntity } from "./domains/user-role/entity.mjs";
|
|
57
|
+
import { UserRoleSubscriber } from "./domains/user-role/subscriber.mjs";
|
|
60
58
|
import "./domains/index.mjs";
|
|
61
59
|
import { DatabaseQueryResultCache } from "./cache/module.mjs";
|
|
62
60
|
import "./cache/index.mjs";
|
|
@@ -67,4 +65,4 @@ import { DatabaseConflictError } from "./errors/conflict.mjs";
|
|
|
67
65
|
import "./errors/index.mjs";
|
|
68
66
|
import { isDatabaseTypeSupported, isDatabaseTypeSupportedForEnvironment } from "./helpers/is-supported.mjs";
|
|
69
67
|
import "./helpers/index.mjs";
|
|
70
|
-
export { CachePrefix, ClientEntity, ClientPermissionEntity, ClientPermissionSubscriber,
|
|
68
|
+
export { CachePrefix, ClientEntity, ClientPermissionEntity, ClientPermissionSubscriber, ClientRoleEntity, ClientRoleSubscriber, ClientScopeEntity, ClientScopeSubscriber, ClientSubscriber, DataSourceOptionsBuilder, DatabaseConflictError, DatabaseQueryResultCache, IdentityProviderAccountEntity, IdentityProviderAccountSubscriber, IdentityProviderAttributeEntity, IdentityProviderAttributeMappingEntity, IdentityProviderAttributeSubscriber, IdentityProviderEntity, IdentityProviderPermissionMappingEntity, IdentityProviderRepository, IdentityProviderRoleMappingEntity, IdentityProviderRoleSubscriber, IdentityProviderSubscriber, KeyEntity, PermissionEntity, PermissionPolicyEntity, PermissionSubscriber, PolicyAttributeEntity, PolicyAttributeSubscriber, PolicyEntity, PolicyRepository, PolicySubscriber, RealmEntity, RealmRepository, RealmSubscriber, RobotEntity, RobotPermissionEntity, RobotPermissionSubscriber, RobotRoleEntity, RobotRoleSubscriber, RobotSubscriber, RoleAttributeEntity, RoleAttributeSubscriber, RoleEntity, RolePermissionEntity, RolePermissionSubscriber, RoleRepository, RoleSubscriber, ScopeEntity, ScopeSubscriber, SessionEntity, UserAttributeEntity, UserAttributeSubscriber, UserEntity, UserPermissionEntity, UserPermissionSubscriber, UserRepository, UserRoleEntity, UserRoleSubscriber, UserSubscriber, isDatabaseTypeSupported, isDatabaseTypeSupportedForEnvironment, setDataSourceSync, unsetDataSourceSync, useDataSourceSync };
|
|
@@ -9,8 +9,8 @@ import "../../../request/index.mjs";
|
|
|
9
9
|
import { ForceLoggedInMiddleware } from "../../../middleware/built-in/loggedin/module.mjs";
|
|
10
10
|
import "../../../middleware/index.mjs";
|
|
11
11
|
import { IdentityProviderAttributesValidator, IdentityProviderValidator, IdentityType, PermissionName, ValidatorGroup, isOAuth2IdentityProvider, isOpenIDIdentityProvider } from "@authup/core-kit";
|
|
12
|
-
import { BuiltInPolicyType, PolicyData } from "@authup/access";
|
|
13
12
|
import { base64URLDecode, isUUID } from "@authup/kit";
|
|
13
|
+
import { BuiltInPolicyType, PolicyData } from "@authup/access";
|
|
14
14
|
import { OAuth2Error } from "@authup/specs";
|
|
15
15
|
import { BadRequestError, NotFoundError } from "@ebec/http";
|
|
16
16
|
import { getRequestHeader, getRequestIP, send, sendAccepted, sendCreated, sendRedirect, useRequestParam } from "routup";
|
|
@@ -5,8 +5,8 @@ import { buildActorContext } from "../../../request/helpers/actor.mjs";
|
|
|
5
5
|
import "../../../request/index.mjs";
|
|
6
6
|
import { ForceLoggedInMiddleware } from "../../../middleware/built-in/loggedin/module.mjs";
|
|
7
7
|
import "../../../middleware/index.mjs";
|
|
8
|
-
import { BuiltInPolicyType, PermissionEvaluator, PolicyData } from "@authup/access";
|
|
9
8
|
import { isUUID } from "@authup/kit";
|
|
9
|
+
import { BuiltInPolicyType, PermissionEvaluator, PolicyData } from "@authup/access";
|
|
10
10
|
import { NotFoundError } from "@ebec/http";
|
|
11
11
|
import { send, sendAccepted, sendCreated, useRequestParam } from "routup";
|
|
12
12
|
import { useRequestQuery } from "@routup/basic/query";
|
|
@@ -5,8 +5,8 @@ import { buildActorContext } from "../../../request/helpers/actor.mjs";
|
|
|
5
5
|
import "../../../request/index.mjs";
|
|
6
6
|
import { ForceLoggedInMiddleware } from "../../../middleware/built-in/loggedin/module.mjs";
|
|
7
7
|
import "../../../middleware/index.mjs";
|
|
8
|
-
import { BuiltInPolicyType, PolicyData, definePolicyEvaluationContext } from "@authup/access";
|
|
9
8
|
import { isUUID } from "@authup/kit";
|
|
9
|
+
import { BuiltInPolicyType, PolicyData, definePolicyEvaluationContext } from "@authup/access";
|
|
10
10
|
import { NotFoundError } from "@ebec/http";
|
|
11
11
|
import { send, sendAccepted, sendCreated, useRequestParam } from "routup";
|
|
12
12
|
import { useRequestQuery } from "@routup/basic/query";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AttributeNamesPolicyValidator, AttributesPolicyValidator, BuiltInPolicyType, DatePolicyValidator, TimePolicyValidator } from "@authup/access";
|
|
2
1
|
import { omitRecord } from "@authup/kit";
|
|
2
|
+
import { AttributeNamesPolicyValidator, AttributesPolicyValidator, BuiltInPolicyType, DatePolicyValidator, TimePolicyValidator } from "@authup/access";
|
|
3
3
|
import { Container } from "validup";
|
|
4
4
|
//#region src/adapters/http/controllers/entities/policy/utils/attributes-validator.ts
|
|
5
5
|
var PolicyAttributesValidator = class extends Container {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/authorize/module.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAU,8BAA8B,EAAS,MAAM,kBAAkB,CAAC;AAItF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,8BAA8B,CAAC;AAG5F,OAAO,KAAK,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAEzF,qBACa,mBAAmB;IAI5B,SAAS,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAE9C,SAAS,CAAC,mBAAmB,EAAG,uCAAuC,CAAC;IAExE,SAAS,CAAC,oBAAoB,EAAG,sBAAsB,CAAC,8BAA8B,CAAC,CAAC;IAExF,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;gBAI/B,GAAG,EAAE,0BAA0B;IAoBrC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;IAwBV,KAAK,CACK,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../../../src/adapters/http/controllers/workflows/authorize/module.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AACjE,OAAO,KAAK,EAAU,8BAA8B,EAAS,MAAM,kBAAkB,CAAC;AAItF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,KAAK,EAAE,uCAAuC,EAAE,MAAM,8BAA8B,CAAC;AAG5F,OAAO,KAAK,EAAE,0BAA0B,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAEzF,qBACa,mBAAmB;IAI5B,SAAS,CAAC,OAAO,EAAE,0BAA0B,CAAC;IAE9C,SAAS,CAAC,mBAAmB,EAAG,uCAAuC,CAAC;IAExE,SAAS,CAAC,oBAAoB,EAAG,sBAAsB,CAAC,8BAA8B,CAAC,CAAC;IAExF,SAAS,CAAC,UAAU,EAAE,oBAAoB,CAAC;gBAI/B,GAAG,EAAE,0BAA0B;IAoBrC,OAAO,CACG,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;IAwBV,KAAK,CACK,GAAG,EAAE,GAAG,EACP,GAAG,EAAE,GAAG,GACtB,OAAO,CAAC,IAAI,CAAC;CAgFnB"}
|
|
@@ -3,7 +3,7 @@ import "../../../../../core/index.mjs";
|
|
|
3
3
|
import { HTTPOAuth2Authorizer } from "../../../adapters/oauth2/authorization/module.mjs";
|
|
4
4
|
import "../../../adapters/index.mjs";
|
|
5
5
|
import { ForceUserLoggedInMiddleware } from "../../../middleware/built-in/loggedin/user.mjs";
|
|
6
|
-
import {
|
|
6
|
+
import { UI_DIST_PATH, UI_SOURCE_PATH } from "../../../../../path.mjs";
|
|
7
7
|
import { sanitizeError } from "../../../../../utils/error.mjs";
|
|
8
8
|
import "../../../../../utils/index.mjs";
|
|
9
9
|
import "../../../middleware/index.mjs";
|
|
@@ -88,19 +88,18 @@ var AuthorizeController = class {
|
|
|
88
88
|
let html;
|
|
89
89
|
let manifest;
|
|
90
90
|
let render;
|
|
91
|
-
const clientWebSlimPackagePath = CLIENT_WEB_SLIM_PACKAGE_PATH;
|
|
92
91
|
if (isJIT) {
|
|
93
92
|
/**
|
|
94
93
|
* @type {import('vite').ViteDevServer}
|
|
95
94
|
*/ const vite = useRequestParam(req, "viteServer");
|
|
96
|
-
html = await fs.promises.readFile(path.join(
|
|
95
|
+
html = await fs.promises.readFile(path.join(UI_SOURCE_PATH, "index.html"), "utf-8");
|
|
97
96
|
html = await vite.transformIndexHtml("/", html);
|
|
98
97
|
manifest = {};
|
|
99
98
|
render = (await vite.ssrLoadModule("/src/server.ts")).render;
|
|
100
99
|
} else {
|
|
101
|
-
html = await fs.promises.readFile(path.join(
|
|
102
|
-
manifest = JSON.parse(await fs.promises.readFile(path.join(
|
|
103
|
-
render = (await load(path.join(
|
|
100
|
+
html = await fs.promises.readFile(path.join(UI_DIST_PATH, "client", "index.html"), "utf-8");
|
|
101
|
+
manifest = JSON.parse(await fs.promises.readFile(path.join(UI_DIST_PATH, "client", ".vite", "ssr-manifest.json"), "utf-8"));
|
|
102
|
+
render = (await load(path.join(UI_DIST_PATH, "server", "server.js"))).render;
|
|
104
103
|
}
|
|
105
104
|
const [appHtml, preloadLinks] = await render({
|
|
106
105
|
url: "/authorize",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.mjs","names":["DController","DGet","DPost","DRequest","DResponse","load","fs","path","URL","send","useRequestParam","RoutupContainerAdapter","CodeTransformation","isCodeTransformation","
|
|
1
|
+
{"version":3,"file":"module.mjs","names":["DController","DGet","DPost","DRequest","DResponse","load","fs","path","URL","send","useRequestParam","RoutupContainerAdapter","CodeTransformation","isCodeTransformation","UI_DIST_PATH","UI_SOURCE_PATH","ForceUserLoggedInMiddleware","HTTPOAuth2Authorizer","OAuth2AuthorizationCodeRequestValidator","sanitizeError","AuthorizeController","options","codeRequestVerifier","codeRequestValidator","authorizer","ctx","validator","accessTokenIssuer","openIdTokenIssuer","codeIssuer","identityResolver","confirm","req","res","result","authorizeWithRequest","url","redirectUri","state","searchParams","set","authorizationCode","accessToken","idToken","href","serve","codeRequest","client","scopes","error","data","run","locations","verify","e","normalized","message","isJIT","JUST_IN_TIME","payload","config","baseURL","html","manifest","render","vite","promises","readFile","join","transformIndexHtml","ssrLoadModule","JSON","parse","appHtml","preloadLinks","replace"],"sources":["../../../../../../src/adapters/http/controllers/workflows/authorize/module.ts"],"sourcesContent":["/*\n * Copyright (c) 2024.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport {\n DController, \n DGet, \n DPost, \n DRequest, \n DResponse,\n} from '@routup/decorators';\nimport { load } from 'locter';\nimport fs from 'node:fs';\nimport path from 'node:path';\nimport { URL } from 'node:url';\nimport { send, useRequestParam } from 'routup';\nimport { RoutupContainerAdapter } from '@validup/adapter-routup';\nimport type { Client, OAuth2AuthorizationCodeRequest, Scope } from '@authup/core-kit';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { UI_DIST_PATH, UI_SOURCE_PATH } from '../../../../../path.ts';\nimport { ForceUserLoggedInMiddleware } from '../../../middleware/index.ts';\nimport { HTTPOAuth2Authorizer } from '../../../adapters/index.ts';\nimport type { IOAuth2AuthorizationCodeRequestVerifier } from '../../../../../core/index.ts';\nimport { OAuth2AuthorizationCodeRequestValidator } from '../../../../../core/index.ts';\nimport { sanitizeError } from '../../../../../utils/index.ts';\nimport type { AuthorizeControllerContext, AuthorizeControllerOptions } from './types.ts';\n\n@DController('/authorize')\nexport class AuthorizeController {\n // todo: maybe /realms/<realm>/protocol/openid-connect/authorize\n // todo: maybe /realms/<realm>/[...]/authorize\n\n protected options: AuthorizeControllerOptions;\n\n protected codeRequestVerifier : IOAuth2AuthorizationCodeRequestVerifier;\n\n protected codeRequestValidator : RoutupContainerAdapter<OAuth2AuthorizationCodeRequest>;\n\n protected authorizer: HTTPOAuth2Authorizer;\n\n // ---------------------------------------------------------\n\n constructor(ctx: AuthorizeControllerContext) {\n this.options = ctx.options;\n\n this.codeRequestVerifier = ctx.codeRequestVerifier;\n\n const validator = new OAuth2AuthorizationCodeRequestValidator();\n this.codeRequestValidator = new RoutupContainerAdapter(validator);\n\n this.authorizer = new HTTPOAuth2Authorizer({\n codeRequestVerifier: this.codeRequestVerifier,\n accessTokenIssuer: ctx.accessTokenIssuer,\n openIdTokenIssuer: ctx.openIdTokenIssuer,\n codeIssuer: ctx.codeIssuer,\n identityResolver: ctx.identityResolver,\n });\n }\n\n // ---------------------------------------------------------\n\n @DPost('', [ForceUserLoggedInMiddleware])\n async confirm(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<void> {\n const result = await this.authorizer.authorizeWithRequest(req);\n\n const url = new URL(result.redirectUri);\n if (result.state) {\n url.searchParams.set('state', result.state);\n }\n\n if (result.authorizationCode) {\n url.searchParams.set('code', result.authorizationCode);\n }\n\n if (result.accessToken) {\n url.searchParams.set('access_token', result.accessToken);\n }\n\n if (result.idToken) {\n url.searchParams.set('id_token', result.idToken);\n }\n\n return send(res, { url: url.href });\n }\n\n @DGet('', [])\n async serve(\n @DRequest() req: any,\n @DResponse() res: any,\n ): Promise<void> {\n let codeRequest : OAuth2AuthorizationCodeRequest | undefined;\n\n let client : Client | undefined;\n let scopes : Scope[] | undefined;\n\n let error : Error | undefined;\n\n try {\n const data = await this.codeRequestValidator.run(req, { locations: ['body', 'query'] });\n\n const result = await this.codeRequestVerifier.verify(data);\n client = result.client;\n scopes = result.scopes;\n\n codeRequest = result.data;\n } catch (e) {\n const normalized = sanitizeError(e);\n error = {\n ...normalized,\n message: normalized.message,\n };\n }\n\n const isJIT = isCodeTransformation(CodeTransformation.JUST_IN_TIME);\n\n const payload = {\n config: { baseURL: this.options.baseURL },\n data: {\n codeRequest,\n error,\n client,\n scopes,\n },\n };\n\n let html : string;\n let manifest : Record<string, any>;\n let render : CallableFunction;\n\n if (isJIT) {\n /**\n * @type {import('vite').ViteDevServer}\n */\n const vite = useRequestParam(req, 'viteServer');\n\n html = await fs.promises.readFile(\n path.join(UI_SOURCE_PATH, 'index.html'),\n 'utf-8',\n );\n html = await vite.transformIndexHtml('/', html);\n manifest = {};\n render = (await vite.ssrLoadModule('/src/server.ts')).render;\n } else {\n html = await fs.promises.readFile(\n path.join(UI_DIST_PATH, 'client', 'index.html'),\n 'utf-8',\n );\n\n manifest = JSON.parse(await fs.promises.readFile(\n path.join(UI_DIST_PATH, 'client', '.vite', 'ssr-manifest.json'),\n 'utf-8',\n ));\n\n render = (await load(path.join(UI_DIST_PATH, 'server', 'server.js'))).render;\n }\n\n const [appHtml, preloadLinks] = await render({\n url: '/authorize',\n manifest,\n payload,\n });\n\n return send(\n res,\n html\n .replace('<!--preload-links-->', preloadLinks)\n .replace('<!--app-html-->', appHtml),\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BA,IAAaoB,sBAAb,MAAaA;CAICC;CAEAC;CAEAC;CAEAC;CAIV,YAAYC,KAAiC;AACzC,OAAKJ,UAAUI,IAAIJ;AAEnB,OAAKC,sBAAsBG,IAAIH;EAE/B,MAAMI,YAAY,IAAIR,yCAAAA;AACtB,OAAKK,uBAAuB,IAAIZ,uBAAuBe,UAAAA;AAEvD,OAAKF,aAAa,IAAIP,qBAAqB;GACvCK,qBAAqB,KAAKA;GAC1BK,mBAAmBF,IAAIE;GACvBC,mBAAmBH,IAAIG;GACvBC,YAAYJ,IAAII;GAChBC,kBAAkBL,IAAIK;GAC1B,CAAA;;CAKJ,MACMC,QACF,KACA,KACa;EACb,MAAMG,SAAS,MAAM,KAAKV,WAAWW,qBAAqBH,IAAAA;EAE1D,MAAMI,MAAM,IAAI5B,IAAI0B,OAAOG,YAAW;AACtC,MAAIH,OAAOI,MACPF,KAAIG,aAAaC,IAAI,SAASN,OAAOI,MAAK;AAG9C,MAAIJ,OAAOO,kBACPL,KAAIG,aAAaC,IAAI,QAAQN,OAAOO,kBAAiB;AAGzD,MAAIP,OAAOQ,YACPN,KAAIG,aAAaC,IAAI,gBAAgBN,OAAOQ,YAAW;AAG3D,MAAIR,OAAOS,QACPP,KAAIG,aAAaC,IAAI,YAAYN,OAAOS,QAAO;AAGnD,SAAOlC,KAAKwB,KAAK,EAAEG,KAAKA,IAAIQ,MAAK,CAAA;;CAGrC,MACMC,MACF,KACA,KACa;EACb,IAAIC;EAEJ,IAAIC;EACJ,IAAIC;EAEJ,IAAIC;AAEJ,MAAI;GACA,MAAMC,OAAO,MAAM,KAAK3B,qBAAqB4B,IAAInB,KAAK,EAAEoB,WAAW,CAAC,QAAQ,QAAQ,EAAC,CAAA;GAErF,MAAMlB,SAAS,MAAM,KAAKZ,oBAAoB+B,OAAOH,KAAAA;AACrDH,YAASb,OAAOa;AAChBC,YAASd,OAAOc;AAEhBF,iBAAcZ,OAAOgB;WAChBI,GAAG;GACR,MAAMC,aAAapC,cAAcmC,EAAAA;AACjCL,WAAQ;IACJ,GAAGM;IACHC,SAASD,WAAWC;IACxB;;EAGJ,MAAMC,QAAQ5C,qBAAqBD,mBAAmB8C,aAAY;EAElE,MAAMC,UAAU;GACZC,QAAQ,EAAEC,SAAS,KAAKxC,QAAQwC,SAAQ;GACxCX,MAAM;IACFJ;IACAG;IACAF;IACAC;IACJ;GACJ;EAEA,IAAIc;EACJ,IAAIC;EACJ,IAAIC;AAEJ,MAAIP,OAAO;;;MAIP,MAAMQ,OAAOvD,gBAAgBsB,KAAK,aAAA;AAElC8B,UAAO,MAAMxD,GAAG4D,SAASC,SACrB5D,KAAK6D,KAAKrD,gBAAgB,aAAA,EAC1B,QAAA;AAEJ+C,UAAO,MAAMG,KAAKI,mBAAmB,KAAKP,KAAAA;AAC1CC,cAAW,EAAC;AACZC,aAAU,MAAMC,KAAKK,cAAc,iBAAgB,EAAGN;SACnD;AACHF,UAAO,MAAMxD,GAAG4D,SAASC,SACrB5D,KAAK6D,KAAKtD,cAAc,UAAU,aAAA,EAClC,QAAA;AAGJiD,cAAWQ,KAAKC,MAAM,MAAMlE,GAAG4D,SAASC,SACpC5D,KAAK6D,KAAKtD,cAAc,UAAU,SAAS,oBAAA,EAC3C,QAAA,CAAA;AAGJkD,aAAU,MAAM3D,KAAKE,KAAK6D,KAAKtD,cAAc,UAAU,YAAA,CAAY,EAAGkD;;EAG1E,MAAM,CAACS,SAASC,gBAAgB,MAAMV,OAAO;GACzC5B,KAAK;GACL2B;GACAJ;GACJ,CAAA;AAEA,SAAOlD,KACHwB,KACA6B,KACKa,QAAQ,wBAAwBD,aAAAA,CAChCC,QAAQ,mBAAmBF,QAAAA,CAAAA;;;;YA5G5BzD,4BAAAA,CAAAA"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { PACKAGE_PATH, UI_DIST_PATH, UI_SOURCE_PATH } from "../../../../path.mjs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { CodeTransformation, isCodeTransformation } from "typeorm-extension";
|
|
4
4
|
import { coreHandler, setRequestParam } from "routup";
|
|
@@ -11,7 +11,7 @@ async function registerAssetsMiddleware(router) {
|
|
|
11
11
|
fallthrough: true,
|
|
12
12
|
scan: false
|
|
13
13
|
}));
|
|
14
|
-
router.use("public", createHandler(path.posix.join(
|
|
14
|
+
router.use("public", createHandler(path.posix.join(UI_DIST_PATH, "client"), {
|
|
15
15
|
fallthrough: false,
|
|
16
16
|
scan: false
|
|
17
17
|
}));
|
|
@@ -20,7 +20,7 @@ async function registerAssetsMiddleware(router) {
|
|
|
20
20
|
/**
|
|
21
21
|
* @type {import('vite').ViteDevServer}
|
|
22
22
|
*/ const server = await (await load("vite")).createServer({
|
|
23
|
-
root:
|
|
23
|
+
root: UI_SOURCE_PATH,
|
|
24
24
|
base: "/public/",
|
|
25
25
|
logLevel: "error",
|
|
26
26
|
server: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.mjs","names":["load","CodeTransformation","isCodeTransformation","createHandler","path","coreHandler","setRequestParam","
|
|
1
|
+
{"version":3,"file":"assets.mjs","names":["load","CodeTransformation","isCodeTransformation","createHandler","path","coreHandler","setRequestParam","PACKAGE_PATH","UI_DIST_PATH","UI_SOURCE_PATH","registerAssetsMiddleware","router","JUST_IN_TIME","use","posix","join","fallthrough","scan","vite","server","createServer","root","base","logLevel","middlewareMode","watch","usePolling","interval","appType","req","res","next","middlewares"],"sources":["../../../../../src/adapters/http/middleware/built-in/assets.ts"],"sourcesContent":["/*\n * Copyright (c) 2023.\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 { load } from 'locter';\nimport { CodeTransformation, isCodeTransformation } from 'typeorm-extension';\nimport { createHandler } from '@routup/assets';\nimport path from 'node:path';\nimport type { Router } from 'routup';\nimport { coreHandler, setRequestParam } from 'routup';\nimport { PACKAGE_PATH, UI_DIST_PATH, UI_SOURCE_PATH } from '../../../../path.ts';\n\nexport async function registerAssetsMiddleware(router: Router) {\n if (!isCodeTransformation(CodeTransformation.JUST_IN_TIME)) {\n router.use('public', createHandler(\n path.posix.join(PACKAGE_PATH, 'public'),\n {\n fallthrough: true,\n scan: false,\n },\n ));\n\n router.use('public', createHandler(\n path.posix.join(UI_DIST_PATH, 'client'),\n {\n fallthrough: false,\n scan: false,\n },\n ));\n return;\n }\n\n /**\n * @type import('vite')\n */\n const vite = await load('vite');\n\n /**\n * @type {import('vite').ViteDevServer}\n */\n const server = await vite.createServer({\n root: UI_SOURCE_PATH,\n base: '/public/',\n logLevel: 'error',\n server: {\n middlewareMode: true,\n watch: {\n usePolling: true,\n interval: 100,\n },\n },\n appType: 'custom',\n });\n\n router.use('public', coreHandler((req, res, next) => server.middlewares(req, res, next)));\n router.use(coreHandler((req, res, next) => {\n setRequestParam(req, 'viteServer', server);\n\n next();\n }));\n}\n"],"mappings":";;;;;;;AAeA,eAAsBU,yBAAyBC,QAAc;AACzD,KAAI,CAACT,qBAAqBD,mBAAmBW,aAAY,EAAG;AACxDD,SAAOE,IAAI,UAAUV,cACjBC,KAAKU,MAAMC,KAAKR,cAAc,SAAA,EAC9B;GACIS,aAAa;GACbC,MAAM;GACV,CAAA,CAAA;AAGJN,SAAOE,IAAI,UAAUV,cACjBC,KAAKU,MAAMC,KAAKP,cAAc,SAAA,EAC9B;GACIQ,aAAa;GACbC,MAAM;GACV,CAAA,CAAA;AAEJ;;;;IAWJ,MAAME,SAAS,OAAMD,MALFlB,KAAK,OAAA,EAKEoB,aAAa;EACnCC,MAAMZ;EACNa,MAAM;EACNC,UAAU;EACVJ,QAAQ;GACJK,gBAAgB;GAChBC,OAAO;IACHC,YAAY;IACZC,UAAU;IACd;GACJ;EACAC,SAAS;EACb,CAAA;AAEAjB,QAAOE,IAAI,UAAUR,aAAawB,KAAKC,KAAKC,SAASZ,OAAOa,YAAYH,KAAKC,KAAKC,KAAAA,CAAAA,CAAAA;AAClFpB,QAAOE,IAAIR,aAAawB,KAAKC,KAAKC,SAAAA;AAC9BzB,kBAAgBuB,KAAK,cAAcV,OAAAA;AAEnCY,QAAAA;GACJ,CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { EntityManager, EntityTarget, FindOptionsWhere, ObjectLiteral } from 'typeorm';
|
|
2
|
+
import type { PermissionPolicyBinding } from '@authup/access';
|
|
3
|
+
import type { Permission } from '@authup/core-kit';
|
|
4
|
+
export type LoadBoundPermissionsOptions<E extends ObjectLiteral> = {
|
|
5
|
+
manager: EntityManager;
|
|
6
|
+
junctionTarget: EntityTarget<E>;
|
|
7
|
+
where: FindOptionsWhere<E>;
|
|
8
|
+
cachePrefix: string;
|
|
9
|
+
cacheKey: string;
|
|
10
|
+
};
|
|
11
|
+
type PermissionJunction = {
|
|
12
|
+
permission: Permission;
|
|
13
|
+
policy_id?: string | null;
|
|
14
|
+
};
|
|
15
|
+
export declare function loadBoundPermissions<E extends PermissionJunction & ObjectLiteral>(options: LoadBoundPermissionsOptions<E>): Promise<PermissionPolicyBinding[]>;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=bindings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.d.ts","sourceRoot":"","sources":["../../../../../src/app/modules/database/repositories/bindings.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACR,aAAa,EACb,YAAY,EAEZ,gBAAgB,EAChB,aAAa,EAChB,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAc,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,aAAa,IAAI;IAC/D,OAAO,EAAE,aAAa,CAAC;IACvB,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;IAChC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,CAAC;AAEF,wBAAsB,oBAAoB,CAAC,CAAC,SAAS,kBAAkB,GAAG,aAAa,EACnF,OAAO,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACxC,OAAO,CAAC,uBAAuB,EAAE,CAAC,CAiCpC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { PolicyRepository } from "../../../../adapters/database/domains/policy/repository.mjs";
|
|
2
|
+
import "../../../../adapters/database/domains/policy/index.mjs";
|
|
3
|
+
import { buildRedisKeyPath } from "@authup/server-kit";
|
|
4
|
+
//#region src/app/modules/database/repositories/bindings.ts
|
|
5
|
+
async function loadBoundPermissions(options) {
|
|
6
|
+
const entries = await options.manager.getRepository(options.junctionTarget).find({
|
|
7
|
+
where: options.where,
|
|
8
|
+
relations: { permission: true },
|
|
9
|
+
cache: {
|
|
10
|
+
id: buildRedisKeyPath({
|
|
11
|
+
prefix: options.cachePrefix,
|
|
12
|
+
key: options.cacheKey
|
|
13
|
+
}),
|
|
14
|
+
milliseconds: 6e4
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
const policyIds = /* @__PURE__ */ new Set();
|
|
18
|
+
for (const entry of entries) if (entry.policy_id) policyIds.add(entry.policy_id);
|
|
19
|
+
const policyTrees = await loadPolicyTrees(options.manager, [...policyIds]);
|
|
20
|
+
return entries.map((entry) => {
|
|
21
|
+
const policies = [];
|
|
22
|
+
if (entry.policy_id && policyTrees[entry.policy_id]) policies.push(policyTrees[entry.policy_id]);
|
|
23
|
+
return {
|
|
24
|
+
permission: entry.permission,
|
|
25
|
+
policies: policies.length > 0 ? policies : void 0
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
async function loadPolicyTrees(manager, policyIds) {
|
|
30
|
+
if (policyIds.length === 0) return {};
|
|
31
|
+
const policyRepository = new PolicyRepository(manager);
|
|
32
|
+
const trees = await Promise.all(policyIds.map((id) => policyRepository.findDescendantsTreeById(id).then((tree) => [id, tree])));
|
|
33
|
+
const result = {};
|
|
34
|
+
for (const [id, tree] of trees) if (tree) result[id] = tree;
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { loadBoundPermissions };
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=bindings.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bindings.mjs","names":["buildRedisKeyPath","PolicyRepository","loadBoundPermissions","options","repository","manager","getRepository","junctionTarget","relations","permission","entries","find","where","cache","id","prefix","cachePrefix","key","cacheKey","milliseconds","policyIds","Set","entry","policy_id","add","policyTrees","loadPolicyTrees","map","policies","push","length","undefined","policyRepository","trees","Promise","all","findDescendantsTreeById","then","tree","result"],"sources":["../../../../../src/app/modules/database/repositories/bindings.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 {\n EntityManager,\n EntityTarget,\n FindOptionsRelations,\n FindOptionsWhere,\n ObjectLiteral,\n} from 'typeorm';\nimport type { BasePolicy, PermissionPolicyBinding } from '@authup/access';\nimport type { Permission } from '@authup/core-kit';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { PolicyRepository } from '../../../../adapters/database/domains/policy/index.ts';\n\nexport type LoadBoundPermissionsOptions<E extends ObjectLiteral> = {\n manager: EntityManager;\n junctionTarget: EntityTarget<E>;\n where: FindOptionsWhere<E>;\n cachePrefix: string;\n cacheKey: string;\n};\n\ntype PermissionJunction = {\n permission: Permission;\n policy_id?: string | null;\n};\n\nexport async function loadBoundPermissions<E extends PermissionJunction & ObjectLiteral>(\n options: LoadBoundPermissionsOptions<E>,\n): Promise<PermissionPolicyBinding[]> {\n const repository = options.manager.getRepository(options.junctionTarget);\n const relations = { permission: true } as FindOptionsRelations<E>;\n\n const entries = await repository.find({\n where: options.where,\n relations,\n cache: {\n id: buildRedisKeyPath({ prefix: options.cachePrefix, key: options.cacheKey }),\n milliseconds: 60_000,\n },\n });\n\n const policyIds = new Set<string>();\n for (const entry of entries) {\n if (entry.policy_id) {\n policyIds.add(entry.policy_id);\n }\n }\n\n const policyTrees = await loadPolicyTrees(options.manager, [...policyIds]);\n\n return entries.map((entry) => {\n const policies: BasePolicy[] = [];\n if (entry.policy_id && policyTrees[entry.policy_id]) {\n policies.push(policyTrees[entry.policy_id]);\n }\n\n return {\n permission: entry.permission,\n policies: policies.length > 0 ? policies : undefined,\n };\n });\n}\n\nasync function loadPolicyTrees(\n manager: EntityManager,\n policyIds: string[],\n): Promise<Record<string, BasePolicy>> {\n if (policyIds.length === 0) {\n return {};\n }\n\n const policyRepository = new PolicyRepository(manager);\n const trees = await Promise.all(\n policyIds.map((id) => policyRepository.findDescendantsTreeById(id)\n .then((tree) => [id, tree] as const)),\n );\n\n const result: Record<string, BasePolicy> = {};\n for (const [id, tree] of trees) {\n if (tree) {\n result[id] = tree;\n }\n }\n return result;\n}\n"],"mappings":";;;;AAgCA,eAAsBE,qBAClBC,SAAuC;CAKvC,MAAMO,UAAU,MAHGP,QAAQE,QAAQC,cAAcH,QAAQI,eAGnCH,CAAWO,KAAK;EAClCC,OAAOT,QAAQS;EACfJ,WAAAA,EAJgBC,YAAY,MAI5BD;EACAK,OAAO;GACHC,IAAId,kBAAkB;IAAEe,QAAQZ,QAAQa;IAAaC,KAAKd,QAAQe;IAAS,CAAA;GAC3EC,cAAc;GAClB;EACJ,CAAA;CAEA,MAAMC,4BAAY,IAAIC,KAAAA;AACtB,MAAK,MAAMC,SAASZ,QAChB,KAAIY,MAAMC,UACNH,WAAUI,IAAIF,MAAMC,UAAS;CAIrC,MAAME,cAAc,MAAMC,gBAAgBvB,QAAQE,SAAS,CAAA,GAAIe,UAAU,CAAA;AAEzE,QAAOV,QAAQiB,KAAKL,UAAAA;EAChB,MAAMM,WAAyB,EAAE;AACjC,MAAIN,MAAMC,aAAaE,YAAYH,MAAMC,WACrCK,UAASC,KAAKJ,YAAYH,MAAMC,WAAU;AAG9C,SAAO;GACHd,YAAYa,MAAMb;GAClBmB,UAAUA,SAASE,SAAS,IAAIF,WAAWG,KAAAA;GAC/C;GACJ;;AAGJ,eAAeL,gBACXrB,SACAe,WAAmB;AAEnB,KAAIA,UAAUU,WAAW,EACrB,QAAO,EAAC;CAGZ,MAAME,mBAAmB,IAAI/B,iBAAiBI,QAAAA;CAC9C,MAAM4B,QAAQ,MAAMC,QAAQC,IACxBf,UAAUO,KAAKb,OAAOkB,iBAAiBI,wBAAwBtB,GAAAA,CAC1DuB,MAAMC,SAAS,CAACxB,IAAIwB,KAAK,CAAA,CAAA,CAAA;CAGlC,MAAMC,SAAqC,EAAC;AAC5C,MAAK,MAAM,CAACzB,IAAIwB,SAASL,MACrB,KAAIK,KACAC,QAAOzB,MAAMwB;AAGrB,QAAOC"}
|
|
@@ -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 = {
|
|
@@ -22,5 +23,7 @@ export declare class ClientRepositoryAdapter implements IClientRepository {
|
|
|
22
23
|
remove(entity: Client): Promise<void>;
|
|
23
24
|
validateJoinColumns(data: Partial<Client>): Promise<void>;
|
|
24
25
|
checkUniqueness(data: Partial<Client>, existing?: Client): Promise<void>;
|
|
26
|
+
getBoundRoles(entity: string | Client): Promise<Role[]>;
|
|
27
|
+
getBoundPermissions(entity: string | Client): Promise<PermissionPolicyBinding[]>;
|
|
25
28
|
}
|
|
26
29
|
//# 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,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
|
|
@@ -124,6 +129,30 @@ var ClientRepositoryAdapter = class {
|
|
|
124
129
|
entityExisting: existing
|
|
125
130
|
})) throw new DatabaseConflictError();
|
|
126
131
|
}
|
|
132
|
+
async getBoundRoles(entity) {
|
|
133
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
134
|
+
return (await this.repository.manager.getRepository(ClientRoleEntity).find({
|
|
135
|
+
where: { client_id: id },
|
|
136
|
+
relations: { role: true },
|
|
137
|
+
cache: {
|
|
138
|
+
id: buildRedisKeyPath({
|
|
139
|
+
prefix: CachePrefix.CLIENT_OWNED_ROLES,
|
|
140
|
+
key: id
|
|
141
|
+
}),
|
|
142
|
+
milliseconds: 6e4
|
|
143
|
+
}
|
|
144
|
+
})).map((entry) => entry.role);
|
|
145
|
+
}
|
|
146
|
+
async getBoundPermissions(entity) {
|
|
147
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
148
|
+
return loadBoundPermissions({
|
|
149
|
+
manager: this.repository.manager,
|
|
150
|
+
junctionTarget: ClientPermissionEntity,
|
|
151
|
+
where: { client_id: id },
|
|
152
|
+
cachePrefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,
|
|
153
|
+
cacheKey: id
|
|
154
|
+
});
|
|
155
|
+
}
|
|
127
156
|
};
|
|
128
157
|
//#endregion
|
|
129
158
|
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":";;;;;;;;;AAsBA,IAAaQ,0BAAb,MAAaA;CACQC;CAEAC;CAEjB,YAAYC,KAAqC;AAC7C,OAAKF,aAAaE,IAAIF;AACtB,OAAKC,kBAAkB,IAAIH,uBAAuBI,IAAID,gBAAe;;CAGzE,MAAME,SAASC,OAA6E;EACxF,MAAMC,KAAK,KAAKL,WAAWM,mBAAmB,SAAA;AAC9CD,KAAGE,QAAQ,YAAA;EAEX,MAAM,EAAEC,eAAehB,WAAWa,IAAID,OAAO;GACzCK,cAAc;GACdC,QAAQ;IACJC,SAAS;KACL;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACH;IACDC,SAAS,CAAC,SAAS;IACvB;GACAC,SAAS,EAAED,SAAS;IAAC;IAAM;IAAQ;IAAY;IAAa,EAAC;GAC7DJ,YAAY,EAAEM,UAAU,IAAG;GAC3BC,WAAW;IACPH,SAAS,CAAC,QAAQ;IAClBI,SAASC,WAAmBC,KAAaC,MAAAA;AACrCA,OAAEC,WAAW,GAAGF,IAAI,KAAI;;IAEhC;GACAG,MAAM,EAAET,SAAS;IAAC;IAAM;IAAc;IAAa,EAAC;GACxD,CAAA;EAEA,MAAM,CAACU,UAAUC,SAAS,MAAMlB,GAAGmB,iBAAe;AAElD,SAAO;GACHC,MAAMH;GACNI,MAAM;IACFH;IACA,GAAGf;IACP;GACJ;;CAGJmB,YAAYC,IAAoC;AAC5C,SAAO,KAAKC,UAAU,EAAED,IAAG,CAAA;;CAG/B,MAAME,cAAcC,MAAcC,UAA2C;EACzE,MAAM3B,KAAK,KAAKL,WAAWM,mBAAmB,SAAA;AAC9CD,KAAG4B,MAAM,0BAA0B,EAAEF,MAAK,CAAA;AAE1C,MAAIC,UAAU;GACV,MAAME,QAAQ,MAAM,KAAKjC,gBAAgBkC,QAAQH,SAAAA;AACjD,OAAIE,MACA7B,IAAG+B,SAAS,8BAA8B,EAAEC,SAASH,MAAMN,IAAG,CAAA;;AAItE,SAAOvB,GAAGiC,QAAM;;CAGpB,MAAMC,kBAAkBC,UAAkBN,OAAwC;AAC9E,SAAO3C,OAAOiD,SAAAA,GACV,KAAKb,YAAYa,SAAAA,GACjB,KAAKV,cAAcU,UAAUN,MAAAA;;CAGrC,MAAMO,WAAWR,OAA+C;AAC5D,SAAO,KAAKjC,WAAW0C,OAAO9C,yBAAyBqC,MAAAA,CAAAA;;CAG3D,MAAMJ,UAAUI,OAAoD;AAChE,SAAO,KAAKjC,WAAW6B,UAAUjC,yBAAyBqC,MAAAA,CAAAA;;CAG9D,MAAMU,kBAAkBV,OAAoD;EACxE,MAAM5B,KAAK,KAAKL,WAAWM,mBAAmB,SAAA;AAE9CsC,SAAOC,QAAQZ,MAAAA,CAAOa,SAAS,CAAC5B,KAAK6B,WAAM;AACvC1C,MAAG+B,SAAS,UAAUlB,IAAI,MAAMA,OAAO,GAAGA,MAAM6B,OAAM,CAAA;IAC1D;AAEA1C,KAAG2C,UAAU,gBAAA;AAEb,SAAO3C,GAAGiC,QAAM;;CAGpBW,OAAOxB,MAA+B;AAClC,SAAO,KAAKzB,WAAWiD,OAAOxB,KAAAA;;CAGlCyB,MAAMC,QAAgB1B,MAA+B;AACjD,SAAO,KAAKzB,WAAWkD,MAAMC,QAAQ1B,KAAAA;;CAGzC,MAAM2B,KAAKD,QAAiC;AACxC,SAAO,KAAKnD,WAAWoD,KAAKD,OAAAA;;CAGhC,MAAME,OAAOF,QAA+B;AACxC,QAAM,KAAKnD,WAAWqD,OAAOF,OAAAA;;CAGjC,MAAMG,oBAAoB7B,MAAsC;AAC5D,QAAM/B,0BAA0B+B,MAAM;GAClC8B,YAAY,KAAKvD,WAAWwD,QAAQC;GACpCC,cAAc7D;GAClB,CAAA;;CAGJ,MAAM8D,gBAAgBlC,MAAuBmC,UAAkC;AAQ3E,MAAI,CAACC,MAPkBpE,eAAe;GAClC8D,YAAY,KAAKvD,WAAWwD,QAAQC;GACpCC,cAAc7D;GACdsD,QAAQ1B;GACRqC,gBAAgBF;GACpB,CAAA,CAGI,OAAM,IAAIjE,uBAAAA"}
|
|
1
|
+
{"version":3,"file":"repository.mjs","names":["buildRedisKeyPath","isUUID","applyQuery","isEntityUnique","validateEntityJoinColumns","DatabaseConflictError","translateWhereConditions","loadBoundPermissions","CachePrefix","ClientEntity","ClientPermissionEntity","ClientRoleEntity","RealmRepositoryAdapter","ClientRepositoryAdapter","repository","realmRepository","ctx","findMany","query","qb","createQueryBuilder","groupBy","pagination","defaultAlias","fields","default","allowed","filters","maxLimit","relations","onJoin","_property","key","q","addGroupBy","sort","entities","total","getManyAndCount","data","meta","findOneById","id","findOneBy","findOneByName","name","realmKey","where","realm","resolve","andWhere","realmId","getOne","findOneByIdOrName","idOrName","findManyBy","findBy","findOneWithSecret","Object","entries","forEach","value","addSelect","create","merge","entity","save","remove","validateJoinColumns","dataSource","manager","connection","entityTarget","checkUniqueness","existing","isUnique","entityExisting","getBoundRoles","getRepository","find","client_id","role","cache","prefix","CLIENT_OWNED_ROLES","milliseconds","map","entry","getBoundPermissions","junctionTarget","cachePrefix","CLIENT_OWNED_PERMISSIONS","cacheKey"],"sources":["../../../../../../src/app/modules/database/repositories/client/repository.ts"],"sourcesContent":["/*\n * Copyright (c) 2025.\n * Author Peter Placzek (tada5hi)\n * For the full copyright and license information,\n * view the LICENSE file that was distributed with this source code.\n */\n\nimport type { Client, Realm, Role } from '@authup/core-kit';\nimport type { PermissionPolicyBinding } from '@authup/access';\nimport { buildRedisKeyPath } from '@authup/server-kit';\nimport { isUUID } from '@authup/kit';\nimport type { Repository } from 'typeorm';\nimport { applyQuery, isEntityUnique, validateEntityJoinColumns } from 'typeorm-extension';\nimport type { EntityRepositoryFindManyResult, IClientRepository, IRealmRepository } from '../../../../../core/index.ts';\nimport { DatabaseConflictError } from '../../../../../adapters/database/index.ts';\nimport { translateWhereConditions } from '../helpers.ts';\nimport { loadBoundPermissions } from '../bindings.ts';\nimport {\n CachePrefix,\n ClientEntity,\n ClientPermissionEntity,\n ClientRoleEntity,\n} from '../../../../../adapters/database/domains/index.ts';\nimport { RealmRepositoryAdapter } from '../realm/repository.ts';\n\nexport type ClientRepositoryAdapterContext = {\n repository: Repository<Client>,\n realmRepository: Repository<Realm>,\n};\n\nexport class ClientRepositoryAdapter implements IClientRepository {\n private readonly repository: Repository<Client>;\n\n private readonly realmRepository: IRealmRepository;\n\n constructor(ctx: ClientRepositoryAdapterContext) {\n this.repository = ctx.repository;\n this.realmRepository = new RealmRepositoryAdapter(ctx.realmRepository);\n }\n\n async findMany(query: Record<string, any>): Promise<EntityRepositoryFindManyResult<Client>> {\n const qb = this.repository.createQueryBuilder('client');\n qb.groupBy('client.id');\n\n const { pagination } = applyQuery(qb, query, {\n defaultAlias: 'client',\n fields: {\n default: [\n 'id',\n 'active',\n 'built_in',\n 'name',\n 'display_name',\n 'description',\n 'secret_hashed',\n 'secret_encrypted',\n 'base_url',\n 'root_url',\n 'redirect_uri',\n 'grant_types',\n 'scope',\n 'is_confidential',\n 'realm_id',\n 'updated_at',\n 'created_at',\n ],\n allowed: ['secret'],\n },\n filters: { allowed: ['id', 'name', 'realm_id', 'realm.name'] },\n pagination: { maxLimit: 50 },\n relations: {\n allowed: ['realm'],\n onJoin: (_property: string, key: string, q: any) => {\n q.addGroupBy(`${key}.id`);\n },\n },\n sort: { allowed: ['id', 'created_at', 'updated_at'] },\n });\n\n const [entities, total] = await qb.getManyAndCount();\n\n return {\n data: entities,\n meta: {\n total,\n ...pagination,\n },\n };\n }\n\n findOneById(id: string): Promise<Client | null> {\n return this.findOneBy({ id });\n }\n\n async findOneByName(name: string, realmKey?: string): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n qb.where('client.name LIKE :name', { name });\n\n if (realmKey) {\n const realm = await this.realmRepository.resolve(realmKey);\n if (realm) {\n qb.andWhere('client.realm_id = :realmId', { realmId: realm.id });\n }\n }\n\n return qb.getOne();\n }\n\n async findOneByIdOrName(idOrName: string, realm?: string): Promise<Client | null> {\n return isUUID(idOrName) ?\n this.findOneById(idOrName) :\n this.findOneByName(idOrName, realm);\n }\n\n async findManyBy(where: Record<string, any>): Promise<Client[]> {\n return this.repository.findBy(translateWhereConditions(where));\n }\n\n async findOneBy(where: Record<string, any>): Promise<Client | null> {\n return this.repository.findOneBy(translateWhereConditions(where));\n }\n\n async findOneWithSecret(where: Record<string, any>): Promise<Client | null> {\n const qb = this.repository.createQueryBuilder('client');\n\n Object.entries(where).forEach(([key, value]) => {\n qb.andWhere(`client.${key} = :${key}`, { [key]: value });\n });\n\n qb.addSelect('client.secret');\n\n return qb.getOne();\n }\n\n create(data: Partial<Client>): Client {\n return this.repository.create(data);\n }\n\n merge(entity: Client, data: Partial<Client>): Client {\n return this.repository.merge(entity, data);\n }\n\n async save(entity: Client): Promise<Client> {\n return this.repository.save(entity);\n }\n\n async remove(entity: Client): Promise<void> {\n await this.repository.remove(entity);\n }\n\n async validateJoinColumns(data: Partial<Client>): Promise<void> {\n await validateEntityJoinColumns(data, {\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n });\n }\n\n async checkUniqueness(data: Partial<Client>, existing?: Client): Promise<void> {\n const isUnique = await isEntityUnique({\n dataSource: this.repository.manager.connection,\n entityTarget: ClientEntity,\n entity: data,\n entityExisting: existing,\n });\n\n if (!isUnique) {\n throw new DatabaseConflictError();\n }\n }\n\n async getBoundRoles(entity: string | Client): Promise<Role[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n const entries = await this.repository.manager\n .getRepository(ClientRoleEntity)\n .find({\n where: { client_id: id },\n relations: { role: true },\n cache: {\n id: buildRedisKeyPath({\n prefix: CachePrefix.CLIENT_OWNED_ROLES,\n key: id,\n }),\n milliseconds: 60_000,\n },\n });\n\n return entries.map((entry) => entry.role);\n }\n\n async getBoundPermissions(entity: string | Client): Promise<PermissionPolicyBinding[]> {\n const id = typeof entity === 'string' ? entity : entity.id;\n return loadBoundPermissions({\n manager: this.repository.manager,\n junctionTarget: ClientPermissionEntity,\n where: { client_id: id },\n cachePrefix: CachePrefix.CLIENT_OWNED_PERMISSIONS,\n cacheKey: id,\n });\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,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 = {
|
|
@@ -22,5 +23,7 @@ export declare class RobotRepositoryAdapter implements IRobotRepository {
|
|
|
22
23
|
remove(entity: Robot): Promise<void>;
|
|
23
24
|
validateJoinColumns(data: Partial<Robot>): Promise<void>;
|
|
24
25
|
checkUniqueness(data: Partial<Robot>, existing?: Robot): Promise<void>;
|
|
26
|
+
getBoundRoles(entity: string | Robot): Promise<Role[]>;
|
|
27
|
+
getBoundPermissions(entity: string | Robot): Promise<PermissionPolicyBinding[]>;
|
|
25
28
|
}
|
|
26
29
|
//# 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,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
|
|
@@ -118,6 +123,30 @@ var RobotRepositoryAdapter = class {
|
|
|
118
123
|
entityExisting: existing
|
|
119
124
|
})) throw new DatabaseConflictError();
|
|
120
125
|
}
|
|
126
|
+
async getBoundRoles(entity) {
|
|
127
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
128
|
+
return (await this.repository.manager.getRepository(RobotRoleEntity).find({
|
|
129
|
+
where: { robot_id: id },
|
|
130
|
+
relations: { role: true },
|
|
131
|
+
cache: {
|
|
132
|
+
id: buildRedisKeyPath({
|
|
133
|
+
prefix: CachePrefix.ROBOT_OWNED_ROLES,
|
|
134
|
+
key: id
|
|
135
|
+
}),
|
|
136
|
+
milliseconds: 6e4
|
|
137
|
+
}
|
|
138
|
+
})).map((entry) => entry.role);
|
|
139
|
+
}
|
|
140
|
+
async getBoundPermissions(entity) {
|
|
141
|
+
const id = typeof entity === "string" ? entity : entity.id;
|
|
142
|
+
return loadBoundPermissions({
|
|
143
|
+
manager: this.repository.manager,
|
|
144
|
+
junctionTarget: RobotPermissionEntity,
|
|
145
|
+
where: { robot_id: id },
|
|
146
|
+
cachePrefix: CachePrefix.ROBOT_OWNED_PERMISSIONS,
|
|
147
|
+
cacheKey: id
|
|
148
|
+
});
|
|
149
|
+
}
|
|
121
150
|
};
|
|
122
151
|
//#endregion
|
|
123
152
|
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","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 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 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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"}
|