@in.pulse-crm/sdk 2.11.7 → 2.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/CHANGELOG_READY_MESSAGES.md +417 -0
- package/MIGRATION_CAMELCASE.md +292 -0
- package/dist/files.client.js +10 -37
- package/dist/ready-message.client.d.ts +91 -4
- package/dist/ready-message.client.js +109 -13
- package/dist/types/ready-messages.types.d.ts +56 -0
- package/dist/users.client.js +1 -2
- package/package.json +1 -1
- package/src/files.client.ts +16 -43
- package/src/ready-message.client.ts +139 -38
- package/src/types/ready-messages.types.ts +62 -1
- package/src/users.client.ts +10 -10
|
@@ -0,0 +1,417 @@
|
|
|
1
|
+
# 🔄 Changelog - Ready Messages Client
|
|
2
|
+
|
|
3
|
+
## 📅 Data: 15 de Outubro de 2025
|
|
4
|
+
|
|
5
|
+
### ✨ Mudanças Implementadas
|
|
6
|
+
|
|
7
|
+
O `ReadyMessageClient` foi completamente atualizado para refletir a refatoração do backend que migrou de SQL raw para Prisma ORM.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 🔀 Breaking Changes
|
|
12
|
+
|
|
13
|
+
### 1️⃣ **Tipos Atualizados**
|
|
14
|
+
|
|
15
|
+
#### ❌ ANTES (Legado)
|
|
16
|
+
```typescript
|
|
17
|
+
interface ReadyMessage {
|
|
18
|
+
CODIGO: number;
|
|
19
|
+
TITULO: string;
|
|
20
|
+
SETOR: number;
|
|
21
|
+
TEXTO_MENSAGEM: string;
|
|
22
|
+
ARQUIVO: string;
|
|
23
|
+
ARQUIVO_CODIGO: string;
|
|
24
|
+
LAST_UPDATE: Date;
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
#### ✅ AGORA (Novo)
|
|
29
|
+
```typescript
|
|
30
|
+
interface ReadyMessage {
|
|
31
|
+
id: number; // CODIGO → id
|
|
32
|
+
instance: string; // NOVO: identificador da instância
|
|
33
|
+
sectorId: number; // SETOR → sectorId
|
|
34
|
+
title: string; // TITULO → title
|
|
35
|
+
message: string; // TEXTO_MENSAGEM → message
|
|
36
|
+
fileId: number | null; // ARQUIVO_CODIGO → fileId (agora tipado)
|
|
37
|
+
fileName: string | null; // ARQUIVO → fileName
|
|
38
|
+
onlyAdmin: boolean; // NOVO: flag para mensagens exclusivas de admin
|
|
39
|
+
createdAt: Date; // NOVO: data de criação
|
|
40
|
+
updatedAt: Date; // LAST_UPDATE → updatedAt
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### 2️⃣ **Assinatura de Métodos**
|
|
45
|
+
|
|
46
|
+
#### `createReadyMessage()`
|
|
47
|
+
|
|
48
|
+
##### ❌ ANTES
|
|
49
|
+
```typescript
|
|
50
|
+
await client.createReadyMessage(
|
|
51
|
+
file, // File primeiro
|
|
52
|
+
"Título", // Parâmetros separados
|
|
53
|
+
"Mensagem",
|
|
54
|
+
10
|
|
55
|
+
);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
##### ✅ AGORA
|
|
59
|
+
```typescript
|
|
60
|
+
await client.createReadyMessage(
|
|
61
|
+
{ // Objeto DTO
|
|
62
|
+
TITULO: "Título",
|
|
63
|
+
TEXTO_MENSAGEM: "Mensagem",
|
|
64
|
+
SETOR: 10, // Opcional!
|
|
65
|
+
APENAS_ADMIN: false
|
|
66
|
+
},
|
|
67
|
+
file // File por último
|
|
68
|
+
);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Benefícios:**
|
|
72
|
+
- ✅ Parâmetros nomeados (menos erros)
|
|
73
|
+
- ✅ SETOR opcional (usa setor do usuário se omitido)
|
|
74
|
+
- ✅ Suporte a `APENAS_ADMIN`
|
|
75
|
+
|
|
76
|
+
#### `updateReadyMessage()`
|
|
77
|
+
|
|
78
|
+
##### ❌ ANTES
|
|
79
|
+
```typescript
|
|
80
|
+
await client.updateReadyMessage(
|
|
81
|
+
123,
|
|
82
|
+
entireReadyMessageObject, // Objeto completo obrigatório
|
|
83
|
+
file
|
|
84
|
+
);
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
##### ✅ AGORA
|
|
88
|
+
```typescript
|
|
89
|
+
await client.updateReadyMessage(
|
|
90
|
+
123,
|
|
91
|
+
{ // Apenas campos que quer atualizar
|
|
92
|
+
TITULO: "Novo Título"
|
|
93
|
+
},
|
|
94
|
+
file // Opcional
|
|
95
|
+
);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**Benefícios:**
|
|
99
|
+
- ✅ Update parcial (só envia o que mudou)
|
|
100
|
+
- ✅ File opcional
|
|
101
|
+
- ✅ Validação no backend
|
|
102
|
+
|
|
103
|
+
#### `deleteReadyMessage()`
|
|
104
|
+
|
|
105
|
+
##### ❌ ANTES
|
|
106
|
+
```typescript
|
|
107
|
+
await client.deleteReadyMessage(chatId); // Nome confuso
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
##### ✅ AGORA
|
|
111
|
+
```typescript
|
|
112
|
+
await client.deleteReadyMessage(id); // Nome correto
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## 📚 Novos DTOs
|
|
118
|
+
|
|
119
|
+
### `CreateReadyMessageDto`
|
|
120
|
+
```typescript
|
|
121
|
+
interface CreateReadyMessageDto {
|
|
122
|
+
TITULO: string; // Obrigatório
|
|
123
|
+
TEXTO_MENSAGEM: string; // Obrigatório
|
|
124
|
+
SETOR?: number; // Opcional - usa setor do usuário
|
|
125
|
+
APENAS_ADMIN?: boolean; // Opcional - padrão: false
|
|
126
|
+
}
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### `UpdateReadyMessageDto`
|
|
130
|
+
```typescript
|
|
131
|
+
interface UpdateReadyMessageDto {
|
|
132
|
+
TITULO?: string; // Todos opcionais
|
|
133
|
+
TEXTO_MENSAGEM?: string;
|
|
134
|
+
APENAS_ADMIN?: boolean;
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 🚀 Guia de Migração
|
|
141
|
+
|
|
142
|
+
### Passo 1: Atualizar Criação
|
|
143
|
+
|
|
144
|
+
#### ❌ Código Antigo
|
|
145
|
+
```typescript
|
|
146
|
+
const message = await readyMessageClient.createReadyMessage(
|
|
147
|
+
imageFile,
|
|
148
|
+
"Mensagem de Boas-vindas",
|
|
149
|
+
"Olá! Bem-vindo ao nosso atendimento.",
|
|
150
|
+
10
|
|
151
|
+
);
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
#### ✅ Código Novo
|
|
155
|
+
```typescript
|
|
156
|
+
const message = await readyMessageClient.createReadyMessage(
|
|
157
|
+
{
|
|
158
|
+
TITULO: "Mensagem de Boas-vindas",
|
|
159
|
+
TEXTO_MENSAGEM: "Olá! Bem-vindo ao nosso atendimento.",
|
|
160
|
+
SETOR: 10, // Opcional se usuário estiver em um setor
|
|
161
|
+
APENAS_ADMIN: false
|
|
162
|
+
},
|
|
163
|
+
imageFile // Pode ser null
|
|
164
|
+
);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Passo 2: Atualizar Listagem
|
|
168
|
+
|
|
169
|
+
#### ❌ Código Antigo
|
|
170
|
+
```typescript
|
|
171
|
+
const messages = await readyMessageClient.getReadyMessages();
|
|
172
|
+
|
|
173
|
+
messages.forEach(msg => {
|
|
174
|
+
console.log(msg.TITULO); // UPPERCASE
|
|
175
|
+
console.log(msg.CODIGO);
|
|
176
|
+
console.log(msg.SETOR);
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
#### ✅ Código Novo
|
|
181
|
+
```typescript
|
|
182
|
+
const messages = await readyMessageClient.getReadyMessages();
|
|
183
|
+
|
|
184
|
+
messages.forEach(msg => {
|
|
185
|
+
console.log(msg.title); // camelCase
|
|
186
|
+
console.log(msg.id);
|
|
187
|
+
console.log(msg.sectorId);
|
|
188
|
+
console.log(msg.onlyAdmin); // Novo campo!
|
|
189
|
+
console.log(msg.instance); // Novo campo!
|
|
190
|
+
});
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Passo 3: Atualizar Updates
|
|
194
|
+
|
|
195
|
+
#### ❌ Código Antigo
|
|
196
|
+
```typescript
|
|
197
|
+
const fullMessage = await readyMessageClient.getReadyMessages();
|
|
198
|
+
const messageToUpdate = fullMessage.find(m => m.CODIGO === 123);
|
|
199
|
+
|
|
200
|
+
messageToUpdate.TITULO = "Novo Título";
|
|
201
|
+
|
|
202
|
+
await readyMessageClient.updateReadyMessage(
|
|
203
|
+
123,
|
|
204
|
+
messageToUpdate,
|
|
205
|
+
null
|
|
206
|
+
);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
#### ✅ Código Novo
|
|
210
|
+
```typescript
|
|
211
|
+
// Muito mais simples!
|
|
212
|
+
await readyMessageClient.updateReadyMessage(
|
|
213
|
+
123,
|
|
214
|
+
{ TITULO: "Novo Título" } // Só o que mudou
|
|
215
|
+
// file é opcional
|
|
216
|
+
);
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
### Passo 4: Atualizar Deleção
|
|
220
|
+
|
|
221
|
+
#### ❌ Código Antigo
|
|
222
|
+
```typescript
|
|
223
|
+
await readyMessageClient.deleteReadyMessage(chatId);
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
#### ✅ Código Novo
|
|
227
|
+
```typescript
|
|
228
|
+
await readyMessageClient.deleteReadyMessage(messageId);
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
---
|
|
232
|
+
|
|
233
|
+
## 🎯 Novos Recursos
|
|
234
|
+
|
|
235
|
+
### 1. **Mensagens Exclusivas para Admin**
|
|
236
|
+
```typescript
|
|
237
|
+
const adminOnlyMessage = await client.createReadyMessage({
|
|
238
|
+
TITULO: "Mensagem Interna",
|
|
239
|
+
TEXTO_MENSAGEM: "Apenas admins veem isso",
|
|
240
|
+
APENAS_ADMIN: true // 🔒 Novo!
|
|
241
|
+
});
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### 2. **Setor Automático**
|
|
245
|
+
```typescript
|
|
246
|
+
// Se usuário já está em um setor, não precisa informar
|
|
247
|
+
const message = await client.createReadyMessage({
|
|
248
|
+
TITULO: "Resposta Rápida",
|
|
249
|
+
TEXTO_MENSAGEM: "Obrigado pelo contato!"
|
|
250
|
+
// SETOR omitido - usa setor do usuário logado
|
|
251
|
+
});
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### 3. **Update Parcial**
|
|
255
|
+
```typescript
|
|
256
|
+
// Atualizar só o título
|
|
257
|
+
await client.updateReadyMessage(123, {
|
|
258
|
+
TITULO: "Novo Título"
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
// Atualizar só a mensagem
|
|
262
|
+
await client.updateReadyMessage(123, {
|
|
263
|
+
TEXTO_MENSAGEM: "Nova mensagem"
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
// Atualizar apenas flag admin
|
|
267
|
+
await client.updateReadyMessage(123, {
|
|
268
|
+
APENAS_ADMIN: true
|
|
269
|
+
});
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### 4. **Upload Opcional**
|
|
273
|
+
```typescript
|
|
274
|
+
// Sem arquivo
|
|
275
|
+
await client.updateReadyMessage(123, {
|
|
276
|
+
TITULO: "Atualizado"
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
// Com arquivo
|
|
280
|
+
await client.updateReadyMessage(123, {
|
|
281
|
+
TITULO: "Atualizado"
|
|
282
|
+
}, newFile);
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## 🔒 Melhorias de Segurança
|
|
288
|
+
|
|
289
|
+
1. ✅ **SQL Injection Eliminado** - Migração para Prisma
|
|
290
|
+
2. ✅ **Validação de Tipos** - TypeScript strict mode
|
|
291
|
+
3. ✅ **Validação de Permissões** - Backend valida setor
|
|
292
|
+
4. ✅ **Sanitização de Dados** - DTOs validados
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## 📊 Compatibilidade
|
|
297
|
+
|
|
298
|
+
### Tipo Legado Mantido
|
|
299
|
+
|
|
300
|
+
Para facilitar migração gradual, o tipo legado ainda está disponível:
|
|
301
|
+
|
|
302
|
+
```typescript
|
|
303
|
+
import { ReadyMessageLegacy } from './types/ready-messages.types';
|
|
304
|
+
|
|
305
|
+
// ⚠️ Depreciado - use ReadyMessage
|
|
306
|
+
const oldMessage: ReadyMessageLegacy = {
|
|
307
|
+
CODIGO: 1,
|
|
308
|
+
TITULO: "Test",
|
|
309
|
+
// ...
|
|
310
|
+
};
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Aviso:** `ReadyMessageLegacy` será removido na v3.0.0
|
|
314
|
+
|
|
315
|
+
---
|
|
316
|
+
|
|
317
|
+
## 🧪 Exemplos Práticos
|
|
318
|
+
|
|
319
|
+
### Criar Mensagem Simples
|
|
320
|
+
```typescript
|
|
321
|
+
const client = new ReadyMessageClient("http://localhost:8000");
|
|
322
|
+
client.setAuth(userToken);
|
|
323
|
+
|
|
324
|
+
const message = await client.createReadyMessage({
|
|
325
|
+
TITULO: "Horário de Atendimento",
|
|
326
|
+
TEXTO_MENSAGEM: "Atendemos de segunda a sexta, 8h às 18h",
|
|
327
|
+
});
|
|
328
|
+
|
|
329
|
+
console.log(`Mensagem criada com ID: ${message.id}`);
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### Criar com Arquivo
|
|
333
|
+
```typescript
|
|
334
|
+
const fileInput = document.getElementById('file') as HTMLInputElement;
|
|
335
|
+
const file = fileInput.files?.[0];
|
|
336
|
+
|
|
337
|
+
const message = await client.createReadyMessage(
|
|
338
|
+
{
|
|
339
|
+
TITULO: "Catálogo de Produtos",
|
|
340
|
+
TEXTO_MENSAGEM: "Confira nosso catálogo em anexo",
|
|
341
|
+
SETOR: 5
|
|
342
|
+
},
|
|
343
|
+
file
|
|
344
|
+
);
|
|
345
|
+
|
|
346
|
+
console.log(`Arquivo anexado: ${message.fileName}`);
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Listar e Filtrar
|
|
350
|
+
```typescript
|
|
351
|
+
const allMessages = await client.getReadyMessages();
|
|
352
|
+
|
|
353
|
+
// Filtrar apenas mensagens de admin
|
|
354
|
+
const adminMessages = allMessages.filter(m => m.onlyAdmin);
|
|
355
|
+
|
|
356
|
+
// Filtrar por setor
|
|
357
|
+
const sectorMessages = allMessages.filter(m => m.sectorId === 10);
|
|
358
|
+
|
|
359
|
+
// Ordenar por título
|
|
360
|
+
const sorted = allMessages.sort((a, b) =>
|
|
361
|
+
a.title.localeCompare(b.title)
|
|
362
|
+
);
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Atualizar Incrementalmente
|
|
366
|
+
```typescript
|
|
367
|
+
const messageId = 123;
|
|
368
|
+
|
|
369
|
+
// Primeiro: atualizar título
|
|
370
|
+
await client.updateReadyMessage(messageId, {
|
|
371
|
+
TITULO: "Título Atualizado"
|
|
372
|
+
});
|
|
373
|
+
|
|
374
|
+
// Depois: adicionar arquivo
|
|
375
|
+
const newFile = await fetchFileFromSomewhere();
|
|
376
|
+
await client.updateReadyMessage(messageId, {}, newFile);
|
|
377
|
+
|
|
378
|
+
// Por fim: tornar admin-only
|
|
379
|
+
await client.updateReadyMessage(messageId, {
|
|
380
|
+
APENAS_ADMIN: true
|
|
381
|
+
});
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
---
|
|
385
|
+
|
|
386
|
+
## ❓ FAQ
|
|
387
|
+
|
|
388
|
+
### Por que os DTOs ainda usam UPPERCASE?
|
|
389
|
+
|
|
390
|
+
Para manter compatibilidade com o frontend existente que envia dados nesse formato. O controller faz a conversão para camelCase internamente.
|
|
391
|
+
|
|
392
|
+
### Posso usar os dois formatos?
|
|
393
|
+
|
|
394
|
+
Não. O backend agora retorna apenas camelCase. Atualize seu código para usar os novos tipos.
|
|
395
|
+
|
|
396
|
+
### E se eu não quiser especificar o setor?
|
|
397
|
+
|
|
398
|
+
Não precisa! Se omitido, o backend usa automaticamente o setor do usuário logado (exceto TI que pode escolher).
|
|
399
|
+
|
|
400
|
+
### Como sei se meu usuário é TI?
|
|
401
|
+
|
|
402
|
+
Usuários do setor 3 são considerados TI e podem criar mensagens para qualquer setor.
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## 📞 Suporte
|
|
407
|
+
|
|
408
|
+
Dúvidas sobre a migração?
|
|
409
|
+
- Consulte `docs/refatoracao-ready-messages.md` no whatsapp-service
|
|
410
|
+
- Veja os testes em `src/services/ready-messages.service.spec.ts`
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
**Versão do SDK:** 3.0.0
|
|
415
|
+
**Data de Release:** 15/10/2025
|
|
416
|
+
**Breaking Changes:** Sim
|
|
417
|
+
**Migration Guide:** Este documento
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
# 🚀 Ready Messages Client - Migração para camelCase
|
|
2
|
+
|
|
3
|
+
## 📋 Resumo das Mudanças
|
|
4
|
+
|
|
5
|
+
Os DTOs do Ready Messages Client foram atualizados para usar **camelCase em inglês** seguindo as melhores práticas do TypeScript/JavaScript.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 🔄 DTOs Atualizados
|
|
10
|
+
|
|
11
|
+
### ✅ Novos DTOs (camelCase)
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
// CreateReadyMessageDto
|
|
15
|
+
interface CreateReadyMessageDto {
|
|
16
|
+
title: string; // "Título da mensagem"
|
|
17
|
+
message: string; // "Conteúdo da mensagem"
|
|
18
|
+
sectorId?: number; // "ID do setor (opcional)"
|
|
19
|
+
onlyAdmin?: boolean; // "Apenas para admin (opcional)"
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// UpdateReadyMessageDto
|
|
23
|
+
interface UpdateReadyMessageDto {
|
|
24
|
+
title?: string; // "Novo título (opcional)"
|
|
25
|
+
message?: string; // "Nova mensagem (opcional)"
|
|
26
|
+
onlyAdmin?: boolean; // "Flag admin (opcional)"
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### 🔄 Conversão Automática
|
|
31
|
+
|
|
32
|
+
O client **automaticamente converte** camelCase para o formato que o backend espera:
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
// Input (camelCase - novo)
|
|
36
|
+
{
|
|
37
|
+
title: "Horário",
|
|
38
|
+
message: "8h às 18h",
|
|
39
|
+
sectorId: 10,
|
|
40
|
+
onlyAdmin: true
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// ↓ Conversão automática ↓
|
|
44
|
+
|
|
45
|
+
// Output (UPPERCASE - backend)
|
|
46
|
+
{
|
|
47
|
+
TITULO: "Horário",
|
|
48
|
+
TEXTO_MENSAGEM: "8h às 18h",
|
|
49
|
+
SETOR: 10,
|
|
50
|
+
APENAS_ADMIN: true
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 📝 Guia de Migração
|
|
57
|
+
|
|
58
|
+
### Antes (UPPERCASE)
|
|
59
|
+
```typescript
|
|
60
|
+
// ❌ Formato antigo
|
|
61
|
+
await client.createReadyMessage({
|
|
62
|
+
TITULO: "Mensagem de Boas-vindas",
|
|
63
|
+
TEXTO_MENSAGEM: "Olá! Bem-vindo!",
|
|
64
|
+
SETOR: 10,
|
|
65
|
+
APENAS_ADMIN: false
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
await client.updateReadyMessage(123, {
|
|
69
|
+
TITULO: "Novo Título",
|
|
70
|
+
TEXTO_MENSAGEM: "Nova mensagem"
|
|
71
|
+
});
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Agora (camelCase)
|
|
75
|
+
```typescript
|
|
76
|
+
// ✅ Formato novo
|
|
77
|
+
await client.createReadyMessage({
|
|
78
|
+
title: "Mensagem de Boas-vindas",
|
|
79
|
+
message: "Olá! Bem-vindo!",
|
|
80
|
+
sectorId: 10,
|
|
81
|
+
onlyAdmin: false
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
await client.updateReadyMessage(123, {
|
|
85
|
+
title: "Novo Título",
|
|
86
|
+
message: "Nova mensagem"
|
|
87
|
+
});
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## 🛠️ Mapeamento de Campos
|
|
93
|
+
|
|
94
|
+
| Antigo (UPPERCASE) | Novo (camelCase) | Tipo | Descrição |
|
|
95
|
+
|-------------------|------------------|------|-----------|
|
|
96
|
+
| `TITULO` | `title` | `string` | Título da mensagem |
|
|
97
|
+
| `TEXTO_MENSAGEM` | `message` | `string` | Conteúdo da mensagem |
|
|
98
|
+
| `SETOR` | `sectorId` | `number?` | ID do setor (opcional) |
|
|
99
|
+
| `APENAS_ADMIN` | `onlyAdmin` | `boolean?` | Flag para admin (opcional) |
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 💡 Exemplos Práticos
|
|
104
|
+
|
|
105
|
+
### 1. Criar Mensagem Simples
|
|
106
|
+
```typescript
|
|
107
|
+
const message = await client.createReadyMessage({
|
|
108
|
+
title: "Horário de Funcionamento",
|
|
109
|
+
message: "Funcionamos de segunda a sexta, das 8h às 18h"
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 2. Criar Mensagem com Arquivo
|
|
114
|
+
```typescript
|
|
115
|
+
const message = await client.createReadyMessage({
|
|
116
|
+
title: "Catálogo 2025",
|
|
117
|
+
message: "Confira nosso novo catálogo em anexo",
|
|
118
|
+
sectorId: 5,
|
|
119
|
+
onlyAdmin: false
|
|
120
|
+
}, fileObject);
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
### 3. Criar Mensagem Apenas para Admin
|
|
124
|
+
```typescript
|
|
125
|
+
const adminMessage = await client.createReadyMessage({
|
|
126
|
+
title: "Procedimento Interno",
|
|
127
|
+
message: "Instruções confidenciais para administradores",
|
|
128
|
+
onlyAdmin: true // 🔒 Só admins veem
|
|
129
|
+
});
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### 4. Atualização Parcial
|
|
133
|
+
```typescript
|
|
134
|
+
// Atualizar apenas o título
|
|
135
|
+
await client.updateReadyMessage(123, {
|
|
136
|
+
title: "Título Atualizado"
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
// Atualizar apenas a mensagem
|
|
140
|
+
await client.updateReadyMessage(123, {
|
|
141
|
+
message: "Mensagem atualizada com novas informações"
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
// Tornar mensagem exclusiva para admin
|
|
145
|
+
await client.updateReadyMessage(123, {
|
|
146
|
+
onlyAdmin: true
|
|
147
|
+
});
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### 5. Com Upload de Arquivo
|
|
151
|
+
```typescript
|
|
152
|
+
const updatedMessage = await client.updateReadyMessage(
|
|
153
|
+
123,
|
|
154
|
+
{
|
|
155
|
+
title: "Manual Atualizado",
|
|
156
|
+
message: "Nova versão do manual em anexo"
|
|
157
|
+
},
|
|
158
|
+
newFileObject
|
|
159
|
+
);
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 🎯 Benefícios
|
|
165
|
+
|
|
166
|
+
### ✅ Consistência
|
|
167
|
+
- Segue padrões TypeScript/JavaScript
|
|
168
|
+
- Alinhado com conventions modernas
|
|
169
|
+
- Melhor legibilidade do código
|
|
170
|
+
|
|
171
|
+
### ✅ IntelliSense Melhorado
|
|
172
|
+
```typescript
|
|
173
|
+
// Auto-complete mostra:
|
|
174
|
+
data.title // ✅ Claro e conciso
|
|
175
|
+
data.message // ✅ Descritivo
|
|
176
|
+
data.sectorId // ✅ Tipado como number
|
|
177
|
+
|
|
178
|
+
// Ao invés de:
|
|
179
|
+
data.TITULO // ❌ GRITANDO
|
|
180
|
+
data.TEXTO_MENSAGEM // ❌ Verboso
|
|
181
|
+
data.SETOR // ❌ Ambíguo
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### ✅ Melhor Manutenibilidade
|
|
185
|
+
- Nomes em inglês facilitam colaboração internacional
|
|
186
|
+
- camelCase é padrão do ecossistema JS/TS
|
|
187
|
+
- Menos confusão entre frontend e backend
|
|
188
|
+
|
|
189
|
+
---
|
|
190
|
+
|
|
191
|
+
## 🔄 Compatibilidade
|
|
192
|
+
|
|
193
|
+
### DTOs Legados Disponíveis
|
|
194
|
+
|
|
195
|
+
Para facilitar migração gradual, os tipos antigos ainda estão disponíveis:
|
|
196
|
+
|
|
197
|
+
```typescript
|
|
198
|
+
import {
|
|
199
|
+
CreateReadyMessageDtoLegacy,
|
|
200
|
+
UpdateReadyMessageDtoLegacy
|
|
201
|
+
} from './types/ready-messages.types';
|
|
202
|
+
|
|
203
|
+
// ⚠️ Depreciado - migre para os novos DTOs
|
|
204
|
+
const oldData: CreateReadyMessageDtoLegacy = {
|
|
205
|
+
TITULO: "Test",
|
|
206
|
+
TEXTO_MENSAGEM: "Test message"
|
|
207
|
+
};
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**⚠️ Aviso:** DTOs legados serão removidos na versão 4.0.0
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 🧪 Testando a Migração
|
|
215
|
+
|
|
216
|
+
### Teste Básico
|
|
217
|
+
```typescript
|
|
218
|
+
import ReadyMessageClient from '@in.pulse-crm/sdk';
|
|
219
|
+
|
|
220
|
+
const client = new ReadyMessageClient('http://localhost:8000');
|
|
221
|
+
client.setAuth(token);
|
|
222
|
+
|
|
223
|
+
// Teste de criação
|
|
224
|
+
const message = await client.createReadyMessage({
|
|
225
|
+
title: "Teste de Migração",
|
|
226
|
+
message: "Se você está lendo isso, a migração funcionou! 🎉"
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
console.log('✅ Migração bem-sucedida!');
|
|
230
|
+
console.log('ID da mensagem:', message.id);
|
|
231
|
+
console.log('Título:', message.title);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Teste com Todos os Campos
|
|
235
|
+
```typescript
|
|
236
|
+
const fullTest = await client.createReadyMessage({
|
|
237
|
+
title: "Teste Completo",
|
|
238
|
+
message: "Testando todos os campos disponíveis",
|
|
239
|
+
sectorId: 10,
|
|
240
|
+
onlyAdmin: true
|
|
241
|
+
}, null);
|
|
242
|
+
|
|
243
|
+
// Teste de atualização
|
|
244
|
+
const updated = await client.updateReadyMessage(fullTest.id, {
|
|
245
|
+
title: "Título Atualizado",
|
|
246
|
+
onlyAdmin: false
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
console.log('✅ Teste completo bem-sucedido!');
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
---
|
|
253
|
+
|
|
254
|
+
## ❓ FAQ
|
|
255
|
+
|
|
256
|
+
### P: Preciso alterar o backend?
|
|
257
|
+
**R:** Não! O client faz a conversão automaticamente. O backend continua recebendo UPPERCASE.
|
|
258
|
+
|
|
259
|
+
### P: E se eu usar os campos antigos por engano?
|
|
260
|
+
**R:** TypeScript mostrará erro de compilação. Isso evita bugs em produção.
|
|
261
|
+
|
|
262
|
+
### P: Posso misturar formatos antigos e novos?
|
|
263
|
+
**R:** Não recomendado. Use apenas os novos DTOs para consistência.
|
|
264
|
+
|
|
265
|
+
### P: Como saber se estou usando a versão correta?
|
|
266
|
+
**R:** Verifique se seus DTOs usam `title`, `message`, `sectorId`, `onlyAdmin`.
|
|
267
|
+
|
|
268
|
+
---
|
|
269
|
+
|
|
270
|
+
## 🎓 Resumo
|
|
271
|
+
|
|
272
|
+
### O que mudou:
|
|
273
|
+
- ✅ DTOs agora usam camelCase em inglês
|
|
274
|
+
- ✅ Conversão automática para backend
|
|
275
|
+
- ✅ Melhor IntelliSense e documentação
|
|
276
|
+
- ✅ Compatibilidade mantida temporariamente
|
|
277
|
+
|
|
278
|
+
### O que você precisa fazer:
|
|
279
|
+
1. Atualizar seus DTOs para camelCase
|
|
280
|
+
2. Testar a integração
|
|
281
|
+
3. Remover referências aos DTOs legados
|
|
282
|
+
|
|
283
|
+
### Deadline:
|
|
284
|
+
- **Migração recomendada:** Imediatamente
|
|
285
|
+
- **DTOs legados removidos:** Versão 4.0.0
|
|
286
|
+
|
|
287
|
+
---
|
|
288
|
+
|
|
289
|
+
**Versão:** 3.1.0
|
|
290
|
+
**Data:** 15/10/2025
|
|
291
|
+
**Breaking Changes:** Não (compatibilidade mantida)
|
|
292
|
+
**Próxima versão:** DTOs legados serão removidos
|