@jantstack/adonis-authz 2.4.0-alpha.8 → 2.5.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/README.md +300 -15
- package/build/commands/authz_catalog_diff.d.ts.map +1 -1
- package/build/commands/authz_catalog_diff.js +0 -1
- package/build/commands/authz_catalog_diff.js.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.js +0 -1
- package/build/commands/authz_catalog_prune_orphans.js.map +1 -1
- package/build/commands/authz_freeze.d.ts.map +1 -1
- package/build/commands/authz_freeze.js +1 -2
- package/build/commands/authz_freeze.js.map +1 -1
- package/build/commands/authz_reconcile.d.ts +10 -3
- package/build/commands/authz_reconcile.d.ts.map +1 -1
- package/build/commands/authz_reconcile.js +168 -18
- package/build/commands/authz_reconcile.js.map +1 -1
- package/build/commands/authz_relations_reconcile.d.ts +66 -19
- package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
- package/build/commands/authz_relations_reconcile.js +231 -44
- package/build/commands/authz_relations_reconcile.js.map +1 -1
- package/build/commands/authz_scopes_relay.d.ts.map +1 -1
- package/build/commands/authz_scopes_relay.js +82 -6
- package/build/commands/authz_scopes_relay.js.map +1 -1
- package/build/commands/authz_scopes_requeue.d.ts.map +1 -1
- package/build/commands/authz_scopes_requeue.js +0 -2
- package/build/commands/authz_scopes_requeue.js.map +1 -1
- package/build/commands/authz_unfreeze.d.ts +12 -4
- package/build/commands/authz_unfreeze.d.ts.map +1 -1
- package/build/commands/authz_unfreeze.js +74 -9
- package/build/commands/authz_unfreeze.js.map +1 -1
- package/build/index.d.ts +6 -4
- package/build/index.d.ts.map +1 -1
- package/build/index.js +5 -3
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts +1 -1
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +2 -1
- package/build/providers/authz_provider.js.map +1 -1
- package/build/src/define_config.d.ts +9 -0
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +11 -0
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/database_driver.d.ts.map +1 -1
- package/build/src/drivers/database_driver.js +1 -0
- package/build/src/drivers/database_driver.js.map +1 -1
- package/build/src/drivers/database_relations_driver.d.ts +18 -6
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/database_relations_driver.js +91 -44
- package/build/src/drivers/database_relations_driver.js.map +1 -1
- package/build/src/drivers/openfga_driver.d.ts +62 -4
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +182 -28
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/openfga_relations_driver.d.ts +16 -4
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_relations_driver.js +71 -34
- package/build/src/drivers/openfga_relations_driver.js.map +1 -1
- package/build/src/errors.d.ts +50 -0
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +50 -0
- package/build/src/errors.js.map +1 -1
- package/build/src/freeze.d.ts +63 -4
- package/build/src/freeze.d.ts.map +1 -1
- package/build/src/freeze.js +107 -18
- package/build/src/freeze.js.map +1 -1
- package/build/src/identity.d.ts +120 -9
- package/build/src/identity.d.ts.map +1 -1
- package/build/src/identity.js +164 -12
- package/build/src/identity.js.map +1 -1
- package/build/src/manager.d.ts +64 -2
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +271 -35
- 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 +17 -0
- package/build/src/relations/check_many.d.ts.map +1 -0
- package/build/src/relations/check_many.js +57 -0
- package/build/src/relations/check_many.js.map +1 -0
- package/build/src/relations/manager.d.ts +20 -0
- package/build/src/relations/manager.d.ts.map +1 -1
- package/build/src/relations/manager.js +84 -13
- package/build/src/relations/manager.js.map +1 -1
- package/build/src/relations/reconcile.d.ts +67 -0
- package/build/src/relations/reconcile.d.ts.map +1 -1
- package/build/src/relations/reconcile.js +123 -30
- package/build/src/relations/reconcile.js.map +1 -1
- package/build/src/relations/tuple_key.d.ts +25 -0
- package/build/src/relations/tuple_key.d.ts.map +1 -0
- package/build/src/relations/tuple_key.js +60 -0
- package/build/src/relations/tuple_key.js.map +1 -0
- package/build/src/shared/backend_guard.d.ts +30 -11
- package/build/src/shared/backend_guard.d.ts.map +1 -1
- package/build/src/shared/backend_guard.js +45 -15
- package/build/src/shared/backend_guard.js.map +1 -1
- package/build/src/shared/sql_expiry.d.ts +2 -0
- package/build/src/shared/sql_expiry.d.ts.map +1 -1
- package/build/src/shared/sql_expiry.js +4 -0
- package/build/src/shared/sql_expiry.js.map +1 -1
- package/build/src/testing/main.d.ts +3 -1
- 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/migration_contract.d.ts +9 -0
- package/build/src/testing/migration_contract.d.ts.map +1 -1
- package/build/src/testing/migration_contract.js +5 -2
- package/build/src/testing/migration_contract.js.map +1 -1
- package/build/src/testing/relations_contract.d.ts +14 -0
- package/build/src/testing/relations_contract.d.ts.map +1 -1
- package/build/src/testing/relations_contract.js +297 -21
- package/build/src/testing/relations_contract.js.map +1 -1
- package/build/src/testing/test_clock.d.ts +15 -0
- package/build/src/testing/test_clock.d.ts.map +1 -0
- package/build/src/testing/test_clock.js +65 -0
- package/build/src/testing/test_clock.js.map +1 -0
- package/build/src/types.d.ts +148 -9
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js.map +1 -1
- package/package.json +5 -1
|
@@ -8,37 +8,110 @@ 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 { AuthorizationConfigError, StaleSourceRefusedError } from '../src/errors.js';
|
|
11
12
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* -
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* de OTRA pasada es 423;
|
|
23
|
-
* - el reporte publica `frozen` —fence, lease y **`lapsed`**— y un lease
|
|
24
|
-
* perdido a mitad significa que la pasada NO se certifica (exit ≠ 0).
|
|
25
|
-
*
|
|
26
|
-
* Durante la ventana TODA escritura del paquete responde 503 `E_AUTHZ_FROZEN`
|
|
27
|
-
* en la flota: las de roles y, desde L-1, las de relaciones
|
|
28
|
-
* (`RelationsManager` pasa la misma barrera). Función exportada para tener su
|
|
29
|
-
* caso sin montar un ace.
|
|
13
|
+
* Límites DECLARADOS de la identidad (cierre-2 de alpha.10 · C1 y C6):
|
|
14
|
+
* - la identidad es la REFERENCIA de la factory: dos factories DISTINTAS que
|
|
15
|
+
* construyen el mismo backend (`fga: () => new OpenFgaRelationsDriver(…mismo
|
|
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.
|
|
30
23
|
*/
|
|
31
24
|
export async function runRelationsReconcile(authorization, options) {
|
|
32
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
|
+
};
|
|
33
79
|
if (options.dryRun === true)
|
|
34
|
-
return
|
|
35
|
-
const reason = `authz:relations:reconcile
|
|
80
|
+
return mark(await pass());
|
|
81
|
+
const reason = `authz:relations:reconcile --to=${toKey}`;
|
|
36
82
|
return authorization.withFrozenWrites(reason, async (window) => {
|
|
37
|
-
const report = await
|
|
38
|
-
report.frozen = {
|
|
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
|
+
};
|
|
39
92
|
return report;
|
|
40
93
|
}, { kind: 'reconcile', operatorAsContext: true });
|
|
41
94
|
}
|
|
95
|
+
/**
|
|
96
|
+
* Cómo se nombra la ventana en la que corrió la pasada (2.4.0-alpha.10 · 3):
|
|
97
|
+
* la del OPERADOR dice si caduca y cuándo — hasta alpha.9 una ventana abierta
|
|
98
|
+
* con `--lease-ms` salía como «ventana del operador» a secas, sin caducidad.
|
|
99
|
+
*/
|
|
100
|
+
export function frozenWindowLabel(frozen) {
|
|
101
|
+
// alpha.10 · S2: la ventana PROPIA se dice como tal — «no había ventana de
|
|
102
|
+
// operador viva» es justo lo que el operador de un cutover necesita leer.
|
|
103
|
+
if (frozen.window === 'own') {
|
|
104
|
+
return `, ventana PROPIA de la pasada (lease ${frozen.leaseMs} ms): NO había ventana de operador viva`;
|
|
105
|
+
}
|
|
106
|
+
if (frozen.window === 'enclosing')
|
|
107
|
+
return `, ventana que ya sostenía este proceso`;
|
|
108
|
+
if (frozen.untilMs !== undefined) {
|
|
109
|
+
return frozen.untilMs === null
|
|
110
|
+
? ', ventana del operador sin caducidad'
|
|
111
|
+
: `, ventana del operador que CADUCA el ${new Date(frozen.untilMs).toISOString()} (le quedaban ${frozen.leaseMs} ms)`;
|
|
112
|
+
}
|
|
113
|
+
return frozen.leaseMs === null ? ', ventana del operador' : `, lease ${frozen.leaseMs} ms`;
|
|
114
|
+
}
|
|
42
115
|
/**
|
|
43
116
|
* Las líneas del reporte de `authz:relations:reconcile` y si la pasada es
|
|
44
117
|
* «limpia», en una función PURA (mismo patrón que `reconcileLines` de roles):
|
|
@@ -92,10 +165,69 @@ export function relationsReconcileLines(report) {
|
|
|
92
165
|
'defineRelationsConfig del destino (y republica su modelo) antes de migrarlas.',
|
|
93
166
|
});
|
|
94
167
|
}
|
|
168
|
+
// ⚪ R2 (cierre-2 del lote A; linaje L8, «una operación destructiva lista lo
|
|
169
|
+
// que destruye»): lo enumerado con una identidad fuera de la gramática, UNA
|
|
170
|
+
// línea por tupla con su lado y su porqué. Nunca fue una pregunta del
|
|
171
|
+
// llamante (invariante 5), así que nunca es un 422 que tumbe la pasada:
|
|
172
|
+
// - destino + prune: «se pedirá borrar» (dry-run; y dice que con los drivers
|
|
173
|
+
// del paquete la pasada real NO la borrará: a mano YA — ⚪ R2 del re-ataque
|
|
174
|
+
// al cierre-2, cierre-3) / «BORRADA» (real); si el DRIVER del destino la
|
|
175
|
+
// rechazó por el puerto, «NO se pudo borrar … a mano» (error: sigue ahí y
|
|
176
|
+
// la pasada no es limpia);
|
|
177
|
+
// - destino sin prune: sobra con motivo (warning; `extra` la cuenta);
|
|
178
|
+
// - origen: no se migra (la API no la puede escribir): deriva, a mano.
|
|
179
|
+
let invalidRefused = 0;
|
|
180
|
+
for (const detail of report.details ?? []) {
|
|
181
|
+
const what = `(${detail.reason}) ${detail.side}: ${detail.tuple} — ${detail.message}`;
|
|
182
|
+
if (detail.side === 'origen') {
|
|
183
|
+
lines.push({
|
|
184
|
+
level: 'error',
|
|
185
|
+
message: `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
|
+
});
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (detail.pruned === true) {
|
|
190
|
+
lines.push({
|
|
191
|
+
level: 'log',
|
|
192
|
+
message: report.dryRun
|
|
193
|
+
? `con --prune se pedirá al driver del destino que la BORRE ${what}. OJO: con los drivers del paquete (database/openfga) la pasada real NO la borrará (su gramática en unrelate la rechaza, R-16) y saldrá con exit 1 hasta que la borres a mano (SQL/SDK): bórrala ya, no esperes a la pasada real.`
|
|
194
|
+
: `BORRADA por --prune ${what}.`,
|
|
195
|
+
});
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (detail.pruned === false) {
|
|
199
|
+
invalidRefused += 1;
|
|
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
|
+
});
|
|
204
|
+
continue;
|
|
205
|
+
}
|
|
206
|
+
lines.push({
|
|
207
|
+
level: 'warning',
|
|
208
|
+
message: `sobra ${what}: nadie del origen puede respaldarla; repite con --prune para pedir su borrado.`,
|
|
209
|
+
});
|
|
210
|
+
}
|
|
95
211
|
// R-17: el seguro de borrado masivo. En una pasada REAL sin --allow-mass-delete
|
|
96
212
|
// esto ya habría lanzado 500 antes de llegar aquí; en --dry-run NO lanza y lo
|
|
97
213
|
// marca, así que el verificador tiene que sacarlo como deriva (exit ≠ 0).
|
|
98
|
-
|
|
214
|
+
// **F-R2 (plan 2.5 · lote A; linaje L8, letra ≠ efecto)**: con el seguro
|
|
215
|
+
// LEVANTADO (`--allow-mass-delete`) la pasada real YA vació el destino: la
|
|
216
|
+
// letra lo dice así y es limpia (fue la decisión humana); en `--dry-run` dice
|
|
217
|
+
// que la real lo HARÁ y sigue siendo deriva (haría algo). Sin la bandera, el
|
|
218
|
+
// error de siempre. Tabla de verdad en `tests/relations_reconcile_cli.spec.ts`.
|
|
219
|
+
const massDeleteLifted = report.massDelete && report.allowMassDelete === true;
|
|
220
|
+
if (massDeleteLifted) {
|
|
221
|
+
lines.push({
|
|
222
|
+
level: 'warning',
|
|
223
|
+
message: report.dryRun
|
|
224
|
+
? `--prune borraría ${report.extra || report.deleted} tupla(s) del destino con un ORIGEN sin NI UNA utilizable; ` +
|
|
225
|
+
'--allow-mass-delete está puesto, así que la pasada real las BORRARÁ. Comprueba el --from antes de correrla.'
|
|
226
|
+
: `El seguro de borrado masivo se LEVANTÓ con --allow-mass-delete: se han borrado ${report.deleted} tupla(s) del destino ` +
|
|
227
|
+
'con un ORIGEN que no aportó NI UNA utilizable. Era tu decisión; si el --from era el equivocado, repite la pasada desde el correcto.',
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
else if (report.massDelete) {
|
|
99
231
|
lines.push({
|
|
100
232
|
level: 'error',
|
|
101
233
|
message: `--prune borraría ${report.extra || report.deleted} tupla(s) del destino y el ORIGEN no aportó NI UNA ` +
|
|
@@ -126,15 +258,31 @@ export function relationsReconcileLines(report) {
|
|
|
126
258
|
lines.push({
|
|
127
259
|
level: 'log',
|
|
128
260
|
message: `Escrituras congeladas durante la pasada (fence ${report.frozen.fence}` +
|
|
129
|
-
`${report.frozen
|
|
261
|
+
`${frozenWindowLabel(report.frozen)}): ` +
|
|
130
262
|
'la ventana aguantó entera.',
|
|
131
263
|
});
|
|
132
264
|
}
|
|
133
265
|
}
|
|
266
|
+
// alpha.10 · S1: la dirección rancia se dice siempre; en el verificador es deriva.
|
|
267
|
+
if (report.staleSource !== undefined) {
|
|
268
|
+
const { to, from, allowed } = report.staleSource;
|
|
269
|
+
lines.push({
|
|
270
|
+
level: 'warning',
|
|
271
|
+
message: `dirección RANCIA: '${to}' es el driver de relaciones ACTIVO y las tuplas salen de '${from}', que dejó de verlas ` +
|
|
272
|
+
'en el cutover — esta pasada resucita las comparticiones retiradas desde entonces (y con --prune borra las ' +
|
|
273
|
+
'nuevas). ' +
|
|
274
|
+
(allowed
|
|
275
|
+
? 'Levantada a sabiendas con --allow-stale-source.'
|
|
276
|
+
: 'Sin --allow-stale-source la pasada de verdad se niega (E_AUTHZ_STALE_SOURCE_REFUSED).'),
|
|
277
|
+
});
|
|
278
|
+
}
|
|
134
279
|
const cambios = report.written + report.updated + report.deleted + (report.dryRun ? report.extra : 0);
|
|
135
|
-
const clean = report.
|
|
280
|
+
const clean = !(report.dryRun && report.staleSource !== undefined && !report.staleSource.allowed) &&
|
|
281
|
+
report.modelDrift.length === 0 &&
|
|
136
282
|
report.skipped.undeclared === 0 &&
|
|
137
|
-
|
|
283
|
+
(report.skipped.invalid ?? 0) === 0 &&
|
|
284
|
+
invalidRefused === 0 &&
|
|
285
|
+
!(report.massDelete && !massDeleteLifted) &&
|
|
138
286
|
!(report.frozen?.lapsed === true) &&
|
|
139
287
|
(!report.dryRun || cambios === 0);
|
|
140
288
|
return { lines, clean };
|
|
@@ -183,9 +331,13 @@ export default class AuthzRelationsReconcile extends BaseCommand {
|
|
|
183
331
|
this.exitCode = 1;
|
|
184
332
|
return;
|
|
185
333
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
334
|
+
// Cierre del auditor de alpha.10 · R4: las claves, las factories y el driver
|
|
335
|
+
// ACTIVO salen del MISMO sitio — el manager de servicio (construido desde
|
|
336
|
+
// config/authorization.ts) —, que es también quien toma la ventana. Hasta el
|
|
337
|
+
// cierre el comando resolvía los drivers de `this.app.config` y le pasaba a
|
|
338
|
+
// `runRelationsReconcile` las instancias y, aparte, las etiquetas.
|
|
339
|
+
const { default: authorization } = await import('../services/main.js');
|
|
340
|
+
const keys = authorization.relationsDriverKeys();
|
|
189
341
|
if (keys.length === 0) {
|
|
190
342
|
this.logger.error('No hay `relations.drivers` en config/authorization.ts: declara los drivers de relaciones (por clave) ' +
|
|
191
343
|
'para poder migrar sus tuplas.');
|
|
@@ -204,53 +356,82 @@ export default class AuthzRelationsReconcile extends BaseCommand {
|
|
|
204
356
|
}
|
|
205
357
|
fromKey = candidates[0];
|
|
206
358
|
}
|
|
207
|
-
if (
|
|
359
|
+
if (authorization.relationsDriverFactory(this.to) === undefined) {
|
|
208
360
|
this.logger.error(`El destino '${this.to}' no es una clave de relations.drivers (${keys.join(', ')}).`);
|
|
209
361
|
this.exitCode = 1;
|
|
210
362
|
return;
|
|
211
363
|
}
|
|
212
|
-
if (
|
|
364
|
+
if (authorization.relationsDriverFactory(fromKey) === undefined) {
|
|
213
365
|
this.logger.error(`El origen '${fromKey}' no es una clave de relations.drivers (${keys.join(', ')}).`);
|
|
214
366
|
this.exitCode = 1;
|
|
215
367
|
return;
|
|
216
368
|
}
|
|
217
369
|
// La partición (mono-tenant por defecto). El reconcile es POR partición.
|
|
370
|
+
// Las DOS banderas van juntas o no va ninguna (cierre de alpha.9, 🟡 B del
|
|
371
|
+
// auditor): media pareja reconciliaba `app` en silencio, escribía CERO y
|
|
372
|
+
// salía `[success]` — la misma forma del 🔴 «migra 0 y reporta éxito» que
|
|
373
|
+
// este lote cierra, sobreviviendo a una errata del runbook de cutover.
|
|
374
|
+
if (this.partitionUuid && !this.partitionType) {
|
|
375
|
+
this.logger.error('--partition-uuid sin --partition-type: las dos banderas van juntas. ' +
|
|
376
|
+
'Sin --partition-type se reconciliaría la partición RAÍZ (app) y tus tuplas por tenant no se migrarían.');
|
|
377
|
+
this.exitCode = 1;
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
// alpha.10 · 5 (sexto informe de COGNITIV): la variante que el cierre de
|
|
381
|
+
// alpha.9 no cazó — pareja COMPLETA con `app` también reconciliaba la raíz
|
|
382
|
+
// en silencio, tirando el uuid (una errata del runbook: `app` por el tipo).
|
|
383
|
+
if (this.partitionType === 'app' && this.partitionUuid) {
|
|
384
|
+
this.logger.error(`--partition-type=app con --partition-uuid=${this.partitionUuid}: la partición raíz no lleva uuid. ` +
|
|
385
|
+
'O quitas --partition-uuid (reconciliar la raíz) o pones el tipo del tenant en --partition-type.');
|
|
386
|
+
this.exitCode = 1;
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
if (this.partitionType && this.partitionType !== 'app' && !this.partitionUuid) {
|
|
390
|
+
this.logger.error(`--partition-type=${this.partitionType} exige --partition-uuid (el tenant concreto a reconciliar).`);
|
|
391
|
+
this.exitCode = 1;
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
218
394
|
const partition = this.partitionType && this.partitionType !== 'app'
|
|
219
|
-
? { type: this.partitionType, uuid: this.partitionUuid
|
|
395
|
+
? { type: this.partitionType, uuid: this.partitionUuid }
|
|
220
396
|
: { type: 'app', uuid: null };
|
|
221
397
|
// La config del DESTINO, para vigilar la deriva del modelo fusionado en
|
|
222
398
|
// --dry-run: es la persistida (una sola en el store compartido).
|
|
223
399
|
const { readRelationsConfig } = await import('../src/relations_config_store.js');
|
|
224
400
|
const toConfig = await readRelationsConfig().catch(() => undefined);
|
|
225
|
-
const from = await factories[fromKey]();
|
|
226
|
-
const to = await factories[this.to]();
|
|
227
401
|
// L-1 · J1: la pasada que ESCRIBE corre bajo la ventana durable del
|
|
228
402
|
// manager de roles (la misma fila `id = 2`, toda la flota); `--dry-run` no.
|
|
229
|
-
|
|
403
|
+
// Los drivers los construye `runRelationsReconcile`, DESPUÉS del guard.
|
|
230
404
|
let report;
|
|
231
405
|
try {
|
|
232
406
|
report = await runRelationsReconcile(authorization, {
|
|
233
|
-
from,
|
|
234
|
-
to,
|
|
235
407
|
partition,
|
|
236
408
|
dryRun: this.dryRun === true,
|
|
237
409
|
prune: this.prune === true,
|
|
238
410
|
allowMassDelete: this.allowMassDelete === true,
|
|
411
|
+
allowStaleSource: this.allowStaleSource === true,
|
|
239
412
|
toKey: this.to,
|
|
413
|
+
fromKey,
|
|
240
414
|
...(toConfig ? { toConfig } : {}),
|
|
241
415
|
});
|
|
242
416
|
}
|
|
243
417
|
catch (error) {
|
|
244
418
|
// R-17: el seguro de borrado masivo (500) sale como error de comando, no
|
|
245
419
|
// como stack crudo. `--allow-mass-delete` es la salida humana.
|
|
246
|
-
if (error?.code === 'E_AUTHZ_MASS_RECONCILE_REFUSED') {
|
|
420
|
+
if (error?.code === 'E_AUTHZ_MASS_RECONCILE_REFUSED' || error?.code === 'E_AUTHZ_STALE_SOURCE_REFUSED') {
|
|
247
421
|
this.logger.error(String(error.message ?? error));
|
|
248
422
|
this.exitCode = 1;
|
|
249
423
|
return;
|
|
250
424
|
}
|
|
251
425
|
// L-1 · J1: un freeze vivo de OTRA pasada (423): dos migraciones no se
|
|
252
426
|
// pisan; el mensaje nombra al dueño y cómo se levanta.
|
|
253
|
-
if (error?.code === 'E_AUTHZ_FREEZE_HELD') {
|
|
427
|
+
if (error?.code === 'E_AUTHZ_FREEZE_HELD' || error?.code === 'E_AUTHZ_OPERATOR_WINDOW_EXPIRED') {
|
|
428
|
+
this.logger.error(String(error.message ?? error));
|
|
429
|
+
this.exitCode = 1;
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
// Cierre R4: origen y destino que resuelven el MISMO driver (misma clave o
|
|
433
|
+
// alias de la misma factory) es un error de configuración de la pasada.
|
|
434
|
+
if (error?.code === 'E_AUTHZ_CONFIG') {
|
|
254
435
|
this.logger.error(String(error.message ?? error));
|
|
255
436
|
this.exitCode = 1;
|
|
256
437
|
return;
|
|
@@ -262,7 +443,8 @@ export default class AuthzRelationsReconcile extends BaseCommand {
|
|
|
262
443
|
this.logger[level](message);
|
|
263
444
|
const resumen = `escritas ${report.written}, actualizadas ${report.updated}, borradas ${report.deleted}, ` +
|
|
264
445
|
`iguales ${report.unchanged}, sobran ${report.extra}, caducadas omitidas ${report.skipped.expired}, ` +
|
|
265
|
-
`no declaradas en el destino ${report.skipped.undeclared}
|
|
446
|
+
`no declaradas en el destino ${report.skipped.undeclared}` +
|
|
447
|
+
(report.skipped.invalid ? `, fuera de la gramática en el origen ${report.skipped.invalid}` : '');
|
|
266
448
|
if (report.dryRun) {
|
|
267
449
|
if (clean) {
|
|
268
450
|
this.logger.success(`Sin deriva: '${this.to}' coincide con '${fromKey}' (${resumen}).`);
|
|
@@ -288,7 +470,7 @@ __decorate([
|
|
|
288
470
|
__metadata("design:type", Object)
|
|
289
471
|
], AuthzRelationsReconcile.prototype, "from", void 0);
|
|
290
472
|
__decorate([
|
|
291
|
-
flags.boolean({
|
|
473
|
+
flags.boolean({ description: 'Report what it would do and write nothing (this is the verifier)' }),
|
|
292
474
|
__metadata("design:type", Object)
|
|
293
475
|
], AuthzRelationsReconcile.prototype, "dryRun", void 0);
|
|
294
476
|
__decorate([
|
|
@@ -297,17 +479,22 @@ __decorate([
|
|
|
297
479
|
], AuthzRelationsReconcile.prototype, "prune", void 0);
|
|
298
480
|
__decorate([
|
|
299
481
|
flags.boolean({
|
|
300
|
-
name: 'allow-mass-delete',
|
|
301
482
|
description: 'Allow --prune to empty the destination when the source has no usable tuple (mass-delete safeguard)',
|
|
302
483
|
}),
|
|
303
484
|
__metadata("design:type", Object)
|
|
304
485
|
], AuthzRelationsReconcile.prototype, "allowMassDelete", void 0);
|
|
305
486
|
__decorate([
|
|
306
|
-
flags.
|
|
487
|
+
flags.boolean({
|
|
488
|
+
description: 'Allow --to=<ACTIVE relations driver> from another source: rewrites into the serving driver tuples the source no longer reflects',
|
|
489
|
+
}),
|
|
490
|
+
__metadata("design:type", Object)
|
|
491
|
+
], AuthzRelationsReconcile.prototype, "allowStaleSource", void 0);
|
|
492
|
+
__decorate([
|
|
493
|
+
flags.string({ description: 'Partition (tenant) scope type to migrate; default: app (mono-tenant)' }),
|
|
307
494
|
__metadata("design:type", Object)
|
|
308
495
|
], AuthzRelationsReconcile.prototype, "partitionType", void 0);
|
|
309
496
|
__decorate([
|
|
310
|
-
flags.string({
|
|
497
|
+
flags.string({ description: 'Partition (tenant) scope uuid; required with --partition-type' }),
|
|
311
498
|
__metadata("design:type", Object)
|
|
312
499
|
], AuthzRelationsReconcile.prototype, "partitionUuid", void 0);
|
|
313
500
|
//# sourceMappingURL=authz_relations_reconcile.js.map
|
|
@@ -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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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authz_scopes_relay.d.ts","sourceRoot":"","sources":["../../commands/authz_scopes_relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,OAAe,GACzB;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAoC/F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAuB;IACzC,MAAM,CAAC,WAAW,SAAiF;IAEnG,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;
|
|
1
|
+
{"version":3,"file":"authz_scopes_relay.d.ts","sourceRoot":"","sources":["../../commands/authz_scopes_relay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAS,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,eAAe,EACtB,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,SAAS,GAAE,OAAe,GACzB;IAAE,KAAK,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAoC/F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AACH,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,WAAW;IACvD,MAAM,CAAC,WAAW,SAAuB;IACzC,MAAM,CAAC,WAAW,SAAiF;IAEnG,MAAM,CAAC,OAAO,EAAE,cAAc,CAE7B;IAKO,MAAM,EAAE,OAAO,GAAG,SAAS,CAAA;IAG3B,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;IAGzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAK7B,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;IAK1B,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAK/B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAA;IAElC,+FAA+F;IAC/F,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS;IAS5E,GAAG;CAgMV"}
|
|
@@ -140,6 +140,15 @@ export default class AuthzScopesRelay extends BaseCommand {
|
|
|
140
140
|
this.exitCode = 1;
|
|
141
141
|
return;
|
|
142
142
|
}
|
|
143
|
+
// alpha.10 · S7 (auditoría de sistema): el umbral se valida ANTES de tocar
|
|
144
|
+
// la cola. Hasta alpha.9 `queueAgeLines` lanzaba DESPUÉS de relevar: la
|
|
145
|
+
// pasada aplicaba y marcaba entradas y el comando reventaba con un
|
|
146
|
+
// TypeError sin decir qué había aplicado.
|
|
147
|
+
if (this.maxAge !== undefined && !(Number.isInteger(this.maxAge) && this.maxAge >= 0)) {
|
|
148
|
+
this.logger.error(`--max-age debe ser un entero >= 0 en milisegundos (llegó ${String(this.maxAge)}). No se ha relevado nada.`);
|
|
149
|
+
this.exitCode = 1;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
143
152
|
const report = await authorization.relayScopeChanges({
|
|
144
153
|
dryRun: this.dryRun === true,
|
|
145
154
|
limit: this.limit,
|
|
@@ -165,6 +174,34 @@ export default class AuthzScopesRelay extends BaseCommand {
|
|
|
165
174
|
for (const item of report.dead) {
|
|
166
175
|
this.logger.error(`APARCADO tras agotar los intentos: ${linea(item)}${item.error ? ` — ${item.error}` : ''}`);
|
|
167
176
|
}
|
|
177
|
+
// Cierre-2 · C2 (gemelo): un id PEDIDO aparcado más allá del primer lote de
|
|
178
|
+
// `dead` (acotado a `batchSize`) llega en `entries`; se nombra igual.
|
|
179
|
+
if (only !== undefined) {
|
|
180
|
+
const listed = new Set(report.dead.map((item) => String(item.id)));
|
|
181
|
+
for (const entry of report.entries) {
|
|
182
|
+
if (entry.status !== 'dead' || listed.has(String(entry.id)))
|
|
183
|
+
continue;
|
|
184
|
+
this.logger.error(`APARCADO tras agotar los intentos: ${linea(entry)}${entry.reason ? ` — ${entry.reason}` : ''}`);
|
|
185
|
+
this.exitCode = 1;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
// Cierre-2 · C2: `missing` (no está en la cola) ≠ `notEvaluated` (PENDIENTE y
|
|
189
|
+
// la pasada no llegó: alcanzó --limit). Hasta el cierre-2 los dos salían como
|
|
190
|
+
// «no estaba ni pendiente ni aparcado … o no existe», con exit 0.
|
|
191
|
+
const notEvaluated = only === undefined ? [] : (report.notEvaluated ?? []);
|
|
192
|
+
const limite = this.limit === undefined ? 'el --limit por defecto' : `--limit=${this.limit}`;
|
|
193
|
+
const rama = report.dryRun ? '--dry-run' : 'pasada que aplica';
|
|
194
|
+
const notEvaluatedLines = () => {
|
|
195
|
+
if (notEvaluated.length === 0)
|
|
196
|
+
return;
|
|
197
|
+
for (const id of notEvaluated) {
|
|
198
|
+
this.logger.error(`#${id} está PENDIENTE y esta pasada NO lo evaluó (${rama}): alcanzó ${limite} antes de llegar a él. ` +
|
|
199
|
+
(report.dryRun ? 'No se sabe si se aplicaría.' : 'No se ha aplicado: el cambio no ha aterrizado.'));
|
|
200
|
+
}
|
|
201
|
+
this.logger.error(`${notEvaluated.length} de los ids pedidos NO se evaluaron por el límite de la pasada ` +
|
|
202
|
+
`(${notEvaluated.map((id) => `#${id}`).join(', ')}): repite con un --limit mayor (o sin él).`);
|
|
203
|
+
this.exitCode = 1;
|
|
204
|
+
};
|
|
168
205
|
if (report.dead.length > 0) {
|
|
169
206
|
this.logger.warning('Una entrada aparcada NO se va a aplicar sola: el árbol del backend está divergente en ese nodo. ' +
|
|
170
207
|
'Revísala en la cola (el consumidor puede volver a notificar el cambio) o reconcilia.');
|
|
@@ -178,15 +215,38 @@ export default class AuthzScopesRelay extends BaseCommand {
|
|
|
178
215
|
if (report.dryRun) {
|
|
179
216
|
for (const item of report.wouldApply)
|
|
180
217
|
this.logger.log(`pendiente: ${linea(item)}`);
|
|
218
|
+
// Cierre del auditor de alpha.10 · R3 (gemelo de S6 en --dry-run): con
|
|
219
|
+
// `--only` la pregunta es «¿qué fue de LO PEDIDO?» también aquí. Hasta el
|
|
220
|
+
// cierre esta rama retornaba antes del bloque S6 y `--dry-run --only=999`
|
|
221
|
+
// (errata) decía «La outbox del árbol está vacía» en verde sin nombrar el id.
|
|
222
|
+
// Misma letra por id que la pasada que aplica; el resumen dice su rama.
|
|
223
|
+
if (only !== undefined) {
|
|
224
|
+
for (const id of report.missing) {
|
|
225
|
+
this.logger.warning(`#${id} no estaba ni pendiente ni aparcado: ya lo aplicó otra pasada, o no existe.`);
|
|
226
|
+
}
|
|
227
|
+
notEvaluatedLines();
|
|
228
|
+
}
|
|
181
229
|
if (report.wouldApply.length === 0) {
|
|
182
230
|
if (report.dead.length > 0)
|
|
183
231
|
this.exitCode = 1;
|
|
184
|
-
|
|
232
|
+
if (only !== undefined) {
|
|
233
|
+
if (report.missing.length > 0 && notEvaluated.length === 0) {
|
|
234
|
+
this.logger.warning(`--dry-run: ninguno de los ids pedidos está pendiente (${report.missing.map((id) => `#${id}`).join(', ')}: ` +
|
|
235
|
+
'ni pendientes ni aparcados). No hay nada de LO PEDIDO que propagar; si no los aplicó otra pasada, revisa los ids.');
|
|
236
|
+
}
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
if (report.dead.length === 0)
|
|
185
240
|
this.logger.success('La outbox del árbol está vacía: nada que propagar.');
|
|
186
241
|
return;
|
|
187
242
|
}
|
|
188
243
|
this.logger.warning(`${report.wouldApply.length} cambio(s) del árbol sin propagar. No se ha aplicado nada: repite sin --dry-run. ` +
|
|
189
244
|
`Mientras tanto el backend decide con el árbol VIEJO.`);
|
|
245
|
+
// alpha.10 · S5: lo APARCADO es exit ≠ 0 «mientras exista» (README), haya
|
|
246
|
+
// o no pendientes. Hasta alpha.9 un cron con --dry-run perdía la
|
|
247
|
+
// divergencia permanente justo cuando además había tráfico.
|
|
248
|
+
if (report.dead.length > 0)
|
|
249
|
+
this.exitCode = 1;
|
|
190
250
|
return;
|
|
191
251
|
}
|
|
192
252
|
// Qué fue de cada entrada, una a una (`entries`): la pasada no es atómica
|
|
@@ -204,6 +264,7 @@ export default class AuthzScopesRelay extends BaseCommand {
|
|
|
204
264
|
for (const id of report.missing) {
|
|
205
265
|
this.logger.warning(`#${id} no estaba ni pendiente ni aparcado: ya lo aplicó otra pasada, o no existe.`);
|
|
206
266
|
}
|
|
267
|
+
notEvaluatedLines();
|
|
207
268
|
if (report.failures.length > 0) {
|
|
208
269
|
for (const item of report.failures) {
|
|
209
270
|
this.logger.error(`falló #${item.id} (${item.change.op} ` +
|
|
@@ -218,6 +279,25 @@ export default class AuthzScopesRelay extends BaseCommand {
|
|
|
218
279
|
}
|
|
219
280
|
if (report.dead.length > 0)
|
|
220
281
|
this.exitCode = 1;
|
|
282
|
+
// alpha.10 · S6: con `--only` la pregunta es «¿aterrizó LO QUE PEDÍ?», no
|
|
283
|
+
// «¿está vacía la cola?». Hasta alpha.9 un id aplazado (o una errata)
|
|
284
|
+
// imprimía «La outbox del árbol está vacía» en verde: el script de alta de
|
|
285
|
+
// tenant daba por relevado un cambio que no había aterrizado.
|
|
286
|
+
if (only !== undefined) {
|
|
287
|
+
const deferred = report.entries.filter((entry) => entry.status === 'deferred');
|
|
288
|
+
if (deferred.length > 0) {
|
|
289
|
+
this.logger.error(`${deferred.length} de los ids pedidos NO se ha aplicado (aplazado, arriba el motivo): ` +
|
|
290
|
+
`${deferred.map((entry) => `#${entry.id}`).join(', ')}. El cambio no ha aterrizado en el backend.`);
|
|
291
|
+
this.exitCode = 1;
|
|
292
|
+
}
|
|
293
|
+
if (report.applied.length === 0) {
|
|
294
|
+
if (deferred.length === 0 && notEvaluated.length === 0 && report.missing.length > 0) {
|
|
295
|
+
this.logger.warning(`Ninguno de los ids pedidos se ha aplicado en esta pasada (${report.missing.map((id) => `#${id}`).join(', ')}: ` +
|
|
296
|
+
'ni pendientes ni aparcados). Si no los aplicó otra pasada, revisa los ids.');
|
|
297
|
+
}
|
|
298
|
+
return;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
221
301
|
if (report.applied.length === 0) {
|
|
222
302
|
if (report.dead.length === 0)
|
|
223
303
|
this.logger.success('La outbox del árbol está vacía: nada que propagar.');
|
|
@@ -231,7 +311,6 @@ export default class AuthzScopesRelay extends BaseCommand {
|
|
|
231
311
|
}
|
|
232
312
|
__decorate([
|
|
233
313
|
flags.boolean({
|
|
234
|
-
name: 'dry-run',
|
|
235
314
|
description: 'List the pending tree changes without applying any of them',
|
|
236
315
|
}),
|
|
237
316
|
__metadata("design:type", Object)
|
|
@@ -241,26 +320,23 @@ __decorate([
|
|
|
241
320
|
__metadata("design:type", Object)
|
|
242
321
|
], AuthzScopesRelay.prototype, "limit", void 0);
|
|
243
322
|
__decorate([
|
|
244
|
-
flags.number({
|
|
323
|
+
flags.number({ description: 'How many pending changes to read per round trip' }),
|
|
245
324
|
__metadata("design:type", Object)
|
|
246
325
|
], AuthzScopesRelay.prototype, "batchSize", void 0);
|
|
247
326
|
__decorate([
|
|
248
327
|
flags.array({
|
|
249
|
-
name: 'only',
|
|
250
328
|
description: 'Apply ONLY these outbox ids (the receipt of scopes.*), comma-separated or repeated; dependencies are deferred, never skipped',
|
|
251
329
|
}),
|
|
252
330
|
__metadata("design:type", Object)
|
|
253
331
|
], AuthzScopesRelay.prototype, "only", void 0);
|
|
254
332
|
__decorate([
|
|
255
333
|
flags.number({
|
|
256
|
-
name: 'wait-lease-ms',
|
|
257
334
|
description: 'Wait up to this many ms for the relay lease instead of reporting busy at once (default 0; needs a pool >= 2)',
|
|
258
335
|
}),
|
|
259
336
|
__metadata("design:type", Object)
|
|
260
337
|
], AuthzScopesRelay.prototype, "waitLeaseMs", void 0);
|
|
261
338
|
__decorate([
|
|
262
339
|
flags.number({
|
|
263
|
-
name: 'max-age',
|
|
264
340
|
description: 'Exit ≠ 0 if the oldest pending entry of the whole queue is older than this many ms (without it the age is only reported)',
|
|
265
341
|
}),
|
|
266
342
|
__metadata("design:type", Object)
|