@oondemand/create-central-oon 0.6.6 → 0.6.8
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.
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# Licença comercial por aplicativo — contrato 1 (Core 0.6.7)
|
|
2
|
+
|
|
3
|
+
Disponível no namespace público `licensing` de `@oondemand/oon-core-back`.
|
|
4
|
+
Requer a Central de Ativações com `/licensing/decision` e `/licensing/identity`.
|
|
5
|
+
O SDK não substitui autenticação, RBAC, vínculo de Deployment ou licença organizacional.
|
|
6
|
+
|
|
7
|
+
```js
|
|
8
|
+
const { licensing } = require("@oondemand/oon-core-back");
|
|
9
|
+
await licensing.assertBusinessOperation({ tenantId: accessContext.tenantId, correlationId });
|
|
10
|
+
// Inicie agora o efeito autorizado: PDF, e-mail, emissão ou mutação externa.
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Chame imediatamente antes de **cada novo efeito**, inclusive em jobs aceitos anteriormente.
|
|
14
|
+
Não guarde autorização no JWT, snapshot ou cache positivo. A decisão é uma leitura pontual;
|
|
15
|
+
uma suspensão posterior não cancela uma chamada já iniciada nem desfaz um efeito confirmado.
|
|
16
|
+
Preserve recibos, callbacks, reconciliação, downloads já gerados e histórico sem reiniciar efeitos.
|
|
17
|
+
|
|
18
|
+
O Core usa identidade operacional do próprio Deployment e a autoridade configurada pelo
|
|
19
|
+
runtime. O App não configura URL da Central, credencial interna ou transporte paralelo.
|
|
20
|
+
Timeout de 3 segundos, sem redirects, sem retry e sem cache positivo. Resposta ausente,
|
|
21
|
+
incompatível ou de outro escopo retorna `LICENSE_AUTHORITY_UNAVAILABLE` (503).
|
|
22
|
+
Runtime local não pode obter identidade operacional: `LOCAL_OPERATION_NOT_SUPPORTED`.
|
|
23
|
+
Em testes unitários, injete o guard na camada de domínio; isso nunca habilita operação local real.
|
|
24
|
+
|
|
25
|
+
Um contrato bloqueado retorna HTTP 423 com código `APP_LICENSE_REQUIRED`,
|
|
26
|
+
`APP_LICENSE_NOT_STARTED`, `APP_LICENSE_EXPIRED`, `APP_LICENSE_SUSPENDED`,
|
|
27
|
+
`APP_LICENSE_CANCELLED`, `APP_LICENSE_OVERDUE` ou `APP_LICENSE_INVALID`.
|
|
28
|
+
Bloqueios organizacionais e de entitlement também são preservados.
|
|
29
|
+
Exiba a razão comercial; deixe a operação pendente. Pagamento não renova nem reativa sozinho.
|
|
30
|
+
|
|
31
|
+
## Gateway que recebe chamadas de outros Apps
|
|
32
|
+
|
|
33
|
+
```js
|
|
34
|
+
const identity = await licensing.verifyConsumerRequest({
|
|
35
|
+
headers: req.headers,
|
|
36
|
+
requireLicense: false,
|
|
37
|
+
});
|
|
38
|
+
// Vincule identity.{tenantId,appCode,environment} ao consumidor cadastrado no gateway.
|
|
39
|
+
// Autorize base e operação no domínio do gateway, depois:
|
|
40
|
+
await licensing.verifyConsumerRequest({ headers: req.headers, requireLicense: true });
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`requireLicense` é `true` por padrão. `false` consulta apenas a identidade e vínculo
|
|
44
|
+
ativo Deployment–tenant, permitindo receber/consultar evidências durante suspensão.
|
|
45
|
+
**Não autoriza um efeito novo.** A autenticação específica do consumidor e sua política
|
|
46
|
+
continuam obrigatórias. O bearer do gateway nunca é encaminhado à Central.
|
|
47
|
+
|
|
48
|
+
Headers obrigatórios: `x-oon-deployment-id`, `x-oon-deployment-token`, `x-app-code`,
|
|
49
|
+
`x-oon-tenant-id`. Eles só são confiáveis depois da validação remota. Não aceite App,
|
|
50
|
+
ambiente ou tenant do body. Todas as respostas são comparadas com o escopo solicitado.
|
|
51
|
+
Nenhum segredo ou diagnóstico bruto do provedor é incluído nos erros normalizados.
|
|
52
|
+
|
|
53
|
+
## Resposta da autoridade
|
|
54
|
+
|
|
55
|
+
`POST /licensing/decision` (body vazio): `schemaVersion: 1`, `appCode`, `tenantId`,
|
|
56
|
+
`environment`, `allowed`, `code`, `version`, `checkedAt`, `maxAgeSeconds: 0`.
|
|
57
|
+
Permissão exige versão positiva e código nulo; negação tem código reconhecido.
|
|
58
|
+
`POST /licensing/identity`: `schemaVersion: 1`, `appCode`, `tenantId`, `environment`,
|
|
59
|
+
`maxAgeSeconds: 0`. Respostas autenticadas têm `Cache-Control: no-store`.
|
|
60
|
+
|
|
61
|
+
## Limite atual de jobs
|
|
62
|
+
|
|
63
|
+
Este contrato oferece o guard de efeitos, não um executor durável de integrações.
|
|
64
|
+
A documentação de process jobs existente não especifica registro público de handlers
|
|
65
|
+
externos, inbox/outbox e retomada autônoma necessários ao gateway da issue #170.
|
|
66
|
+
Essa extensão precisa de contrato e testes próprios antes de declarar I4 concluída.
|
package/docs/BACKEND_API.md
CHANGED
|
@@ -38,7 +38,12 @@ O namespace público `capabilities` contém:
|
|
|
38
38
|
|
|
39
39
|
O App nunca configura URL, credencial interna ou implementação de uma capability. A única exceção é a injeção de dublês documentada para testes automatizados.
|
|
40
40
|
|
|
41
|
-
`operationalRequestHeaders(
|
|
41
|
+
`operationalRequestHeaders({ tenantId, correlationId })` produz headers de identidade do Deployment. O tenant vem do contexto validado e correlationId é opcional. Retorna `LOCAL_OPERATION_NOT_SUPPORTED` no runtime local; nunca improvise identidade local.
|
|
42
|
+
|
|
43
|
+
## Licença por App
|
|
44
|
+
|
|
45
|
+
`licensing.assertBusinessOperation` e `licensing.verifyConsumerRequest` (0.6.7):
|
|
46
|
+
consulte [APP_LICENSING.md](APP_LICENSING.md) para escopo, erros, local, jobs e reconciliação.
|
|
42
47
|
|
|
43
48
|
## Runtime local
|
|
44
49
|
|
package/docs/FRONTEND_API.md
CHANGED
|
@@ -23,9 +23,18 @@ O contrato principal do frontend é code-first.
|
|
|
23
23
|
- `useOonApi`, `useOonResource`, `useCoreMetadata`, `useModelSchema`: acesso padronizado;
|
|
24
24
|
- rotas reservadas e guards obrigatórios pertencem ao Core.
|
|
25
25
|
|
|
26
|
+
## Contexto e descarte de estado por tenant
|
|
27
|
+
|
|
28
|
+
`useOonTenant()` devolve `{activeTenantId: string | null, switchTenant(id), clearTenant()}`
|
|
29
|
+
em Apps com tenancy. Não chame esse hook em Apps `tenancyModel=none`.
|
|
30
|
+
O Core atualiza o header e limpa o cache de queries na troca. Estado React local,
|
|
31
|
+
formulários, tokens de uso único e respostas assíncronas também devem ser descartados:
|
|
32
|
+
uma página filha com `key={activeTenantId ?? "no-tenant"}` é uma composição possível.
|
|
33
|
+
`useOonAuth().hasPermission(code)` permite ocultar ações, com autorização obrigatória
|
|
34
|
+
e independente no backend. `useOonApi()` fornece `{http}` para o cliente autenticado.
|
|
35
|
+
|
|
26
36
|
## Domínio e UI
|
|
27
37
|
|
|
28
38
|
Views declarativas continuam disponíveis como composição opcional dentro do
|
|
29
39
|
objeto App. Componentes, páginas e layouts locais podem ser usados em qualquer
|
|
30
40
|
`appKind`. Consulte `FRONTEND_CODE_FIRST.md`.
|
|
31
|
-
|
package/package.json
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"sync:metadata": "oonCore-front sync:metadata"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@oondemand/oon-core-front": "^0.6.
|
|
14
|
+
"@oondemand/oon-core-front": "^0.6.8",
|
|
15
15
|
"@chakra-ui/react": "^3.13.0",
|
|
16
16
|
"@emotion/react": "^11.14.0",
|
|
17
17
|
"@tanstack/react-query": "^5.65.0",
|