@meltwater/conversations-api-services 1.3.1 → 1.4.0

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.
Files changed (29) hide show
  1. package/.github/workflows/release.yml +4 -6
  2. package/CLAUDE.md +70 -0
  3. package/README.md +1 -1
  4. package/dist/cjs/data-access/http/facebook.native.js +122 -106
  5. package/dist/cjs/data-access/http/instagram.native.js +92 -49
  6. package/dist/cjs/data-access/http/linkedin.native.js +135 -56
  7. package/dist/cjs/data-access/http/threads.native.js +53 -18
  8. package/dist/cjs/data-access/http/tiktok.native.js +18 -12
  9. package/dist/cjs/data-access/http/twitter.native.js +142 -40
  10. package/dist/cjs/data-access/http/youtube.native.js +19 -13
  11. package/dist/esm/data-access/http/facebook.native.js +123 -107
  12. package/dist/esm/data-access/http/instagram.native.js +93 -50
  13. package/dist/esm/data-access/http/linkedin.native.js +136 -57
  14. package/dist/esm/data-access/http/threads.native.js +54 -19
  15. package/dist/esm/data-access/http/tiktok.native.js +19 -13
  16. package/dist/esm/data-access/http/twitter.native.js +143 -41
  17. package/dist/esm/data-access/http/youtube.native.js +20 -14
  18. package/package.json +1 -3
  19. package/src/data-access/http/README.md +50 -0
  20. package/src/data-access/http/facebook.native.js +122 -144
  21. package/src/data-access/http/instagram.native.js +113 -93
  22. package/src/data-access/http/linkedin.native.js +144 -83
  23. package/src/data-access/http/threads.native.js +58 -27
  24. package/src/data-access/http/tiktok.native.js +19 -39
  25. package/src/data-access/http/twitter.native.js +145 -65
  26. package/src/data-access/http/youtube.native.js +21 -40
  27. package/dist/cjs/lib/hiddenComment.helper.js +0 -119
  28. package/dist/esm/lib/hiddenComment.helper.js +0 -112
  29. package/src/lib/hiddenComment.helper.js +0 -107
@@ -94,7 +94,12 @@ async function makeTwitterV2Request(v2Endpoint, v1FallbackQuery, token, logger)
94
94
  source: 'v1.1'
95
95
  };
96
96
  } catch (fallbackError) {
97
- (0, _loggerHelpers.loggerError)(logger, `Both v2 and v1.1 APIs failed for ${v2Endpoint}`, fallbackError);
97
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - makeTwitterV2Request`, {
98
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
99
+ v2Endpoint,
100
+ error: fallbackError?.message
101
+ })
102
+ });
98
103
  }
99
104
  }
100
105
  return {
@@ -144,17 +149,25 @@ function normalizeUsersData(users) {
144
149
  * @returns {Promise<Object>} User data from v2 API
145
150
  */
146
151
  async function getAuthenticatedUser(token, logger) {
152
+ const apiUrl = 'https://api.x.com/2/users/me';
147
153
  try {
148
154
  const result = await getRequest({
149
155
  token,
150
- uri: 'https://api.x.com/2/users/me',
156
+ uri: apiUrl,
151
157
  attachUrlPrefix: false,
152
158
  convertPayloadToUri: false,
153
159
  logger
154
160
  });
155
161
  return result.data;
156
162
  } catch (e) {
157
- (0, _loggerHelpers.loggerError)(logger, `Error getting authenticated user info`, e);
163
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - getAuthenticatedUser`, {
164
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
165
+ apiUrl,
166
+ status: e?.response?.status,
167
+ responseBody: e?.response?.body,
168
+ error: e?.response?.body?.errors?.[0]?.message ?? e?.message
169
+ })
170
+ });
158
171
  throw e;
159
172
  }
160
173
  }
@@ -198,8 +211,12 @@ async function getUserInfoFromHandles(token, handles, logger) {
198
211
  const normalizedData = normalizeUsersData(result.data, result.source);
199
212
  return normalizedData || [];
200
213
  } catch (e) {
201
- (0, _loggerHelpers.loggerError)(logger, `Unexpected error in getUserInfoFromHandles`, e);
202
- return [];
214
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - getUserInfoFromHandles`, {
215
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
216
+ error: e?.message
217
+ })
218
+ });
219
+ throw e;
203
220
  }
204
221
  }
205
222
  async function getUserInfoFromHandle(token, handleId, logger) {
@@ -221,7 +238,13 @@ async function getUserInfoFromHandle(token, handleId, logger) {
221
238
  throw result.error || new Error('Failed to get user info from both APIs');
222
239
  }
223
240
  } catch (e) {
224
- (0, _loggerHelpers.loggerError)(logger, `Error in getUserInfoFromHandle with handleId: ${JSON.stringify(handleId)}`, e);
241
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - getUserInfoFromHandle`, {
242
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
243
+ handleId,
244
+ error: e?.message
245
+ })
246
+ });
247
+ throw e;
225
248
  }
226
249
  }
227
250
  async function getDirectMessageImage(token, imageUrl, logger) {
@@ -237,7 +260,12 @@ async function getDirectMessageImage(token, imageUrl, logger) {
237
260
  contentType: result.contentType
238
261
  };
239
262
  } catch (e) {
240
- (0, _loggerHelpers.loggerError)(logger, `Error getting image`, e);
263
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - getDirectMessageImage`, {
264
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
265
+ imageUrl,
266
+ error: e?.message
267
+ })
268
+ });
241
269
  throw e;
242
270
  }
243
271
  }
@@ -257,7 +285,13 @@ async function getCurrentInfo(token, externalId, logger) {
257
285
  result.data.retweeted = !!result.data.current_user_retweet;
258
286
  return result.data.data[0].public_metrics;
259
287
  } catch (error) {
260
- (0, _loggerHelpers.loggerDebug)(logger, 'Error in twitter getCurrentInfo', error);
288
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - getCurrentInfo`, {
289
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
290
+ externalId,
291
+ error: error?.message
292
+ })
293
+ });
294
+ throw error;
261
295
  }
262
296
  }
263
297
  async function getMentionHandleInfo(token, externalId, logger) {
@@ -272,7 +306,13 @@ async function getMentionHandleInfo(token, externalId, logger) {
272
306
  });
273
307
  return result.data;
274
308
  } catch (error) {
275
- (0, _loggerHelpers.loggerDebug)(logger, 'Error in twitter getMentionHandleInfo', error);
309
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - getMentionHandleInfo`, {
310
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
311
+ externalId,
312
+ error: error?.message
313
+ })
314
+ });
315
+ throw error;
276
316
  }
277
317
  }
278
318
  async function retweet(token, sourceId, externalId, logger) {
@@ -293,7 +333,14 @@ async function retweet(token, sourceId, externalId, logger) {
293
333
  return false;
294
334
  }
295
335
  } catch (error) {
296
- (0, _loggerHelpers.loggerDebug)(logger, `Error in retweet user: ${sourceId}`, error);
336
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - retweet`, {
337
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
338
+ sourceId,
339
+ externalId,
340
+ error: error?.message
341
+ })
342
+ });
343
+ throw error;
297
344
  }
298
345
  }
299
346
  async function unRetweet(token, sourceId, externalId, logger) {
@@ -309,15 +356,20 @@ async function unRetweet(token, sourceId, externalId, logger) {
309
356
  return false;
310
357
  }
311
358
  } catch (error) {
312
- (0, _loggerHelpers.loggerDebug)(logger, `Error in unretweet user: ${sourceId}`, error, {
313
- [MeltwaterAttributes.SOCIALEXTERNALID]: externalId
359
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - unRetweet`, {
360
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
361
+ sourceId,
362
+ externalId,
363
+ error: error?.message
364
+ })
314
365
  });
366
+ throw error;
315
367
  }
316
368
  }
317
369
  async function like(token, externalId, logger) {
370
+ let authenticatedUser = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
318
371
  try {
319
- // Get the authenticated user's ID first
320
- const userInfo = await getAuthenticatedUser(token, logger);
372
+ const userInfo = authenticatedUser ?? (await getAuthenticatedUser(token, logger));
321
373
  const userId = userInfo.data.id;
322
374
  let response = await postRequest({
323
375
  token,
@@ -338,14 +390,19 @@ async function like(token, externalId, logger) {
338
390
  return false;
339
391
  }
340
392
  } catch (error) {
341
- (0, _loggerHelpers.loggerDebug)(logger, `Twitter Error in like user: ${externalId}`, error);
393
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - like`, {
394
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
395
+ externalId,
396
+ error: error?.message
397
+ })
398
+ });
342
399
  throw error;
343
400
  }
344
401
  }
345
402
  async function unLike(token, externalId, logger) {
403
+ let authenticatedUser = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
346
404
  try {
347
- // Get the authenticated user's ID first
348
- const userInfo = await getAuthenticatedUser(token, logger);
405
+ const userInfo = authenticatedUser ?? (await getAuthenticatedUser(token, logger));
349
406
  const userId = userInfo.data.id;
350
407
  let response = await deleteRequest({
351
408
  token,
@@ -360,14 +417,19 @@ async function unLike(token, externalId, logger) {
360
417
  return false;
361
418
  }
362
419
  } catch (error) {
363
- (0, _loggerHelpers.loggerDebug)(logger, `Error in unlike user: ${externalId}`, error);
420
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - unLike`, {
421
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
422
+ externalId,
423
+ error: error?.message
424
+ })
425
+ });
364
426
  throw error;
365
427
  }
366
428
  }
367
429
  async function followUser(token, profileId, logger) {
430
+ let authenticatedUser = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
368
431
  try {
369
- // Get the authenticated user's ID first
370
- const userInfo = await getAuthenticatedUser(token, logger);
432
+ const userInfo = authenticatedUser ?? (await getAuthenticatedUser(token, logger));
371
433
  const userId = userInfo.data.id;
372
434
  let response = await postRequest({
373
435
  token,
@@ -385,13 +447,19 @@ async function followUser(token, profileId, logger) {
385
447
  return false;
386
448
  }
387
449
  } catch (error) {
388
- (0, _loggerHelpers.loggerDebug)(logger, `Error in following user: ${profileId}`, error);
450
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - followUser`, {
451
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
452
+ profileId,
453
+ error: error?.message
454
+ })
455
+ });
456
+ throw error;
389
457
  }
390
458
  }
391
459
  async function unFollowUser(token, profileId, logger) {
460
+ let authenticatedUser = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
392
461
  try {
393
- // Get the authenticated user's ID first
394
- const userInfo = await getAuthenticatedUser(token, logger);
462
+ const userInfo = authenticatedUser ?? (await getAuthenticatedUser(token, logger));
395
463
  const userId = userInfo.data.id;
396
464
  let response = await deleteRequest({
397
465
  token,
@@ -406,13 +474,19 @@ async function unFollowUser(token, profileId, logger) {
406
474
  return false;
407
475
  }
408
476
  } catch (error) {
409
- (0, _loggerHelpers.loggerDebug)(logger, `Error in unfollowing user: ${profileId}`, error);
477
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - unFollowUser`, {
478
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
479
+ profileId,
480
+ error: error?.message
481
+ })
482
+ });
483
+ throw error;
410
484
  }
411
485
  }
412
486
  async function userFollowStatus(token, profileId, logger) {
487
+ let authenticatedUser = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
413
488
  try {
414
- // Get the authenticated user's ID first
415
- const userInfo = await getAuthenticatedUser(token, logger);
489
+ const userInfo = authenticatedUser ?? (await getAuthenticatedUser(token, logger));
416
490
  const userId = userInfo.data.id;
417
491
 
418
492
  // Check if authenticated user is following the target user
@@ -444,7 +518,7 @@ async function userFollowStatus(token, profileId, logger) {
444
518
  if (error.message != 'Bad Request') {
445
519
  // if we hit a minor rate limit here, we wait for 5 seconds before attempting again, usually long enough to continue
446
520
  await new Promise(r => setTimeout(r, 5000));
447
- return userFollowStatus(token, profileId, logger);
521
+ return userFollowStatus(token, profileId, logger, authenticatedUser);
448
522
  }
449
523
  }
450
524
  }
@@ -503,7 +577,14 @@ async function getBrandUserRelationship(token, profileId, brandProfileId, logger
503
577
  }
504
578
  };
505
579
  } catch (error) {
506
- (0, _loggerHelpers.loggerDebug)(logger, `Error in getting user brand friendship info: ${profileId} and ${brandProfileId}`, error);
580
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - getBrandUserRelationship`, {
581
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
582
+ profileId,
583
+ brandProfileId,
584
+ error: error?.message
585
+ })
586
+ });
587
+ throw error;
507
588
  }
508
589
  }
509
590
  async function createTweet(token, text, attachment, logger) {
@@ -715,7 +796,6 @@ async function publishTweet(token, payload, query, isDirectMessage, logger) {
715
796
  );
716
797
  return normalizedResponse;
717
798
  } catch (err) {
718
- (0, _loggerHelpers.loggerError)(logger, `Twitter publish exception details`, err);
719
799
  throw err;
720
800
  }
721
801
  }
@@ -748,7 +828,6 @@ async function publishDirectMessage(token, payload, query, logger) {
748
828
  const normalizedResponse = normalizeTwitterResponse(response, 'dm', logger);
749
829
  return normalizedResponse;
750
830
  } catch (err) {
751
- (0, _loggerHelpers.loggerError)(logger, `Twitter DM send failed`, err);
752
831
  throw err;
753
832
  }
754
833
  }
@@ -869,10 +948,14 @@ async function doRequest(_ref5) {
869
948
  });
870
949
  return reject(e);
871
950
  }
872
- (0, _loggerHelpers.loggerError)(logger, `Error in twitter doRequest`, e, {
873
- url,
874
- convertPayloadToUri,
875
- payload: JSON.stringify(payload)
951
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - doRequest`, {
952
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
953
+ url,
954
+ convertPayloadToUri,
955
+ payload: JSON.stringify(payload),
956
+ status: e?.response?.status,
957
+ error: e?.response?.body?.errors?.[0]?.message ?? e?.message
958
+ })
876
959
  });
877
960
  reject(e);
878
961
  }
@@ -942,7 +1025,6 @@ async function uploadMedia(attachment, token, discussionType, logger) {
942
1025
  return mediaIdString;
943
1026
  }
944
1027
  } catch (e) {
945
- (0, _loggerHelpers.loggerError)(logger, `Failed uploading media`, e);
946
1028
  if (filePath) {
947
1029
  removeMedia(filePath, logger);
948
1030
  }
@@ -977,7 +1059,13 @@ async function simpleMediaUpload(fileData, mimeType, mediaCategory, token, logge
977
1059
  });
978
1060
  return result.body.media_id_string;
979
1061
  } catch (e) {
980
- (0, _loggerHelpers.loggerError)(logger, 'Error in simple media upload', e);
1062
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - simpleMediaUpload`, {
1063
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
1064
+ mimeType,
1065
+ mediaCategory,
1066
+ error: e?.message
1067
+ })
1068
+ });
981
1069
  throw e;
982
1070
  }
983
1071
  }
@@ -1034,7 +1122,6 @@ async function chunkedMediaUpload(filePath, fileSize, mimeType, mediaCategory, t
1034
1122
  }
1035
1123
  return mediaId;
1036
1124
  } catch (e) {
1037
- (0, _loggerHelpers.loggerError)(logger, 'Error in chunked media upload', e);
1038
1125
  throw e;
1039
1126
  }
1040
1127
  }
@@ -1085,7 +1172,12 @@ async function mediaUploadRequest(params, token, logger) {
1085
1172
  const result = await request;
1086
1173
  return result.body;
1087
1174
  } catch (e) {
1088
- (0, _loggerHelpers.loggerError)(logger, `Media upload request failed for command: ${params.command}`, e);
1175
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - mediaUploadRequest`, {
1176
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
1177
+ command: params.command,
1178
+ error: e?.message
1179
+ })
1180
+ });
1089
1181
  throw e;
1090
1182
  }
1091
1183
  }
@@ -1126,10 +1218,20 @@ function removeMedia(file, logger) {
1126
1218
  try {
1127
1219
  _fs.default.unlink(file, function (err) {
1128
1220
  if (err) {
1129
- (0, _loggerHelpers.loggerError)(logger, `Failed removing ${file}`, err);
1221
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - removeMedia`, {
1222
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
1223
+ file,
1224
+ error: err?.message
1225
+ })
1226
+ });
1130
1227
  }
1131
1228
  });
1132
1229
  } catch (e) {
1133
- (0, _loggerHelpers.loggerError)(logger, `failed trying to remove media ${file} it may have already been removed`);
1230
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call twitter api - removeMedia`, {
1231
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
1232
+ file,
1233
+ error: e?.message
1234
+ })
1235
+ });
1134
1236
  }
1135
1237
  }
@@ -21,11 +21,12 @@ async function sendPost(token) {
21
21
  try {
22
22
  response = await _superagent.default.post(YOUTUBE_API_URL + paramString).set('Accept', 'application/json').set('Content-Type', 'application/json').set('Authorization', `Bearer ${token}`).send(postData);
23
23
  } catch (err) {
24
- if (err && err.response && err.response.body && err.response.body.error) {
25
- (0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}: ${err.response.body.error.message}`);
26
- } else {
27
- (0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}`, err);
28
- }
24
+ (0, _loggerHelpers.loggerInfo)(logger, 'Failed to call youtube api - sendPost', {
25
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
26
+ paramString,
27
+ error: err?.response?.body?.error?.message ?? err?.message
28
+ })
29
+ });
29
30
  throw err;
30
31
  }
31
32
  return response;
@@ -37,18 +38,23 @@ async function sendRequest(token) {
37
38
  try {
38
39
  response = await _superagent.default.get(YOUTUBE_API_URL + paramString).set('Accept', 'application/json').set('Content-Type', 'application/json').set('Authorization', `Bearer ${token}`).send();
39
40
  } catch (err) {
40
- if (err && err.response && err.response.body && err.response.body.error) {
41
- (0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}: ${err.response.body.error.message}`);
42
- } else {
43
- (0, _loggerHelpers.loggerError)(logger, `Failed to call youtube api for paramString ${paramString}`, err);
44
- }
41
+ (0, _loggerHelpers.loggerInfo)(logger, 'Failed to call youtube api - sendRequest', {
42
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
43
+ paramString,
44
+ error: err?.response?.body?.error?.message ?? err?.message
45
+ })
46
+ });
45
47
  throw err;
46
48
  }
47
49
  if (response.status !== 200) {
48
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api`, {
49
- responseBody: JSON.stringify(response.body)
50
+ (0, _loggerHelpers.loggerInfo)(logger, 'Failed to call youtube api - sendRequest', {
51
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
52
+ paramString,
53
+ status: response.status,
54
+ body: response.body
55
+ })
50
56
  });
51
- let error = new Error(`Failed to call facebook api`);
57
+ let error = new Error(`Failed to call youtube api`);
52
58
  error.code = response.status;
53
59
  throw error;
54
60
  }