@adatechnology/meta-whatsapp-module 0.2.0 → 0.3.1
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/dist/index.cjs +28 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +9 -1
- package/dist/index.d.ts +9 -1
- package/dist/index.js +30 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -505,20 +505,33 @@ var SessionRepository = class {
|
|
|
505
505
|
if (!session?.lastInboundAt) return void 0;
|
|
506
506
|
return (Date.now() - session.lastInboundAt.getTime()) / (1e3 * 60 * 60);
|
|
507
507
|
}
|
|
508
|
-
|
|
508
|
+
// `clearHumanRequest` é opt-in: quem chama `setMode` direto para outros fins (ex.: trocar de
|
|
509
|
+
// atendente sem mexer na fila) continua sem afetar `humanRequestedAt`. Só `takeover`/`release`
|
|
510
|
+
// pedem a limpeza, porque só eles representam "o pedido de atendimento foi resolvido".
|
|
511
|
+
async setMode(companyId, whatsappNumber, mode, assignedUserId, clearHumanRequest = false) {
|
|
509
512
|
await this.db.update(sessions).set({
|
|
510
513
|
mode,
|
|
511
514
|
assignedUserId: assignedUserId ?? null,
|
|
515
|
+
...clearHumanRequest ? {
|
|
516
|
+
humanRequestedAt: null
|
|
517
|
+
} : {},
|
|
512
518
|
updatedAt: import_drizzle_orm2.sql`now()`
|
|
513
519
|
}).where((0, import_drizzle_orm2.and)((0, import_drizzle_orm2.eq)(sessions.companyId, companyId), (0, import_drizzle_orm2.eq)(sessions.whatsappNumber, whatsappNumber)));
|
|
514
520
|
}
|
|
515
521
|
// T3.3 — takeover: atendente assume a conversa, tirando-a do modo bot.
|
|
522
|
+
//
|
|
523
|
+
// Limpa `humanRequestedAt`: sem isso a conversa nunca sai da fila `waitingHuman` da inbox,
|
|
524
|
+
// mesmo depois de atendida — o filtro é só `humanRequestedAt is not null` (ver
|
|
525
|
+
// `listByContextFilters`), então o campo tem que voltar a null quando o pedido é resolvido.
|
|
516
526
|
async takeover(companyId, whatsappNumber, agentUserId) {
|
|
517
|
-
await this.setMode(companyId, whatsappNumber, "human", agentUserId);
|
|
527
|
+
await this.setMode(companyId, whatsappNumber, "human", agentUserId, true);
|
|
518
528
|
}
|
|
519
529
|
// T3.3 — release: devolve a conversa ao bot.
|
|
530
|
+
//
|
|
531
|
+
// Também limpa `humanRequestedAt` pelo mesmo motivo do takeover: se o cliente pedir atendimento
|
|
532
|
+
// de novo depois, `requestHuman` grava um novo timestamp normalmente.
|
|
520
533
|
async release(companyId, whatsappNumber) {
|
|
521
|
-
await this.setMode(companyId, whatsappNumber, "bot", null);
|
|
534
|
+
await this.setMode(companyId, whatsappNumber, "bot", null, true);
|
|
522
535
|
}
|
|
523
536
|
/**
|
|
524
537
|
* Apaga a sessão; a cascata das FKs leva mensagens e documentos.
|
|
@@ -2585,7 +2598,9 @@ var InboundEffectsDispatcher = class {
|
|
|
2585
2598
|
const sessionRow = await this.params.sessionRepository.getContext(companyId, message.from);
|
|
2586
2599
|
if (!sessionRow) return;
|
|
2587
2600
|
if (sessionRow.mode === "human") return;
|
|
2588
|
-
const outcome = await this.params.hooks?.onMessageReceived?.(message, toSessionContract(sessionRow)
|
|
2601
|
+
const outcome = await this.params.hooks?.onMessageReceived?.(message, toSessionContract(sessionRow), job.profileName === void 0 ? {} : {
|
|
2602
|
+
profileName: job.profileName
|
|
2603
|
+
});
|
|
2589
2604
|
if (outcome?.outcome === "handled") return;
|
|
2590
2605
|
void extractAnswer(message);
|
|
2591
2606
|
}
|
|
@@ -2714,7 +2729,11 @@ var ReceiveWebhookUseCase = class {
|
|
|
2714
2729
|
continue;
|
|
2715
2730
|
}
|
|
2716
2731
|
for (const message of change.value.messages ?? []) {
|
|
2717
|
-
|
|
2732
|
+
const profileName = (0, import_meta_whatsapp_contracts12.resolveContactProfileName)({
|
|
2733
|
+
contacts: change.value.contacts,
|
|
2734
|
+
from: message.from
|
|
2735
|
+
});
|
|
2736
|
+
await this.handleMessage(input.companyId, message, profileName);
|
|
2718
2737
|
messagesProcessed++;
|
|
2719
2738
|
}
|
|
2720
2739
|
for (const status of change.value.statuses ?? []) {
|
|
@@ -2773,7 +2792,7 @@ var ReceiveWebhookUseCase = class {
|
|
|
2773
2792
|
await this.params.hooks?.onPhoneNumberQualityUpdate?.(quality.data);
|
|
2774
2793
|
return true;
|
|
2775
2794
|
}
|
|
2776
|
-
async handleMessage(companyId, message) {
|
|
2795
|
+
async handleMessage(companyId, message, profileName) {
|
|
2777
2796
|
const saved = await this.params.logMessage.execute({
|
|
2778
2797
|
companyId,
|
|
2779
2798
|
whatsappNumber: message.from,
|
|
@@ -2796,6 +2815,9 @@ var ReceiveWebhookUseCase = class {
|
|
|
2796
2815
|
...media ? {
|
|
2797
2816
|
media
|
|
2798
2817
|
} : {},
|
|
2818
|
+
...profileName ? {
|
|
2819
|
+
profileName
|
|
2820
|
+
} : {},
|
|
2799
2821
|
receivedAt: Date.now()
|
|
2800
2822
|
});
|
|
2801
2823
|
}
|