Skip to content

Commit 9956a2f

Browse files
committed
feat(contact): add save/delete contact endpoints and Baileys handler
1 parent cd800f2 commit 9956a2f

File tree

7 files changed

+86
-0
lines changed

7 files changed

+86
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { SaveContactDto } from '@api/dto/contact.dto';
2+
import { InstanceDto } from '@api/dto/instance.dto';
3+
import { WAMonitoringService } from '@api/services/monitor.service';
4+
5+
export class ContactController {
6+
constructor(private readonly waMonitor: WAMonitoringService) {}
7+
8+
public async saveContact({ instanceName }: InstanceDto, data: SaveContactDto) {
9+
return await this.waMonitor.waInstances[instanceName].saveContact(data);
10+
}
11+
}

src/api/dto/contact.dto.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export class SaveContactDto {
2+
number: string;
3+
name: string;
4+
saveOnDevice?: boolean;
5+
}

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

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ import { v4 } from 'uuid';
154154

155155
import { BaileysMessageProcessor } from './baileysMessage.processor';
156156
import { useVoiceCallsBaileys } from './voiceCalls/useVoiceCallsBaileys';
157+
import { SaveContactDto } from '@api/dto/contact.dto';
157158

158159
export interface ExtendedIMessageKey extends proto.IMessageKey {
159160
remoteJidAlt?: string;
@@ -3767,6 +3768,29 @@ export class BaileysStartupService extends ChannelStartupService {
37673768
});
37683769
}
37693770
}
3771+
3772+
public async saveContact(data: SaveContactDto) {
3773+
try {
3774+
const jid = createJid(data.number);
3775+
await this.client.chatModify(
3776+
{
3777+
contact: {
3778+
fullName: data.name || 'Unknown',
3779+
firstName: (data.name || 'Unknown').split(' ')[0],
3780+
saveOnPrimaryAddressbook: data.saveOnDevice ?? true,
3781+
},
3782+
},
3783+
jid,
3784+
);
3785+
3786+
return { saved: true, number: data.number, name: data.name };
3787+
} catch (error) {
3788+
throw new InternalServerErrorException({
3789+
saved: false,
3790+
message: ['An error occurred while saving the contact.', error.toString()],
3791+
});
3792+
}
3793+
}
37703794

37713795
public async deleteMessage(del: DeleteMessage) {
37723796
try {

src/api/routes/contact.router.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { RouterBroker } from '@api/abstract/abstract.router';
2+
import { SaveContactDto } from '@api/dto/contact.dto';
3+
import { contactController } from '@api/server.module';
4+
import { saveContactSchema } from '@validate/contact.schema';
5+
import { RequestHandler, Router } from 'express';
6+
7+
import { HttpStatus } from './index.router';
8+
9+
export class ContactRouter extends RouterBroker {
10+
constructor(...guards: RequestHandler[]) {
11+
super();
12+
this.router.post(this.routerPath('save'), ...guards, async (req, res) => {
13+
try {
14+
const response = await this.dataValidate<SaveContactDto>({
15+
request: req,
16+
schema: saveContactSchema,
17+
ClassRef: SaveContactDto,
18+
execute: (instance, data) => contactController.saveContact(instance, data),
19+
});
20+
21+
return res.status(HttpStatus.OK).json(response);
22+
} catch (error) {
23+
return res.status(HttpStatus.BAD_REQUEST).json(error);
24+
}
25+
});
26+
}
27+
28+
public readonly router: Router = Router();
29+
}

src/api/routes/index.router.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import path from 'path';
1616
import { BusinessRouter } from './business.router';
1717
import { CallRouter } from './call.router';
1818
import { ChatRouter } from './chat.router';
19+
import { ContactRouter } from './contact.router';
1920
import { GroupRouter } from './group.router';
2021
import { InstanceRouter } from './instance.router';
2122
import { LabelRouter } from './label.router';
@@ -218,6 +219,7 @@ router
218219
.use('/message', new MessageRouter(...guards).router)
219220
.use('/call', new CallRouter(...guards).router)
220221
.use('/chat', new ChatRouter(...guards).router)
222+
.use('/contact', new ContactRouter(...guards).router)
221223
.use('/business', new BusinessRouter(...guards).router)
222224
.use('/group', new GroupRouter(...guards).router)
223225
.use('/template', new TemplateRouter(configService, ...guards).router)

src/api/server.module.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { Logger } from '@config/logger.config';
66
import { BusinessController } from './controllers/business.controller';
77
import { CallController } from './controllers/call.controller';
88
import { ChatController } from './controllers/chat.controller';
9+
import { ContactController } from './controllers/contact.controller';
910
import { GroupController } from './controllers/group.controller';
1011
import { InstanceController } from './controllers/instance.controller';
1112
import { LabelController } from './controllers/label.controller';
@@ -103,6 +104,7 @@ export const instanceController = new InstanceController(
103104
export const sendMessageController = new SendMessageController(waMonitor);
104105
export const callController = new CallController(waMonitor);
105106
export const chatController = new ChatController(waMonitor);
107+
export const contactController = new ContactController(waMonitor);
106108
export const businessController = new BusinessController(waMonitor);
107109
export const groupController = new GroupController(waMonitor);
108110
export const labelController = new LabelController(waMonitor);

src/validate/contact.schema.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { JSONSchema7 } from 'json-schema';
2+
import { v4 } from 'uuid';
3+
4+
export const saveContactSchema: JSONSchema7 = {
5+
$id: v4(),
6+
type: 'object',
7+
properties: {
8+
number: { type: 'string' },
9+
name: { type: 'string' },
10+
saveOnDevice: { type: 'boolean', default: true },
11+
},
12+
required: ['number', 'name'],
13+
};

0 commit comments

Comments
 (0)