@peopl-health/nexus 4.2.7 → 4.2.9

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.
@@ -1,9 +1,11 @@
1
1
  const moment = require('moment-timezone');
2
+ const mongoose = require('mongoose');
2
3
 
3
4
  const { logger } = require('../utils/logger');
4
5
 
5
6
  const { Message } = require('../models/messageModel.js');
6
7
  const { ScheduledMessage } = require('../models/agendaMessageModel.js');
8
+ const { DeliveryAttempt } = require('../models/deliveryAttemptModel.js');
7
9
  const FlowRouting = require('../models/flowRoutingModel.js');
8
10
 
9
11
  const { ensureWhatsAppFormat } = require('../helpers/twilioHelper');
@@ -253,11 +255,29 @@ const checkMessageStatusController = async (req, res) => {
253
255
  }
254
256
  };
255
257
 
258
+ const getDeliveryAttemptsController = async (req, res) => {
259
+ const { id } = req.params;
260
+ if (!id || !mongoose.Types.ObjectId.isValid(id)) {
261
+ return res.status(400).json({ success: false, error: 'Valid message id is required' });
262
+ }
263
+ try {
264
+ const attempts = await DeliveryAttempt
265
+ .find({ messageId: id }, { raw: 0 })
266
+ .sort({ attemptedAt: 1 })
267
+ .lean();
268
+ return res.status(200).json({ success: true, attempts });
269
+ } catch (err) {
270
+ logger.error('Error fetching delivery attempts:', { messageId: id, error: err.message });
271
+ return res.status(500).json({ success: false, error: 'Failed to fetch delivery attempts' });
272
+ }
273
+ };
274
+
256
275
  module.exports = {
257
276
  sendMessageController,
258
277
  sendBulkMessageController,
259
278
  sendBulkMessageAirtableController,
260
279
  getLastInteractionController,
261
280
  checkScheduledMessageStatusController,
262
- checkMessageStatusController
281
+ checkMessageStatusController,
282
+ getDeliveryAttemptsController
263
283
  };
@@ -1,5 +1,6 @@
1
1
  const { logger } = require('../utils/logger');
2
2
  const { Message } = require('../models/messageModel');
3
+ const { DeliveryAttempt } = require('../models/deliveryAttemptModel');
3
4
  const { BaseJob } = require('./BaseJob');
4
5
 
5
6
  const QUEUE_NAME = 'template-approval';
@@ -139,6 +140,11 @@ class TemplateApprovalJob extends BaseJob {
139
140
 
140
141
  logger.info('[TemplateApprovalJob] Recovered', { originalMessageSid, recoveryMessageId: sendResult.messageId, templateSid });
141
142
 
143
+ await DeliveryAttempt.updateOne(
144
+ { messageId: message._id, kind: 'recovery_template_setup', twilioSid: templateSid },
145
+ { $set: { status: 'sent', completedAt: new Date() } }
146
+ );
147
+
142
148
  provider.deleteTemplate(templateSid).catch((deleteErr) =>
143
149
  logger.warn('[TemplateApprovalJob] Failed to delete template after send', { templateSid, error: deleteErr.message })
144
150
  );
@@ -152,6 +158,16 @@ class TemplateApprovalJob extends BaseJob {
152
158
  { $set: { 'statusInfo.recoveryRejectedAt': new Date() } }
153
159
  );
154
160
 
161
+ await DeliveryAttempt.updateOne(
162
+ { messageId: message._id, kind: 'recovery_template_setup', twilioSid: templateSid },
163
+ { $set: {
164
+ status: 'failed',
165
+ errorSource: 'server',
166
+ errorMessage: 'Rejected by WhatsApp',
167
+ completedAt: new Date()
168
+ } }
169
+ );
170
+
155
171
  try {
156
172
  await provider.deleteTemplate(templateSid);
157
173
  logger.info('[TemplateApprovalJob] Rejected template deleted', { templateSid, messageId: message._id });
@@ -49,7 +49,8 @@ const messageRouteDefinitions = {
49
49
  'POST /quality': 'addQualityVoteController',
50
50
  'GET /quality/:message_id': 'getQualityVotesByMessageController',
51
51
  'GET /quality/:message_id/voter/:voter_username': 'getQualityVoteByMessageAndVoterController',
52
- 'GET /quality/voter/:voter_username': 'getQualityVotesByVoterController'
52
+ 'GET /quality/voter/:voter_username': 'getQualityVotesByVoterController',
53
+ 'GET /:id/attempts': 'getDeliveryAttemptsController'
53
54
  };
54
55
 
55
56
  const patientRouteDefinitions = {
@@ -164,6 +165,7 @@ const builtInControllers = {
164
165
  getLastInteractionController: messageController.getLastInteractionController,
165
166
  checkScheduledMessageStatusController: messageController.checkScheduledMessageStatusController,
166
167
  checkMessageStatusController: messageController.checkMessageStatusController,
168
+ getDeliveryAttemptsController: messageController.getDeliveryAttemptsController,
167
169
  getMessageStatusController: messageStatusController.getMessageStatusController,
168
170
  messageStatusCallbackController: messageStatusController.messageStatusCallbackController,
169
171
  addQualityVoteController: qualityMessageController.addQualityVoteController,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@peopl-health/nexus",
3
- "version": "4.2.7",
3
+ "version": "4.2.9",
4
4
  "description": "Core messaging and assistant library for WhatsApp communication platforms",
5
5
  "keywords": [
6
6
  "whatsapp",