Skip to content

Commit ca451bf

Browse files
Merge pull request #1126 from jesus-chacon/update_chats
Fix: cuid security deprecation, update libs, lint and improve chat DB update
2 parents f971f38 + 236b0f9 commit ca451bf

File tree

17 files changed

+12668
-126
lines changed

17 files changed

+12668
-126
lines changed

.gitignore

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ lerna-debug.log*
2121
# Package
2222
/yarn.lock
2323
/pnpm-lock.yaml
24-
/package-lock.json
2524

2625
# IDEs
2726
.vscode/*

package-lock.json

Lines changed: 12517 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 37 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -49,73 +49,72 @@
4949
"homepage": "https://github.com/EvolutionAPI/evolution-api#readme",
5050
"dependencies": {
5151
"@adiwajshing/keyed-db": "^0.2.4",
52-
"@aws-sdk/client-sqs": "^3.569.0",
52+
"@aws-sdk/client-sqs": "^3.723.0",
5353
"@ffmpeg-installer/ffmpeg": "^1.1.0",
5454
"@figuro/chatwoot-sdk": "^1.1.16",
5555
"@hapi/boom": "^10.0.1",
56+
"@paralleldrive/cuid2": "^2.2.2",
5657
"@prisma/client": "^6.1.0",
57-
"@sentry/node": "^8.28.0",
58-
"amqplib": "^0.10.3",
59-
"axios": "^1.6.5",
58+
"@sentry/node": "^8.47.0",
59+
"amqplib": "^0.10.5",
60+
"axios": "^1.7.9",
6061
"baileys": "github:EvolutionAPI/Baileys",
6162
"class-validator": "^0.14.1",
62-
"compression": "^1.7.4",
63+
"compression": "^1.7.5",
6364
"cors": "^2.8.5",
64-
"cuid": "^3.0.0",
65-
"dayjs": "^1.11.7",
66-
"dotenv": "^16.4.5",
65+
"dayjs": "^1.11.13",
66+
"dotenv": "^16.4.7",
6767
"eventemitter2": "^6.4.9",
68-
"express": "^4.18.2",
68+
"express": "^4.21.2",
6969
"express-async-errors": "^3.1.1",
70-
"fluent-ffmpeg": "^2.1.2",
71-
"form-data": "^4.0.0",
72-
"https-proxy-agent": "^7.0.2",
70+
"fluent-ffmpeg": "^2.1.3",
71+
"form-data": "^4.0.1",
72+
"https-proxy-agent": "^7.0.6",
7373
"i18next": "^23.7.19",
7474
"jimp": "^0.16.13",
7575
"json-schema": "^0.4.0",
7676
"jsonschema": "^1.4.1",
77-
"link-preview-js": "^3.0.4",
77+
"link-preview-js": "^3.0.13",
7878
"long": "^5.2.3",
79-
"mediainfo.js": "^0.3.2",
80-
"mime": "^3.0.0",
81-
"minio": "^8.0.1",
79+
"mediainfo.js": "^0.3.4",
80+
"mime": "^4.0.6",
81+
"minio": "^8.0.3",
8282
"multer": "^1.4.5-lts.1",
8383
"node-cache": "^5.1.2",
8484
"node-cron": "^3.0.3",
85-
"openai": "^4.52.7",
86-
"pg": "^8.11.3",
85+
"openai": "^4.77.3",
86+
"pg": "^8.13.1",
8787
"pino": "^8.11.0",
8888
"prisma": "^6.1.0",
8989
"pusher": "^5.2.0",
90-
"qrcode": "^1.5.1",
90+
"qrcode": "^1.5.4",
9191
"qrcode-terminal": "^0.12.0",
92-
"redis": "^4.6.5",
93-
"sharp": "^0.32.2",
94-
"socket.io": "^4.7.1",
95-
"tsup": "^8.2.4",
96-
"uuid": "^9.0.0"
92+
"redis": "^4.7.0",
93+
"sharp": "^0.32.6",
94+
"socket.io": "^4.8.1",
95+
"tsup": "^8.3.5"
9796
},
9897
"devDependencies": {
99-
"@types/compression": "^1.7.2",
100-
"@types/cors": "^2.8.13",
101-
"@types/express": "^4.17.17",
98+
"@types/compression": "^1.7.5",
99+
"@types/cors": "^2.8.17",
100+
"@types/express": "^4.17.18",
102101
"@types/json-schema": "^7.0.15",
103-
"@types/mime": "3.0.0",
104-
"@types/node": "^18.15.11",
102+
"@types/mime": "4.0.0",
103+
"@types/node": "^22.10.5",
105104
"@types/node-cron": "^3.0.11",
106-
"@types/qrcode": "^1.5.0",
107-
"@types/qrcode-terminal": "^0.12.0",
108-
"@types/uuid": "^8.3.4",
105+
"@types/qrcode": "^1.5.5",
106+
"@types/qrcode-terminal": "^0.12.2",
107+
"@types/uuid": "^10.0.0",
109108
"@typescript-eslint/eslint-plugin": "^5.62.0",
110109
"@typescript-eslint/parser": "^5.62.0",
111110
"eslint": "^8.45.0",
112-
"eslint-config-prettier": "^8.8.0",
113-
"eslint-plugin-import": "^2.27.5",
114-
"eslint-plugin-prettier": "^4.2.1",
111+
"eslint-config-prettier": "^9.1.0",
112+
"eslint-plugin-import": "^2.31.0",
113+
"eslint-plugin-prettier": "^5.2.1",
115114
"eslint-plugin-simple-import-sort": "^10.0.0",
116-
"prettier": "^2.8.8",
115+
"prettier": "^3.4.2",
117116
"ts-node-dev": "^2.0.0",
118117
"tsconfig-paths": "^4.2.0",
119-
"typescript": "^5.5.4"
118+
"typescript": "^5.7.2"
120119
}
121-
}
120+
}

src/api/controllers/proxy.controller.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import axios from 'axios';
1010
const logger = new Logger('ProxyController');
1111

1212
export class ProxyController {
13-
constructor(private readonly proxyService: ProxyService, private readonly waMonitor: WAMonitoringService) {}
13+
constructor(
14+
private readonly proxyService: ProxyService,
15+
private readonly waMonitor: WAMonitoringService,
16+
) {}
1417

1518
public async createProxy(instance: InstanceDto, data: ProxyDto) {
1619
if (!this.waMonitor.waInstances[instance.instanceName]) {

src/api/integrations/channel/meta/whatsapp.business.service.ts

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -71,10 +71,7 @@ export class BusinessStartupService extends ChannelStartupService {
7171
}
7272

7373
private isMediaMessage(message: any) {
74-
return message.document ||
75-
message.image ||
76-
message.audio ||
77-
message.video
74+
return message.document || message.image || message.audio || message.video;
7875
}
7976

8077
private async post(message: any, params: string) {
@@ -333,13 +330,17 @@ export class BusinessStartupService extends ChannelStartupService {
333330

334331
const buffer = await axios.get(result.data.url, { headers, responseType: 'arraybuffer' });
335332

336-
const mediaType = message.messages[0].document
337-
? 'document'
338-
: message.messages[0].image
339-
? 'image'
340-
: message.messages[0].audio
341-
? 'audio'
342-
: 'video';
333+
let mediaType;
334+
335+
if (message.messages[0].document) {
336+
mediaType = 'document';
337+
} else if (message.messages[0].image) {
338+
mediaType = 'image';
339+
} else if (message.messages[0].audio) {
340+
mediaType = 'audio';
341+
} else {
342+
mediaType = 'video';
343+
}
343344

344345
const mimetype = result.data?.mime_type || result.headers['content-type'];
345346

@@ -479,7 +480,7 @@ export class BusinessStartupService extends ChannelStartupService {
479480
message: {
480481
mediaUrl: messageRaw.message.mediaUrl,
481482
...messageRaw,
482-
}
483+
},
483484
},
484485
() => {},
485486
);
@@ -800,7 +801,7 @@ export class BusinessStartupService extends ChannelStartupService {
800801
}
801802
if (message['media']) {
802803
const isImage = message['mimetype']?.startsWith('image/');
803-
804+
804805
content = {
805806
messaging_product: 'whatsapp',
806807
recipient_type: 'individual',
@@ -815,7 +816,7 @@ export class BusinessStartupService extends ChannelStartupService {
815816
};
816817
quoted ? (content.context = { message_id: quoted.id }) : content;
817818
return await this.post(content, 'messages');
818-
}
819+
}
819820
if (message['audio']) {
820821
content = {
821822
messaging_product: 'whatsapp',
@@ -1103,11 +1104,10 @@ export class BusinessStartupService extends ChannelStartupService {
11031104

11041105
if (file?.buffer) {
11051106
mediaData.audio = file.buffer.toString('base64');
1106-
}
1107-
else if(isURL(mediaData.audio)){
1108-
mediaData.audio = mediaData.audio
1109-
}
1110-
else {
1107+
} else if (isURL(mediaData.audio)) {
1108+
// DO NOTHING
1109+
// mediaData.audio = mediaData.audio;
1110+
} else {
11111111
console.error('El archivo no tiene buffer o file es undefined');
11121112
throw new Error('File or buffer is undefined');
11131113
}

src/api/integrations/channel/whatsapp/whatsapp.baileys.service.ts

Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ import {
7676
import { BadRequestException, InternalServerErrorException, NotFoundException } from '@exceptions';
7777
import ffmpegPath from '@ffmpeg-installer/ffmpeg';
7878
import { Boom } from '@hapi/boom';
79+
import { createId as cuid } from '@paralleldrive/cuid2';
7980
import { Instance } from '@prisma/client';
8081
import { makeProxyAgent } from '@utils/makeProxyAgent';
8182
import { getOnWhatsappCache, saveOnWhatsappCache } from '@utils/onWhatsappCache';
@@ -125,7 +126,6 @@ import { LabelAssociation } from 'baileys/lib/Types/LabelAssociation';
125126
import { spawn } from 'child_process';
126127
import { isArray, isBase64, isURL } from 'class-validator';
127128
import { randomBytes } from 'crypto';
128-
import cuid from 'cuid';
129129
import EventEmitter2 from 'eventemitter2';
130130
import ffmpeg from 'fluent-ffmpeg';
131131
import FormData from 'form-data';
@@ -1136,29 +1136,25 @@ export class BaileysStartupService extends ChannelStartupService {
11361136
}
11371137
const existingChat = await this.prismaRepository.chat.findFirst({
11381138
where: { instanceId: this.instanceId, remoteJid: received.key.remoteJid },
1139+
select: { id: true, name: true },
11391140
});
11401141

1141-
if (existingChat) {
1142-
const chatToInsert = {
1143-
remoteJid: received.key.remoteJid,
1144-
instanceId: this.instanceId,
1145-
name: received.pushName || '',
1146-
unreadMessages: 0,
1147-
};
1148-
1149-
this.sendDataWebhook(Events.CHATS_UPSERT, [chatToInsert]);
1142+
if (
1143+
existingChat &&
1144+
received.pushName &&
1145+
existingChat.name !== received.pushName &&
1146+
received.pushName.trim().length > 0
1147+
) {
1148+
this.sendDataWebhook(Events.CHATS_UPSERT, [{ ...existingChat, name: received.pushName }]);
11501149
if (this.configService.get<Database>('DATABASE').SAVE_DATA.CHATS) {
1151-
try {
1152-
await this.prismaRepository.chat.update({
1153-
where: {
1154-
id: existingChat.id,
1155-
},
1156-
data: chatToInsert,
1157-
});
1158-
}
1159-
catch(error){
1160-
console.log(`Chat insert record ignored: ${chatToInsert.remoteJid} - ${chatToInsert.instanceId}`);
1161-
}
1150+
try {
1151+
await this.prismaRepository.chat.update({
1152+
where: { id: existingChat.id },
1153+
data: { name: received.pushName },
1154+
});
1155+
} catch (error) {
1156+
console.log(`Chat insert record ignored: ${received.key.remoteJid} - ${this.instanceId}`);
1157+
}
11621158
}
11631159
}
11641160

@@ -1494,13 +1490,12 @@ export class BaileysStartupService extends ChannelStartupService {
14941490
if (this.configService.get<Database>('DATABASE').SAVE_DATA.CHATS) {
14951491
try {
14961492
await this.prismaRepository.chat.update({
1497-
where: {
1498-
id: existingChat.id,
1499-
},
1493+
where: {
1494+
id: existingChat.id,
1495+
},
15001496
data: chatToInsert,
15011497
});
1502-
}
1503-
catch(error){
1498+
} catch (error) {
15041499
console.log(`Chat insert record ignored: ${chatToInsert.remoteJid} - ${chatToInsert.instanceId}`);
15051500
}
15061501
}

src/api/integrations/event/webhook/webhook.controller.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@ export class WebhookController extends EventController implements EventControlle
6666
local,
6767
}: EmitData): Promise<void> {
6868
const instance = (await this.get(instanceName)) as wa.LocalWebHook;
69-
7069

7170
const webhookConfig = configService.get<Webhook>('WEBHOOK');
7271
const webhookLocal = instance?.events;
@@ -86,7 +85,7 @@ export class WebhookController extends EventController implements EventControlle
8685
apikey: apiKey,
8786
};
8887

89-
if (local && !instance || !instance?.enabled) {
88+
if ((local && !instance) || !instance?.enabled) {
9089
if (Array.isArray(webhookLocal) && webhookLocal.includes(we)) {
9190
let baseURL: string;
9291

src/api/integrations/event/webhook/webhook.router.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import { instanceSchema, webhookSchema } from '@validate/validate.schema';
88
import { RequestHandler, Router } from 'express';
99

1010
export class WebhookRouter extends RouterBroker {
11-
constructor(readonly configService: ConfigService, ...guards: RequestHandler[]) {
11+
constructor(
12+
readonly configService: ConfigService,
13+
...guards: RequestHandler[]
14+
) {
1215
super();
1316
this.router
1417
.post(this.routerPath('set'), ...guards, async (req, res) => {

src/api/routes/instance.router.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import { RequestHandler, Router } from 'express';
88
import { HttpStatus } from './index.router';
99

1010
export class InstanceRouter extends RouterBroker {
11-
constructor(readonly configService: ConfigService, ...guards: RequestHandler[]) {
11+
constructor(
12+
readonly configService: ConfigService,
13+
...guards: RequestHandler[]
14+
) {
1215
super();
1316
this.router
1417
.post('/create', ...guards, async (req, res) => {

src/api/routes/template.router.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import { RequestHandler, Router } from 'express';
99
import { HttpStatus } from './index.router';
1010

1111
export class TemplateRouter extends RouterBroker {
12-
constructor(readonly configService: ConfigService, ...guards: RequestHandler[]) {
12+
constructor(
13+
readonly configService: ConfigService,
14+
...guards: RequestHandler[]
15+
) {
1316
super();
1417
this.router
1518
.post(this.routerPath('create'), ...guards, async (req, res) => {

0 commit comments

Comments
 (0)