@venizia/ignis 0.2.0-12 → 0.2.0-14
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/base/applications/base.d.ts +14 -13
- package/dist/base/applications/base.d.ts.map +1 -1
- package/dist/base/applications/base.js +55 -52
- package/dist/base/applications/base.js.map +1 -1
- package/dist/base/applications/boot-steps.d.ts +13 -0
- package/dist/base/applications/boot-steps.d.ts.map +1 -0
- package/dist/base/applications/boot-steps.js +23 -0
- package/dist/base/applications/boot-steps.js.map +1 -0
- package/dist/base/applications/common/index.d.ts +2 -0
- package/dist/base/applications/common/index.d.ts.map +1 -0
- package/dist/base/applications/common/index.js +18 -0
- package/dist/base/applications/common/index.js.map +1 -0
- package/dist/base/applications/common/types.d.ts.map +1 -0
- package/dist/base/applications/common/types.js.map +1 -0
- package/dist/base/applications/index.d.ts +2 -1
- package/dist/base/applications/index.d.ts.map +1 -1
- package/dist/base/applications/index.js +2 -1
- package/dist/base/applications/index.js.map +1 -1
- package/dist/base/applications/server.d.ts +1 -1
- package/dist/base/applications/server.d.ts.map +1 -1
- package/dist/base/middlewares/app-error/app-error.middleware.d.ts +3 -2
- package/dist/base/middlewares/app-error/app-error.middleware.d.ts.map +1 -1
- package/dist/base/middlewares/app-error/app-error.middleware.js +4 -3
- package/dist/base/middlewares/app-error/app-error.middleware.js.map +1 -1
- package/dist/base/middlewares/request-spy/request-spy.middleware.d.ts.map +1 -1
- package/dist/base/middlewares/request-spy/request-spy.middleware.js +2 -1
- package/dist/base/middlewares/request-spy/request-spy.middleware.js.map +1 -1
- package/dist/components/api-reference/component.js +2 -2
- package/dist/components/api-reference/component.js.map +1 -1
- package/dist/components/api-reference/index.d.ts +1 -1
- package/dist/components/api-reference/index.d.ts.map +1 -1
- package/dist/components/api-reference/index.js +1 -1
- package/dist/components/api-reference/index.js.map +1 -1
- package/dist/components/api-reference/ui/factory.d.ts +14 -0
- package/dist/components/api-reference/ui/factory.d.ts.map +1 -0
- package/dist/components/api-reference/ui/factory.js +53 -0
- package/dist/components/api-reference/ui/factory.js.map +1 -0
- package/dist/components/api-reference/ui/index.d.ts +4 -0
- package/dist/components/api-reference/ui/index.d.ts.map +1 -0
- package/dist/components/api-reference/ui/index.js +20 -0
- package/dist/components/api-reference/ui/index.js.map +1 -0
- package/dist/components/api-reference/ui/scalar.d.ts +8 -0
- package/dist/components/api-reference/ui/scalar.d.ts.map +1 -0
- package/dist/components/api-reference/ui/scalar.js +28 -0
- package/dist/components/api-reference/ui/scalar.js.map +1 -0
- package/dist/components/api-reference/ui/swagger.d.ts +8 -0
- package/dist/components/api-reference/ui/swagger.d.ts.map +1 -0
- package/dist/components/api-reference/ui/swagger.js +28 -0
- package/dist/components/api-reference/ui/swagger.js.map +1 -0
- package/dist/components/auth/authenticate/controllers/factory.d.ts +2 -2
- package/dist/components/auth/authenticate/strategies/index.d.ts +1 -1
- package/dist/components/auth/authenticate/strategies/index.d.ts.map +1 -1
- package/dist/components/auth/authenticate/strategies/index.js +1 -1
- package/dist/components/auth/authenticate/strategies/index.js.map +1 -1
- package/dist/components/auth/authenticate/strategies/jwks/index.d.ts +3 -0
- package/dist/components/auth/authenticate/strategies/jwks/index.d.ts.map +1 -0
- package/dist/components/auth/authenticate/strategies/jwks/index.js +19 -0
- package/dist/components/auth/authenticate/strategies/jwks/index.js.map +1 -0
- package/dist/components/auth/authenticate/strategies/jwks/issuer.d.ts +13 -0
- package/dist/components/auth/authenticate/strategies/jwks/issuer.d.ts.map +1 -0
- package/dist/components/auth/authenticate/strategies/{jwks.strategy.js → jwks/issuer.js} +4 -27
- package/dist/components/auth/authenticate/strategies/jwks/issuer.js.map +1 -0
- package/dist/components/auth/authenticate/strategies/{jwks.strategy.d.ts → jwks/verifier.d.ts} +2 -10
- package/dist/components/auth/authenticate/strategies/jwks/verifier.d.ts.map +1 -0
- package/dist/components/auth/authenticate/strategies/jwks/verifier.js +45 -0
- package/dist/components/auth/authenticate/strategies/jwks/verifier.js.map +1 -0
- package/dist/components/auth/authorize/adapters/base-filtered.d.ts +1 -1
- package/dist/components/auth/authorize/adapters/base-filtered.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/common/index.d.ts +2 -0
- package/dist/components/auth/authorize/adapters/common/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/common/index.js +18 -0
- package/dist/components/auth/authorize/adapters/common/index.js.map +1 -0
- package/dist/components/auth/authorize/adapters/{types.d.ts → common/types.d.ts} +1 -1
- package/dist/components/auth/authorize/adapters/common/types.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/common/types.js.map +1 -0
- package/dist/components/auth/authorize/adapters/connector.d.ts +1 -1
- package/dist/components/auth/authorize/adapters/connector.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts +1 -1
- package/dist/components/auth/authorize/adapters/custom-grant-expander.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/index.d.ts +2 -2
- package/dist/components/auth/authorize/adapters/index.d.ts.map +1 -1
- package/dist/components/auth/authorize/adapters/index.js +2 -2
- package/dist/components/auth/authorize/adapters/index.js.map +1 -1
- package/dist/components/auth/authorize/adapters/{scoped-casbin.adapter.d.ts → scoped-casbin/adapter.d.ts} +11 -66
- package/dist/components/auth/authorize/adapters/scoped-casbin/adapter.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/{scoped-casbin.adapter.js → scoped-casbin/adapter.js} +27 -22
- package/dist/components/auth/authorize/adapters/scoped-casbin/adapter.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.d.ts +2 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.js +5 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/constants.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.d.ts +3 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.js +19 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/index.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.d.ts +50 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.js +3 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/common/types.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.d.ts +4 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.js +19 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/index.js.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.d.ts +17 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.d.ts.map +1 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.js +11 -0
- package/dist/components/auth/authorize/adapters/scoped-casbin/policy-edges.js.map +1 -0
- package/dist/components/auth/models/entities/policy-definition.model.d.ts +20 -28
- package/dist/components/auth/models/entities/policy-definition.model.d.ts.map +1 -1
- package/dist/components/auth/models/entities/policy-definition.model.js +14 -35
- package/dist/components/auth/models/entities/policy-definition.model.js.map +1 -1
- package/dist/components/mail/common/constants.d.ts +7 -0
- package/dist/components/mail/common/constants.d.ts.map +1 -1
- package/dist/components/mail/common/constants.js +7 -1
- package/dist/components/mail/common/constants.js.map +1 -1
- package/dist/components/mail/common/types/index.d.ts +6 -0
- package/dist/components/mail/common/types/index.d.ts.map +1 -0
- package/dist/components/mail/common/types/index.js +22 -0
- package/dist/components/mail/common/types/index.js.map +1 -0
- package/dist/components/mail/common/types/message.d.ts +48 -0
- package/dist/components/mail/common/types/message.d.ts.map +1 -0
- package/dist/components/mail/common/types/message.js +3 -0
- package/dist/components/mail/common/types/message.js.map +1 -0
- package/dist/components/mail/common/types/options.d.ts +42 -0
- package/dist/components/mail/common/types/options.d.ts.map +1 -0
- package/dist/components/mail/common/types/options.js +3 -0
- package/dist/components/mail/common/types/options.js.map +1 -0
- package/dist/components/mail/common/types/queue.d.ts +53 -0
- package/dist/components/mail/common/types/queue.d.ts.map +1 -0
- package/dist/components/mail/common/types/queue.js +3 -0
- package/dist/components/mail/common/types/queue.js.map +1 -0
- package/dist/components/mail/common/types/template.d.ts +33 -0
- package/dist/components/mail/common/types/template.d.ts.map +1 -0
- package/dist/components/mail/common/types/template.js +3 -0
- package/dist/components/mail/common/types/template.js.map +1 -0
- package/dist/components/mail/common/types/verification.d.ts +26 -0
- package/dist/components/mail/common/types/verification.d.ts.map +1 -0
- package/dist/components/mail/common/types/verification.js +3 -0
- package/dist/components/mail/common/types/verification.js.map +1 -0
- package/dist/components/mail/services/generators/index.d.ts +4 -0
- package/dist/components/mail/services/generators/index.d.ts.map +1 -0
- package/dist/components/mail/services/generators/index.js +20 -0
- package/dist/components/mail/services/generators/index.js.map +1 -0
- package/dist/components/mail/services/generators/numeric-code.d.ts +7 -0
- package/dist/components/mail/services/generators/numeric-code.d.ts.map +1 -0
- package/dist/components/mail/services/generators/numeric-code.js +20 -0
- package/dist/components/mail/services/generators/numeric-code.js.map +1 -0
- package/dist/components/mail/services/generators/random-token.d.ts +7 -0
- package/dist/components/mail/services/generators/random-token.d.ts.map +1 -0
- package/dist/components/mail/services/generators/random-token.js +18 -0
- package/dist/components/mail/services/generators/random-token.js.map +1 -0
- package/dist/components/mail/services/{generator.service.d.ts → generators/verification-data.d.ts} +2 -10
- package/dist/components/mail/services/generators/verification-data.d.ts.map +1 -0
- package/dist/components/mail/services/{generator.service.js → generators/verification-data.js} +5 -29
- package/dist/components/mail/services/generators/verification-data.js.map +1 -0
- package/dist/components/mail/services/index.d.ts +1 -1
- package/dist/components/mail/services/index.d.ts.map +1 -1
- package/dist/components/mail/services/index.js +1 -1
- package/dist/components/mail/services/index.js.map +1 -1
- package/dist/components/static-asset/controller/factory.d.ts +2 -2
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/package.json +17 -17
- package/dist/base/applications/types.d.ts.map +0 -1
- package/dist/base/applications/types.js.map +0 -1
- package/dist/components/api-reference/ui-factory.d.ts +0 -24
- package/dist/components/api-reference/ui-factory.d.ts.map +0 -1
- package/dist/components/api-reference/ui-factory.js +0 -97
- package/dist/components/api-reference/ui-factory.js.map +0 -1
- package/dist/components/auth/authenticate/strategies/jwks.strategy.d.ts.map +0 -1
- package/dist/components/auth/authenticate/strategies/jwks.strategy.js.map +0 -1
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.d.ts.map +0 -1
- package/dist/components/auth/authorize/adapters/scoped-casbin.adapter.js.map +0 -1
- package/dist/components/auth/authorize/adapters/types.d.ts.map +0 -1
- package/dist/components/auth/authorize/adapters/types.js.map +0 -1
- package/dist/components/mail/common/types.d.ts +0 -201
- package/dist/components/mail/common/types.d.ts.map +0 -1
- package/dist/components/mail/common/types.js +0 -10
- package/dist/components/mail/common/types.js.map +0 -1
- package/dist/components/mail/services/generator.service.d.ts.map +0 -1
- package/dist/components/mail/services/generator.service.js.map +0 -1
- /package/dist/base/applications/{types.d.ts → common/types.d.ts} +0 -0
- /package/dist/base/applications/{types.js → common/types.js} +0 -0
- /package/dist/components/auth/authorize/adapters/{types.js → common/types.js} +0 -0
|
@@ -1,70 +1,11 @@
|
|
|
1
|
-
import type { IdType } from '
|
|
2
|
-
import type { TConstValue, TNullable } from '@venizia/ignis-helpers/common';
|
|
1
|
+
import type { IdType } from '../../../../../base';
|
|
3
2
|
import { type Model } from 'casbin';
|
|
4
3
|
import { type SQL } from 'drizzle-orm';
|
|
5
|
-
import { BaseFilteredAdapter } from '
|
|
6
|
-
import { CustomGrantExpander } from '
|
|
7
|
-
import type { ICasbinPolicySource, IScopedCasbinEntities } from '
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
parent: string;
|
|
11
|
-
};
|
|
12
|
-
export interface IScopedCasbinPolicyFilter {
|
|
13
|
-
principal: {
|
|
14
|
-
type: string;
|
|
15
|
-
id: IdType;
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
/** A grant row as fetched, before it becomes casbin lines. Permission columns are null when the join misses. */
|
|
19
|
-
export type TGrantRow = {
|
|
20
|
-
subjectId: IdType;
|
|
21
|
-
objectCode: TNullable<string>;
|
|
22
|
-
objectSubject: TNullable<string>;
|
|
23
|
-
objectMethod: TNullable<string>;
|
|
24
|
-
action: TNullable<string>;
|
|
25
|
-
effect: TNullable<string>;
|
|
26
|
-
domain: TNullable<string>;
|
|
27
|
-
metadata?: unknown;
|
|
28
|
-
};
|
|
29
|
-
export declare class PrincipalPolicyEdges {
|
|
30
|
-
static readonly DIRECT = "direct";
|
|
31
|
-
static readonly ROLE_EDGE = "roleEdge";
|
|
32
|
-
static readonly ROLE_GRANT = "roleGrant";
|
|
33
|
-
static readonly DOMAIN_EDGE = "domainEdge";
|
|
34
|
-
}
|
|
35
|
-
/** A row from the single principal-policy statement; `kind` says which branch produced it. */
|
|
36
|
-
export type TPrincipalPolicyRow = TGrantRow & {
|
|
37
|
-
kind: TConstValue<typeof PrincipalPolicyEdges>;
|
|
38
|
-
variant: string;
|
|
39
|
-
targetType: TNullable<string>;
|
|
40
|
-
targetId: IdType;
|
|
41
|
-
};
|
|
42
|
-
/**
|
|
43
|
-
* Per-principal domain edges sourced from business data the app already owns (e.g. a tenant
|
|
44
|
-
* foreign key) - read live on every cache miss, never duplicated into `domain_inherits`. An app
|
|
45
|
-
* whose hierarchy genuinely lives in `domain_inherits` rows does not need this hook at all: the
|
|
46
|
-
* DOMAIN_EDGE branch above already emits those as `g3` lines. `domains` is the principal's own
|
|
47
|
-
* domain closure, already `<Type>_<id>` tokens; the returned edges must be too - neither side
|
|
48
|
-
* re-formats them.
|
|
49
|
-
*
|
|
50
|
-
* `domains` is the principal's **membership closure** - built from `join_domain` rows plus both
|
|
51
|
-
* ends of every `domainEdge` row. It is NOT the set of domains the principal holds a role in via
|
|
52
|
-
* `assign_role`: a principal can carry `assign_role` at a domain it never joined. A hook ported
|
|
53
|
-
* from a mechanism that derived its domains from `assign_role` will silently lose access for
|
|
54
|
-
* exactly those principals - no error, no log, just fewer edges reaching `g`/`g2`/`g3` than before.
|
|
55
|
-
*
|
|
56
|
-
* More than one hierarchy axis (e.g. an organizer tree and a separate region tree)? Write one
|
|
57
|
-
* function per axis and concatenate their results here - this hook deliberately takes a single
|
|
58
|
-
* function, so composition stays visible in the application, not hidden inside the framework:
|
|
59
|
-
* `resolveDomainEdges: async opts => [...(await organizerEdges(opts)), ...(await regionEdges(opts))]`.
|
|
60
|
-
*/
|
|
61
|
-
export type TResolveDomainEdgesFn = (opts: {
|
|
62
|
-
principal: {
|
|
63
|
-
type: string;
|
|
64
|
-
id: IdType;
|
|
65
|
-
};
|
|
66
|
-
domains: string[];
|
|
67
|
-
}) => Promise<TDomainHierarchyEdge[]>;
|
|
4
|
+
import { BaseFilteredAdapter } from '../base-filtered';
|
|
5
|
+
import { CustomGrantExpander } from '../custom-grant-expander';
|
|
6
|
+
import type { ICasbinPolicySource, IScopedCasbinEntities } from '../common';
|
|
7
|
+
import { type TPrincipalPolicyRow } from './policy-edges';
|
|
8
|
+
import { type IScopedCasbinPolicyFilter, type TGrantRow, type TResolveDomainEdgesFn } from './common';
|
|
68
9
|
/**
|
|
69
10
|
* Filtered casbin adapter for the scoped RBAC model: loads ONE principal's edges (role assignments,
|
|
70
11
|
* memberships, grants) plus the shared structural hierarchy trees as casbin lines. Read-only.
|
|
@@ -119,6 +60,10 @@ export declare class ScopedCasbinAdapter extends BaseFilteredAdapter<IScopedCasb
|
|
|
119
60
|
protected schemaOf(table: {
|
|
120
61
|
schemaName?: string;
|
|
121
62
|
}): string;
|
|
63
|
+
/** The casbin domain token, built from the stored pair - one expression for every SELECT so they cannot drift. NULL reaches `buildGrantLines` as `ANY_MEMBER`. The alias is emitted raw for the same reason as in `softDeleteClause`: quoting folds it to a different case than the unquoted FROM alias. */
|
|
64
|
+
protected domainTokenSelection(opts: {
|
|
65
|
+
alias: string;
|
|
66
|
+
}): SQL;
|
|
122
67
|
/** Schema-qualified table reference (`"<schema>"."<table>"`) for use after FROM/JOIN with an alias. */
|
|
123
68
|
protected qualifiedTable(opts: {
|
|
124
69
|
table: {
|
|
@@ -145,4 +90,4 @@ export declare class ScopedCasbinAdapter extends BaseFilteredAdapter<IScopedCasb
|
|
|
145
90
|
/** The two code-fixed structural trees only (`g4` resource, `g5` action) - constant regardless of tenant count. Domain edges (`g3`) grow with the domain count, so they are principal-scoped in {@link queryPrincipalPolicies} instead. */
|
|
146
91
|
protected queryEdgePolicies(): Promise<string[]>;
|
|
147
92
|
}
|
|
148
|
-
//# sourceMappingURL=
|
|
93
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../../../src/components/auth/authorize/adapters/scoped-casbin/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ScopedCasbinAdapter =
|
|
3
|
+
exports.ScopedCasbinAdapter = void 0;
|
|
4
4
|
const drizzle_orm_1 = require("drizzle-orm");
|
|
5
5
|
const ignis_kernel_1 = require("@venizia/ignis-kernel");
|
|
6
6
|
const ignis_kernel_2 = require("@venizia/ignis-kernel");
|
|
7
|
-
const base_filtered_1 = require("
|
|
8
|
-
const custom_grant_expander_1 = require("
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
static { this.ROLE_EDGE = 'roleEdge'; }
|
|
12
|
-
static { this.ROLE_GRANT = 'roleGrant'; }
|
|
13
|
-
static { this.DOMAIN_EDGE = 'domainEdge'; }
|
|
14
|
-
}
|
|
15
|
-
exports.PrincipalPolicyEdges = PrincipalPolicyEdges;
|
|
16
|
-
const DEFAULT_SCHEMA = 'public';
|
|
7
|
+
const base_filtered_1 = require("../base-filtered");
|
|
8
|
+
const custom_grant_expander_1 = require("../custom-grant-expander");
|
|
9
|
+
const policy_edges_1 = require("./policy-edges");
|
|
10
|
+
const common_1 = require("./common");
|
|
17
11
|
/**
|
|
18
12
|
* Filtered casbin adapter for the scoped RBAC model: loads ONE principal's edges (role assignments,
|
|
19
13
|
* memberships, grants) plus the shared structural hierarchy trees as casbin lines. Read-only.
|
|
@@ -52,15 +46,15 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
52
46
|
const domainClosure = new Set();
|
|
53
47
|
for (const row of principalRows) {
|
|
54
48
|
switch (row.kind) {
|
|
55
|
-
case PrincipalPolicyEdges.ROLE_EDGE: {
|
|
49
|
+
case policy_edges_1.PrincipalPolicyEdges.ROLE_EDGE: {
|
|
56
50
|
lines.push(`${ignis_kernel_2.AuthorizationPolicyVariants.ROLE_INHERITS.rule}, ${principals.role}_${row.subjectId}, ${principals.role}_${row.targetId}, *`);
|
|
57
51
|
break;
|
|
58
52
|
}
|
|
59
|
-
case PrincipalPolicyEdges.ROLE_GRANT: {
|
|
53
|
+
case policy_edges_1.PrincipalPolicyEdges.ROLE_GRANT: {
|
|
60
54
|
roleGrants.push(row);
|
|
61
55
|
break;
|
|
62
56
|
}
|
|
63
|
-
case PrincipalPolicyEdges.DOMAIN_EDGE: {
|
|
57
|
+
case policy_edges_1.PrincipalPolicyEdges.DOMAIN_EDGE: {
|
|
64
58
|
lines.push(`${ignis_kernel_2.AuthorizationPolicyVariants.DOMAIN_INHERITS.rule}, ${row.subjectId}, ${row.targetId}`);
|
|
65
59
|
// Both ends are, by construction, members of the principal's domain_closure CTE.
|
|
66
60
|
domainClosure.add(String(row.subjectId));
|
|
@@ -140,7 +134,18 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
140
134
|
}
|
|
141
135
|
/** Schema for a table, defaulting to `public`. */
|
|
142
136
|
schemaOf(table) {
|
|
143
|
-
return table.schemaName ?? DEFAULT_SCHEMA;
|
|
137
|
+
return table.schemaName ?? common_1.DEFAULT_SCHEMA;
|
|
138
|
+
}
|
|
139
|
+
/** The casbin domain token, built from the stored pair - one expression for every SELECT so they cannot drift. NULL reaches `buildGrantLines` as `ANY_MEMBER`. The alias is emitted raw for the same reason as in `softDeleteClause`: quoting folds it to a different case than the unquoted FROM alias. */
|
|
140
|
+
domainTokenSelection(opts) {
|
|
141
|
+
const column = (name) => (0, drizzle_orm_1.sql) `${drizzle_orm_1.sql.raw(opts.alias)}.${drizzle_orm_1.sql.identifier(name)}`;
|
|
142
|
+
const domainType = column('domain_type');
|
|
143
|
+
const domainId = column('domain_id');
|
|
144
|
+
return (0, drizzle_orm_1.sql) `CASE
|
|
145
|
+
WHEN ${domainType} IS NULL THEN NULL
|
|
146
|
+
WHEN ${domainId} IS NULL THEN ${domainType}
|
|
147
|
+
ELSE ${domainType} || '_' || ${domainId}::text
|
|
148
|
+
END AS "domain"`;
|
|
144
149
|
}
|
|
145
150
|
/** Schema-qualified table reference (`"<schema>"."<table>"`) for use after FROM/JOIN with an alias. */
|
|
146
151
|
qualifiedTable(opts) {
|
|
@@ -203,14 +208,14 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
203
208
|
)
|
|
204
209
|
|
|
205
210
|
SELECT
|
|
206
|
-
${PrincipalPolicyEdges.DIRECT}::text AS "kind",
|
|
211
|
+
${policy_edges_1.PrincipalPolicyEdges.DIRECT}::text AS "kind",
|
|
207
212
|
policyDefinition.variant,
|
|
208
213
|
policyDefinition.subject_id::text AS "subjectId",
|
|
209
214
|
policyDefinition.target_type AS "targetType",
|
|
210
215
|
policyDefinition.target_id::text AS "targetId",
|
|
211
216
|
policyDefinition.action,
|
|
212
217
|
policyDefinition.effect,
|
|
213
|
-
policyDefinition
|
|
218
|
+
${this.domainTokenSelection({ alias: 'policyDefinition' })},
|
|
214
219
|
permission.code AS "objectCode",
|
|
215
220
|
permission.subject AS "objectSubject",
|
|
216
221
|
permission.method AS "objectMethod"${metadataSelection}
|
|
@@ -232,7 +237,7 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
232
237
|
UNION ALL
|
|
233
238
|
|
|
234
239
|
SELECT
|
|
235
|
-
${PrincipalPolicyEdges.ROLE_EDGE}::text AS "kind",
|
|
240
|
+
${policy_edges_1.PrincipalPolicyEdges.ROLE_EDGE}::text AS "kind",
|
|
236
241
|
policyDefinition.variant,
|
|
237
242
|
policyDefinition.subject_id::text AS "subjectId",
|
|
238
243
|
policyDefinition.target_type AS "targetType",
|
|
@@ -250,14 +255,14 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
250
255
|
UNION ALL
|
|
251
256
|
|
|
252
257
|
SELECT
|
|
253
|
-
${PrincipalPolicyEdges.ROLE_GRANT}::text AS "kind",
|
|
258
|
+
${policy_edges_1.PrincipalPolicyEdges.ROLE_GRANT}::text AS "kind",
|
|
254
259
|
policyDefinition.variant,
|
|
255
260
|
policyDefinition.subject_id::text AS "subjectId",
|
|
256
261
|
policyDefinition.target_type AS "targetType",
|
|
257
262
|
policyDefinition.target_id::text AS "targetId",
|
|
258
263
|
policyDefinition.action,
|
|
259
264
|
policyDefinition.effect,
|
|
260
|
-
policyDefinition
|
|
265
|
+
${this.domainTokenSelection({ alias: 'policyDefinition' })},
|
|
261
266
|
permission.code AS "objectCode",
|
|
262
267
|
permission.subject AS "objectSubject",
|
|
263
268
|
permission.method AS "objectMethod"${metadataSelection}
|
|
@@ -271,7 +276,7 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
271
276
|
UNION ALL
|
|
272
277
|
|
|
273
278
|
SELECT
|
|
274
|
-
${PrincipalPolicyEdges.DOMAIN_EDGE}::text AS "kind",
|
|
279
|
+
${policy_edges_1.PrincipalPolicyEdges.DOMAIN_EDGE}::text AS "kind",
|
|
275
280
|
policyDefinition.variant,
|
|
276
281
|
policyDefinition.subject_type || '_' || policyDefinition.subject_id::text AS "subjectId",
|
|
277
282
|
NULL AS "targetType",
|
|
@@ -385,4 +390,4 @@ class ScopedCasbinAdapter extends base_filtered_1.BaseFilteredAdapter {
|
|
|
385
390
|
}
|
|
386
391
|
}
|
|
387
392
|
exports.ScopedCasbinAdapter = ScopedCasbinAdapter;
|
|
388
|
-
//# sourceMappingURL=
|
|
393
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../../../src/components/auth/authorize/adapters/scoped-casbin/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/auth/authorize/adapters/scoped-casbin/common/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../../../src/components/auth/authorize/adapters/scoped-casbin/common/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,cAAc,GAAG,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/auth/authorize/adapters/scoped-casbin/common/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./types"), exports);
|
|
18
|
+
__exportStar(require("./constants"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../src/components/auth/authorize/adapters/scoped-casbin/common/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,0CAAwB;AACxB,8CAA4B"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { IdType } from '../../../../../../base';
|
|
2
|
+
import type { TNullable } from '@venizia/ignis-helpers/common';
|
|
3
|
+
export type TDomainHierarchyEdge = {
|
|
4
|
+
child: string;
|
|
5
|
+
parent: string;
|
|
6
|
+
};
|
|
7
|
+
export interface IScopedCasbinPolicyFilter {
|
|
8
|
+
principal: {
|
|
9
|
+
type: string;
|
|
10
|
+
id: IdType;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/** A grant row as fetched, before it becomes casbin lines. Permission columns are null when the join misses. */
|
|
14
|
+
export type TGrantRow = {
|
|
15
|
+
subjectId: IdType;
|
|
16
|
+
objectCode: TNullable<string>;
|
|
17
|
+
objectSubject: TNullable<string>;
|
|
18
|
+
objectMethod: TNullable<string>;
|
|
19
|
+
action: TNullable<string>;
|
|
20
|
+
effect: TNullable<string>;
|
|
21
|
+
domain: TNullable<string>;
|
|
22
|
+
metadata?: unknown;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Per-principal domain edges sourced from business data the app already owns (e.g. a tenant
|
|
26
|
+
* foreign key) - read live on every cache miss, never duplicated into `domain_inherits`. An app
|
|
27
|
+
* whose hierarchy genuinely lives in `domain_inherits` rows does not need this hook at all: the
|
|
28
|
+
* DOMAIN_EDGE branch above already emits those as `g3` lines. `domains` is the principal's own
|
|
29
|
+
* domain closure, already `<Type>_<id>` tokens; the returned edges must be too - neither side
|
|
30
|
+
* re-formats them.
|
|
31
|
+
*
|
|
32
|
+
* `domains` is the principal's **membership closure** - built from `join_domain` rows plus both
|
|
33
|
+
* ends of every `domainEdge` row. It is NOT the set of domains the principal holds a role in via
|
|
34
|
+
* `assign_role`: a principal can carry `assign_role` at a domain it never joined. A hook ported
|
|
35
|
+
* from a mechanism that derived its domains from `assign_role` will silently lose access for
|
|
36
|
+
* exactly those principals - no error, no log, just fewer edges reaching `g`/`g2`/`g3` than before.
|
|
37
|
+
*
|
|
38
|
+
* More than one hierarchy axis (e.g. an organizer tree and a separate region tree)? Write one
|
|
39
|
+
* function per axis and concatenate their results here - this hook deliberately takes a single
|
|
40
|
+
* function, so composition stays visible in the application, not hidden inside the framework:
|
|
41
|
+
* `resolveDomainEdges: async opts => [...(await organizerEdges(opts)), ...(await regionEdges(opts))]`.
|
|
42
|
+
*/
|
|
43
|
+
export type TResolveDomainEdgesFn = (opts: {
|
|
44
|
+
principal: {
|
|
45
|
+
type: string;
|
|
46
|
+
id: IdType;
|
|
47
|
+
};
|
|
48
|
+
domains: string[];
|
|
49
|
+
}) => Promise<TDomainHierarchyEdge[]>;
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../../../src/components/auth/authorize/adapters/scoped-casbin/common/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D,MAAM,MAAM,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAErE,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAED,gHAAgH;AAChH,MAAM,MAAM,SAAS,GAAG;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,KAAK,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../../../../src/components/auth/authorize/adapters/scoped-casbin/common/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/components/auth/authorize/adapters/scoped-casbin/index.ts"],"names":[],"mappings":"AAEA,YAAY,EACV,yBAAyB,EACzB,oBAAoB,EACpB,SAAS,EACT,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAClB,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./policy-edges"), exports);
|
|
18
|
+
__exportStar(require("./adapter"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/components/auth/authorize/adapters/scoped-casbin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAQA,iDAA+B;AAC/B,4CAA0B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IdType } from '../../../../../base';
|
|
2
|
+
import type { TConstValue, TNullable } from '@venizia/ignis-helpers/common';
|
|
3
|
+
import type { TGrantRow } from './common';
|
|
4
|
+
export declare class PrincipalPolicyEdges {
|
|
5
|
+
static readonly DIRECT = "direct";
|
|
6
|
+
static readonly ROLE_EDGE = "roleEdge";
|
|
7
|
+
static readonly ROLE_GRANT = "roleGrant";
|
|
8
|
+
static readonly DOMAIN_EDGE = "domainEdge";
|
|
9
|
+
}
|
|
10
|
+
/** A row from the single principal-policy statement; `kind` says which branch produced it. */
|
|
11
|
+
export type TPrincipalPolicyRow = TGrantRow & {
|
|
12
|
+
kind: TConstValue<typeof PrincipalPolicyEdges>;
|
|
13
|
+
variant: string;
|
|
14
|
+
targetType: TNullable<string>;
|
|
15
|
+
targetId: IdType;
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=policy-edges.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-edges.d.ts","sourceRoot":"","sources":["../../../../../../src/components/auth/authorize/adapters/scoped-casbin/policy-edges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAE1C,qBAAa,oBAAoB;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,YAAY;IAClC,MAAM,CAAC,QAAQ,CAAC,SAAS,cAAc;IACvC,MAAM,CAAC,QAAQ,CAAC,UAAU,eAAe;IACzC,MAAM,CAAC,QAAQ,CAAC,WAAW,gBAAgB;CAC5C;AAED,8FAA8F;AAC9F,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG;IAC5C,IAAI,EAAE,WAAW,CAAC,OAAO,oBAAoB,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PrincipalPolicyEdges = void 0;
|
|
4
|
+
class PrincipalPolicyEdges {
|
|
5
|
+
static { this.DIRECT = 'direct'; }
|
|
6
|
+
static { this.ROLE_EDGE = 'roleEdge'; }
|
|
7
|
+
static { this.ROLE_GRANT = 'roleGrant'; }
|
|
8
|
+
static { this.DOMAIN_EDGE = 'domainEdge'; }
|
|
9
|
+
}
|
|
10
|
+
exports.PrincipalPolicyEdges = PrincipalPolicyEdges;
|
|
11
|
+
//# sourceMappingURL=policy-edges.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy-edges.js","sourceRoot":"","sources":["../../../../../../src/components/auth/authorize/adapters/scoped-casbin/policy-edges.ts"],"names":[],"mappings":";;;AAIA,MAAa,oBAAoB;aACf,WAAM,GAAG,QAAQ,CAAC;aAClB,cAAS,GAAG,UAAU,CAAC;aACvB,eAAU,GAAG,WAAW,CAAC;aACzB,gBAAW,GAAG,YAAY,CAAC;;AAJ7C,oDAKC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { TAuthorizationDecision } from '@venizia/ignis-kernel';
|
|
1
|
+
import type { TAuthorizationDecision, TSubsetGrantMetadata } from '@venizia/ignis-kernel';
|
|
2
2
|
import { integer, text } from 'drizzle-orm/pg-core';
|
|
3
3
|
export type TPolicyDefinitionOptions<ExtraVariant extends string = never> = {
|
|
4
4
|
idType?: 'string' | 'number';
|
|
@@ -15,50 +15,42 @@ type TExtraPolicyVariantOf<Opts> = Opts extends {
|
|
|
15
15
|
extraVariants?: ReadonlyArray<infer ExtraVariant extends string>;
|
|
16
16
|
} ? ExtraVariant : never;
|
|
17
17
|
/** Column shape is inferred, never hand-declared, so it can never drift from the `$type<>()` narrowing below. */
|
|
18
|
-
declare const buildCommonPolicyDefinitionColumns: <ExtraVariant extends string = never>() => {
|
|
18
|
+
declare const buildCommonPolicyDefinitionColumns: <ExtraVariant extends string = never, Metadata extends object = TSubsetGrantMetadata>() => {
|
|
19
|
+
metadata: import("drizzle-orm").$Type<import("drizzle-orm/pg-core").PgJsonbBuilderInitial<"metadata">, Metadata>;
|
|
19
20
|
variant: import("drizzle-orm").NotNull<import("drizzle-orm").$Type<import("drizzle-orm/pg-core").PgTextBuilderInitial<"variant", [string, ...string[]]>, "join_domain" | "assign_role" | "grant" | "role_inherits" | "domain_inherits" | "resource_inherits" | "action_inherits" | ExtraVariant>>;
|
|
20
21
|
subjectType: import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTextBuilderInitial<"subject_type", [string, ...string[]]>>;
|
|
21
22
|
targetType: import("drizzle-orm").NotNull<import("drizzle-orm/pg-core").PgTextBuilderInitial<"target_type", [string, ...string[]]>>;
|
|
23
|
+
domainType: import("drizzle-orm/pg-core").PgTextBuilderInitial<"domain_type", [string, ...string[]]>;
|
|
22
24
|
action: import("drizzle-orm/pg-core").PgTextBuilderInitial<"action", [string, ...string[]]>;
|
|
23
25
|
effect: import("drizzle-orm").$Type<import("drizzle-orm/pg-core").PgTextBuilderInitial<"effect", [string, ...string[]]>, TAuthorizationDecision>;
|
|
24
|
-
domain: import("drizzle-orm/pg-core").PgTextBuilderInitial<"domain", [string, ...string[]]>;
|
|
25
|
-
domainType: import("drizzle-orm/pg-core").PgTextBuilderInitial<"domain_type", [string, ...string[]]>;
|
|
26
|
-
metadata: import("drizzle-orm/pg-core").PgJsonbBuilderInitial<"metadata">;
|
|
27
26
|
};
|
|
28
|
-
export type TPolicyDefinitionCommonColumns<ExtraVariant extends string = never> = ReturnType<typeof buildCommonPolicyDefinitionColumns<ExtraVariant>>;
|
|
29
|
-
type TPolicyDefinitionColumnDef<Opts extends TPolicyDefinitionOptions<string> | undefined = undefined> = Opts extends {
|
|
27
|
+
export type TPolicyDefinitionCommonColumns<ExtraVariant extends string = never, Metadata extends object = TSubsetGrantMetadata> = ReturnType<typeof buildCommonPolicyDefinitionColumns<ExtraVariant, Metadata>>;
|
|
28
|
+
type TPolicyDefinitionColumnDef<Opts extends TPolicyDefinitionOptions<string> | undefined = undefined, Metadata extends object = TSubsetGrantMetadata> = Opts extends {
|
|
30
29
|
idType: 'string';
|
|
31
|
-
} ? TPolicyDefinitionCommonColumns<TExtraPolicyVariantOf<Opts
|
|
30
|
+
} ? TPolicyDefinitionCommonColumns<TExtraPolicyVariantOf<Opts>, Metadata> & {
|
|
32
31
|
subjectId: ReturnType<typeof text>;
|
|
33
32
|
targetId: ReturnType<typeof text>;
|
|
34
33
|
domainId: ReturnType<typeof text>;
|
|
35
|
-
} : TPolicyDefinitionCommonColumns<TExtraPolicyVariantOf<Opts
|
|
34
|
+
} : TPolicyDefinitionCommonColumns<TExtraPolicyVariantOf<Opts>, Metadata> & {
|
|
36
35
|
subjectId: ReturnType<typeof integer>;
|
|
37
36
|
targetId: ReturnType<typeof integer>;
|
|
38
37
|
domainId: ReturnType<typeof integer>;
|
|
39
38
|
};
|
|
40
|
-
export declare const extraPolicyDefinitionColumns: <const Opts extends TPolicyDefinitionOptions<string> | undefined = undefined>(opts?: Opts) => TPolicyDefinitionColumnDef<Opts>;
|
|
41
39
|
/**
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
* ```
|
|
40
|
+
* `Metadata` is a type parameter, not an `opts` field: unlike `extraVariants` there is no runtime
|
|
41
|
+
* value to infer from, so supplying it means spelling `Opts` too (no partial inference):
|
|
42
|
+
* `extraPolicyDefinitionColumns<{ idType: 'string' }, IMyMetadata>({ idType: 'string' })`.
|
|
43
|
+
* Keep `ops` in a custom shape if the app also issues subset grants - `customGrant` writes it.
|
|
44
|
+
*/
|
|
45
|
+
export declare const extraPolicyDefinitionColumns: <const Opts extends TPolicyDefinitionOptions<string> | undefined = undefined, Metadata extends object = TSubsetGrantMetadata>(opts?: Opts) => TPolicyDefinitionColumnDef<Opts, Metadata>;
|
|
46
|
+
/**
|
|
47
|
+
* The three legal `(domain_type, domain_id)` pairs, as CHECK predicate TEXT for a migration - text,
|
|
48
|
+
* not a Drizzle `SQL`, because a column ref in a `sql` template renders schema-qualified, which a
|
|
49
|
+
* table-level CHECK rejects.
|
|
53
50
|
*
|
|
54
|
-
* Both directions are enforced, because half a constraint still admits half the broken rows: an
|
|
55
|
-
* absent or sentinel type REQUIRES a null id, and a typed domain REQUIRES a non-null one.
|
|
56
51
|
* The `IS NOT NULL` guard on the last branch looks redundant next to `NOT IN` and is not: a NULL
|
|
57
|
-
* `domain_type` makes `NOT IN` evaluate to NULL, and a CHECK only
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
* `ANY_MEMBER` is refused outright - null already means it, and one state reachable two ways is the
|
|
61
|
-
* bug this column split exists to remove.
|
|
52
|
+
* `domain_type` makes `NOT IN` evaluate to NULL, and a CHECK rejects only on FALSE - without it an id
|
|
53
|
+
* with no type passes.
|
|
62
54
|
*/
|
|
63
55
|
export declare const policyDefinitionDomainShapeCheck: (opts?: {
|
|
64
56
|
domainTypeColumn?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-definition.model.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/models/entities/policy-definition.model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"policy-definition.model.d.ts","sourceRoot":"","sources":["../../../../../src/components/auth/models/entities/policy-definition.model.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,sBAAsB,EAEtB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,OAAO,EAAS,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,MAAM,wBAAwB,CAAC,YAAY,SAAS,MAAM,GAAG,KAAK,IAAI;IAC1E,MAAM,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC,YAAY,CAAC,CAAC;CAC7C,CAAC;AAEF,gGAAgG;AAChG,KAAK,qBAAqB,CAAC,IAAI,IAAI,IAAI,SAAS;IAC9C,aAAa,CAAC,EAAE,aAAa,CAAC,MAAM,YAAY,SAAS,MAAM,CAAC,CAAC;CAClE,GACG,YAAY,GACZ,KAAK,CAAC;AAEV,iHAAiH;AACjH,QAAA,MAAM,kCAAkC,GACtC,YAAY,SAAS,MAAM,GAAG,KAAK,EACnC,QAAQ,SAAS,MAAM,GAAG,oBAAoB;;;;;;;;CAa9C,CAAC;AAEH,MAAM,MAAM,8BAA8B,CACxC,YAAY,SAAS,MAAM,GAAG,KAAK,EACnC,QAAQ,SAAS,MAAM,GAAG,oBAAoB,IAC5C,UAAU,CAAC,OAAO,kCAAkC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAElF,KAAK,0BAA0B,CAC7B,IAAI,SAAS,wBAAwB,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,EACrE,QAAQ,SAAS,MAAM,GAAG,oBAAoB,IAC5C,IAAI,SAAS;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,GACjC,8BAA8B,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,GAAG;IACtE,SAAS,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IACnC,QAAQ,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;IAClC,QAAQ,EAAE,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;CACnC,GACD,8BAA8B,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,GAAG;IACtE,SAAS,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;IACtC,QAAQ,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;IACrC,QAAQ,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,CAAC;CACtC,CAAC;AAEN;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,GACvC,KAAK,CAAC,IAAI,SAAS,wBAAwB,CAAC,MAAM,CAAC,GAAG,SAAS,GAAG,SAAS,EAC3E,QAAQ,SAAS,MAAM,GAAG,oBAAoB,EAE9C,OAAO,IAAI,KACV,0BAA0B,CAAC,IAAI,EAAE,QAAQ,CA4B3C,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,gCAAgC,GAAI,OAAO;IACtD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,KAAG,MAaH,CAAC"}
|
|
@@ -6,29 +6,21 @@ const ignis_kernel_1 = require("@venizia/ignis-kernel");
|
|
|
6
6
|
const pg_core_1 = require("drizzle-orm/pg-core");
|
|
7
7
|
/** Column shape is inferred, never hand-declared, so it can never drift from the `$type<>()` narrowing below. */
|
|
8
8
|
const buildCommonPolicyDefinitionColumns = () => ({
|
|
9
|
-
|
|
10
|
-
// a typo here is a silent 403, not a compile error.
|
|
9
|
+
metadata: (0, pg_core_1.jsonb)('metadata').$type(),
|
|
11
10
|
variant: (0, pg_core_1.text)('variant').$type().notNull(),
|
|
12
11
|
subjectType: (0, pg_core_1.text)('subject_type').notNull(),
|
|
13
12
|
targetType: (0, pg_core_1.text)('target_type').notNull(),
|
|
14
|
-
//
|
|
13
|
+
// `null` IS `ANY_MEMBER`, not "unknown"; the literal is refused by `policyDefinitionDomainShapeCheck`.
|
|
14
|
+
domainType: (0, pg_core_1.text)('domain_type'),
|
|
15
15
|
action: (0, pg_core_1.text)('action'),
|
|
16
|
-
// Narrowed to AuthorizationDecisions (allow/deny/abstain) and NOT extensible like `variant`:
|
|
17
|
-
// the casbin effect evaluator itself reads this value, so an unknown effect is a correctness
|
|
18
|
-
// bug in enforcement, not a harmless unselected row.
|
|
19
16
|
effect: (0, pg_core_1.text)('effect').$type(),
|
|
20
|
-
// Being replaced by `domain_type` + `domain_id`; still the READ source, so both are written.
|
|
21
|
-
// The two-column form is what `subject`/`target` already use, and what the domain-closure CTE
|
|
22
|
-
// joins on - the concatenated token was the odd one out.
|
|
23
|
-
domain: (0, pg_core_1.text)('domain'),
|
|
24
|
-
// `null` IS `ANY_MEMBER`, not "unknown" - the adapter has always defaulted a null domain to it.
|
|
25
|
-
// A scope literal (`SYSTEM_WIDE`) sits here with a null `domain_id`; a typed domain carries both.
|
|
26
|
-
// `ANY_MEMBER` must never be written here explicitly: two spellings for one state is a bug
|
|
27
|
-
// waiting to happen. `policyDefinitionDomainShapeSql` enforces all three rules as a CHECK.
|
|
28
|
-
domainType: (0, pg_core_1.text)('domain_type'),
|
|
29
|
-
// Nullable: only subset grants populate it, and a consumer may map its own column instead.
|
|
30
|
-
metadata: (0, pg_core_1.jsonb)('metadata'),
|
|
31
17
|
});
|
|
18
|
+
/**
|
|
19
|
+
* `Metadata` is a type parameter, not an `opts` field: unlike `extraVariants` there is no runtime
|
|
20
|
+
* value to infer from, so supplying it means spelling `Opts` too (no partial inference):
|
|
21
|
+
* `extraPolicyDefinitionColumns<{ idType: 'string' }, IMyMetadata>({ idType: 'string' })`.
|
|
22
|
+
* Keep `ops` in a custom shape if the app also issues subset grants - `customGrant` writes it.
|
|
23
|
+
*/
|
|
32
24
|
const extraPolicyDefinitionColumns = (opts) => {
|
|
33
25
|
const { idType = 'number' } = opts ?? {};
|
|
34
26
|
const common = buildCommonPolicyDefinitionColumns();
|
|
@@ -58,26 +50,13 @@ const extraPolicyDefinitionColumns = (opts) => {
|
|
|
58
50
|
};
|
|
59
51
|
exports.extraPolicyDefinitionColumns = extraPolicyDefinitionColumns;
|
|
60
52
|
/**
|
|
61
|
-
* The three legal `(domain_type, domain_id)` pairs, as CHECK predicate TEXT for a migration
|
|
53
|
+
* The three legal `(domain_type, domain_id)` pairs, as CHECK predicate TEXT for a migration - text,
|
|
54
|
+
* not a Drizzle `SQL`, because a column ref in a `sql` template renders schema-qualified, which a
|
|
55
|
+
* table-level CHECK rejects.
|
|
62
56
|
*
|
|
63
|
-
* Text, not a Drizzle `SQL` object, because that is where this constraint actually goes: a column
|
|
64
|
-
* reference inside a Drizzle `sql` template renders schema-qualified (`"table"."column"`), which is
|
|
65
|
-
* not valid inside a table-level CHECK. Migrations here are raw SQL, so the helper matches them.
|
|
66
|
-
*
|
|
67
|
-
* ```sql
|
|
68
|
-
* ALTER TABLE policy_definitions
|
|
69
|
-
* ADD CONSTRAINT policy_definition_domain_shape
|
|
70
|
-
* CHECK (<policyDefinitionDomainShapeCheck()>);
|
|
71
|
-
* ```
|
|
72
|
-
*
|
|
73
|
-
* Both directions are enforced, because half a constraint still admits half the broken rows: an
|
|
74
|
-
* absent or sentinel type REQUIRES a null id, and a typed domain REQUIRES a non-null one.
|
|
75
57
|
* The `IS NOT NULL` guard on the last branch looks redundant next to `NOT IN` and is not: a NULL
|
|
76
|
-
* `domain_type` makes `NOT IN` evaluate to NULL, and a CHECK only
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
* `ANY_MEMBER` is refused outright - null already means it, and one state reachable two ways is the
|
|
80
|
-
* bug this column split exists to remove.
|
|
58
|
+
* `domain_type` makes `NOT IN` evaluate to NULL, and a CHECK rejects only on FALSE - without it an id
|
|
59
|
+
* with no type passes.
|
|
81
60
|
*/
|
|
82
61
|
const policyDefinitionDomainShapeCheck = (opts) => {
|
|
83
62
|
const { domainTypeColumn = 'domain_type', domainIdColumn = 'domain_id' } = opts ?? {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy-definition.model.js","sourceRoot":"","sources":["../../../../../src/components/auth/models/entities/policy-definition.model.ts"],"names":[],"mappings":";;;AAAA,sDAAuD;
|
|
1
|
+
{"version":3,"file":"policy-definition.model.js","sourceRoot":"","sources":["../../../../../src/components/auth/models/entities/policy-definition.model.ts"],"names":[],"mappings":";;;AAAA,sDAAuD;AAMvD,wDAAkE;AAClE,iDAA2D;AAoB3D,iHAAiH;AACjH,MAAM,kCAAkC,GAAG,GAGvC,EAAE,CAAC,CAAC;IACN,QAAQ,EAAE,IAAA,eAAK,EAAC,UAAU,CAAC,CAAC,KAAK,EAAY;IAC7C,OAAO,EAAE,IAAA,cAAI,EAAC,SAAS,CAAC,CAAC,KAAK,EAA8C,CAAC,OAAO,EAAE;IAEtF,WAAW,EAAE,IAAA,cAAI,EAAC,cAAc,CAAC,CAAC,OAAO,EAAE;IAC3C,UAAU,EAAE,IAAA,cAAI,EAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IAEzC,uGAAuG;IACvG,UAAU,EAAE,IAAA,cAAI,EAAC,aAAa,CAAC;IAE/B,MAAM,EAAE,IAAA,cAAI,EAAC,QAAQ,CAAC;IACtB,MAAM,EAAE,IAAA,cAAI,EAAC,QAAQ,CAAC,CAAC,KAAK,EAA0B;CACvD,CAAC,CAAC;AAsBH;;;;;GAKG;AACI,MAAM,4BAA4B,GAAG,CAI1C,IAAW,EACiC,EAAE;IAC9C,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,kCAAkC,EAAyC,CAAC;IAE3F,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO;gBACL,GAAG,MAAM;gBACT,SAAS,EAAE,IAAA,iBAAO,EAAC,YAAY,CAAC,CAAC,OAAO,EAAE;gBAC1C,QAAQ,EAAE,IAAA,iBAAO,EAAC,WAAW,CAAC,CAAC,OAAO,EAAE;gBACxC,QAAQ,EAAE,IAAA,iBAAO,EAAC,WAAW,CAAC;aACe,CAAC;QAClD,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,OAAO;gBACL,GAAG,MAAM;gBACT,SAAS,EAAE,IAAA,cAAI,EAAC,YAAY,CAAC,CAAC,OAAO,EAAE;gBACvC,QAAQ,EAAE,IAAA,cAAI,EAAC,WAAW,CAAC,CAAC,OAAO,EAAE;gBACrC,QAAQ,EAAE,IAAA,cAAI,EAAC,WAAW,CAAC;aACkB,CAAC;QAClD,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,IAAA,eAAQ,EAAC;gBACb,OAAO,EAAE,2DAA2D,MAAM,EAAE;aAC7E,CAAC,CAAC;QACL,CAAC;IACH,CAAC;AACH,CAAC,CAAC;AAjCW,QAAA,4BAA4B,gCAiCvC;AAEF;;;;;;;;GAQG;AACI,MAAM,gCAAgC,GAAG,CAAC,IAGhD,EAAU,EAAE;IACX,MAAM,EAAE,gBAAgB,GAAG,aAAa,EAAE,cAAc,GAAG,WAAW,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC;IACtF,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,wCAAyB,CAAC;IAE9D,OAAO;QACL,IAAI,gBAAgB,gBAAgB,cAAc,WAAW;QAC7D,OAAO,gBAAgB,OAAO,WAAW,SAAS,cAAc,WAAW;QAC3E;QACI,gBAAgB;YACZ,gBAAgB,aAAa,UAAU,OAAO,WAAW;YACzD,cAAc;MACpB;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC,CAAC;AAhBW,QAAA,gCAAgC,oCAgB3C"}
|