@jantstack/adonis-authz 2.5.0-alpha.1 → 2.5.0-alpha.3
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/README.md +515 -22
- package/build/commands/authz_relations_reconcile.d.ts +13 -62
- package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
- package/build/commands/authz_relations_reconcile.js +202 -116
- package/build/commands/authz_relations_reconcile.js.map +1 -1
- package/build/commands/openfga_provision.d.ts +62 -0
- package/build/commands/openfga_provision.d.ts.map +1 -1
- package/build/commands/openfga_provision.js +193 -1
- package/build/commands/openfga_provision.js.map +1 -1
- package/build/index.d.ts +6 -6
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -3
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +4 -1
- package/build/providers/authz_provider.js.map +1 -1
- package/build/src/define_config.d.ts +32 -0
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +109 -0
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/database_relations_driver.d.ts +36 -1
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/database_relations_driver.js +213 -46
- package/build/src/drivers/database_relations_driver.js.map +1 -1
- package/build/src/drivers/openfga_driver.d.ts +30 -4
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +151 -45
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/openfga_facts.d.ts +21 -0
- package/build/src/drivers/openfga_facts.d.ts.map +1 -1
- package/build/src/drivers/openfga_facts.js +74 -8
- package/build/src/drivers/openfga_facts.js.map +1 -1
- package/build/src/drivers/openfga_relations_driver.d.ts +140 -10
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_relations_driver.js +743 -49
- package/build/src/drivers/openfga_relations_driver.js.map +1 -1
- package/build/src/errors.d.ts +148 -0
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +166 -0
- package/build/src/errors.js.map +1 -1
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +15 -5
- package/build/src/manager.js.map +1 -1
- package/build/src/openfga.d.ts +1 -1
- package/build/src/openfga.d.ts.map +1 -1
- package/build/src/openfga.js +1 -1
- package/build/src/openfga.js.map +1 -1
- package/build/src/relations/check_many.d.ts +1 -1
- package/build/src/relations/check_many.d.ts.map +1 -1
- package/build/src/relations/check_many.js +6 -4
- package/build/src/relations/check_many.js.map +1 -1
- package/build/src/relations/define_relations_config.d.ts +187 -1
- package/build/src/relations/define_relations_config.d.ts.map +1 -1
- package/build/src/relations/define_relations_config.js +395 -7
- package/build/src/relations/define_relations_config.js.map +1 -1
- package/build/src/relations/manager.d.ts +33 -2
- package/build/src/relations/manager.d.ts.map +1 -1
- package/build/src/relations/manager.js +123 -4
- package/build/src/relations/manager.js.map +1 -1
- package/build/src/relations/reconcile.d.ts +295 -13
- package/build/src/relations/reconcile.d.ts.map +1 -1
- package/build/src/relations/reconcile.js +886 -85
- package/build/src/relations/reconcile.js.map +1 -1
- package/build/src/relations/tuple_order.d.ts +126 -0
- package/build/src/relations/tuple_order.d.ts.map +1 -0
- package/build/src/relations/tuple_order.js +598 -0
- package/build/src/relations/tuple_order.js.map +1 -0
- package/build/src/relations_config_store.d.ts.map +1 -1
- package/build/src/relations_config_store.js +29 -7
- package/build/src/relations_config_store.js.map +1 -1
- package/build/src/relations_reconcile.d.ts +79 -0
- package/build/src/relations_reconcile.d.ts.map +1 -0
- package/build/src/relations_reconcile.js +85 -0
- package/build/src/relations_reconcile.js.map +1 -0
- package/build/src/scope_outbox.d.ts +9 -5
- package/build/src/scope_outbox.d.ts.map +1 -1
- package/build/src/scope_outbox.js +7 -4
- package/build/src/scope_outbox.js.map +1 -1
- package/build/src/shared/backend_guard.d.ts +8 -0
- package/build/src/shared/backend_guard.d.ts.map +1 -1
- package/build/src/shared/backend_guard.js +15 -0
- package/build/src/shared/backend_guard.js.map +1 -1
- package/build/src/testing/main.d.ts +1 -1
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +1 -1
- package/build/src/testing/main.js.map +1 -1
- package/build/src/testing/relations_contract.d.ts +18 -0
- package/build/src/testing/relations_contract.d.ts.map +1 -1
- package/build/src/testing/relations_contract.js +895 -45
- package/build/src/testing/relations_contract.js.map +1 -1
- package/build/src/testing/relations_reconcile_contract.d.ts +9 -0
- package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -1
- package/build/src/testing/relations_reconcile_contract.js +207 -0
- package/build/src/testing/relations_reconcile_contract.js.map +1 -1
- package/build/src/testing/scope_outbox_contract.d.ts +14 -1
- package/build/src/testing/scope_outbox_contract.d.ts.map +1 -1
- package/build/src/testing/scope_outbox_contract.js +126 -48
- package/build/src/testing/scope_outbox_contract.js.map +1 -1
- package/build/src/types.d.ts +90 -6
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +2 -0
- package/build/src/types.js.map +1 -1
- package/package.json +2 -1
|
@@ -1,66 +1,6 @@
|
|
|
1
1
|
import { BaseCommand } from '@adonisjs/core/ace';
|
|
2
2
|
import { CommandOptions } from '@adonisjs/core/types/ace';
|
|
3
|
-
import type {
|
|
4
|
-
import type { AuthorizationManager } from '../src/manager.js';
|
|
5
|
-
/**
|
|
6
|
-
* **La ÚNICA vía pública para reconciliar relaciones** (L-1 · J1; cierre del
|
|
7
|
-
* auditor de alpha.10 · R1/R4). `reconcileRelations` (`src/relations/`) es el
|
|
8
|
-
* primitivo: no puede ver al manager de roles (regla 2 de pureza), así que no
|
|
9
|
-
* sabe cuál es el driver ACTIVO ni puede tomar la ventana durable. Hasta el
|
|
10
|
-
* cierre se exportaba desde la raíz del paquete y el README lo recomendaba para
|
|
11
|
-
* K particiones: esa vía llegaba a la dirección rancia sin guard y sin freeze.
|
|
12
|
-
* Ahora sale de la raíz y TODA migración de relaciones pasa por aquí —el
|
|
13
|
-
* comando, un bucle por particiones de la plataforma—, que es el punto único
|
|
14
|
-
* donde viven las dos garantías:
|
|
15
|
-
*
|
|
16
|
-
* - **la dirección RANCIA** (alpha.10 · S1, gemelo de `manager.reconcile`):
|
|
17
|
-
* hacia el driver de relaciones activo (`relations.default ?? default`)
|
|
18
|
-
* ningún origen distinto pasa. **El origen y el destino se RESUELVEN aquí,
|
|
19
|
-
* por su clave, desde el config del manager** (R4): hasta el cierre la
|
|
20
|
-
* función recibía las instancias `from`/`to` y, aparte, las ETIQUETAS
|
|
21
|
-
* `toKey`/`fromKey`/`activeKey`, y juzgaba las etiquetas — un bucle con
|
|
22
|
-
* `fromKey === toKey` copiado y pegado, o un `activeKey` que contradecía al
|
|
23
|
-
* manager, escribía la compartición retirada en el activo. La identidad es
|
|
24
|
-
* la de la factory resuelta: dos claves con la MISMA factory son el mismo
|
|
25
|
-
* driver (un alias del activo también se niega);
|
|
26
|
-
* - **la ventana durable**: `--dry-run` **NO congela** (el verificador es
|
|
27
|
-
* read-only y está hecho para un cron); la pasada que ESCRIBE corre bajo
|
|
28
|
-
* `withFrozenWrites` con `kind: 'reconcile'` y la ventana del OPERADOR como
|
|
29
|
-
* contexto propio; un freeze vivo de OTRA pasada es 423; el reporte publica
|
|
30
|
-
* `frozen` —fence, lease, `window` y **`lapsed`**— y un lease perdido a
|
|
31
|
-
* mitad significa que la pasada NO se certifica (exit ≠ 0).
|
|
32
|
-
*
|
|
33
|
-
* Límite declarado (auditor · R5): el activo es el que dice el config del
|
|
34
|
-
* PROCESO que ejecuta esto; un Job con otro entorno apaga el guard. El sello
|
|
35
|
-
* durable del driver activo está en el roadmap (2.5).
|
|
36
|
-
*/
|
|
37
|
-
/**
|
|
38
|
-
* **Las opciones PÚBLICAS de `runRelationsReconcile`** (cierre-2 de alpha.10 · C7):
|
|
39
|
-
* las del primitivo sin `from`/`to` (instancias: retiradas) más las claves. Hasta el
|
|
40
|
-
* cierre-2 la raíz exportaba `RelationsReconcileOptions` —la forma del primitivo, con
|
|
41
|
-
* `from`/`to` obligatorios— y no esta.
|
|
42
|
-
*/
|
|
43
|
-
export type RunRelationsReconcileOptions = Omit<RelationsReconcileOptions, 'from' | 'to'> & {
|
|
44
|
-
/** Clave (en `relations.drivers` del config del manager) del DESTINO. */
|
|
45
|
-
toKey: string;
|
|
46
|
-
/** Clave del ORIGEN (el de `--from` o el elegido por descarte). */
|
|
47
|
-
fromKey: string;
|
|
48
|
-
/** La salida humana de `E_AUTHZ_STALE_SOURCE_REFUSED`. */
|
|
49
|
-
allowStaleSource?: boolean;
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Límites DECLARADOS de la identidad (cierre-2 de alpha.10 · C1 y C6):
|
|
53
|
-
* - la identidad es la REFERENCIA de la factory: dos factories DISTINTAS que
|
|
54
|
-
* construyen el mismo backend (`fga: () => new OpenFgaRelationsDriver(…mismo
|
|
55
|
-
* store…)`) NO se detectan — el alias pasa el guard. No se construye nada antes
|
|
56
|
-
* del guard, así que no hay backend que comparar; identidad declarada por el
|
|
57
|
-
* driver ⇒ roadmap 2.5. Registra un alias con la MISMA referencia
|
|
58
|
-
* (`const fga = () => …; drivers: { openfga: fga, alias: fga }`) o no lo registres.
|
|
59
|
-
* - `authorization` es estructural (`Pick<…>`): un objeto que FALSEA
|
|
60
|
-
* `relationsDriverKey`/`relationsDriverFactory` decide el activo y las factories.
|
|
61
|
-
* Pásale el manager del servicio, nunca uno construido o envuelto a mano.
|
|
62
|
-
*/
|
|
63
|
-
export declare function runRelationsReconcile(authorization: Pick<AuthorizationManager, 'withFrozenWrites' | 'relationsDriverKey' | 'relationsDriverFactory'>, options: RunRelationsReconcileOptions): Promise<RelationsReconcileReport>;
|
|
3
|
+
import type { RelationsReconcileReport } from '../src/relations/reconcile.js';
|
|
64
4
|
/**
|
|
65
5
|
* Cómo se nombra la ventana en la que corrió la pasada (2.4.0-alpha.10 · 3):
|
|
66
6
|
* la del OPERADOR dice si caduca y cuándo — hasta alpha.9 una ventana abierta
|
|
@@ -87,7 +27,12 @@ export declare function frozenWindowLabel(frozen: {
|
|
|
87
27
|
*
|
|
88
28
|
* `extra` en una pasada que SÍ escribe (sin `--prune`) se AVISA —«repite con
|
|
89
29
|
* --prune»— pero no tumba: el operador eligió no podar. Es la misma cortesía
|
|
90
|
-
* que `authz:reconcile` de roles con la ventana del relay.
|
|
30
|
+
* que `authz:reconcile` de roles con la ventana del relay. **Salvo el residuo
|
|
31
|
+
* del destino que nadie borra** (`invalid-identity`, `userset-unsupported` y,
|
|
32
|
+
* desde el cierre 3 · 🟠 N9, `undeclared` — la fila cuya relación o tipo el
|
|
33
|
+
* destino ya no declara; cierre 2 del lote B · 🟡 N3): ése es deriva con o sin
|
|
34
|
+
* `--prune`, y el consejo solo cuenta lo que `--prune` borraría de verdad y
|
|
35
|
+
* solo si no se pasó.
|
|
91
36
|
*/
|
|
92
37
|
export declare function relationsReconcileLines(report: RelationsReconcileReport): {
|
|
93
38
|
lines: Array<{
|
|
@@ -96,6 +41,12 @@ export declare function relationsReconcileLines(report: RelationsReconcileReport
|
|
|
96
41
|
}>;
|
|
97
42
|
clean: boolean;
|
|
98
43
|
};
|
|
44
|
+
/**
|
|
45
|
+
* **La pasada que revienta A MITAD dice qué quedó escrito, por partición** (plan 2.5 · lote D · D2; roadmap 2.5, 🟡 3
|
|
46
|
+
* del auditor de alpha.6): con el reporte parcial que viaja en el error (`error.report`, `partial: true`). Prefijo
|
|
47
|
+
* ESTABLE «pasada PARCIAL:» (punto 7). Función PURA.
|
|
48
|
+
*/
|
|
49
|
+
export declare function partialReportLines(report: RelationsReconcileReport): string[];
|
|
99
50
|
/**
|
|
100
51
|
* **`authz:relations:reconcile`** (Fase 4, lote 4-6) — migra las tuplas de
|
|
101
52
|
* RELACIÓN de un `RelationsDriver` a otro, idempotente y bidireccional, nunca
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz_relations_reconcile.d.ts","sourceRoot":"","sources":["../../commands/authz_relations_reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"authz_relations_reconcile.d.ts","sourceRoot":"","sources":["../../commands/authz_relations_reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAA;AAO7E;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,CAAC,EAAE,UAAU,GAAG,KAAK,GAAG,WAAW,CAAA;CAC1C,GAAG,MAAM,CAaT;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,wBAAwB,GAAG;IACzE,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,KAAK,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACjF,KAAK,EAAE,OAAO,CAAA;CACf,CA+QA;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,wBAAwB,GAAG,MAAM,EAAE,CAoB7E;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAwB,SAAQ,WAAW;IAC9D,MAAM,CAAC,WAAW,SAA8B;IAChD,MAAM,CAAC,WAAW,SAAgG;IAElH,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAGO,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IAGtB,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IAGxB,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAG3B,KAAK,EAAE,OAAO,GAAG,SAAS,CAAA;IAK1B,eAAe,EAAE,OAAO,GAAG,SAAS,CAAA;IAMpC,gBAAgB,EAAE,OAAO,GAAG,SAAS,CAAA;IAGrC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAGjC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAA;IAEnC,GAAG;CAyNV"}
|
|
@@ -8,90 +8,11 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
8
8
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
9
|
};
|
|
10
10
|
import { BaseCommand, flags } from '@adonisjs/core/ace';
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
* store…)`) NO se detectan — el alias pasa el guard. No se construye nada antes
|
|
17
|
-
* del guard, así que no hay backend que comparar; identidad declarada por el
|
|
18
|
-
* driver ⇒ roadmap 2.5. Registra un alias con la MISMA referencia
|
|
19
|
-
* (`const fga = () => …; drivers: { openfga: fga, alias: fga }`) o no lo registres.
|
|
20
|
-
* - `authorization` es estructural (`Pick<…>`): un objeto que FALSEA
|
|
21
|
-
* `relationsDriverKey`/`relationsDriverFactory` decide el activo y las factories.
|
|
22
|
-
* Pásale el manager del servicio, nunca uno construido o envuelto a mano.
|
|
23
|
-
*/
|
|
24
|
-
export async function runRelationsReconcile(authorization, options) {
|
|
25
|
-
const { reconcileRelations } = await import('../src/relations/reconcile.js');
|
|
26
|
-
const raw = options;
|
|
27
|
-
// Entradas que ya no gobiernan nada (L5: una opción inerte no cae en un
|
|
28
|
-
// default en silencio). `from`/`to` como instancias y `activeKey` eran
|
|
29
|
-
// justo las etiquetas desalineables del R4.
|
|
30
|
-
const retiredOptions = ['from', 'to', 'activeKey'].filter((name) => raw[name] !== undefined);
|
|
31
|
-
if (retiredOptions.length > 0) {
|
|
32
|
-
throw new AuthorizationConfigError(`runRelationsReconcile: ${retiredOptions.map((n) => `\`${n}\``).join(', ')} ya no se acepta(n) (cierre de 2.4.0-alpha.10): ` +
|
|
33
|
-
'el origen y el destino se resuelven por `fromKey`/`toKey` desde el config del manager, y el driver activo lo ' +
|
|
34
|
-
'dice el manager (`relations.default ?? default`). Pasar instancias o un activo propio permitía que la etiqueta ' +
|
|
35
|
-
'contradijera al driver y la dirección rancia pasara.');
|
|
36
|
-
}
|
|
37
|
-
if (typeof options.toKey !== 'string' || typeof options.fromKey !== 'string') {
|
|
38
|
-
throw new AuthorizationConfigError('runRelationsReconcile: hacen falta `toKey` y `fromKey` (las claves de relations.drivers del destino y del ORIGEN) ' +
|
|
39
|
-
'desde 2.4.0-alpha.10 — sin ellas no se puede negar la dirección rancia (re-escribir en el driver de relaciones ' +
|
|
40
|
-
'ACTIVO lo que el origen dejó de ver en el cutover).');
|
|
41
|
-
}
|
|
42
|
-
const { toKey, fromKey, allowStaleSource, ...rest } = options;
|
|
43
|
-
const toFactory = authorization.relationsDriverFactory(toKey);
|
|
44
|
-
const fromFactory = authorization.relationsDriverFactory(fromKey);
|
|
45
|
-
for (const [role, key, factory] of [['destino', toKey, toFactory], ['origen', fromKey, fromFactory]]) {
|
|
46
|
-
if (typeof factory !== 'function') {
|
|
47
|
-
throw new AuthorizationConfigError(`runRelationsReconcile: el ${role} '${key}' no es una clave de relations.drivers en el config del manager.`);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
const active = authorization.relationsDriverKey();
|
|
51
|
-
/** Mismo driver ⇔ misma clave o misma factory resuelta (un alias es el mismo driver). */
|
|
52
|
-
const sameDriver = (a, b) => a === b || authorization.relationsDriverFactory(a) === authorization.relationsDriverFactory(b);
|
|
53
|
-
if (sameDriver(fromKey, toKey)) {
|
|
54
|
-
throw new AuthorizationConfigError(`runRelationsReconcile: el origen '${fromKey}' y el destino '${toKey}' son el MISMO driver ` +
|
|
55
|
-
`(${fromKey === toKey ? 'misma clave' : 'la misma factory bajo dos claves'}): no hay nada que migrar y un --prune ` +
|
|
56
|
-
'se compararía consigo mismo. Nombra el otro driver.');
|
|
57
|
-
}
|
|
58
|
-
const stale = sameDriver(toKey, active);
|
|
59
|
-
const allowStale = allowStaleSource === true;
|
|
60
|
-
if (stale && !allowStale && options.dryRun !== true) {
|
|
61
|
-
const alias = toKey === active ? '' : ` (la clave '${toKey}' resuelve la MISMA factory que el activo '${active}')`;
|
|
62
|
-
throw new StaleSourceRefusedError(`authz:relations:reconcile --to=${toKey} (origen '${fromKey}'): '${toKey}' es el driver de ` +
|
|
63
|
-
`relaciones ACTIVO (relations.default ?? default)${alias} y el origen no lo es. Esa dirección re-escribiría en el driver ` +
|
|
64
|
-
`activo tuplas que el origen ya no refleja: resucitaría las comparticiones retiradas desde el cutover (y con ` +
|
|
65
|
-
`--prune borraría las creadas después). No se ha construido, leído, congelado ni escrito nada. Tras el cutover el driver ` +
|
|
66
|
-
`activo ES la fuente de verdad de las relaciones: no hay nada que migrar hacia él; para volver atrás, migra en ` +
|
|
67
|
-
`la otra dirección (--to=${fromKey} --from=${toKey}) ANTES de cambiar relations.default/default. ` +
|
|
68
|
-
`Si de verdad el origen sigue siendo la fuente de verdad, la decisión humana es --allow-stale-source ` +
|
|
69
|
-
`(allowStaleSource: true).`);
|
|
70
|
-
}
|
|
71
|
-
const from = await fromFactory();
|
|
72
|
-
const to = await toFactory();
|
|
73
|
-
const pass = () => reconcileRelations({ ...rest, from, to });
|
|
74
|
-
const mark = (report) => {
|
|
75
|
-
if (stale)
|
|
76
|
-
report.staleSource = { to: toKey, from: fromKey, allowed: allowStale };
|
|
77
|
-
return report;
|
|
78
|
-
};
|
|
79
|
-
if (options.dryRun === true)
|
|
80
|
-
return mark(await pass());
|
|
81
|
-
const reason = `authz:relations:reconcile --to=${toKey}`;
|
|
82
|
-
return authorization.withFrozenWrites(reason, async (window) => {
|
|
83
|
-
const report = mark(await pass());
|
|
84
|
-
report.frozen = {
|
|
85
|
-
durable: true,
|
|
86
|
-
lapsed: await window.lapsed(),
|
|
87
|
-
leaseMs: window.leaseMs,
|
|
88
|
-
fence: window.fence,
|
|
89
|
-
...(window.untilMs === undefined ? {} : { untilMs: window.untilMs }),
|
|
90
|
-
...(window.window === undefined ? {} : { window: window.window }),
|
|
91
|
-
};
|
|
92
|
-
return report;
|
|
93
|
-
}, { kind: 'reconcile', operatorAsContext: true });
|
|
94
|
-
}
|
|
11
|
+
import { RELATION_USERSET_RESIDUE_DELETE } from '../src/relations/define_relations_config.js';
|
|
12
|
+
import { RelationConfigError } from '../src/errors.js';
|
|
13
|
+
// Plan 2.5 · lote B · B7: la vía pública vive en su subpath (`src/relations_reconcile.ts`,
|
|
14
|
+
// `@jantstack/adonis-authz/relations/reconcile`); este módulo es el COMANDO y la importa de allí.
|
|
15
|
+
import { runRelationsReconcile } from '../src/relations_reconcile.js';
|
|
95
16
|
/**
|
|
96
17
|
* Cómo se nombra la ventana en la que corrió la pasada (2.4.0-alpha.10 · 3):
|
|
97
18
|
* la del OPERADOR dice si caduca y cuándo — hasta alpha.9 una ventana abierta
|
|
@@ -128,7 +49,12 @@ export function frozenWindowLabel(frozen) {
|
|
|
128
49
|
*
|
|
129
50
|
* `extra` en una pasada que SÍ escribe (sin `--prune`) se AVISA —«repite con
|
|
130
51
|
* --prune»— pero no tumba: el operador eligió no podar. Es la misma cortesía
|
|
131
|
-
* que `authz:reconcile` de roles con la ventana del relay.
|
|
52
|
+
* que `authz:reconcile` de roles con la ventana del relay. **Salvo el residuo
|
|
53
|
+
* del destino que nadie borra** (`invalid-identity`, `userset-unsupported` y,
|
|
54
|
+
* desde el cierre 3 · 🟠 N9, `undeclared` — la fila cuya relación o tipo el
|
|
55
|
+
* destino ya no declara; cierre 2 del lote B · 🟡 N3): ése es deriva con o sin
|
|
56
|
+
* `--prune`, y el consejo solo cuenta lo que `--prune` borraría de verdad y
|
|
57
|
+
* solo si no se pasó.
|
|
132
58
|
*/
|
|
133
59
|
export function relationsReconcileLines(report) {
|
|
134
60
|
const lines = [];
|
|
@@ -137,6 +63,27 @@ export function relationsReconcileLines(report) {
|
|
|
137
63
|
message: `relaciones: escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted}, ` +
|
|
138
64
|
`iguales ${report.unchanged}, sobran ${report.extra}`,
|
|
139
65
|
});
|
|
66
|
+
// Lote D · D2: los denies, en su PROPIA línea (prefijo estable «denies:»), solo si la pasada tocó o vio alguno. Los
|
|
67
|
+
// contadores de arriba son allows + denies; esta línea es el subconjunto (analista §4.7).
|
|
68
|
+
const denies = report.denies;
|
|
69
|
+
if (denies && Object.values(denies).some((n) => n > 0)) {
|
|
70
|
+
lines.push({
|
|
71
|
+
level: 'log',
|
|
72
|
+
message: `denies: escritos ${denies.written}, rehechos ${denies.updated}, borrados ${denies.deleted}, ` +
|
|
73
|
+
`iguales ${denies.unchanged}, sobran ${denies.extra}`,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
// Lote D · D2 (S6/R2-5): un deny que la pasada NO puede migrar. Solo llega en `--dry-run` (la real lanza 500 con la
|
|
77
|
+
// misma letra): es DERIVA, una línea por tipo/relación y motivo, con el prefijo ESTABLE «deny NO migrable».
|
|
78
|
+
for (const refusal of report.denyRefused ?? []) {
|
|
79
|
+
lines.push({
|
|
80
|
+
level: 'error',
|
|
81
|
+
message: `deny NO migrable (${refusal.reason}) ${refusal.objectType}#${refusal.relation}: ${refusal.message}. ` +
|
|
82
|
+
'La pasada real se NIEGA (500 E_AUTHZ_DENY_MIGRATION_REFUSED) sin escribir nada — ni los allows: escribirlos sin ' +
|
|
83
|
+
// Cierre 1 de D2 · 🟡 6: la receta de SU motivo (la decide el plan, `refusal.recipe`), no una genérica.
|
|
84
|
+
`el deny concedería lo que el origen niega. Receta: ${refusal.recipe}`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
140
87
|
// R-15: la caducada del origen es la pérdida DECLARADA de la migración (como
|
|
141
88
|
// `expired` en roles, 3b-8 · B2): se dice, no es deriva.
|
|
142
89
|
if (report.skipped.expired > 0) {
|
|
@@ -166,46 +113,94 @@ export function relationsReconcileLines(report) {
|
|
|
166
113
|
});
|
|
167
114
|
}
|
|
168
115
|
// ⚪ R2 (cierre-2 del lote A; linaje L8, «una operación destructiva lista lo
|
|
169
|
-
// que destruye»)
|
|
170
|
-
//
|
|
171
|
-
//
|
|
172
|
-
//
|
|
173
|
-
//
|
|
174
|
-
//
|
|
175
|
-
//
|
|
176
|
-
//
|
|
177
|
-
//
|
|
178
|
-
//
|
|
179
|
-
|
|
116
|
+
// que destruye») + cierre 1 (🟠 1/🟠 2) y cierre 2 (🟡 N3, UNIFICACIÓN) del lote
|
|
117
|
+
// B: lo enumerado con una identidad fuera de la gramática (`invalid-identity`)
|
|
118
|
+
// y el residuo pre-2.5 de B3 (`userset-unsupported`), UNA línea por tupla con
|
|
119
|
+
// su lado y su porqué. Nunca fue una pregunta del llamante (invariante 5), así
|
|
120
|
+
// que nunca es un 422 que tumbe la pasada. Y UNA regla para los dos motivos
|
|
121
|
+
// (coordinador, 2026-10-15): un residuo del DESTINO que ningún driver del
|
|
122
|
+
// paquete borra se lista con `error` y el prefijo ESTABLE «sobra (<motivo>)
|
|
123
|
+
// destino:», es deriva (exit ≠ 0) en los CUATRO modos (prune × dry-run)
|
|
124
|
+
// —ninguna bandera lo toca: nunca un DELETE de plataforma ni un `unrelate`
|
|
125
|
+
// que los drivers del paquete rechazarían (R-16)—, dice «--prune NO lo borra»
|
|
126
|
+
// (`pruned: false`, con --prune) o «tampoco lo borraría» (sin --prune), lleva
|
|
127
|
+
// la receta y JAMÁS «repite con --prune». El del ORIGEN no se migra: deriva, a
|
|
128
|
+
// mano. Hasta el cierre 2, `invalid-identity` sin --prune era un warning con
|
|
129
|
+
// exit 0 y el consejo falso «repite con --prune» (que tampoco lo quitaba).
|
|
130
|
+
// El verificador queda rojo HASTA que se ejecute la receta — y dice qué y cómo.
|
|
131
|
+
let destResidue = 0;
|
|
132
|
+
let pendingRenewals = 0;
|
|
180
133
|
for (const detail of report.details ?? []) {
|
|
181
134
|
const what = `(${detail.reason}) ${detail.side}: ${detail.tuple} — ${detail.message}`;
|
|
182
135
|
if (detail.side === 'origen') {
|
|
183
136
|
lines.push({
|
|
184
137
|
level: 'error',
|
|
185
|
-
message:
|
|
138
|
+
message: detail.reason === 'userset-unsupported'
|
|
139
|
+
? `sin migrar ${what}. Es un residuo pre-2.5 (B3) del store de ORIGEN: el destino no lo admite por ninguna puerta y ningún --prune lo toca. Bórrala a mano (los tres motores): ${RELATION_USERSET_RESIDUE_DELETE} y repite la pasada.`
|
|
140
|
+
: `sin migrar ${what}. Es un dato del store de ORIGEN, no una pregunta: corrígela o bórrala a mano (SQL/SDK) y repite la pasada.`,
|
|
186
141
|
});
|
|
187
142
|
continue;
|
|
188
143
|
}
|
|
189
|
-
if (detail.
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
: `BORRADA por --prune ${what}.`,
|
|
195
|
-
});
|
|
144
|
+
if (detail.reason === 'renewal-unsafe') {
|
|
145
|
+
// Cierre 2 de D2 · 🟠 N1: la membresía NO se renovó (su grupo transporta un deny y el destino renueva con dos
|
|
146
|
+
// Write). Deriva con su receta; prefijo ESTABLE «sin renovar (renewal-unsafe) destino:» (punto 7).
|
|
147
|
+
pendingRenewals += 1;
|
|
148
|
+
lines.push({ level: 'error', message: `sin renovar ${what}.` });
|
|
196
149
|
continue;
|
|
197
150
|
}
|
|
198
|
-
if (detail.pruned ===
|
|
199
|
-
|
|
200
|
-
lines.push({
|
|
201
|
-
level: 'error',
|
|
202
|
-
message: `NO se pudo borrar con --prune ${what}: el driver del destino la rechaza por el puerto (su gramática en unrelate). Sigue ahí: bórrala a mano (SQL/SDK).`,
|
|
203
|
-
});
|
|
151
|
+
if (detail.pruned === true) {
|
|
152
|
+
// El paquete ya no lo emite (cierre 2 · N3): un reporte de un harness de terceros anterior.
|
|
153
|
+
lines.push({ level: 'log', message: `BORRADA por --prune ${what}.` });
|
|
204
154
|
continue;
|
|
205
155
|
}
|
|
156
|
+
destResidue += 1;
|
|
157
|
+
const verdict = detail.pruned === false ? 'NO' : 'tampoco';
|
|
158
|
+
// Cierre 3 del lote B · 🟠 N9: el tercer motivo, con el MISMO prefijo estable
|
|
159
|
+
// «sobra (<motivo>) destino:» (punto 7). La fila cuya relación (o tipo) el
|
|
160
|
+
// DESTINO ya no declara: `unrelate` la rechaza por F-05, así que ningún
|
|
161
|
+
// --prune la borra; la receta es retirarla a mano O volver a declarar la
|
|
162
|
+
// relación en el destino (y re-guardar la config persistida), y repetir.
|
|
163
|
+
lines.push({
|
|
164
|
+
level: 'error',
|
|
165
|
+
message: detail.reason === 'userset-unsupported'
|
|
166
|
+
? `sobra ${what}. Es un residuo pre-2.5 (B3) del DESTINO: --prune ${verdict} lo borra${detail.pruned === false ? '' : 'ría'} (nunca un DELETE de plataforma sobre una fila que la API no admite). Bórrala a mano (los tres motores): ${RELATION_USERSET_RESIDUE_DELETE} y repite la pasada.`
|
|
167
|
+
: detail.reason === 'deny-conditional'
|
|
168
|
+
? `sobra ${what}. Es un deny CONDICIONAL del DESTINO (con caducidad, escrito fuera del paquete) que el driver destino no puede rehacer permanente (openfga no reemplaza la misma clave en un Write, M5): niega solo mientras viva (si ya venció, no niega nada) y su partición queda NEGADA (línea «partición NEGADA»: cero escrituras en ella).`
|
|
169
|
+
: detail.reason === 'undeclared'
|
|
170
|
+
? `sobra ${what}. Es una fila del DESTINO cuya relación (o tipo) el destino YA NO declara (F-05): --prune ${verdict} la borra${detail.pruned === false ? '' : 'ría'} (unrelate la rechaza por F-05 y la pasada no insiste: nunca un DELETE de plataforma). Sigue ahí: retírala a mano (SQL/SDK) o vuelve a declarar la relación en el destino (y re-guarda su config persistida) y repite la pasada.`
|
|
171
|
+
: `sobra ${what}. Es un dato del DESTINO fuera de la gramática: --prune ${verdict} la borra${detail.pruned === false ? '' : 'ría'} (ningún driver del paquete la admite en unrelate, R-16, y la pasada no se la pide a nadie: nunca un DELETE de plataforma). Sigue ahí: corrígela o bórrala a mano (SQL/SDK) y repite la pasada.`,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
// Cierre 5 de D2 (decisión del dueño §2026-10-16 (10), opción A): la PARTICIÓN NEGADA — ≥ 1 `renewal-unsafe` o
|
|
175
|
+
// `deny-conditional`: cero escrituras y cero borrados en ella; el resto migra. Deriva (exit ≠ 0) con el prefijo ESTABLE
|
|
176
|
+
// «partición NEGADA» (punto 7): qué partición, por qué, que su destino queda COMO ESTABA, la deriva que queda a la vista
|
|
177
|
+
// y la receta (honesta: sin atomicRenewal no hay forma sin ventana).
|
|
178
|
+
for (const refusal of report.partitionsRefused ?? []) {
|
|
179
|
+
const causes = refusal.causes.map((cause) => `(${cause.reason}) ${cause.tuple}`);
|
|
180
|
+
// Cierre 6 de D2 · ⚪ D5-3 (E3): «COMO ESTABA» no es estático — cuándo empieza a conceder el destino y qué.
|
|
181
|
+
const evolves = (refusal.evolves ?? []).map((e) => `a partir de ${e.at} el destino concederá a ${e.member} lo que cortan ${e.cut.join(', ')} (si otro camino se lo da; el origen lo sigue negando)`);
|
|
182
|
+
const later = evolves.length > 0 ? ` OJO, ese estado EVOLUCIONA: ${evolves.slice(0, 5).join('; ')}${evolves.length > 5 ? '; …' : ''}.` : '';
|
|
183
|
+
lines.push({
|
|
184
|
+
level: 'error',
|
|
185
|
+
message: `partición NEGADA ${refusal.partition}: ${causes.length} causa(s) que el destino no puede escribir en una escritura — ` +
|
|
186
|
+
`${causes.slice(0, 5).join('; ')}${causes.length > 5 ? '; …' : ''}. Cero escrituras y cero borrados en esta partición ` +
|
|
187
|
+
`(también en la pasada real${report.prune === true ? ' y con --prune' : ''}): su destino queda COMO ESTABA, con la deriva ` +
|
|
188
|
+
`previa a la vista (por escribir ${refusal.pending.write}, por renovar ${refusal.pending.update}, por borrar ` +
|
|
189
|
+
`${refusal.pending.delete}).${later} El resto de particiones migra. Receta: ${refusal.recipe}`,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
// Cierre 2 de D2 · ⚪ N3/🟡 N3: el RESIDUO del orden — membresías de un ciclo del grafo de precedencias. El estado final
|
|
193
|
+
// es el correcto (no es deriva): se AVISA, con el prefijo ESTABLE «orden SIN garantía». Cierre 5 de D2 (⚪ D4-4): desde
|
|
194
|
+
// el cierre 4 una RENOVACIÓN de membresía entra en el grafo (en `now` ni entra ni sale: lo hace cuando vence la
|
|
195
|
+
// caducidad más corta), así que la letra lo dice, y dice que el corte puede conceder en un instante POSTERIOR.
|
|
196
|
+
if ((report.orderResidue?.length ?? 0) > 0) {
|
|
206
197
|
lines.push({
|
|
207
198
|
level: 'warning',
|
|
208
|
-
message: `
|
|
199
|
+
message: `orden SIN garantía: ${report.orderResidue.length} membresía(s) de esta pasada se contradicen en el orden (el mismo ` +
|
|
200
|
+
'sujeto entra o sale de grupos que se cortan entre sí —o una RENOVACIÓN, que entra o sale cuando vence la caducidad ' +
|
|
201
|
+
'más corta—: cada uno trae un deny que corta un allow del otro); un corte entre ellas puede conceder, ya o en un ' +
|
|
202
|
+
'instante posterior, lo que ni el estado inicial ni el final concedían en ese instante. El estado final es el ' +
|
|
203
|
+
`correcto. Si eso importa, aplícalas en dos pasadas. (${report.orderResidue.slice(0, 5).join('; ')}${report.orderResidue.length > 5 ? '; …' : ''})`,
|
|
209
204
|
});
|
|
210
205
|
}
|
|
211
206
|
// R-17: el seguro de borrado masivo. En una pasada REAL sin --allow-mass-delete
|
|
@@ -235,10 +230,16 @@ export function relationsReconcileLines(report) {
|
|
|
235
230
|
'E_AUTHZ_MASS_RECONCILE_REFUSED; si de verdad quieres vaciar el destino, --allow-mass-delete.',
|
|
236
231
|
});
|
|
237
232
|
}
|
|
238
|
-
|
|
233
|
+
// Cierre 2 del lote B · 🟡 N3: el consejo «repite con --prune» SOLO cuando no
|
|
234
|
+
// se pasó `--prune` (el reporte lo lleva; ausente = no pasado) Y queda algo
|
|
235
|
+
// que `--prune` borra DE VERDAD: `extra` menos el residuo del destino que nadie
|
|
236
|
+
// borra. Hasta el cierre 2 salía con `extra > 0` a secas, justo debajo de la
|
|
237
|
+
// línea «--prune NO lo borra» de una pasada que YA llevaba --prune.
|
|
238
|
+
const prunable = report.extra - destResidue;
|
|
239
|
+
if (prunable > 0 && !report.dryRun && report.prune !== true) {
|
|
239
240
|
lines.push({
|
|
240
241
|
level: 'warning',
|
|
241
|
-
message: `${
|
|
242
|
+
message: `${prunable} tupla(s) del destino que el origen ya no respalda siguen ahí (no pasaste --prune): ` +
|
|
242
243
|
'repite con --prune si quieres borrarlas.',
|
|
243
244
|
});
|
|
244
245
|
}
|
|
@@ -281,12 +282,38 @@ export function relationsReconcileLines(report) {
|
|
|
281
282
|
report.modelDrift.length === 0 &&
|
|
282
283
|
report.skipped.undeclared === 0 &&
|
|
283
284
|
(report.skipped.invalid ?? 0) === 0 &&
|
|
284
|
-
|
|
285
|
+
(report.skipped.usersetUnsupported ?? 0) === 0 &&
|
|
286
|
+
destResidue === 0 &&
|
|
287
|
+
pendingRenewals === 0 &&
|
|
288
|
+
(report.partitionsRefused?.length ?? 0) === 0 &&
|
|
289
|
+
(report.denyRefused?.length ?? 0) === 0 &&
|
|
285
290
|
!(report.massDelete && !massDeleteLifted) &&
|
|
286
291
|
!(report.frozen?.lapsed === true) &&
|
|
287
292
|
(!report.dryRun || cambios === 0);
|
|
288
293
|
return { lines, clean };
|
|
289
294
|
}
|
|
295
|
+
/**
|
|
296
|
+
* **La pasada que revienta A MITAD dice qué quedó escrito, por partición** (plan 2.5 · lote D · D2; roadmap 2.5, 🟡 3
|
|
297
|
+
* del auditor de alpha.6): con el reporte parcial que viaja en el error (`error.report`, `partial: true`). Prefijo
|
|
298
|
+
* ESTABLE «pasada PARCIAL:» (punto 7). Función PURA.
|
|
299
|
+
*/
|
|
300
|
+
export function partialReportLines(report) {
|
|
301
|
+
const lines = [
|
|
302
|
+
`pasada PARCIAL: escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted} antes del fallo ` +
|
|
303
|
+
'(la pasada es idempotente: repítela para terminar).',
|
|
304
|
+
];
|
|
305
|
+
// Cierre 2 de D2 · 🟠 N1: la escritura que FALLÓ ya había aplicado parte — una renovación de `openfga` (delete + write)
|
|
306
|
+
// cuyo write no entró: los contadores no la cuentan, pero el destino CAMBIÓ (jamás «sin escribir nada»).
|
|
307
|
+
if (report.written + report.updated + report.deleted === 0) {
|
|
308
|
+
lines.push('pasada PARCIAL: la escritura que falló YA había aplicado parte (una renovación del destino: el delete entró y el write ' +
|
|
309
|
+
'no) — el destino CAMBIÓ aunque los contadores digan 0; repite la pasada.');
|
|
310
|
+
}
|
|
311
|
+
for (const row of report.partitions ?? []) {
|
|
312
|
+
lines.push(`pasada PARCIAL: partición ${row.partition} · ${row.status === 'done' ? 'TERMINADA' : row.status === 'failed' ? 'REVENTÓ aquí' : row.status === 'refused' ? 'NEGADA (cero escrituras)' : 'sin tocar'}` +
|
|
313
|
+
` (escritas ${row.written}, actualizadas ${row.updated}, borradas ${row.deleted}; denies escritos ${row.denies.written})`);
|
|
314
|
+
}
|
|
315
|
+
return lines;
|
|
316
|
+
}
|
|
290
317
|
/**
|
|
291
318
|
* **`authz:relations:reconcile`** (Fase 4, lote 4-6) — migra las tuplas de
|
|
292
319
|
* RELACIÓN de un `RelationsDriver` a otro, idempotente y bidireccional, nunca
|
|
@@ -396,8 +423,44 @@ export default class AuthzRelationsReconcile extends BaseCommand {
|
|
|
396
423
|
: { type: 'app', uuid: null };
|
|
397
424
|
// La config del DESTINO, para vigilar la deriva del modelo fusionado en
|
|
398
425
|
// --dry-run: es la persistida (una sola en el store compartido).
|
|
426
|
+
// **Plan 2.5 · lote B · B5** (analista §4.7, auditor R2-5; linaje L5): hasta
|
|
427
|
+
// 2.5.0-alpha.1 era `readRelationsConfig().catch(() => undefined)` — un
|
|
428
|
+
// FALLO de lectura seguía sin config y en silencio (sin vigilar la deriva;
|
|
429
|
+
// con el deny, sin la puerta del 500 del plan). Tres ramas, cada una con su
|
|
430
|
+
// línea: fallo ⇒ error + exit 1 ANTES de construir, congelar o escribir;
|
|
431
|
+
// `null` («no hay config persistida», relaciones opt-in) ⇒ sigue y lo dice;
|
|
432
|
+
// leída ⇒ sigue y lo dice.
|
|
399
433
|
const { readRelationsConfig } = await import('../src/relations_config_store.js');
|
|
400
|
-
|
|
434
|
+
let toConfig;
|
|
435
|
+
try {
|
|
436
|
+
toConfig = await readRelationsConfig();
|
|
437
|
+
}
|
|
438
|
+
catch (error) {
|
|
439
|
+
// Cierre 1 del lote B · 🟡 7: la fila persistida EXISTE y se leyó, pero NO
|
|
440
|
+
// valida en 2.5 (clave desconocida de B2, ciclo de B1, JSON corrupto…):
|
|
441
|
+
// antes de 2.5 `saveRelationsConfig` guardaba el spec TAL CUAL, claves
|
|
442
|
+
// tiradas en silencio incluidas. No es «la lectura falló» (503): es su
|
|
443
|
+
// propia rama, con su línea y el paso que la arregla.
|
|
444
|
+
if (error instanceof RelationConfigError) {
|
|
445
|
+
this.logger.error(`La config de relaciones persistida en authz_relations_config NO valida en 2.5: ${String(error?.message ?? error)} ` +
|
|
446
|
+
`Es una fila escrita por una versión anterior (que descartaba claves en silencio) o a mano. Re-guárdala con ` +
|
|
447
|
+
`saveRelationsConfig(<spec corregida>) —la spec, no la config ya definida— desde un proceso con la config ` +
|
|
448
|
+
`estática buena, y repite la pasada. No se ha construido, congelado ni escrito nada.`);
|
|
449
|
+
this.exitCode = 1;
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
this.logger.error(`No se pudo leer la config de relaciones persistida del destino (authz_relations_config): ` +
|
|
453
|
+
`${String(error?.message ?? error)}. Una lectura que falla NO es «no hay config»: sin ella la pasada no ` +
|
|
454
|
+
`vigilaría la deriva del modelo del destino y escribiría a ciegas. No se ha construido, congelado ni escrito nada.`);
|
|
455
|
+
this.exitCode = 1;
|
|
456
|
+
return;
|
|
457
|
+
}
|
|
458
|
+
if (toConfig === null) {
|
|
459
|
+
this.logger.info('Config del destino: ninguna persistida en authz_relations_config (relaciones opt-in): la deriva del modelo NO se vigila en esta pasada.');
|
|
460
|
+
}
|
|
461
|
+
else {
|
|
462
|
+
this.logger.info(`Config del destino: leída de authz_relations_config (${toConfig.objectTypes.length} tipo(s)): la deriva del modelo se vigila.`);
|
|
463
|
+
}
|
|
401
464
|
// L-1 · J1: la pasada que ESCRIBE corre bajo la ventana durable del
|
|
402
465
|
// manager de roles (la misma fila `id = 2`, toda la flota); `--dry-run` no.
|
|
403
466
|
// Los drivers los construye `runRelationsReconcile`, DESPUÉS del guard.
|
|
@@ -422,6 +485,28 @@ export default class AuthzRelationsReconcile extends BaseCommand {
|
|
|
422
485
|
this.exitCode = 1;
|
|
423
486
|
return;
|
|
424
487
|
}
|
|
488
|
+
// Lote D · D2 (S6/R2-5): la puerta del deny del DESTINO negó la pasada en la fase de plan, con CERO escrituras.
|
|
489
|
+
// La letra del error empieza por el prefijo estable «deny NO migrable:».
|
|
490
|
+
if (error?.code === 'E_AUTHZ_DENY_MIGRATION_REFUSED') {
|
|
491
|
+
this.logger.error(String(error.message ?? error));
|
|
492
|
+
this.exitCode = 1;
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
// Lote D · D2: la pasada reventó A MITAD — el reporte parcial por partición viaja en el error.
|
|
496
|
+
if (error?.report?.partial === true) {
|
|
497
|
+
for (const line of partialReportLines(error.report))
|
|
498
|
+
this.logger.error(line);
|
|
499
|
+
this.logger.error(String(error?.message ?? error));
|
|
500
|
+
this.exitCode = 1;
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
// ⚪ 10 (cierre 1 de D2): reventó ANTES de escribir nada — el reporte viaja con `partial: false`. La línea del
|
|
504
|
+
// error con su prefijo ESTABLE, sin «PARCIAL» (la marca de escritura parcial tampoco está).
|
|
505
|
+
if (error?.report && error.report.partial === false) {
|
|
506
|
+
this.logger.error(`pasada FALLIDA sin escribir nada: ${String(error?.message ?? error)} (la pasada es idempotente: repítela).`);
|
|
507
|
+
this.exitCode = 1;
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
425
510
|
// L-1 · J1: un freeze vivo de OTRA pasada (423): dos migraciones no se
|
|
426
511
|
// pisan; el mensaje nombra al dueño y cómo se levanta.
|
|
427
512
|
if (error?.code === 'E_AUTHZ_FREEZE_HELD' || error?.code === 'E_AUTHZ_OPERATOR_WINDOW_EXPIRED') {
|
|
@@ -444,7 +529,8 @@ export default class AuthzRelationsReconcile extends BaseCommand {
|
|
|
444
529
|
const resumen = `escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted}, ` +
|
|
445
530
|
`iguales ${report.unchanged}, sobran ${report.extra}, caducadas omitidas ${report.skipped.expired}, ` +
|
|
446
531
|
`no declaradas en el destino ${report.skipped.undeclared}` +
|
|
447
|
-
(report.skipped.invalid ? `, fuera de la gramática en el origen ${report.skipped.invalid}` : '')
|
|
532
|
+
(report.skipped.invalid ? `, fuera de la gramática en el origen ${report.skipped.invalid}` : '') +
|
|
533
|
+
(report.skipped.usersetUnsupported ? `, con sujeto userset no admitido en el origen ${report.skipped.usersetUnsupported}` : '');
|
|
448
534
|
if (report.dryRun) {
|
|
449
535
|
if (clean) {
|
|
450
536
|
this.logger.success(`Sin deriva: '${this.to}' coincide con '${fromKey}' (${resumen}).`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz_relations_reconcile.js","sourceRoot":"","sources":["../../commands/authz_relations_reconcile.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"authz_relations_reconcile.js","sourceRoot":"","sources":["../../commands/authz_relations_reconcile.ts"],"names":[],"mappings":"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"}
|