@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
@@ -48,7 +48,13 @@ async function like(token, externalId, socialAccountId, logger) {
48
48
  response: JSON.stringify(response)
49
49
  });
50
50
  } catch (err) {
51
- (0, _loggerHelpers.loggerError)(logger, `Linkedin Like or Unlike Exception`, err);
51
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - like`, {
52
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
53
+ externalId,
54
+ socialAccountId,
55
+ error: err?.message
56
+ })
57
+ });
52
58
  throw err;
53
59
  }
54
60
  return response.connection || response;
@@ -74,7 +80,13 @@ async function unlike(token, externalId, socialAccountId, logger) {
74
80
  response: JSON.stringify(response)
75
81
  });
76
82
  } catch (err) {
77
- (0, _loggerHelpers.loggerError)(logger, `Linkedin Like or Unlike Exception`, err);
83
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - unlike`, {
84
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
85
+ externalId,
86
+ socialAccountId,
87
+ error: err?.message
88
+ })
89
+ });
78
90
  throw err;
79
91
  }
80
92
  return response.connection || response;
@@ -97,8 +109,14 @@ async function deleteMessage(token, externalId, sourceId, inReplyToId, logger) {
97
109
  response: JSON.stringify(response)
98
110
  });
99
111
  } catch (err) {
100
- (0, _loggerHelpers.loggerError)(logger, `Linkedin Delete exception details`, {
101
- err
112
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - deleteMessage`, {
113
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
114
+ externalId,
115
+ commentId,
116
+ inReplyToId,
117
+ sourceId,
118
+ error: err?.message
119
+ })
102
120
  });
103
121
  throw err;
104
122
  }
@@ -224,7 +242,14 @@ async function publish(token, discussionType, mediaId, inReplyToId, socialAccoun
224
242
  });
225
243
  }
226
244
  } catch (err) {
227
- (0, _loggerHelpers.loggerError)(logger, `Exception in linkedin publish `, err);
245
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - publish`, {
246
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
247
+ inReplyToId,
248
+ discussionType,
249
+ socialAccountId,
250
+ error: err?.response?.body?.message ?? err?.message
251
+ })
252
+ });
228
253
  throw err;
229
254
  }
230
255
  return {
@@ -245,7 +270,13 @@ async function getImageMedia(mediaId, token, logger) {
245
270
  'LinkedIn-Version': LINKEDIN_VERSION
246
271
  });
247
272
  } catch (error) {
248
- (0, _loggerHelpers.loggerError)(logger, 'Error in getImageMedia', error);
273
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getImageMedia`, {
274
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
275
+ mediaId,
276
+ error: error?.message
277
+ })
278
+ });
279
+ throw error;
249
280
  }
250
281
  let {
251
282
  downloadUrl
@@ -255,8 +286,11 @@ async function getImageMedia(mediaId, token, logger) {
255
286
  downloadUrl
256
287
  };
257
288
  } else {
258
- (0, _loggerHelpers.loggerError)(logger, `Invalid response getting Linkedin media for mediaId: ${mediaId} `, {
259
- response: JSON.stringify(response)
289
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getImageMedia bad status`, {
290
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
291
+ mediaId,
292
+ responseBody: response.body
293
+ })
260
294
  });
261
295
  return {};
262
296
  }
@@ -280,7 +314,13 @@ async function getVideoMedia(mediaId, token, logger) {
280
314
  'LinkedIn-Version': LINKEDIN_VERSION
281
315
  });
282
316
  } catch (error) {
283
- (0, _loggerHelpers.loggerError)(logger, 'Error in getVideoMedia', error);
317
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getVideoMedia`, {
318
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
319
+ mediaId,
320
+ error: error?.message
321
+ })
322
+ });
323
+ throw error;
284
324
  }
285
325
  let {
286
326
  thumbnail,
@@ -292,8 +332,11 @@ async function getVideoMedia(mediaId, token, logger) {
292
332
  downloadUrl
293
333
  };
294
334
  } else {
295
- (0, _loggerHelpers.loggerError)(logger, `Invalid response getting Linkedin media for mediaId: ${mediaId} `, {
296
- response: JSON.stringify(response)
335
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getVideoMedia bad status`, {
336
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
337
+ mediaId,
338
+ responseBody: response.body
339
+ })
297
340
  });
298
341
  return {};
299
342
  }
@@ -303,28 +346,24 @@ async function getMedia(token, mediaId, type, logger) {
303
346
  if (type.includes('video') && mediaId.includes('image')) {
304
347
  type = 'image/jpeg';
305
348
  }
306
- try {
307
- if (type.includes('image')) {
308
- const {
309
- downloadUrl
310
- } = await getImageMedia(mediaId, token, logger);
311
- return {
312
- downloadUrl
313
- };
314
- } else if (type.includes('video')) {
315
- const {
316
- thumbnail,
317
- downloadUrl
318
- } = await getVideoMedia(mediaId, token, logger);
319
- return {
320
- thumbnail,
321
- downloadUrl
322
- };
323
- }
324
- return {};
325
- } catch (error) {
326
- (0, _loggerHelpers.loggerError)(logger, 'Error in getMedia', error);
349
+ if (type.includes('image')) {
350
+ const {
351
+ downloadUrl
352
+ } = await getImageMedia(mediaId, token, logger);
353
+ return {
354
+ downloadUrl
355
+ };
356
+ } else if (type.includes('video')) {
357
+ const {
358
+ thumbnail,
359
+ downloadUrl
360
+ } = await getVideoMedia(mediaId, token, logger);
361
+ return {
362
+ thumbnail,
363
+ downloadUrl
364
+ };
327
365
  }
366
+ return {};
328
367
  }
329
368
  async function mediaUploadURL(token, socialAccountId, logger) {
330
369
  let query = `${LINKEDIN_API}/images?action=initializeUpload`;
@@ -347,7 +386,13 @@ async function mediaUploadURL(token, socialAccountId, logger) {
347
386
  };
348
387
  return response;
349
388
  } catch (err) {
350
- (0, _loggerHelpers.loggerError)(logger, `Exception linkedin media register `, err);
389
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - mediaUploadURL`, {
390
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
391
+ socialAccountId,
392
+ error: err?.response?.body?.message ?? err?.message
393
+ })
394
+ });
395
+ throw err;
351
396
  }
352
397
  }
353
398
  async function getProfile(urn, token, logger) {
@@ -362,8 +407,13 @@ async function getProfile(urn, token, logger) {
362
407
  'LinkedIn-Version': LINKEDIN_VERSION
363
408
  }).then(result => result.body);
364
409
  } catch (error) {
365
- (0, _loggerHelpers.loggerError)(logger, `Failed requesting LinkedIn API for profileId ${urn}`, error);
366
- return;
410
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getProfile`, {
411
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
412
+ urn,
413
+ error: error?.message
414
+ })
415
+ });
416
+ throw error;
367
417
  }
368
418
  (0, _loggerHelpers.loggerInfo)(logger, `Finished requesting LinkedIn API for profileId ${urn}`);
369
419
  return profile;
@@ -390,7 +440,13 @@ async function getOrganization(urn, token, logger) {
390
440
  id: 'private'
391
441
  };
392
442
  }
393
- (0, _loggerHelpers.loggerError)(logger, `Failed requesting LinkedIn API for organizationId ${urn}`, error);
443
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getOrganization`, {
444
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
445
+ urn,
446
+ error: error?.message
447
+ })
448
+ });
449
+ throw error;
394
450
  }
395
451
  (0, _loggerHelpers.loggerInfo)(logger, `Finished requesting LinkedIn API for organizationId ${urn}`);
396
452
  return organization;
@@ -404,7 +460,13 @@ async function getMediaFromUrl(token, url, logger) {
404
460
  });
405
461
  return response;
406
462
  } catch (error) {
407
- (0, _loggerHelpers.loggerError)(logger, 'Error in getMediaFromUrl', error);
463
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getMediaFromUrl`, {
464
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
465
+ url,
466
+ error: error?.message
467
+ })
468
+ });
469
+ throw error;
408
470
  }
409
471
  }
410
472
  async function getOrganizations(urn, token, logger) {
@@ -421,7 +483,14 @@ async function getOrganizations(urn, token, logger) {
421
483
  return res.results[id];
422
484
  });
423
485
  } catch (error) {
424
- (0, _loggerHelpers.loggerError)(logger, `Failed requesting LinkedIn API for organization id ${id}`, error);
486
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getOrganizations`, {
487
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
488
+ urn,
489
+ id,
490
+ error: error?.message
491
+ })
492
+ });
493
+ throw error;
425
494
  }
426
495
  (0, _loggerHelpers.loggerInfo)(logger, `Finished requesting LinkedIn API for organization id ${id}`);
427
496
  return organizations;
@@ -436,7 +505,13 @@ async function getAllStats(externalId, token, logger) {
436
505
  'LinkedIn-Version': LINKEDIN_VERSION
437
506
  });
438
507
  } catch (error) {
439
- (0, _loggerHelpers.loggerError)(logger, 'Error in getAllStats', error);
508
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getAllStats`, {
509
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
510
+ externalId,
511
+ error: error?.message
512
+ })
513
+ });
514
+ throw error;
440
515
  }
441
516
  let {
442
517
  commentSummary,
@@ -448,27 +523,26 @@ async function getAllStats(externalId, token, logger) {
448
523
  reactionSummaries
449
524
  };
450
525
  } else {
451
- (0, _loggerHelpers.loggerError)(logger, `Invalid response getting all Linkedin Stats for externalId: ${externalId}`, {
452
- response: JSON.stringify(response)
526
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - getAllStats bad status`, {
527
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
528
+ externalId,
529
+ responseBody: response.body
530
+ })
453
531
  });
454
532
  return {};
455
533
  }
456
534
  }
457
535
  async function getSocialStats(externalId, token, logger) {
458
- try {
459
- // get all stats (likes are not to be trusted) seems to only work
460
- // for og posts.
461
- const {
462
- commentSummary,
463
- reactionSummaries
464
- } = await getAllStats(externalId, token, logger);
465
- return {
466
- commentSummary,
467
- reactionSummaries
468
- };
469
- } catch (error) {
470
- (0, _loggerHelpers.loggerError)(logger, 'Error in getSocialStats', error);
471
- }
536
+ // get all stats (likes are not to be trusted) seems to only work
537
+ // for og posts.
538
+ const {
539
+ commentSummary,
540
+ reactionSummaries
541
+ } = await getAllStats(externalId, token, logger);
542
+ return {
543
+ commentSummary,
544
+ reactionSummaries
545
+ };
472
546
  }
473
547
  async function likedByUser(token, externalId, authorExternalId, logger) {
474
548
  let result;
@@ -499,7 +573,12 @@ async function uploadMedia(query, logger) {
499
573
  'X-RestLi-Protocol-Version': LINKEDIN_API_VERSION,
500
574
  'LinkedIn-Version': LINKEDIN_VERSION
501
575
  }).send(data).catch(err => {
502
- (0, _loggerHelpers.loggerError)(logger, "Linkedin Error uploading Media", err);
576
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call linkedin api - uploadMedia`, {
577
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
578
+ url,
579
+ error: err?.message
580
+ })
581
+ });
503
582
  throw err;
504
583
  });
505
584
  }
@@ -68,7 +68,12 @@ async function confirmCreationId(accessToken, creationId, logger) {
68
68
  try {
69
69
  return await retryWithBackoff(operation, MAX_RETRY_COUNT, SHORT_WAIT_TIME_MS, logger);
70
70
  } catch (error) {
71
- (0, _loggerHelpers.loggerError)(logger, `Creation ID ${creationId} confirmation failed: ${error.message}`, error);
71
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call threads api - confirmCreationId`, {
72
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
73
+ creationId,
74
+ error: error?.message
75
+ })
76
+ });
72
77
  error.code = 408; // Request Timeout
73
78
  throw error;
74
79
  }
@@ -83,18 +88,30 @@ async function confirmCreationId(accessToken, creationId, logger) {
83
88
  * @throws {Error} If the request fails.
84
89
  */
85
90
  async function sendRequest(apiUrl, params, logger) {
91
+ let response;
86
92
  try {
87
- const response = await _superagent.default.get(apiUrl).set('Accept', 'application/json').set('Content-Type', 'application/json').query(params).send();
88
- if (response.status !== 200) {
89
- throw new Error(`Unexpected response status: ${response.status}`);
90
- }
91
- (0, _loggerHelpers.loggerDebug)(logger, 'Threads Response status', response.status);
92
- return response;
93
+ response = await _superagent.default.get(apiUrl).set('Accept', 'application/json').set('Content-Type', 'application/json').query(params).send();
93
94
  } catch (err) {
94
- const errorMessage = err?.response?.body?.error?.message || err.message;
95
- (0, _loggerHelpers.loggerError)(logger, `Failed to call Threads API: ${errorMessage}`, err);
95
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call threads api - sendRequest`, {
96
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
97
+ apiUrl,
98
+ error: err?.response?.body?.error?.message ?? err?.message
99
+ })
100
+ });
96
101
  throw err;
97
102
  }
103
+ if (response.status !== 200) {
104
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call threads api - sendRequest bad status`, {
105
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
106
+ apiUrl,
107
+ status: response.status,
108
+ responseBody: response.body
109
+ })
110
+ });
111
+ throw new Error(`Unexpected response status: ${response.status}`);
112
+ }
113
+ (0, _loggerHelpers.loggerDebug)(logger, 'Threads Response status', response.status);
114
+ return response;
98
115
  }
99
116
 
100
117
  /**
@@ -106,18 +123,30 @@ async function sendRequest(apiUrl, params, logger) {
106
123
  * @throws {Error} If the request fails.
107
124
  */
108
125
  async function requestApi(apiUrl, params, logger) {
126
+ let response;
109
127
  try {
110
- const response = await _superagent.default.post(apiUrl).set('Accept', 'application/json').set('Content-Type', 'application/json').query(params).send();
111
- if (response.status !== 200) {
112
- throw new Error(`Unexpected response status: ${response.status}`);
113
- }
114
- (0, _loggerHelpers.loggerDebug)(logger, 'Threads Response status', response.status);
115
- return response;
128
+ response = await _superagent.default.post(apiUrl).set('Accept', 'application/json').set('Content-Type', 'application/json').query(params).send();
116
129
  } catch (err) {
117
- const errorMessage = err?.response?.body?.error?.message || err.message;
118
- (0, _loggerHelpers.loggerError)(logger, `Failed to call Threads API: ${errorMessage}`, err);
130
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call threads api - requestApi`, {
131
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
132
+ apiUrl,
133
+ error: err?.response?.body?.error?.message ?? err?.message
134
+ })
135
+ });
119
136
  throw err;
120
137
  }
138
+ if (response.status !== 200) {
139
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call threads api - requestApi bad status`, {
140
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
141
+ apiUrl,
142
+ status: response.status,
143
+ responseBody: response.body
144
+ })
145
+ });
146
+ throw new Error(`Unexpected response status: ${response.status}`);
147
+ }
148
+ (0, _loggerHelpers.loggerDebug)(logger, 'Threads Response status', response.status);
149
+ return response;
121
150
  }
122
151
 
123
152
  /**
@@ -285,7 +314,13 @@ async function constructReplyQuery(accessToken, inReplyToId, text, asset, logger
285
314
  creation_id: containerResponse.body.id
286
315
  };
287
316
  } catch (error) {
288
- (0, _loggerHelpers.loggerError)(logger, 'Error constructing reply query', error);
317
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call threads api - constructReplyQuery`, {
318
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
319
+ inReplyToId,
320
+ isQuote,
321
+ error: error?.message
322
+ })
323
+ });
289
324
  throw error;
290
325
  }
291
326
  }
@@ -185,16 +185,21 @@ async function sendRequest(token) {
185
185
  try {
186
186
  response = await _superagent.default.get(TIKTOK_API_URL + paramString).set('Accept', 'application/json').set('Content-Type', 'application/json').set('Access-Token', token).send();
187
187
  } catch (err) {
188
- if (err && err.response && err.response.body && err.response.body.error) {
189
- (0, _loggerHelpers.loggerError)(logger, `Failed to call tiktok api for paramString ${paramString}: ${err.response.body.error.message}`);
190
- } else {
191
- (0, _loggerHelpers.loggerError)(logger, `Failed to call tiktok api for paramString ${paramString}`, err);
192
- }
188
+ (0, _loggerHelpers.loggerInfo)(logger, 'Failed to call tiktok api - sendRequest', {
189
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
190
+ paramString,
191
+ error: err?.response?.body?.error?.message ?? err?.message
192
+ })
193
+ });
193
194
  throw err;
194
195
  }
195
196
  if (response.status !== 200) {
196
- (0, _loggerHelpers.loggerError)(logger, `Failed to call tiktok api`, {
197
- [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify(response.body)
197
+ (0, _loggerHelpers.loggerInfo)(logger, 'Failed to call tiktok api - sendRequest', {
198
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
199
+ paramString,
200
+ status: response.status,
201
+ body: response.body
202
+ })
198
203
  });
199
204
  let error = new Error(`Failed to call tiktok api`);
200
205
  error.code = response.status;
@@ -210,11 +215,12 @@ async function sendPost(token) {
210
215
  try {
211
216
  response = await _superagent.default.post(TIKTOK_API_URL + paramString).set('Accept', 'application/json').set('Content-Type', 'application/json').set('Access-Token', token).send(postData);
212
217
  } catch (err) {
213
- if (err && err.response && err.response.body && err.response.body.error) {
214
- (0, _loggerHelpers.loggerError)(logger, `Failed to call tiktok api for paramString ${paramString}: ${err.response.body.error.message}`);
215
- } else {
216
- (0, _loggerHelpers.loggerError)(logger, `Failed to call tiktok api for paramString ${paramString}`, err);
217
- }
218
+ (0, _loggerHelpers.loggerInfo)(logger, 'Failed to call tiktok api - sendPost', {
219
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
220
+ paramString,
221
+ error: err?.response?.body?.error?.message ?? err?.message
222
+ })
223
+ });
218
224
  throw err;
219
225
  }
220
226
  return response;