Skip to content

Commit e65c7b6

Browse files
Merge pull request #577 from neanderdev/mark-chat-as-unread
feat: method to mark chat as unread
2 parents e29b486 + 8e9a1e2 commit e65c7b6

File tree

6 files changed

+100
-0
lines changed

6 files changed

+100
-0
lines changed

src/api/controllers/chat.controller.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
BlockUserDto,
55
DeleteMessage,
66
getBase64FromMediaMessageDto,
7+
MarkChatUnreadDto,
78
NumberDto,
89
PrivacySettingDto,
910
ProfileNameDto,
@@ -40,6 +41,11 @@ export class ChatController {
4041
return await this.waMonitor.waInstances[instanceName].archiveChat(data);
4142
}
4243

44+
public async markChatUnread({ instanceName }: InstanceDto, data: MarkChatUnreadDto) {
45+
logger.verbose('requested markChatUnread from ' + instanceName + ' instance');
46+
return await this.waMonitor.waInstances[instanceName].markChatUnread(data);
47+
}
48+
4349
public async deleteMessage({ instanceName }: InstanceDto, data: DeleteMessage) {
4450
logger.verbose('requested deleteMessage from ' + instanceName + ' instance');
4551
return await this.waMonitor.waInstances[instanceName].deleteMessage(data);

src/api/dto/chat.dto.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ export class ArchiveChatDto {
7373
archive: boolean;
7474
}
7575

76+
export class MarkChatUnreadDto {
77+
lastMessage?: LastMessage;
78+
chat?: string;
79+
}
80+
7681
class PrivacySetting {
7782
readreceipts: WAReadReceiptsValue;
7883
profile: WAPrivacyValue;

src/api/routes/chat.router.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
blockUserSchema,
77
contactValidateSchema,
88
deleteMessageSchema,
9+
markChatUnreadSchema,
910
messageUpSchema,
1011
messageValidateSchema,
1112
presenceSchema,
@@ -24,6 +25,7 @@ import {
2425
BlockUserDto,
2526
DeleteMessage,
2627
getBase64FromMediaMessageDto,
28+
MarkChatUnreadDto,
2729
NumberDto,
2830
PrivacySettingDto,
2931
ProfileNameDto,
@@ -98,6 +100,23 @@ export class ChatRouter extends RouterBroker {
98100

99101
return res.status(HttpStatus.CREATED).json(response);
100102
})
103+
.put(this.routerPath('markChatUnread'), ...guards, async (req, res) => {
104+
logger.verbose('request received in markChatUnread');
105+
logger.verbose('request body: ');
106+
logger.verbose(req.body);
107+
108+
logger.verbose('request query: ');
109+
logger.verbose(req.query);
110+
111+
const response = await this.dataValidate<MarkChatUnreadDto>({
112+
request: req,
113+
schema: markChatUnreadSchema,
114+
ClassRef: MarkChatUnreadDto,
115+
execute: (instance, data) => chatController.markChatUnread(instance, data),
116+
});
117+
118+
return res.status(HttpStatus.CREATED).json(response);
119+
})
101120
.delete(this.routerPath('deleteMessageForEveryone'), ...guards, async (req, res) => {
102121
logger.verbose('request received in deleteMessageForEveryone');
103122
logger.verbose('request body: ');

src/api/services/channels/whatsapp.baileys.service.ts

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ import {
6868
DeleteMessage,
6969
getBase64FromMediaMessageDto,
7070
LastMessage,
71+
MarkChatUnreadDto,
7172
NumberBusiness,
7273
OnWhatsAppDto,
7374
PrivacySettingDto,
@@ -2714,6 +2715,45 @@ export class BaileysStartupService extends ChannelStartupService {
27142715
}
27152716
}
27162717

2718+
public async markChatUnread(data: MarkChatUnreadDto) {
2719+
this.logger.verbose('Marking chat as unread');
2720+
2721+
try {
2722+
let last_message = data.lastMessage;
2723+
let number = data.chat;
2724+
2725+
if (!last_message && number) {
2726+
last_message = await this.getLastMessage(number);
2727+
} else {
2728+
last_message = data.lastMessage;
2729+
last_message.messageTimestamp = last_message?.messageTimestamp ?? Date.now();
2730+
number = last_message?.key?.remoteJid;
2731+
}
2732+
2733+
if (!last_message || Object.keys(last_message).length === 0) {
2734+
throw new NotFoundException('Last message not found');
2735+
}
2736+
2737+
await this.client.chatModify(
2738+
{
2739+
markRead: false,
2740+
lastMessages: [last_message],
2741+
},
2742+
this.createJid(number),
2743+
);
2744+
2745+
return {
2746+
chatId: number,
2747+
markedChatUnread: true,
2748+
};
2749+
} catch (error) {
2750+
throw new InternalServerErrorException({
2751+
markedChatUnread: false,
2752+
message: ['An error occurred while marked unread the chat. Open a calling.', error.toString()],
2753+
});
2754+
}
2755+
}
2756+
27172757
public async deleteMessage(del: DeleteMessage) {
27182758
this.logger.verbose('Deleting message');
27192759
try {

src/api/services/channels/whatsapp.business.service.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1258,6 +1258,9 @@ export class BusinessStartupService extends ChannelStartupService {
12581258
public async archiveChat() {
12591259
throw new BadRequestException('Method not available on WhatsApp Business API');
12601260
}
1261+
public async markChatUnread() {
1262+
throw new BadRequestException('Method not available on WhatsApp Business API');
1263+
}
12611264
public async fetchProfile() {
12621265
throw new BadRequestException('Method not available on WhatsApp Business API');
12631266
}

src/validate/validate.schema.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -597,6 +597,33 @@ export const archiveChatSchema: JSONSchema7 = {
597597
required: ['archive'],
598598
};
599599

600+
export const markChatUnreadSchema: JSONSchema7 = {
601+
$id: v4(),
602+
type: 'object',
603+
properties: {
604+
chat: { type: 'string' },
605+
lastMessage: {
606+
type: 'object',
607+
properties: {
608+
key: {
609+
type: 'object',
610+
properties: {
611+
id: { type: 'string' },
612+
remoteJid: { type: 'string' },
613+
fromMe: { type: 'boolean', enum: [true, false] },
614+
},
615+
required: ['id', 'fromMe', 'remoteJid'],
616+
...isNotEmpty('id', 'remoteJid'),
617+
},
618+
messageTimestamp: { type: 'integer', minLength: 1 },
619+
},
620+
required: ['key'],
621+
...isNotEmpty('messageTimestamp'),
622+
},
623+
},
624+
required: ['lastMessage'],
625+
};
626+
600627
export const deleteMessageSchema: JSONSchema7 = {
601628
$id: v4(),
602629
type: 'object',

0 commit comments

Comments
 (0)