mitra-interactions-sdk 1.0.60-beta.2 → 1.0.60-beta.20
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 +296 -558
- package/dist/index.d.mts +11 -919
- package/dist/index.d.ts +11 -919
- package/dist/index.js +564 -1882
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +563 -1849
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,558 +1,296 @@
|
|
|
1
|
-
# Mitra Interactions SDK
|
|
2
|
-
|
|
3
|
-
SDK para interações com a plataforma Mitra via endpoints `/interactions/`.
|
|
4
|
-
|
|
5
|
-
## Permissões: `dev` vs `business`
|
|
6
|
-
|
|
7
|
-
`userType` no token de login:
|
|
8
|
-
- `dev` — chama tudo
|
|
9
|
-
- `business` — chama apenas execução (SF
|
|
10
|
-
|
|
11
|
-
> Não confundir com o pacote `mitra-business-sdk` (SDK separado, usado pelo agente IA).
|
|
12
|
-
|
|
13
|
-
**Bloqueado para `business`:** CRUD REST (`*RecordMitra`)
|
|
14
|
-
|
|
15
|
-
> SF tipo JAVASCRIPT herda o `userType` do caller — se chamar funções bloqueadas, retorna 403 para business.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
|
|
19
|
-
## Instalação
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
npm install mitra-interactions-sdk
|
|
23
|
-
# ou
|
|
24
|
-
yarn add mitra-interactions-sdk
|
|
25
|
-
# ou
|
|
26
|
-
pnpm add mitra-interactions-sdk
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Configuração
|
|
30
|
-
|
|
31
|
-
Antes de usar qualquer função, configure o SDK. O `token` é **opcional** — Server Functions públicas podem ser chamadas sem autenticação.
|
|
32
|
-
|
|
33
|
-
> **Importante:** Quando usado, o token é um JWT de autenticação da plataforma Mitra. **Nunca deixe o token estático no código.** Utilize variáveis de ambiente para armazená-lo de forma segura.
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
import { configureSdkMitra } from 'mitra-interactions-sdk';
|
|
37
|
-
|
|
38
|
-
// Configuração completa (com autenticação)
|
|
39
|
-
const instance = configureSdkMitra({
|
|
40
|
-
baseURL: process.env.MITRA_BASE_URL || 'https://api.mitra.com',
|
|
41
|
-
token: process.env.MITRA_TOKEN!, // Opcional — necessário apenas para endpoints autenticados
|
|
42
|
-
authUrl: 'https://coder.mitralab.io/sdk-auth/', // Opcional — necessário para login e token refresh
|
|
43
|
-
projectId: 123, // Opcional — se informado, torna projectId opcional em TODOS os métodos
|
|
44
|
-
integrationURL: 'https://api0.mitraecp.com:1003', // Opcional — necessário para integrações
|
|
45
|
-
onTokenRefresh: (session) => { // Opcional — chamado quando o token é renovado automaticamente
|
|
46
|
-
localStorage.setItem('mitra_session', JSON.stringify(session));
|
|
47
|
-
}
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
// Configuração mínima (sem token — apenas para Server Functions públicas)
|
|
51
|
-
const instance = configureSdkMitra({
|
|
52
|
-
baseURL: 'https://api.mitra.com',
|
|
53
|
-
projectId: 123
|
|
54
|
-
});
|
|
55
|
-
await instance.executeServerFunction({ serverFunctionId: 42 }); // OK — sem token
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
> **`projectId` global:** Se você passar `projectId` no `configureSdkMitra`, ele será usado como fallback em **todos** os métodos do SDK. Assim, não é necessário passar `projectId` em cada chamada individual — basta configurar uma vez.
|
|
59
|
-
|
|
60
|
-
`configureSdkMitra` retorna uma `MitraInstance` que também pode ser usada diretamente:
|
|
61
|
-
|
|
62
|
-
```typescript
|
|
63
|
-
await instance.executeServerFunction({ serverFunctionId: 42 }); // projectId já vem do configureSdkMitra
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## Autenticação (Login)
|
|
67
|
-
|
|
68
|
-
Login via popup ou redirect seguro hospedado no domínio Mitra. Credenciais nunca passam pelo código do desenvolvedor. O SDK é **auto-configurado** após o login.
|
|
69
|
-
|
|
70
|
-
> **Nota:** `authUrl` e `projectId` são **obrigatórios** para login. Porém, se já foram passados no `configureSdkMitra()`, não é necessário repeti-los — o SDK usa os valores configurados como fallback.
|
|
71
|
-
|
|
72
|
-
### Login via Popup (padrão)
|
|
73
|
-
|
|
74
|
-
```typescript
|
|
75
|
-
import {
|
|
76
|
-
|
|
77
|
-
//
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
const result = await
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
await
|
|
192
|
-
```
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
```typescript
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
// result: { status, result: { executionId, executionStatus: "CANCELLED" | "ALREADY_FINISHED" } }
|
|
298
|
-
```
|
|
299
|
-
|
|
300
|
-
### Public Server Functions (sem autenticação)
|
|
301
|
-
|
|
302
|
-
Para Server Functions com `publicExecution = true`. Não requerem token.
|
|
303
|
-
|
|
304
|
-
```typescript
|
|
305
|
-
import {
|
|
306
|
-
executePublicServerFunctionMitra,
|
|
307
|
-
executePublicServerFunctionAsyncMitra,
|
|
308
|
-
getPublicServerFunctionExecutionMitra
|
|
309
|
-
} from 'mitra-interactions-sdk';
|
|
310
|
-
|
|
311
|
-
// Sync — retorna resultado inline (timeout 5min)
|
|
312
|
-
const result = await executePublicServerFunctionMitra({
|
|
313
|
-
projectId: 123,
|
|
314
|
-
serverFunctionId: 49,
|
|
315
|
-
input: { param1: 'value' }
|
|
316
|
-
});
|
|
317
|
-
// result: { executionId, status, output, logs, error, durationMs }
|
|
318
|
-
|
|
319
|
-
// Async — retorna executionId imediatamente
|
|
320
|
-
const { executionId } = await executePublicServerFunctionAsyncMitra({
|
|
321
|
-
projectId: 123,
|
|
322
|
-
serverFunctionId: 50,
|
|
323
|
-
input: { heavyParam: true }
|
|
324
|
-
});
|
|
325
|
-
|
|
326
|
-
// Polling — consulta status/resultado
|
|
327
|
-
const execution = await getPublicServerFunctionExecutionMitra({
|
|
328
|
-
projectId: 123,
|
|
329
|
-
executionId
|
|
330
|
-
});
|
|
331
|
-
// execution: { executionId, status, output, logs, error, durationMs }
|
|
332
|
-
```
|
|
333
|
-
|
|
334
|
-
### executeDataLoaderMitra
|
|
335
|
-
|
|
336
|
-
Executa um Data Loader cadastrado no projeto.
|
|
337
|
-
|
|
338
|
-
```typescript
|
|
339
|
-
import { executeDataLoaderMitra } from 'mitra-interactions-sdk';
|
|
340
|
-
|
|
341
|
-
const result = await executeDataLoaderMitra({
|
|
342
|
-
projectId: 123,
|
|
343
|
-
dataLoaderId: 5,
|
|
344
|
-
input: { mes: 1, ano: 2025 } // Opcional — parâmetros {{var}} da query
|
|
345
|
-
});
|
|
346
|
-
// result: { status, result: { dataLoaderId, executionLog: { timestamp, rowCount, query, status, fileSize?, duration? }, message } }
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
### uploadFilePublicMitra / uploadFileLoadableMitra
|
|
350
|
-
|
|
351
|
-
Faz upload de um arquivo diretamente para a pasta PUBLIC ou LOADABLE do projeto. Usa `multipart/form-data`.
|
|
352
|
-
|
|
353
|
-
```typescript
|
|
354
|
-
import { uploadFilePublicMitra, uploadFileLoadableMitra } from 'mitra-interactions-sdk';
|
|
355
|
-
|
|
356
|
-
// Upload para PUBLIC (arquivo fica acessível publicamente via URL)
|
|
357
|
-
const result = await uploadFilePublicMitra({
|
|
358
|
-
projectId: 123,
|
|
359
|
-
file: fileInput.files[0] // File ou Blob
|
|
360
|
-
});
|
|
361
|
-
// result: { status, result: { fileName, currentPath, publicUrl, message } }
|
|
362
|
-
|
|
363
|
-
// Upload para LOADABLE (arquivo disponível para carga via Spark/ETL)
|
|
364
|
-
const result2 = await uploadFileLoadableMitra({
|
|
365
|
-
projectId: 123,
|
|
366
|
-
file: myBlob
|
|
367
|
-
});
|
|
368
|
-
// result2: { status, result: { fileName, currentPath, publicUrl: null, message } }
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
### Dynamic Schema CRUD
|
|
372
|
-
|
|
373
|
-
> 🔒 `userType=dev` only. Falha 403 para business. Em telas com business, envelopar em SF tipo SQL.
|
|
374
|
-
|
|
375
|
-
CRUD completo em tabelas do projeto via Dynamic Schema (usa header `X-TenantID`).
|
|
376
|
-
|
|
377
|
-
Todos os endpoints suportam o parâmetro opcional `jdbcConnectionConfigId` para operar em datasources adicionais (PostgreSQL, Oracle, SQL Server, etc.) ao invés do banco principal do tenant.
|
|
378
|
-
|
|
379
|
-
- `listRecordsMitra(...)` → `ListRecordsResponse` `{ content, page, size, totalElements, totalPages }` - Lista registros com paginação
|
|
380
|
-
- `getRecordMitra(...)` → `Record<string, any>` - Busca registro por ID
|
|
381
|
-
- `createRecordMitra(...)` → `Record<string, any>` - Cria registro (201)
|
|
382
|
-
- `updateRecordMitra(...)` → `Record<string, any>` - Atualiza registro (PUT)
|
|
383
|
-
- `patchRecordMitra(...)` → `Record<string, any>` - Atualiza parcialmente (PATCH)
|
|
384
|
-
- `deleteRecordMitra(...)` → `void` - Remove registro (204 No Content)
|
|
385
|
-
- `createRecordsBatchMitra(...)` → `Record<string, any>[]` - Cria múltiplos registros (201)
|
|
386
|
-
|
|
387
|
-
```typescript
|
|
388
|
-
import { listRecordsMitra, createRecordMitra, updateRecordMitra, deleteRecordMitra } from 'mitra-interactions-sdk';
|
|
389
|
-
|
|
390
|
-
// Listar registros
|
|
391
|
-
const result = await listRecordsMitra({
|
|
392
|
-
projectId: 123,
|
|
393
|
-
tableName: 'produtos',
|
|
394
|
-
page: 0,
|
|
395
|
-
size: 20
|
|
396
|
-
});
|
|
397
|
-
|
|
398
|
-
// Criar registro
|
|
399
|
-
await createRecordMitra({
|
|
400
|
-
projectId: 123,
|
|
401
|
-
tableName: 'produtos',
|
|
402
|
-
data: { nome: 'Produto A', preco: 99.90 }
|
|
403
|
-
});
|
|
404
|
-
|
|
405
|
-
// Atualizar registro
|
|
406
|
-
await updateRecordMitra({
|
|
407
|
-
projectId: 123,
|
|
408
|
-
tableName: 'produtos',
|
|
409
|
-
id: 1,
|
|
410
|
-
data: { nome: 'Produto A Atualizado', preco: 89.90, version: 0 }
|
|
411
|
-
});
|
|
412
|
-
|
|
413
|
-
// Deletar registro
|
|
414
|
-
await deleteRecordMitra({ projectId: 123, tableName: 'produtos', id: 1 });
|
|
415
|
-
|
|
416
|
-
// Usando datasource adicional (jdbcConnectionConfigId)
|
|
417
|
-
const result2 = await listRecordsMitra({
|
|
418
|
-
projectId: 123,
|
|
419
|
-
tableName: 'clientes',
|
|
420
|
-
jdbcConnectionConfigId: 5
|
|
421
|
-
});
|
|
422
|
-
```
|
|
423
|
-
|
|
424
|
-
### Profile Management
|
|
425
|
-
|
|
426
|
-
> 🔒 `userType=dev` only. Falha 403 para business. Telas de perfis exigem guard de `userType`.
|
|
427
|
-
|
|
428
|
-
Gerenciamento de perfis de acesso. Permite gestão de quem pode acessar quais recursos no projeto.
|
|
429
|
-
|
|
430
|
-
#### CRUD de Perfis
|
|
431
|
-
|
|
432
|
-
- `listProfilesMitra({ projectId? })` → `ListProfilesResponse` - Lista todos os perfis do projeto
|
|
433
|
-
- `getProfileDetailsMitra({ projectId?, profileId })` → `GetProfileDetailsResponse` - Detalhes de um perfil (usuários, tabelas, actions, screens, server functions)
|
|
434
|
-
- `createProfileMitra({ projectId?, name, color?, homeScreenId? })` → `CreateProfileResponse` - Cria um novo perfil
|
|
435
|
-
- `updateProfileMitra({ projectId?, profileId, name?, color?, homeScreenId? })` → `UpdateProfileResponse` - Atualiza um perfil existente
|
|
436
|
-
- `deleteProfileMitra({ projectId?, profileId })` → `DeleteProfileResponse` - Deleta um perfil
|
|
437
|
-
|
|
438
|
-
```typescript
|
|
439
|
-
import { listProfilesMitra, createProfileMitra, getProfileDetailsMitra } from 'mitra-interactions-sdk';
|
|
440
|
-
|
|
441
|
-
// Listar perfis
|
|
442
|
-
const profiles = await listProfilesMitra({ projectId: 123 });
|
|
443
|
-
// { status, projectId, result: [{ id, name, color, homeScreenId }] }
|
|
444
|
-
|
|
445
|
-
// Criar perfil
|
|
446
|
-
const created = await createProfileMitra({ projectId: 123, name: 'Vendedores', color: '#FF5733' });
|
|
447
|
-
// { status, result: { id, name, message } }
|
|
448
|
-
|
|
449
|
-
// Detalhes do perfil
|
|
450
|
-
const details = await getProfileDetailsMitra({ projectId: 123, profileId: 1 });
|
|
451
|
-
// { status, projectId, result: { id, name, users, selectTables, dmlTables, actions, screens, serverFunctions } }
|
|
452
|
-
```
|
|
453
|
-
|
|
454
|
-
#### Permissões de Perfil
|
|
455
|
-
|
|
456
|
-
Define quais recursos cada perfil pode acessar. Todas substituem a lista atual (não fazem append).
|
|
457
|
-
|
|
458
|
-
- `setProfileUsersMitra({ projectId?, profileId, userIds })` - Define os usuários do perfil
|
|
459
|
-
- `setProfileSelectTablesMitra({ projectId?, profileId, jdbcConnectionConfigId?, tables })` - Define tabelas SELECT permitidas
|
|
460
|
-
- `setProfileDmlTablesMitra({ projectId?, profileId, jdbcConnectionConfigId?, tables })` - Define tabelas DML permitidas
|
|
461
|
-
- `setProfileActionsMitra({ projectId?, profileId, actionIds })` - Define actions permitidas
|
|
462
|
-
- `setProfileScreensMitra({ projectId?, profileId, screenIds })` - Define screens permitidas
|
|
463
|
-
- `setProfileServerFunctionsMitra({ projectId?, profileId, serverFunctionIds })` - Define server functions permitidas
|
|
464
|
-
|
|
465
|
-
```typescript
|
|
466
|
-
import { setProfileUsersMitra, setProfileSelectTablesMitra, setProfileServerFunctionsMitra } from 'mitra-interactions-sdk';
|
|
467
|
-
|
|
468
|
-
// Definir usuários do perfil
|
|
469
|
-
await setProfileUsersMitra({ projectId: 123, profileId: 1, userIds: [10, 20, 30] });
|
|
470
|
-
|
|
471
|
-
// Definir tabelas SELECT
|
|
472
|
-
await setProfileSelectTablesMitra({
|
|
473
|
-
projectId: 123,
|
|
474
|
-
profileId: 1,
|
|
475
|
-
jdbcConnectionConfigId: 1, // Opcional — ID da conexão JDBC (default: banco principal)
|
|
476
|
-
tables: [
|
|
477
|
-
{ tableName: 'clientes' },
|
|
478
|
-
{ tableName: 'pedidos' }
|
|
479
|
-
]
|
|
480
|
-
});
|
|
481
|
-
|
|
482
|
-
// Definir server functions
|
|
483
|
-
await setProfileServerFunctionsMitra({ projectId: 123, profileId: 1, serverFunctionIds: [5, 8, 12] });
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
## Tipos TypeScript
|
|
487
|
-
|
|
488
|
-
Todos os tipos estão incluídos:
|
|
489
|
-
|
|
490
|
-
```typescript
|
|
491
|
-
import type {
|
|
492
|
-
MitraConfig,
|
|
493
|
-
// Login
|
|
494
|
-
LoginOptions,
|
|
495
|
-
LoginResponse,
|
|
496
|
-
// Email Auth
|
|
497
|
-
EmailSignupOptions,
|
|
498
|
-
EmailLoginOptions,
|
|
499
|
-
EmailVerifyCodeOptions,
|
|
500
|
-
EmailResendCodeOptions,
|
|
501
|
-
// Options
|
|
502
|
-
ExecuteServerFunctionOptions,
|
|
503
|
-
ExecuteServerFunctionAsyncOptions,
|
|
504
|
-
UploadFileOptions,
|
|
505
|
-
StopServerFunctionExecutionOptions,
|
|
506
|
-
ListRecordsOptions,
|
|
507
|
-
GetRecordOptions,
|
|
508
|
-
CreateRecordOptions,
|
|
509
|
-
UpdateRecordOptions,
|
|
510
|
-
PatchRecordOptions,
|
|
511
|
-
DeleteRecordOptions,
|
|
512
|
-
CreateRecordsBatchOptions,
|
|
513
|
-
// Responses
|
|
514
|
-
ExecuteServerFunctionResponse,
|
|
515
|
-
ExecuteServerFunctionAsyncResponse,
|
|
516
|
-
UploadFileResponse,
|
|
517
|
-
StopServerFunctionExecutionResponse,
|
|
518
|
-
ListRecordsResponse,
|
|
519
|
-
// Profile Management
|
|
520
|
-
ListProfilesOptions,
|
|
521
|
-
ListProfilesResponse,
|
|
522
|
-
GetProfileDetailsOptions,
|
|
523
|
-
GetProfileDetailsResponse,
|
|
524
|
-
CreateProfileOptions,
|
|
525
|
-
CreateProfileResponse,
|
|
526
|
-
UpdateProfileOptions,
|
|
527
|
-
UpdateProfileResponse,
|
|
528
|
-
DeleteProfileOptions,
|
|
529
|
-
DeleteProfileResponse,
|
|
530
|
-
SetProfileUsersOptions,
|
|
531
|
-
SetProfileSelectTablesOptions,
|
|
532
|
-
SetProfileDmlTablesOptions,
|
|
533
|
-
SetProfileActionsOptions,
|
|
534
|
-
SetProfileScreensOptions,
|
|
535
|
-
SetProfileServerFunctionsOptions,
|
|
536
|
-
ProfileTableRef,
|
|
537
|
-
SetProfilePermissionResponse
|
|
538
|
-
} from 'mitra-interactions-sdk';
|
|
539
|
-
```
|
|
540
|
-
|
|
541
|
-
## Tratamento de Erros
|
|
542
|
-
|
|
543
|
-
```typescript
|
|
544
|
-
try {
|
|
545
|
-
const result = await executeDbActionMitra({
|
|
546
|
-
projectId: 123,
|
|
547
|
-
dbActionId: 456
|
|
548
|
-
});
|
|
549
|
-
} catch (error) {
|
|
550
|
-
console.log('Erro:', error.message);
|
|
551
|
-
console.log('Status:', error.status);
|
|
552
|
-
console.log('Detalhes:', error.details);
|
|
553
|
-
}
|
|
554
|
-
```
|
|
555
|
-
|
|
556
|
-
## Licença
|
|
557
|
-
|
|
558
|
-
MIT
|
|
1
|
+
# Mitra Interactions SDK
|
|
2
|
+
|
|
3
|
+
SDK para interações com a plataforma Mitra via endpoints `/interactions/`.
|
|
4
|
+
|
|
5
|
+
## Permissões: `dev` vs `business`
|
|
6
|
+
|
|
7
|
+
`userType` no token de login:
|
|
8
|
+
- `dev` — chama tudo
|
|
9
|
+
- `business` — chama apenas execução (SF), auth SSO e integrações. Outras chamadas retornam **403**.
|
|
10
|
+
|
|
11
|
+
> Não confundir com o pacote `mitra-business-sdk` (SDK separado, usado pelo agente IA).
|
|
12
|
+
|
|
13
|
+
**Bloqueado para `business`:** CRUD REST (`*RecordMitra`).
|
|
14
|
+
|
|
15
|
+
> SF tipo JAVASCRIPT herda o `userType` do caller — se chamar funções bloqueadas, retorna 403 para business.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Instalação
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npm install mitra-interactions-sdk
|
|
23
|
+
# ou
|
|
24
|
+
yarn add mitra-interactions-sdk
|
|
25
|
+
# ou
|
|
26
|
+
pnpm add mitra-interactions-sdk
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Configuração
|
|
30
|
+
|
|
31
|
+
Antes de usar qualquer função, configure o SDK. O `token` é **opcional** — Server Functions públicas podem ser chamadas sem autenticação.
|
|
32
|
+
|
|
33
|
+
> **Importante:** Quando usado, o token é um JWT de autenticação da plataforma Mitra. **Nunca deixe o token estático no código.** Utilize variáveis de ambiente para armazená-lo de forma segura.
|
|
34
|
+
|
|
35
|
+
```typescript
|
|
36
|
+
import { configureSdkMitra } from 'mitra-interactions-sdk';
|
|
37
|
+
|
|
38
|
+
// Configuração completa (com autenticação)
|
|
39
|
+
const instance = configureSdkMitra({
|
|
40
|
+
baseURL: process.env.MITRA_BASE_URL || 'https://api.mitra.com',
|
|
41
|
+
token: process.env.MITRA_TOKEN!, // Opcional — necessário apenas para endpoints autenticados
|
|
42
|
+
authUrl: 'https://coder.mitralab.io/sdk-auth/', // Opcional — necessário para login e token refresh
|
|
43
|
+
projectId: 123, // Opcional — se informado, torna projectId opcional em TODOS os métodos
|
|
44
|
+
integrationURL: 'https://api0.mitraecp.com:1003', // Opcional — necessário para integrações
|
|
45
|
+
onTokenRefresh: (session) => { // Opcional — chamado quando o token é renovado automaticamente
|
|
46
|
+
localStorage.setItem('mitra_session', JSON.stringify(session));
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Configuração mínima (sem token — apenas para Server Functions públicas)
|
|
51
|
+
const instance = configureSdkMitra({
|
|
52
|
+
baseURL: 'https://api.mitra.com',
|
|
53
|
+
projectId: 123
|
|
54
|
+
});
|
|
55
|
+
await instance.executeServerFunction({ serverFunctionId: 42 }); // OK — sem token
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
> **`projectId` global:** Se você passar `projectId` no `configureSdkMitra`, ele será usado como fallback em **todos** os métodos do SDK. Assim, não é necessário passar `projectId` em cada chamada individual — basta configurar uma vez.
|
|
59
|
+
|
|
60
|
+
`configureSdkMitra` retorna uma `MitraInstance` que também pode ser usada diretamente:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
await instance.executeServerFunction({ serverFunctionId: 42 }); // projectId já vem do configureSdkMitra
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Autenticação (Login)
|
|
67
|
+
|
|
68
|
+
Login via popup ou redirect seguro hospedado no domínio Mitra. Credenciais nunca passam pelo código do desenvolvedor. O SDK é **auto-configurado** após o login.
|
|
69
|
+
|
|
70
|
+
> **Nota:** `authUrl` e `projectId` são **obrigatórios** para login. Porém, se já foram passados no `configureSdkMitra()`, não é necessário repeti-los — o SDK usa os valores configurados como fallback.
|
|
71
|
+
|
|
72
|
+
### Login via Popup (padrão)
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import { loginWithGoogleMitra, loginWithMicrosoftMitra } from 'mitra-interactions-sdk';
|
|
76
|
+
|
|
77
|
+
// Primeira vez — sem configureSdkMitra: authUrl e projectId são obrigatórios
|
|
78
|
+
const result = await loginWithGoogleMitra({
|
|
79
|
+
authUrl: 'https://stg.mitralab.io/legacy',
|
|
80
|
+
projectId: 'uuid-do-projeto'
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
// Se já chamou configureSdkMitra({ authUrl, projectId }), basta:
|
|
84
|
+
const result = await loginWithGoogleMitra();
|
|
85
|
+
const result = await loginWithMicrosoftMitra();
|
|
86
|
+
|
|
87
|
+
// result: { token, baseURL, refreshToken }
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
### Login via Redirect (mobile)
|
|
91
|
+
|
|
92
|
+
No celular o popup vira aba — use `mode: 'redirect'`: a página de auth navega de volta pro app com `#codeMitra`/`#stateMitra` no fragment, e o app conclui com `exchangeSsoCodeMitra`.
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
import { loginWithGoogleMitra, exchangeSsoCodeMitra } from 'mitra-interactions-sdk';
|
|
96
|
+
|
|
97
|
+
// 1. Iniciar login — o navegador navega para fora da página
|
|
98
|
+
await loginWithGoogleMitra({ mode: 'redirect' });
|
|
99
|
+
|
|
100
|
+
// 2. No boot do app, se houver #codeMitra/#stateMitra no fragment:
|
|
101
|
+
const session = await exchangeSsoCodeMitra({ code, state });
|
|
102
|
+
// A SDK valida o nonce (anti-CSRF), troca o code no BFF e configura o SDK.
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
### Token Refresh Automático
|
|
106
|
+
|
|
107
|
+
Quando qualquer requisição retorna **403**, o SDK tenta renovar o token automaticamente via iframe invisível (usa o cookie de sessão do provider). Se o refresh funcionar, a requisição é retentada com o novo token — transparente para o desenvolvedor.
|
|
108
|
+
|
|
109
|
+
O callback `onTokenRefresh` é chamado após renovação bem-sucedida:
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
configureSdkMitra({
|
|
113
|
+
baseURL: '...',
|
|
114
|
+
token: '...',
|
|
115
|
+
authUrl: 'https://coder.mitralab.io/sdk-auth/',
|
|
116
|
+
projectId: 123,
|
|
117
|
+
onTokenRefresh: (session) => {
|
|
118
|
+
// Atualiza o token salvo (ex: localStorage, store, etc.)
|
|
119
|
+
localStorage.setItem('mitra_token', session.token);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
## Métodos Disponíveis
|
|
125
|
+
|
|
126
|
+
### executeServerFunctionMitra
|
|
127
|
+
|
|
128
|
+
Executa uma Server Function de forma **síncrona** (timeout de 60s no backend). Retorna o resultado diretamente.
|
|
129
|
+
|
|
130
|
+
```typescript
|
|
131
|
+
import { executeServerFunctionMitra } from 'mitra-interactions-sdk';
|
|
132
|
+
|
|
133
|
+
const result = await executeServerFunctionMitra({
|
|
134
|
+
projectId: 123,
|
|
135
|
+
serverFunctionId: 101,
|
|
136
|
+
input: { // Opcional - objeto de entrada para a função
|
|
137
|
+
arg1: 'valor1'
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
// result: { status, result: { executionId, executionStatus, output, logs, error, durationMs } }
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### executeServerFunctionAsyncMitra
|
|
144
|
+
|
|
145
|
+
Executa uma Server Function de forma **assíncrona**. Retorna um `executionId` imediatamente. Use `stopServerFunctionExecutionMitra` para parar ou `getServerFunctionExecutionMitra` (mitra-sdk) para consultar o resultado.
|
|
146
|
+
|
|
147
|
+
```typescript
|
|
148
|
+
import { executeServerFunctionAsyncMitra } from 'mitra-interactions-sdk';
|
|
149
|
+
|
|
150
|
+
const result = await executeServerFunctionAsyncMitra({
|
|
151
|
+
projectId: 123,
|
|
152
|
+
serverFunctionId: 101,
|
|
153
|
+
input: { // Opcional - objeto de entrada para a função
|
|
154
|
+
arg1: 'valor1'
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
// result: { status, result: { executionId, executionStatus } }
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### stopServerFunctionExecutionMitra
|
|
161
|
+
|
|
162
|
+
Para a execução de uma Server Function em andamento.
|
|
163
|
+
|
|
164
|
+
```typescript
|
|
165
|
+
import { stopServerFunctionExecutionMitra } from 'mitra-interactions-sdk';
|
|
166
|
+
|
|
167
|
+
const result = await stopServerFunctionExecutionMitra({
|
|
168
|
+
projectId: 123,
|
|
169
|
+
executionId: 'exec-uuid-aqui'
|
|
170
|
+
});
|
|
171
|
+
// result: { status, result: { executionId, executionStatus: "CANCELLED" | "ALREADY_FINISHED" } }
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Server Functions Públicas (sem autenticação)
|
|
175
|
+
|
|
176
|
+
A SF deve ter `publicExecution = true` (via `togglePublicExecutionMitra` do mitra-sdk). Não exigem token.
|
|
177
|
+
|
|
178
|
+
```typescript
|
|
179
|
+
import {
|
|
180
|
+
executePublicServerFunctionMitra,
|
|
181
|
+
executePublicServerFunctionAsyncMitra,
|
|
182
|
+
getPublicServerFunctionExecutionMitra
|
|
183
|
+
} from 'mitra-interactions-sdk';
|
|
184
|
+
|
|
185
|
+
// Síncrona (timeout 5min)
|
|
186
|
+
const res = await executePublicServerFunctionMitra({ projectId, serverFunctionId, input: { x: 1 } });
|
|
187
|
+
// { executionId, status, output, logs, error, durationMs }
|
|
188
|
+
|
|
189
|
+
// Assíncrona + polling
|
|
190
|
+
const async1 = await executePublicServerFunctionAsyncMitra({ projectId, serverFunctionId });
|
|
191
|
+
const status = await getPublicServerFunctionExecutionMitra({ projectId, executionId: async1.executionId });
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Dynamic Schema CRUD
|
|
195
|
+
|
|
196
|
+
> 🔒 `userType=dev` only. Falha 403 para business. Em telas com business, envelopar em SF tipo SQL.
|
|
197
|
+
|
|
198
|
+
CRUD completo em tabelas do projeto via Dynamic Schema (usa header `X-TenantID`).
|
|
199
|
+
|
|
200
|
+
Todos os endpoints suportam o parâmetro opcional `jdbcConnectionConfigId` para operar em datasources adicionais (PostgreSQL, Oracle, SQL Server, etc.) ao invés do banco principal do tenant.
|
|
201
|
+
|
|
202
|
+
- `listRecordsMitra(...)` → `ListRecordsResponse` `{ content, page, size, totalElements, totalPages }` - Lista registros com paginação
|
|
203
|
+
- `getRecordMitra(...)` → `Record<string, any>` - Busca registro por ID
|
|
204
|
+
- `createRecordMitra(...)` → `Record<string, any>` - Cria registro (201)
|
|
205
|
+
- `updateRecordMitra(...)` → `Record<string, any>` - Atualiza registro (PUT)
|
|
206
|
+
- `patchRecordMitra(...)` → `Record<string, any>` - Atualiza parcialmente (PATCH)
|
|
207
|
+
- `deleteRecordMitra(...)` → `void` - Remove registro (204 No Content)
|
|
208
|
+
- `createRecordsBatchMitra(...)` → `Record<string, any>[]` - Cria múltiplos registros (201)
|
|
209
|
+
|
|
210
|
+
```typescript
|
|
211
|
+
import { listRecordsMitra, createRecordMitra, updateRecordMitra, deleteRecordMitra } from 'mitra-interactions-sdk';
|
|
212
|
+
|
|
213
|
+
// Listar registros
|
|
214
|
+
const result = await listRecordsMitra({
|
|
215
|
+
projectId: 123,
|
|
216
|
+
tableName: 'produtos',
|
|
217
|
+
page: 0,
|
|
218
|
+
size: 20
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
// Criar registro
|
|
222
|
+
await createRecordMitra({
|
|
223
|
+
projectId: 123,
|
|
224
|
+
tableName: 'produtos',
|
|
225
|
+
data: { nome: 'Produto A', preco: 99.90 }
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
// Atualizar registro
|
|
229
|
+
await updateRecordMitra({
|
|
230
|
+
projectId: 123,
|
|
231
|
+
tableName: 'produtos',
|
|
232
|
+
id: 1,
|
|
233
|
+
data: { nome: 'Produto A Atualizado', preco: 89.90, version: 0 }
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
// Deletar registro
|
|
237
|
+
await deleteRecordMitra({ projectId: 123, tableName: 'produtos', id: 1 });
|
|
238
|
+
|
|
239
|
+
// Usando datasource adicional (jdbcConnectionConfigId)
|
|
240
|
+
const result2 = await listRecordsMitra({
|
|
241
|
+
projectId: 123,
|
|
242
|
+
tableName: 'clientes',
|
|
243
|
+
jdbcConnectionConfigId: 5
|
|
244
|
+
});
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
## Tipos TypeScript
|
|
248
|
+
|
|
249
|
+
Todos os tipos estão incluídos:
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
import type {
|
|
253
|
+
MitraConfig,
|
|
254
|
+
// Login
|
|
255
|
+
LoginOptions,
|
|
256
|
+
LoginResponse,
|
|
257
|
+
// Email Auth
|
|
258
|
+
EmailSignupOptions,
|
|
259
|
+
EmailLoginOptions,
|
|
260
|
+
// Options
|
|
261
|
+
ExecuteServerFunctionOptions,
|
|
262
|
+
ExecuteServerFunctionAsyncOptions,
|
|
263
|
+
StopServerFunctionExecutionOptions,
|
|
264
|
+
ListRecordsOptions,
|
|
265
|
+
GetRecordOptions,
|
|
266
|
+
CreateRecordOptions,
|
|
267
|
+
UpdateRecordOptions,
|
|
268
|
+
PatchRecordOptions,
|
|
269
|
+
DeleteRecordOptions,
|
|
270
|
+
CreateRecordsBatchOptions,
|
|
271
|
+
// Responses
|
|
272
|
+
ExecuteServerFunctionResponse,
|
|
273
|
+
ExecuteServerFunctionAsyncResponse,
|
|
274
|
+
StopServerFunctionExecutionResponse,
|
|
275
|
+
ListRecordsResponse
|
|
276
|
+
} from 'mitra-interactions-sdk';
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
## Tratamento de Erros
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
try {
|
|
283
|
+
const result = await executeServerFunctionMitra({
|
|
284
|
+
projectId: 123,
|
|
285
|
+
serverFunctionId: 456
|
|
286
|
+
});
|
|
287
|
+
} catch (error) {
|
|
288
|
+
console.log('Erro:', error.message);
|
|
289
|
+
console.log('Status:', error.status);
|
|
290
|
+
console.log('Detalhes:', error.details);
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## Licença
|
|
295
|
+
|
|
296
|
+
MIT
|