@mybuildex/pkg 0.10.3 → 0.12.0
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 +34 -0
- package/dist/acl/map.generated.js +30 -0
- package/dist/acl/map.generated.js.map +1 -1
- package/dist/acl/plugin.d.ts +7 -0
- package/dist/acl/plugin.js +15 -0
- package/dist/acl/plugin.js.map +1 -1
- package/dist/index.d.ts +7 -1
- package/dist/index.js +34 -1
- package/dist/index.js.map +1 -1
- package/dist/network/context.d.ts +70 -0
- package/dist/network/context.js +196 -0
- package/dist/network/context.js.map +1 -0
- package/dist/network/plugin.d.ts +21 -0
- package/dist/network/plugin.js +222 -0
- package/dist/network/plugin.js.map +1 -0
- package/dist/network/replication.d.ts +86 -0
- package/dist/network/replication.js +328 -0
- package/dist/network/replication.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -51,6 +51,40 @@ createAuthMiddleware({
|
|
|
51
51
|
createTenantMiddleware({getTenantClient, defaultClient, strictTenant: true});
|
|
52
52
|
```
|
|
53
53
|
|
|
54
|
+
## 0.12.0 — ACL primeiro, governança junto
|
|
55
|
+
|
|
56
|
+
**Muda comportamento** (⚠️) em quem registra o `createNetworkPlugin` (v1_settings, v1_acls, v3_peoples, v1_eads). Regra: sem governança, a ACL decide sozinha; com governança, a ACL valida primeiro e a governança em seguida (se a rede não libera, barra mesmo com a permissão da ACL); a governança nunca barra sozinha.
|
|
57
|
+
|
|
58
|
+
- ⚠️ **Ordem.** A verificação da rede saiu do `preHandler` da instância (que rodava ANTES do guard da ACL, um `preHandler` de rota) para um guard na cadeia de cada rota, instalado no `onRoute` logo depois do guard da ACL: ACL → rede → preHandlers da rota. Quem não tem a permissão recebe o 403 da ACL ("Sem permissão para esta ação"), não o da rede, e a auditoria grava `acl_denied`. O guard da rede segue antes do `setRequest` dos controllers, que recebe o client da réplica.
|
|
59
|
+
- ⚠️ **A governança só barra junto com a ACL.** O 403 da filial exige a ACL em `enforce` na rota (`aclEnforces(request)`, exportado). Rota sem `useModuleAcl`, ACL em `report` ou `ACL_MODE=off`: a rede não barra. A réplica da matriz não depende disso (ela não barra ninguém, só mantém as filiais iguais à matriz).
|
|
60
|
+
- **Core fora do ar.** O cache guarda o último contexto bom de cada escola. Com o core sem responder, tabela fora desse catálogo segue só a ACL; tabela do catálogo (ou escola que nunca carregou o catálogo) leva 503, sempre DEPOIS da ACL. Com a ACL fora do `enforce`, nada de 503.
|
|
61
|
+
- Registrar como antes: depois do `createAclPlugin`, antes da compressão e dos módulos (o `onRoute` só vale para as rotas registradas depois dele).
|
|
62
|
+
- `ACL_MAP` regerado do front: entram `programs` e `projects` (projeto social). Nenhuma entrada existente muda.
|
|
63
|
+
|
|
64
|
+
## 0.11.0 — governança de rede de escolas (matriz/filial)
|
|
65
|
+
|
|
66
|
+
Módulo novo, opt-in: API que não registra o plugin não muda nada. Veio da `v1_settings` sem mudança de comportamento (19/10/2026), para as outras APIs ligarem com uma linha.
|
|
67
|
+
|
|
68
|
+
- **`createNetworkPlugin({ttlMs, enabled, logger})`** — a escola é de rede quando o PRÓPRIO banco tem `configs.key = 'REDE'` com `TRUE` (gravada pelo core Go). Sem a flag o core nem é consultado. Com ela, o papel e as regras vêm do banco core (`my_builder_<env>_core`, por SQL cru qualificado no mesmo pool; env `CORE_DATABASE` sobrescreve):
|
|
69
|
+
- **filial** — cada ação (`read/add/edit/remove/restore/delete`) numa tabela do catálogo de módulos passa pelas `networks_policies`, **acima** da ACL: nega com 403 mesmo com a permissão do usuário. A ação sai da constante do router (`routeAcl.key` gravada pelo `useModuleAcl`) ou, sem ela, do método HTTP. A tabela é o segmento depois de `/v1/:id_school/`.
|
|
70
|
+
- **matriz** — pode tudo; o que grava nas tabelas do catálogo é replicado nas filiais com o mesmo id, numa transação única, no `onSend` (antes da resposta). Falha na réplica vira 500 com mensagem clara (a matriz já gravou, nenhuma filial foi alterada).
|
|
71
|
+
- **standalone** — sem flag, sem vínculo ou rede removida: nada muda.
|
|
72
|
+
- Core fora do ar numa escola de rede: 503 (fail-closed). Contexto em cache por escola (`NETWORK_CACHE_TTL_MS`, default 30 s). `NETWORK_GOVERNANCE=off` desliga tudo.
|
|
73
|
+
- **Ordem no `loadPlugins`:** depois do `createAclPlugin` (usa a `routeAcl` dele) e **antes** do `createCompressPlugin` (o `onSend` da réplica pode trocar o corpo por erro).
|
|
74
|
+
- **Para o front:** `effectivePermissions(request.network ?? standaloneContext(id))` devolve `{tabela: {read, add, ...}}` — é o que o `GET /v1/:id_school/networks/effective` da `v1_settings` responde.
|
|
75
|
+
- Limitações (como antes): SQL cru na matriz não replica; escrita aninhada em relação só replica a tabela do model chamado; a réplica não entra no `audit_logs`.
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import {createNetworkPlugin} from "@mybuildex/pkg";
|
|
79
|
+
|
|
80
|
+
const pluginNetwork = createNetworkPlugin();
|
|
81
|
+
// loadPlugins
|
|
82
|
+
await createAclPlugin({api: settings.PREFIX, mode: "enforce"})(fastify);
|
|
83
|
+
await pluginNetwork(fastify);
|
|
84
|
+
await pluginCors(fastify);
|
|
85
|
+
await pluginCompress(fastify);
|
|
86
|
+
```
|
|
87
|
+
|
|
54
88
|
## 0.10.3 — ACL_MAP com split de pagamento
|
|
55
89
|
|
|
56
90
|
- **`ACL_MAP` regerado do front** com os recursos `pay_split_recipients` (ações do CRUD + `sync`, para o botão "Sincronizar" que grava o recebedor no gateway) e `pay_split_rules`. Sem eles a `v1_payments` em enforce nega as rotas novas para todo mundo (10/10/2026). Nenhuma mudança de código.
|
|
@@ -1024,6 +1024,12 @@ exports.ACL_MAP = {
|
|
|
1024
1024
|
"restore": ["full", "months.restore", "meses.restaura"],
|
|
1025
1025
|
"trash": ["full", "months.trash", "meses.lixeira"],
|
|
1026
1026
|
},
|
|
1027
|
+
"networks": {
|
|
1028
|
+
"access": ["full", "networks.access"],
|
|
1029
|
+
"access_all": ["full", "networks.access_all"],
|
|
1030
|
+
"manage": ["full", "networks.manage"],
|
|
1031
|
+
"menu": ["full", "networks.menu"],
|
|
1032
|
+
},
|
|
1027
1033
|
"notes": {
|
|
1028
1034
|
"add": ["full", "notes.add", "notas_pessoa.adiciona"],
|
|
1029
1035
|
"delete": ["full", "notes.delete", "notas_pessoa.exclui"],
|
|
@@ -1934,6 +1940,30 @@ exports.ACL_MAP = {
|
|
|
1934
1940
|
"restore": ["full", "profiles.restore", "perfis.restaura"],
|
|
1935
1941
|
"trash": ["full", "profiles.trash", "perfis.lixeira"],
|
|
1936
1942
|
},
|
|
1943
|
+
"programs": {
|
|
1944
|
+
"add": ["full", "programs.add", "programas.adiciona"],
|
|
1945
|
+
"delete": ["full", "programs.delete", "programas.exclui"],
|
|
1946
|
+
"edit": ["full", "programs.edit", "programas.edita"],
|
|
1947
|
+
"find": ["full", "programs.find", "programas.detalha"],
|
|
1948
|
+
"list": ["full", "programs.list", "programas.lista"],
|
|
1949
|
+
"menu": ["full", "programs.menu", "programas.menu"],
|
|
1950
|
+
"paginate": ["full", "programs.paginate", "programas.pagina"],
|
|
1951
|
+
"remover": ["full", "programs.remove", "programas.remove"],
|
|
1952
|
+
"restore": ["full", "programs.restore", "programas.restaura"],
|
|
1953
|
+
"trash": ["full", "programs.trash", "programas.lixeira"],
|
|
1954
|
+
},
|
|
1955
|
+
"projects": {
|
|
1956
|
+
"add": ["full", "projects.add", "projetos.adiciona"],
|
|
1957
|
+
"delete": ["full", "projects.delete", "projetos.exclui"],
|
|
1958
|
+
"edit": ["full", "projects.edit", "projetos.edita"],
|
|
1959
|
+
"find": ["full", "projects.find", "projetos.detalha"],
|
|
1960
|
+
"list": ["full", "projects.list", "projetos.lista"],
|
|
1961
|
+
"menu": ["full", "projects.menu", "projetos.menu"],
|
|
1962
|
+
"paginate": ["full", "projects.paginate", "projetos.pagina"],
|
|
1963
|
+
"remover": ["full", "projects.remove", "projetos.remove"],
|
|
1964
|
+
"restore": ["full", "projects.restore", "projetos.restaura"],
|
|
1965
|
+
"trash": ["full", "projects.trash", "projetos.lixeira"],
|
|
1966
|
+
},
|
|
1937
1967
|
"psychological_anamneses": {
|
|
1938
1968
|
"add": ["full", "psychological_anamneses.add", "analises_psicologicas.adiciona"],
|
|
1939
1969
|
"delete": ["full", "psychological_anamneses.delete", "analises_psicologicas.exclui"],
|