@jantstack/adonis-authz 1.0.2 → 2.0.0-alpha.1
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/LICENSE +1 -1
- package/README.md +417 -46
- package/build/commands/authz_catalog_diff.d.ts +28 -0
- package/build/commands/authz_catalog_diff.d.ts.map +1 -0
- package/build/commands/authz_catalog_diff.js +67 -0
- package/build/commands/authz_catalog_diff.js.map +1 -0
- package/build/commands/authz_catalog_sync.d.ts +20 -0
- package/build/commands/authz_catalog_sync.d.ts.map +1 -0
- package/build/commands/authz_catalog_sync.js +58 -0
- package/build/commands/authz_catalog_sync.js.map +1 -0
- package/build/commands/main.d.ts +2 -0
- package/build/commands/main.d.ts.map +1 -1
- package/build/commands/main.js +2 -0
- package/build/commands/main.js.map +1 -1
- package/build/commands/openfga_import.d.ts +8 -2
- package/build/commands/openfga_import.d.ts.map +1 -1
- package/build/commands/openfga_import.js +29 -6
- package/build/commands/openfga_import.js.map +1 -1
- package/build/commands/openfga_provision.d.ts.map +1 -1
- package/build/commands/openfga_provision.js +2 -1
- package/build/commands/openfga_provision.js.map +1 -1
- package/build/index.d.ts +51 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +43 -3
- package/build/index.js.map +1 -1
- package/build/src/catalog.d.ts +249 -2
- package/build/src/catalog.d.ts.map +1 -1
- package/build/src/catalog.js +709 -59
- package/build/src/catalog.js.map +1 -1
- package/build/src/catalog_cache.d.ts +300 -0
- package/build/src/catalog_cache.d.ts.map +1 -0
- package/build/src/catalog_cache.js +656 -0
- package/build/src/catalog_cache.js.map +1 -0
- package/build/src/clock.d.ts +24 -0
- package/build/src/clock.d.ts.map +1 -0
- package/build/src/clock.js +7 -0
- package/build/src/clock.js.map +1 -0
- package/build/src/define_config.d.ts +102 -6
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/backend_guard.d.ts +92 -0
- package/build/src/drivers/backend_guard.d.ts.map +1 -0
- package/build/src/drivers/backend_guard.js +221 -0
- package/build/src/drivers/backend_guard.js.map +1 -0
- package/build/src/drivers/database_driver.d.ts +242 -15
- package/build/src/drivers/database_driver.d.ts.map +1 -1
- package/build/src/drivers/database_driver.js +692 -127
- package/build/src/drivers/database_driver.js.map +1 -1
- package/build/src/drivers/openfga_driver.d.ts +341 -27
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +1052 -264
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/sql_expiry.d.ts +53 -0
- package/build/src/drivers/sql_expiry.d.ts.map +1 -0
- package/build/src/drivers/sql_expiry.js +66 -0
- package/build/src/drivers/sql_expiry.js.map +1 -0
- package/build/src/errors.d.ts +366 -0
- package/build/src/errors.d.ts.map +1 -0
- package/build/src/errors.js +387 -0
- package/build/src/errors.js.map +1 -0
- package/build/src/expiry.d.ts +27 -0
- package/build/src/expiry.d.ts.map +1 -0
- package/build/src/expiry.js +50 -0
- package/build/src/expiry.js.map +1 -0
- package/build/src/hierarchical_resolver.d.ts +56 -0
- package/build/src/hierarchical_resolver.d.ts.map +1 -0
- package/build/src/hierarchical_resolver.js +87 -0
- package/build/src/hierarchical_resolver.js.map +1 -0
- package/build/src/identity.d.ts +155 -0
- package/build/src/identity.d.ts.map +1 -0
- package/build/src/identity.js +359 -0
- package/build/src/identity.js.map +1 -0
- package/build/src/manager.d.ts +225 -7
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +1670 -23
- package/build/src/manager.js.map +1 -1
- package/build/src/memoize_ancestors.d.ts +23 -0
- package/build/src/memoize_ancestors.d.ts.map +1 -0
- package/build/src/memoize_ancestors.js +42 -0
- package/build/src/memoize_ancestors.js.map +1 -0
- package/build/src/middleware/app_access_middleware.d.ts +8 -6
- package/build/src/middleware/app_access_middleware.d.ts.map +1 -1
- package/build/src/middleware/app_access_middleware.js +10 -26
- package/build/src/middleware/app_access_middleware.js.map +1 -1
- package/build/src/models/authz_assignment.d.ts +5 -5
- package/build/src/models/authz_assignment.d.ts.map +1 -1
- package/build/src/models/authz_deny.d.ts +5 -5
- package/build/src/models/authz_deny.d.ts.map +1 -1
- package/build/src/models/authz_permission.d.ts +11 -5
- package/build/src/models/authz_permission.d.ts.map +1 -1
- package/build/src/models/authz_permission.js +4 -0
- package/build/src/models/authz_permission.js.map +1 -1
- package/build/src/models/authz_role.d.ts +13 -6
- package/build/src/models/authz_role.d.ts.map +1 -1
- package/build/src/models/authz_role.js +6 -1
- package/build/src/models/authz_role.js.map +1 -1
- package/build/src/models/authz_role_permission.d.ts +5 -5
- package/build/src/models/authz_role_permission.d.ts.map +1 -1
- package/build/src/openfga.d.ts +13 -0
- package/build/src/openfga.d.ts.map +1 -0
- package/build/src/openfga.js +12 -0
- package/build/src/openfga.js.map +1 -0
- package/build/src/sql_descendants.d.ts +51 -0
- package/build/src/sql_descendants.d.ts.map +1 -0
- package/build/src/sql_descendants.js +129 -0
- package/build/src/sql_descendants.js.map +1 -0
- package/build/src/testing/contract.d.ts +138 -7
- package/build/src/testing/contract.d.ts.map +1 -1
- package/build/src/testing/contract.js +2946 -24
- package/build/src/testing/contract.js.map +1 -1
- package/build/src/testing/main.d.ts +4 -2
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +2 -1
- package/build/src/testing/main.js.map +1 -1
- package/build/src/testing/scope_tree.d.ts +65 -0
- package/build/src/testing/scope_tree.d.ts.map +1 -0
- package/build/src/testing/scope_tree.js +145 -0
- package/build/src/testing/scope_tree.js.map +1 -0
- package/build/src/traits/authz_scopes.d.ts +30 -6
- package/build/src/traits/authz_scopes.d.ts.map +1 -1
- package/build/src/traits/authz_scopes.js +30 -18
- package/build/src/traits/authz_scopes.js.map +1 -1
- package/build/src/traits/has_uuid.d.ts +5 -5
- package/build/src/traits/has_uuid.d.ts.map +1 -1
- package/build/src/types.d.ts +530 -28
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +10 -4
- package/build/src/types.js.map +1 -1
- package/build/stubs/config/app_acl.stub +4 -2
- package/build/stubs/config/authorization.stub +66 -12
- package/build/stubs/migration.stub +57 -13
- package/package.json +11 -6
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { APP_SCOPE, APP_SCOPE_TYPE } from '../types.js';
|
|
2
|
+
/** Separador no imprimible: un `type` con ':' no puede colisionar con otro. */
|
|
3
|
+
function key(scope) {
|
|
4
|
+
return `${scope.type}\u001f${scope.uuid ?? ''}`;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* El resolutor que un harness inyecta al driver para que vea el árbol del
|
|
8
|
+
* juez: la cadena canónica del árbol (`chainOf`). Un scope que el árbol NO
|
|
9
|
+
* conoce resuelve a `null` tal cual: el driver deniega y rechaza escribir
|
|
10
|
+
* (L0.3). Es lo que hace que los casos de herencia dependan de verdad de
|
|
11
|
+
* `tree.attach` — con un fallback a `[APP_SCOPE]` un driver que ignorase el
|
|
12
|
+
* árbol seguiría pasando.
|
|
13
|
+
*/
|
|
14
|
+
export function resolveChainFrom(tree) {
|
|
15
|
+
return (scope) => tree.chainOf(scope);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* El `descendantsOf` que un harness inyecta al MANAGER para que las
|
|
19
|
+
* primitivas de enumeración (2.1: `authorizedScopes`) vean el árbol del
|
|
20
|
+
* juez. Se calcula desde `edges()` —lo único que el contrato exige a un
|
|
21
|
+
* árbol— así que vale para cualquier `ContractScopeTree`. Un scope que el
|
|
22
|
+
* árbol no conoce resuelve a `null`; más de `maxNodes` descendientes ⇒ lanza
|
|
23
|
+
* (el contrato del puerto: nunca una lista truncada en silencio).
|
|
24
|
+
*/
|
|
25
|
+
export function descendantsFrom(tree) {
|
|
26
|
+
if (tree.descendantsOf)
|
|
27
|
+
return (scope, options) => tree.descendantsOf(scope, options);
|
|
28
|
+
return async (scope, { maxNodes }) => {
|
|
29
|
+
if (scope.type !== APP_SCOPE_TYPE && (await tree.chainOf(scope)) === null)
|
|
30
|
+
return null;
|
|
31
|
+
const children = new Map();
|
|
32
|
+
for await (const { child, parent } of tree.edges()) {
|
|
33
|
+
const k = key(parent);
|
|
34
|
+
if (!children.has(k))
|
|
35
|
+
children.set(k, []);
|
|
36
|
+
children.get(k).push(child);
|
|
37
|
+
}
|
|
38
|
+
const result = [];
|
|
39
|
+
const seen = new Set([key(scope)]);
|
|
40
|
+
const frontier = [scope];
|
|
41
|
+
while (frontier.length) {
|
|
42
|
+
const current = frontier.shift();
|
|
43
|
+
for (const child of children.get(key(current)) ?? []) {
|
|
44
|
+
if (seen.has(key(child)))
|
|
45
|
+
continue;
|
|
46
|
+
seen.add(key(child));
|
|
47
|
+
result.push(child);
|
|
48
|
+
if (result.length > maxNodes) {
|
|
49
|
+
throw new Error(`descendantsFrom: ${key(scope)} tiene más de ${maxNodes} descendientes`);
|
|
50
|
+
}
|
|
51
|
+
frontier.push(child);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return result;
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Árbol en memoria para harness de test: un `Map` hijo→padre.
|
|
59
|
+
*
|
|
60
|
+
* El árbol de TEST también garantiza ser árbol (anti-ciclo, raíz única,
|
|
61
|
+
* padre existente), igual que hace el manager en `scopes.attached/moved`:
|
|
62
|
+
* el juez habla con el driver directamente, sin manager, y un test que
|
|
63
|
+
* construyera un ciclo por error pasaría en falso o se colgaría subiendo
|
|
64
|
+
* ancestros. Por eso aquí se lanza.
|
|
65
|
+
*/
|
|
66
|
+
export function memoryScopeTree() {
|
|
67
|
+
const parents = new Map();
|
|
68
|
+
function isKnown(scope) {
|
|
69
|
+
return scope.type === APP_SCOPE_TYPE || parents.has(key(scope));
|
|
70
|
+
}
|
|
71
|
+
function descendantsOf(scope) {
|
|
72
|
+
const result = new Set();
|
|
73
|
+
let frontier = [key(scope)];
|
|
74
|
+
while (frontier.length) {
|
|
75
|
+
const next = [];
|
|
76
|
+
for (const entry of parents.values()) {
|
|
77
|
+
const childKey = key(entry.child);
|
|
78
|
+
if (frontier.includes(key(entry.parent)) && !result.has(childKey)) {
|
|
79
|
+
result.add(childKey);
|
|
80
|
+
next.push(childKey);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
frontier = next;
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
87
|
+
function link(child, parent) {
|
|
88
|
+
if (child.type === APP_SCOPE_TYPE) {
|
|
89
|
+
throw new Error('memoryScopeTree: la raíz `app` no puede colgar de nada');
|
|
90
|
+
}
|
|
91
|
+
if (!isKnown(parent)) {
|
|
92
|
+
throw new Error(`memoryScopeTree: el padre ${key(parent)} no existe en el árbol`);
|
|
93
|
+
}
|
|
94
|
+
if (key(parent) === key(child) || descendantsOf(child).has(key(parent))) {
|
|
95
|
+
throw new Error(`memoryScopeTree: ciclo — ${key(parent)} desciende de ${key(child)}`);
|
|
96
|
+
}
|
|
97
|
+
parents.set(key(child), { child, parent });
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
async attach(child, parent) {
|
|
101
|
+
link(child, parent);
|
|
102
|
+
},
|
|
103
|
+
async move(child, newParent) {
|
|
104
|
+
if (!parents.has(key(child))) {
|
|
105
|
+
throw new Error(`memoryScopeTree: no se puede mover ${key(child)}, no existe`);
|
|
106
|
+
}
|
|
107
|
+
link(child, newParent);
|
|
108
|
+
},
|
|
109
|
+
async detach(child) {
|
|
110
|
+
for (const k of descendantsOf(child))
|
|
111
|
+
parents.delete(k);
|
|
112
|
+
parents.delete(key(child));
|
|
113
|
+
},
|
|
114
|
+
async chainOf(scope) {
|
|
115
|
+
if (scope.type === APP_SCOPE_TYPE)
|
|
116
|
+
return [APP_SCOPE];
|
|
117
|
+
const own = parents.get(key(scope));
|
|
118
|
+
if (!own)
|
|
119
|
+
return null;
|
|
120
|
+
// El elemento 0 es el nodo tal como se colgó (canónico para este
|
|
121
|
+
// árbol); un `Map` compara por bytes, así que aquí un alias nunca casa.
|
|
122
|
+
const chain = [own.child];
|
|
123
|
+
// `link` ya impide ciclos; el conjunto de visitados es el cinturón por
|
|
124
|
+
// si alguien manipula el mapa por otra vía.
|
|
125
|
+
const visited = new Set([key(scope)]);
|
|
126
|
+
let current = own;
|
|
127
|
+
while (current) {
|
|
128
|
+
chain.push(current.parent);
|
|
129
|
+
const parentKey = key(current.parent);
|
|
130
|
+
if (visited.has(parentKey)) {
|
|
131
|
+
throw new Error(`memoryScopeTree: ciclo detectado al resolver ${key(scope)}`);
|
|
132
|
+
}
|
|
133
|
+
visited.add(parentKey);
|
|
134
|
+
current = parents.get(parentKey);
|
|
135
|
+
}
|
|
136
|
+
return chain;
|
|
137
|
+
},
|
|
138
|
+
async *edges() {
|
|
139
|
+
for (const entry of parents.values())
|
|
140
|
+
yield { child: entry.child, parent: entry.parent };
|
|
141
|
+
},
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
export { APP_SCOPE };
|
|
145
|
+
//# sourceMappingURL=scope_tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scope_tree.js","sourceRoot":"","sources":["../../../src/testing/scope_tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { scope } from '@adonisjs/lucid/orm';
|
|
2
|
+
import type { Clock } from '../clock.js';
|
|
1
3
|
/**
|
|
2
4
|
* Scopes de query sobre el motor de autorización propio — paridad con los
|
|
3
5
|
* whereRoles/wherePermissions del paquete extirpado, ahora sobre `authz_*`.
|
|
@@ -10,12 +12,34 @@
|
|
|
10
12
|
*
|
|
11
13
|
* Admin.query().withScopes((s) => s.whereRoles('superadmin'))
|
|
12
14
|
* User.query().withScopes((s) => s.wherePermissions('audit:read'))
|
|
15
|
+
*
|
|
16
|
+
* El reloj (2.5-B · K6, CR#5): la vigencia se decide con el reloj del
|
|
17
|
+
* sistema, salvo que se pase uno al componer — `compose(BaseModel,
|
|
18
|
+
* withAuthzScopes({ clock }))`. El trait no ve el manager ni su
|
|
19
|
+
* `config.clock`: si tu app fija el reloj, pásale el MISMO aquí; si no,
|
|
20
|
+
* este listado y `authorize` pueden discrepar sobre lo que ya venció.
|
|
13
21
|
*/
|
|
14
|
-
export
|
|
15
|
-
|
|
16
|
-
|
|
22
|
+
export interface AuthzScopesOptions {
|
|
23
|
+
/** Reloj con el que se decide «vigente» (default: `systemClock`). */
|
|
24
|
+
clock?: Clock;
|
|
25
|
+
}
|
|
26
|
+
type Constructor = {
|
|
17
27
|
new (...args: any[]): {};
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
28
|
+
};
|
|
29
|
+
/** Lo que el trait añade al modelo: dos scopes de query. */
|
|
30
|
+
export interface AuthzScopesStatics {
|
|
31
|
+
whereRoles: ReturnType<typeof scope<any, (query: any, ...roles: string[]) => void>>;
|
|
32
|
+
wherePermissions: ReturnType<typeof scope<any, (query: any, ...permissions: string[]) => void>>;
|
|
33
|
+
}
|
|
34
|
+
export type WithAuthzScopes<T extends Constructor> = T & AuthzScopesStatics;
|
|
35
|
+
/**
|
|
36
|
+
* Como mixin directo (`compose(BaseModel, withAuthzScopes)`: reloj del
|
|
37
|
+
* sistema) o con opciones (`compose(BaseModel, withAuthzScopes({ clock }))`).
|
|
38
|
+
* Una sola firma genérica y no dos overloads: TypeScript solo propaga la
|
|
39
|
+
* inferencia de orden superior de `compose` (`A` = la clase mezclada) cuando
|
|
40
|
+
* el argumento tiene UNA firma; con overloads `compose(BaseModel,
|
|
41
|
+
* withAuthzScopes)` perdía los estáticos del modelo.
|
|
42
|
+
*/
|
|
43
|
+
export declare function withAuthzScopes<T extends Constructor | AuthzScopesOptions>(arg: T): T extends Constructor ? WithAuthzScopes<T> : <U extends Constructor>(Base: U) => WithAuthzScopes<U>;
|
|
44
|
+
export {};
|
|
21
45
|
//# sourceMappingURL=authz_scopes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz_scopes.d.ts","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"authz_scopes.d.ts","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAG3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAIxC;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,kBAAkB;IACjC,qEAAqE;IACrE,KAAK,CAAC,EAAE,KAAK,CAAA;CACd;AAED,KAAK,WAAW,GAAG;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAE,CAAA;AAE/C,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;IACnF,gBAAgB,EAAE,UAAU,CAAC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,CAAC,CAAA;CAChG;AACD,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,WAAW,IAAI,CAAC,GAAG,kBAAkB,CAAA;AAgD3E;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,WAAW,GAAG,kBAAkB,EACxE,GAAG,EAAE,CAAC,GACL,CAAC,SAAS,WAAW,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,KAAK,eAAe,CAAC,CAAC,CAAC,CAAA"}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
import { scope } from '@adonisjs/lucid/orm';
|
|
2
2
|
import db from '@adonisjs/lucid/services/db';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
3
|
+
import { isClock, systemClock } from '../clock.js';
|
|
4
|
+
import { AuthorizationConfigError } from '../errors.js';
|
|
5
|
+
import { dialectOf, sqlExpiryCodec } from '../drivers/sql_expiry.js';
|
|
6
|
+
/** La clave primaria del modelo comparable con `holder_uuid` en cualquier motor (K3). */
|
|
7
|
+
function comparablePrimaryKey(query) {
|
|
8
|
+
// En PostgreSQL una PK `uuid` nativa contra un subquery `varchar(64)` es
|
|
9
|
+
// el error 42883 («operator does not exist: uuid = character varying»):
|
|
10
|
+
// se compara como texto. MySQL y SQLite coaccionan y la columna vale tal
|
|
11
|
+
// cual. Se castea la PK y no el subquery: castear `holder_uuid` a `uuid`
|
|
12
|
+
// reventaría con un holder de OTRO morph cuyo id no sea un UUID.
|
|
13
|
+
const column = `${query.model.table}.${query.model.primaryKey}`;
|
|
14
|
+
return dialectOf(db.connection()) === 'postgres' ? db.raw('CAST(?? AS text)', [column]) : column;
|
|
15
|
+
}
|
|
16
|
+
function mixin(Base, clock) {
|
|
17
|
+
/** `expires_at` vigente con el reloj del trait y el codec del motor (K2: en MySQL, cadena UTC). */
|
|
18
|
+
const active = (b) => b.whereNull('a.expires_at').orWhere('a.expires_at', '>', sqlExpiryCodec(db.connection()).bind(clock()));
|
|
17
19
|
return class extends Base {
|
|
18
20
|
static whereRoles = scope((query, ...roles) => {
|
|
19
21
|
const model = query.model;
|
|
@@ -23,9 +25,9 @@ export function withAuthzScopes(Base) {
|
|
|
23
25
|
.join('authz_roles as r', 'r.uuid', 'a.role_uuid')
|
|
24
26
|
.where('a.holder_type', morph)
|
|
25
27
|
.whereIn('r.slug', roles)
|
|
26
|
-
.where(
|
|
28
|
+
.where(active)
|
|
27
29
|
.select('a.holder_uuid');
|
|
28
|
-
query.whereIn(
|
|
30
|
+
query.whereIn(comparablePrimaryKey(query), sub);
|
|
29
31
|
});
|
|
30
32
|
static wherePermissions = scope((query, ...permissions) => {
|
|
31
33
|
const model = query.model;
|
|
@@ -36,10 +38,20 @@ export function withAuthzScopes(Base) {
|
|
|
36
38
|
.join('authz_permissions as p', 'p.uuid', 'rp.permission_uuid')
|
|
37
39
|
.where('a.holder_type', morph)
|
|
38
40
|
.whereIn('p.slug', permissions)
|
|
39
|
-
.where(
|
|
41
|
+
.where(active)
|
|
40
42
|
.select('a.holder_uuid');
|
|
41
|
-
query.whereIn(
|
|
43
|
+
query.whereIn(comparablePrimaryKey(query), sub);
|
|
42
44
|
});
|
|
43
45
|
};
|
|
44
46
|
}
|
|
47
|
+
export function withAuthzScopes(arg) {
|
|
48
|
+
if (typeof arg === 'function')
|
|
49
|
+
return mixin(arg, systemClock);
|
|
50
|
+
const options = arg ?? {};
|
|
51
|
+
if (options.clock !== undefined && !isClock(options.clock)) {
|
|
52
|
+
throw new AuthorizationConfigError(`withAuthzScopes: 'clock' debe ser una función () => Date (llegó ${typeof options.clock})`);
|
|
53
|
+
}
|
|
54
|
+
const clock = options.clock ?? systemClock;
|
|
55
|
+
return (Base) => mixin(Base, clock);
|
|
56
|
+
}
|
|
45
57
|
//# sourceMappingURL=authz_scopes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz_scopes.js","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,MAAM,6BAA6B,CAAA;
|
|
1
|
+
{"version":3,"file":"authz_scopes.js","sourceRoot":"","sources":["../../../src/traits/authz_scopes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAElD,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AACvD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAmCpE,yFAAyF;AACzF,SAAS,oBAAoB,CAAC,KAAU;IACtC,yEAAyE;IACzE,wEAAwE;IACxE,yEAAyE;IACzE,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,UAAU,EAAE,CAAA;IAC/D,OAAO,SAAS,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,kBAAkB,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;AAClG,CAAC;AAED,SAAS,KAAK,CAAwB,IAAO,EAAE,KAAY;IACzD,mGAAmG;IACnG,MAAM,MAAM,GAAG,CAAC,CAAM,EAAE,EAAE,CACxB,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAQ,CAAC,CAAA;IAEhH,OAAO,KAAM,SAAQ,IAAI;QACvB,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC,CAAC,KAAU,EAAE,GAAG,KAAe,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,CAAA;YAC5C,MAAM,GAAG,GAAG,EAAE;iBACX,IAAI,CAAC,wBAAwB,CAAC;iBAC9B,IAAI,CAAC,kBAAkB,EAAE,QAAQ,EAAE,aAAa,CAAC;iBACjD,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;iBAC7B,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC;iBACxB,KAAK,CAAC,MAAM,CAAC;iBACb,MAAM,CAAC,eAAe,CAAC,CAAA;YAC1B,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;QAEF,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,KAAU,EAAE,GAAG,WAAqB,EAAE,EAAE;YACvE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAA;YACzB,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,cAAc,CAAA;YAC5C,MAAM,GAAG,GAAG,EAAE;iBACX,IAAI,CAAC,wBAAwB,CAAC;iBAC9B,IAAI,CAAC,8BAA8B,EAAE,cAAc,EAAE,aAAa,CAAC;iBACnE,IAAI,CAAC,wBAAwB,EAAE,QAAQ,EAAE,oBAAoB,CAAC;iBAC9D,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC;iBAC7B,OAAO,CAAC,QAAQ,EAAE,WAAW,CAAC;iBAC9B,KAAK,CAAC,MAAM,CAAC;iBACb,MAAM,CAAC,eAAe,CAAC,CAAA;YAC1B,KAAK,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAA;QACjD,CAAC,CAAC,CAAA;KACH,CAAA;AACH,CAAC;AAaD,MAAM,UAAU,eAAe,CAAC,GAAsC;IACpE,IAAI,OAAO,GAAG,KAAK,UAAU;QAAE,OAAO,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAA;IAC7D,MAAM,OAAO,GAAG,GAAG,IAAI,EAAE,CAAA;IACzB,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,wBAAwB,CAChC,mEAAmE,OAAO,OAAO,CAAC,KAAK,GAAG,CAC3F,CAAA;IACH,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAA;IAC1C,OAAO,CAAwB,IAAO,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;AAC/D,CAAC"}
|
|
@@ -68,15 +68,18 @@ export declare const hasUuid: <Model extends NormalizeConstructor<typeof BaseMod
|
|
|
68
68
|
generateUuid(model: any): void;
|
|
69
69
|
/** Devuelve un nuevo UUID v7 (para uso en pivots u otros datos que no son instancias del modelo). */
|
|
70
70
|
nextUuid(): string;
|
|
71
|
+
all: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
|
|
71
72
|
find: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
|
|
73
|
+
table: string;
|
|
74
|
+
connection?: string | undefined;
|
|
75
|
+
first: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
|
|
76
|
+
truncate: (cascade?: boolean) => Promise<void>;
|
|
72
77
|
readonly booted: boolean;
|
|
73
78
|
$columnsDefinitions: Map<string, import("@adonisjs/lucid/types/model").ModelColumnOptions>;
|
|
74
79
|
$relationsDefinitions: Map<string, import("@adonisjs/lucid/types/relations").RelationshipsContract>;
|
|
75
80
|
$computedDefinitions: Map<string, import("@adonisjs/lucid/types/model").ComputedOptions>;
|
|
76
81
|
primaryKey: string;
|
|
77
|
-
connection?: string | undefined;
|
|
78
82
|
namingStrategy: import("@adonisjs/lucid/types/model").NamingStrategyContract;
|
|
79
|
-
table: string;
|
|
80
83
|
$adapter: import("@adonisjs/lucid/types/model").AdapterContract;
|
|
81
84
|
useAdapter: (adapter: import("@adonisjs/lucid/types/model").AdapterContract) => void;
|
|
82
85
|
$hooks: import("@poppinss/hooks").default<any>;
|
|
@@ -134,7 +137,6 @@ export declare const hasUuid: <Model extends NormalizeConstructor<typeof BaseMod
|
|
|
134
137
|
<T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, clause: Record<string, unknown>, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
|
|
135
138
|
<T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, key: string, value: any, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions): Promise<InstanceType<T>[]>;
|
|
136
139
|
};
|
|
137
|
-
first: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<null | InstanceType<T>>;
|
|
138
140
|
firstOrFail: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>>;
|
|
139
141
|
findMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, value: any[], options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
|
|
140
142
|
firstOrNew: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, searchPayload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, savePayload?: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>, options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>>;
|
|
@@ -143,9 +145,7 @@ export declare const hasUuid: <Model extends NormalizeConstructor<typeof BaseMod
|
|
|
143
145
|
fetchOrNewUpMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
144
146
|
fetchOrCreateMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
145
147
|
updateOrCreateMany: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, predicate: keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>> | (keyof import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>)[], payload: Partial<import("@adonisjs/lucid/types/model").ModelAttributes<InstanceType<T>>>[], options?: import("@adonisjs/lucid/types/model").ModelAssignOptions) => Promise<InstanceType<T>[]>;
|
|
146
|
-
all: <T extends import("@adonisjs/lucid/types/model").LucidModel>(this: T, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => Promise<InstanceType<T>[]>;
|
|
147
148
|
query: <Model_1 extends import("@adonisjs/lucid/types/model").LucidModel, Result = InstanceType<Model_1>>(this: Model_1, options?: import("@adonisjs/lucid/types/model").ModelAdapterOptions) => import("@adonisjs/lucid/types/model").ModelQueryBuilderContract<Model_1, Result>;
|
|
148
149
|
transaction: import("@adonisjs/lucid/types/database").TransactionFn;
|
|
149
|
-
truncate: (cascade?: boolean) => Promise<void>;
|
|
150
150
|
} & Model;
|
|
151
151
|
//# sourceMappingURL=has_uuid.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"has_uuid.d.ts","sourceRoot":"","sources":["../../../src/traits/has_uuid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAGxE;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,KAAK,SAAS,oBAAoB,CAAC,OAAO,SAAS,CAAC,EAC1E,YAAY,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAMY,GAAG;IAO9B,qGAAqG;gBAClF,MAAM
|
|
1
|
+
{"version":3,"file":"has_uuid.d.ts","sourceRoot":"","sources":["../../../src/traits/has_uuid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAGxE;;;GAGG;AACH,eAAO,MAAM,OAAO,GAAI,KAAK,SAAS,oBAAoB,CAAC,OAAO,SAAS,CAAC,EAC1E,YAAY,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAMY,GAAG;IAO9B,qGAAqG;gBAClF,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kaAM0jtB,oDAAiD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SADvotB,CAAA"}
|