@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.
@@ -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(options)` produz headers de identidade do Deployment. Retorna `LOCAL_OPERATION_NOT_SUPPORTED` no runtime local; nunca improvise identidade local.
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
 
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oondemand/create-central-oon",
3
- "version": "0.6.6",
3
+ "version": "0.6.8",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/oondemand/oon-platform.git",
@@ -12,6 +12,6 @@
12
12
  "deploy": "oonCore-back deploy"
13
13
  },
14
14
  "dependencies": {
15
- "@oondemand/oon-core-back": "^0.6.6"
15
+ "@oondemand/oon-core-back": "^0.6.8"
16
16
  }
17
17
  }
@@ -11,7 +11,7 @@
11
11
  "sync:metadata": "oonCore-front sync:metadata"
12
12
  },
13
13
  "dependencies": {
14
- "@oondemand/oon-core-front": "^0.6.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",
@@ -13,6 +13,6 @@
13
13
  "dev:frontend": "npm run dev --prefix frontend"
14
14
  },
15
15
  "devDependencies": {
16
- "@oondemand/create-central-oon": "0.6.6"
16
+ "@oondemand/create-central-oon": "0.6.8"
17
17
  }
18
18
  }