@oondemand/create-central-oon 0.3.10 → 0.3.11
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,150 @@
|
|
|
1
|
+
# Portal/Cockpit com OonCore
|
|
2
|
+
|
|
3
|
+
Este padrão atende aplicações como **Meus Apps**, Portal do Cliente, Portal de Parceiros, Suporte, Copilotos e outros Cockpits first-party.
|
|
4
|
+
|
|
5
|
+
O objetivo é evitar que um portal precise recriar Shell, Router, AuthProvider, Menu, Guards e SDK HTTP. O portal deve usar o `central.ui.json` + `startFromManifest` e registrar apenas os componentes realmente customizados.
|
|
6
|
+
|
|
7
|
+
## Perfis arquiteturais
|
|
8
|
+
|
|
9
|
+
O OonCore diferencia três perfis:
|
|
10
|
+
|
|
11
|
+
| Perfil | Uso |
|
|
12
|
+
| --- | --- |
|
|
13
|
+
| `root-central` | Central de Ativações, raiz de confiança. |
|
|
14
|
+
| `member-central` | Central cliente/licenciada, ativada por instância. |
|
|
15
|
+
| `portal-cockpit` | Portal/Cockpit first-party, autenticado por AppClient/BFF. |
|
|
16
|
+
|
|
17
|
+
## Auth modes
|
|
18
|
+
|
|
19
|
+
| `auth.mode` | Uso |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `bearer` | Token local simples, compatível com Centrais existentes. |
|
|
22
|
+
| `cookie` | Sessão futura via cookie HTTP-only. |
|
|
23
|
+
| `external-sso` | Redireciona para login externo. |
|
|
24
|
+
| `central-instance` | Central membro usando instância ativada. |
|
|
25
|
+
| `central-client` | Portal/Cockpit usando AppClient/BFF. |
|
|
26
|
+
|
|
27
|
+
## Capabilities no manifesto
|
|
28
|
+
|
|
29
|
+
Além de `permissions`, o manifesto pode declarar `capabilities`. Elas são permissões dinâmicas vindas da Central de Ativações e evitam criar campos fixos para cada produto.
|
|
30
|
+
|
|
31
|
+
Exemplos:
|
|
32
|
+
|
|
33
|
+
```txt
|
|
34
|
+
apps:read
|
|
35
|
+
users:manage
|
|
36
|
+
tickets:read
|
|
37
|
+
tickets:assign
|
|
38
|
+
copilots:read
|
|
39
|
+
copilots:test
|
|
40
|
+
billing:read
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
O Core trata `permissions` e `capabilities` como requisitos de UI. A segurança real continua no backend.
|
|
44
|
+
|
|
45
|
+
## Manifesto recomendado
|
|
46
|
+
|
|
47
|
+
```json
|
|
48
|
+
{
|
|
49
|
+
"schemaVersion": 2,
|
|
50
|
+
"name": "Portal Cliente",
|
|
51
|
+
"slug": "portal-cliente",
|
|
52
|
+
"appKind": "portal-cockpit",
|
|
53
|
+
"auth": {
|
|
54
|
+
"mode": "central-client",
|
|
55
|
+
"tokenParam": "code"
|
|
56
|
+
},
|
|
57
|
+
"layout": {
|
|
58
|
+
"shell": "portal",
|
|
59
|
+
"sidebar": "core",
|
|
60
|
+
"topbar": "none",
|
|
61
|
+
"header": "none",
|
|
62
|
+
"footer": "core"
|
|
63
|
+
},
|
|
64
|
+
"navigation": {
|
|
65
|
+
"mode": "manual",
|
|
66
|
+
"items": [
|
|
67
|
+
{ "label": "Meus Apps", "href": "/apps", "capabilities": ["apps:read"], "order": 10 },
|
|
68
|
+
{ "label": "Suporte", "href": "/suporte", "capabilities": ["tickets:read"], "order": 20 },
|
|
69
|
+
{ "label": "Copilotos", "href": "/copilotos", "capabilities": ["copilots:read"], "order": 30 },
|
|
70
|
+
{ "label": "Usuários", "href": "/usuarios", "capabilities": ["users:manage"], "order": 40 }
|
|
71
|
+
]
|
|
72
|
+
},
|
|
73
|
+
"pages": [
|
|
74
|
+
{ "path": "/apps", "label": "Meus Apps", "component": "AppsPortalPage", "capabilities": ["apps:read"] },
|
|
75
|
+
{ "path": "/suporte", "label": "Suporte", "component": "SupportPage", "capabilities": ["tickets:read"] },
|
|
76
|
+
{ "path": "/copilotos", "label": "Copilotos", "component": "CopilotsPage", "capabilities": ["copilots:read"] },
|
|
77
|
+
{ "path": "/usuarios", "label": "Usuários", "component": "UsersPermissionsPage", "capabilities": ["users:manage"] }
|
|
78
|
+
],
|
|
79
|
+
"collections": [],
|
|
80
|
+
"pipelines": [],
|
|
81
|
+
"documents": []
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Bootstrap recomendado
|
|
86
|
+
|
|
87
|
+
```ts
|
|
88
|
+
import { startFromManifest } from "@oondemand/oon-core-front";
|
|
89
|
+
import manifest from "../central.ui.json";
|
|
90
|
+
import { AppsPortalPage } from "./custom/AppsPortalPage";
|
|
91
|
+
import { SupportPage } from "./custom/SupportPage";
|
|
92
|
+
import { CopilotsPage } from "./custom/CopilotsPage";
|
|
93
|
+
import { UsersPermissionsPage } from "./custom/UsersPermissionsPage";
|
|
94
|
+
|
|
95
|
+
startFromManifest(manifest, {
|
|
96
|
+
apiBaseUrl: import.meta.env.VITE_API_URL,
|
|
97
|
+
appKind: "portal-cockpit",
|
|
98
|
+
auth: {
|
|
99
|
+
mode: "central-client"
|
|
100
|
+
},
|
|
101
|
+
customComponents: {
|
|
102
|
+
AppsPortalPage,
|
|
103
|
+
SupportPage,
|
|
104
|
+
CopilotsPage,
|
|
105
|
+
UsersPermissionsPage
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
## Contrato esperado do BFF
|
|
111
|
+
|
|
112
|
+
O frontend conversa apenas com o BFF do portal. O BFF fala com a Central de Ativações usando AppClient.
|
|
113
|
+
|
|
114
|
+
Rotas genéricas esperadas no BFF podem espelhar a Central de Ativações:
|
|
115
|
+
|
|
116
|
+
```http
|
|
117
|
+
GET /api/portal/contexto
|
|
118
|
+
GET /api/portal/apps
|
|
119
|
+
GET /api/portal/apps/:appCode
|
|
120
|
+
GET /api/portal/apps/:appCode/capabilities
|
|
121
|
+
POST /api/portal/apps/:appCode/authorize
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
O BFF também pode expor rotas de domínio próprias, como:
|
|
125
|
+
|
|
126
|
+
```http
|
|
127
|
+
GET /api/suporte/tickets
|
|
128
|
+
POST /api/suporte/tickets
|
|
129
|
+
GET /api/copilotos/assistentes
|
|
130
|
+
POST /api/copilotos/assistentes/:id/testar
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Essas rotas de domínio validam capability na Central de Ativações antes de executar a ação.
|
|
134
|
+
|
|
135
|
+
## Regra de segurança
|
|
136
|
+
|
|
137
|
+
O frontend nunca deve receber `clientSecret`, `x-oon-instance-token`, hash de credencial ou segredo completo. Portais devem falar com um BFF próprio, e o BFF fala com a Central de Ativações usando AppClient.
|
|
138
|
+
|
|
139
|
+
## Quando usar página custom
|
|
140
|
+
|
|
141
|
+
Use página custom apenas quando a tela não for CRUD/esteira/documento declarativo, por exemplo:
|
|
142
|
+
|
|
143
|
+
- cards de apps licenciados;
|
|
144
|
+
- matriz de permissões;
|
|
145
|
+
- cockpit de status;
|
|
146
|
+
- tickets de suporte;
|
|
147
|
+
- gestão de copilotos;
|
|
148
|
+
- onboarding orientado por negócio.
|
|
149
|
+
|
|
150
|
+
Mesmo nesses casos, o Shell, Router, Auth, Menu, Guards e SDK HTTP devem continuar no Core.
|
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"sync:metadata": "oonCore-front sync:metadata"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@oondemand/oon-core-front": "^0.3.
|
|
13
|
+
"@oondemand/oon-core-front": "^0.3.11",
|
|
14
14
|
"@chakra-ui/react": "^3.13.0",
|
|
15
15
|
"@emotion/react": "^11.14.0",
|
|
16
16
|
"@tanstack/react-query": "^5.65.0",
|