Skip to content

Commit 8ea4d65

Browse files
committed
refactor: enhance media handling in Baileys service with validation for valid media content
1 parent af713de commit 8ea4d65

File tree

3 files changed

+91
-59
lines changed

3 files changed

+91
-59
lines changed

Dockerfile

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
FROM node:20-alpine AS builder
22

33
RUN apk update && \
4-
apk add --no-cache git ffmpeg wget curl bash openssl dos2unix
4+
apk add --no-cache git ffmpeg wget curl bash openssl
55

66
LABEL version="2.3.1" description="Api to control whatsapp features through http requests."
77
LABEL maintainer="Davidson Gomes" git="https://github.com/DavidsonGomes"
@@ -10,24 +10,19 @@ LABEL contact="[email protected]"
1010
WORKDIR /evolution
1111

1212
# Define variáveis de ambiente padrão para o build
13-
ENV DOCKER_ENV=true
14-
ENV DATABASE_PROVIDER=postgresql
15-
ENV DATABASE_URL=postgresql://user:password@localhost:5432/evolution
16-
17-
# Copia arquivos de configuração primeiro
18-
COPY ./package*.json ./
19-
COPY ./tsconfig.json ./
20-
COPY ./tsup.config.ts ./
13+
COPY ./package.json ./tsconfig.json ./
2114

2215
# Instala todas as dependências (incluindo dev para build)
23-
RUN npm ci --silent
16+
RUN npm install
2417

2518
# Copia código fonte
2619
COPY ./src ./src
2720
COPY ./public ./public
2821
COPY ./prisma ./prisma
2922
COPY ./manager ./manager
23+
COPY ./.env.example ./.env
3024
COPY ./runWithProvider.js ./
25+
COPY ./tsup.config.ts ./
3126

3227
# Copia scripts Docker
3328
COPY ./Docker ./Docker
@@ -45,9 +40,6 @@ RUN ./Docker/scripts/generate_database.sh
4540
# Build do projeto
4641
RUN npm run build
4742

48-
# Remove devDependencies para reduzir tamanho
49-
RUN npm prune --production
50-
5143
FROM node:20-alpine AS final
5244

5345
RUN apk update && \
@@ -66,13 +58,13 @@ COPY --from=builder /evolution/dist ./dist
6658
COPY --from=builder /evolution/prisma ./prisma
6759
COPY --from=builder /evolution/manager ./manager
6860
COPY --from=builder /evolution/public ./public
61+
COPY --from=builder /evolution/.env ./.env
6962
COPY --from=builder /evolution/Docker ./Docker
7063
COPY --from=builder /evolution/runWithProvider.js ./runWithProvider.js
7164
COPY --from=builder /evolution/tsup.config.ts ./tsup.config.ts
7265

73-
# Cria arquivo .env vazio - as variáveis virão do Railway
74-
RUN touch .env
66+
ENV DOCKER_ENV=true
7567

7668
EXPOSE 8080
7769

78-
ENTRYPOINT ["/bin/bash", "-c", ". ./Docker/scripts/deploy_database.sh && npm run start:prod" ]
70+
ENTRYPOINT ["/bin/bash", "-c", ". ./Docker/scripts/deploy_database.sh && npm run start:prod" ]

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

Lines changed: 59 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,33 +1226,41 @@ export class BaileysStartupService extends ChannelStartupService {
12261226
if (this.configService.get<S3>('S3').ENABLE) {
12271227
try {
12281228
const message: any = received;
1229-
const media = await this.getBase64FromMediaMessage({ message }, true);
1230-
1231-
const { buffer, mediaType, fileName, size } = media;
1232-
const mimetype = mimeTypes.lookup(fileName).toString();
1233-
const fullName = join(
1234-
`${this.instance.id}`,
1235-
received.key.remoteJid,
1236-
mediaType,
1237-
`${Date.now()}_${fileName}`,
1238-
);
1239-
await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { 'Content-Type': mimetype });
1240-
1241-
await this.prismaRepository.media.create({
1242-
data: {
1243-
messageId: msg.id,
1244-
instanceId: this.instanceId,
1245-
type: mediaType,
1246-
fileName: fullName,
1247-
mimetype,
1248-
},
1249-
});
1250-
1251-
const mediaUrl = await s3Service.getObjectUrl(fullName);
1252-
1253-
messageRaw.message.mediaUrl = mediaUrl;
12541229

1255-
await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });
1230+
// Verificação adicional para garantir que há conteúdo de mídia real
1231+
const hasRealMedia = this.hasValidMediaContent(message);
1232+
1233+
if (!hasRealMedia) {
1234+
this.logger.warn('Message detected as media but contains no valid media content');
1235+
} else {
1236+
const media = await this.getBase64FromMediaMessage({ message }, true);
1237+
1238+
const { buffer, mediaType, fileName, size } = media;
1239+
const mimetype = mimeTypes.lookup(fileName).toString();
1240+
const fullName = join(
1241+
`${this.instance.id}`,
1242+
received.key.remoteJid,
1243+
mediaType,
1244+
`${Date.now()}_${fileName}`,
1245+
);
1246+
await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { 'Content-Type': mimetype });
1247+
1248+
await this.prismaRepository.media.create({
1249+
data: {
1250+
messageId: msg.id,
1251+
instanceId: this.instanceId,
1252+
type: mediaType,
1253+
fileName: fullName,
1254+
mimetype,
1255+
},
1256+
});
1257+
1258+
const mediaUrl = await s3Service.getObjectUrl(fullName);
1259+
1260+
messageRaw.message.mediaUrl = mediaUrl;
1261+
1262+
await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });
1263+
}
12561264
} catch (error) {
12571265
this.logger.error(['Error on upload file to minio', error?.message, error?.stack]);
12581266
}
@@ -2121,31 +2129,39 @@ export class BaileysStartupService extends ChannelStartupService {
21212129
if (isMedia && this.configService.get<S3>('S3').ENABLE) {
21222130
try {
21232131
const message: any = messageRaw;
2124-
const media = await this.getBase64FromMediaMessage({ message }, true);
21252132

2126-
const { buffer, mediaType, fileName, size } = media;
2133+
// Verificação adicional para garantir que há conteúdo de mídia real
2134+
const hasRealMedia = this.hasValidMediaContent(message);
21272135

2128-
const mimetype = mimeTypes.lookup(fileName).toString();
2136+
if (!hasRealMedia) {
2137+
this.logger.warn('Message detected as media but contains no valid media content');
2138+
} else {
2139+
const media = await this.getBase64FromMediaMessage({ message }, true);
21292140

2130-
const fullName = join(
2131-
`${this.instance.id}`,
2132-
messageRaw.key.remoteJid,
2133-
`${messageRaw.key.id}`,
2134-
mediaType,
2135-
fileName,
2136-
);
2141+
const { buffer, mediaType, fileName, size } = media;
21372142

2138-
await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { 'Content-Type': mimetype });
2143+
const mimetype = mimeTypes.lookup(fileName).toString();
21392144

2140-
await this.prismaRepository.media.create({
2141-
data: { messageId: msg.id, instanceId: this.instanceId, type: mediaType, fileName: fullName, mimetype },
2142-
});
2145+
const fullName = join(
2146+
`${this.instance.id}`,
2147+
messageRaw.key.remoteJid,
2148+
`${messageRaw.key.id}`,
2149+
mediaType,
2150+
fileName,
2151+
);
21432152

2144-
const mediaUrl = await s3Service.getObjectUrl(fullName);
2153+
await s3Service.uploadFile(fullName, buffer, size.fileLength?.low, { 'Content-Type': mimetype });
21452154

2146-
messageRaw.message.mediaUrl = mediaUrl;
2155+
await this.prismaRepository.media.create({
2156+
data: { messageId: msg.id, instanceId: this.instanceId, type: mediaType, fileName: fullName, mimetype },
2157+
});
21472158

2148-
await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });
2159+
const mediaUrl = await s3Service.getObjectUrl(fullName);
2160+
2161+
messageRaw.message.mediaUrl = mediaUrl;
2162+
2163+
await this.prismaRepository.message.update({ where: { id: msg.id }, data: messageRaw });
2164+
}
21492165
} catch (error) {
21502166
this.logger.error(['Error on upload file to minio', error?.message, error?.stack]);
21512167
}

src/api/services/channel.service.ts

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,4 +814,28 @@ export class ChannelStartupService {
814814

815815
return [];
816816
}
817+
818+
public hasValidMediaContent(message: any): boolean {
819+
if (!message?.message) return false;
820+
821+
const msg = message.message;
822+
823+
// Se só tem messageContextInfo, não é mídia válida
824+
if (Object.keys(msg).length === 1 && 'messageContextInfo' in msg) {
825+
return false;
826+
}
827+
828+
// Verifica se tem pelo menos um tipo de mídia válido
829+
const mediaTypes = [
830+
'imageMessage',
831+
'videoMessage',
832+
'stickerMessage',
833+
'documentMessage',
834+
'documentWithCaptionMessage',
835+
'ptvMessage',
836+
'audioMessage',
837+
];
838+
839+
return mediaTypes.some((type) => msg[type] && Object.keys(msg[type]).length > 0);
840+
}
817841
}

0 commit comments

Comments
 (0)