@meltwater/conversations-api-services 1.3.2 → 1.4.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.
Files changed (28) hide show
  1. package/.github/workflows/release.yml +4 -6
  2. package/CLAUDE.md +70 -0
  3. package/dist/cjs/data-access/http/facebook.native.js +129 -110
  4. package/dist/cjs/data-access/http/instagram.native.js +92 -49
  5. package/dist/cjs/data-access/http/linkedin.native.js +135 -56
  6. package/dist/cjs/data-access/http/threads.native.js +53 -18
  7. package/dist/cjs/data-access/http/tiktok.native.js +18 -12
  8. package/dist/cjs/data-access/http/twitter.native.js +142 -40
  9. package/dist/cjs/data-access/http/youtube.native.js +19 -13
  10. package/dist/esm/data-access/http/facebook.native.js +130 -111
  11. package/dist/esm/data-access/http/instagram.native.js +93 -50
  12. package/dist/esm/data-access/http/linkedin.native.js +136 -57
  13. package/dist/esm/data-access/http/threads.native.js +54 -19
  14. package/dist/esm/data-access/http/tiktok.native.js +19 -13
  15. package/dist/esm/data-access/http/twitter.native.js +143 -41
  16. package/dist/esm/data-access/http/youtube.native.js +20 -14
  17. package/package.json +1 -3
  18. package/src/data-access/http/README.md +50 -0
  19. package/src/data-access/http/facebook.native.js +132 -148
  20. package/src/data-access/http/instagram.native.js +113 -93
  21. package/src/data-access/http/linkedin.native.js +144 -83
  22. package/src/data-access/http/threads.native.js +58 -27
  23. package/src/data-access/http/tiktok.native.js +19 -39
  24. package/src/data-access/http/twitter.native.js +145 -65
  25. package/src/data-access/http/youtube.native.js +21 -40
  26. package/dist/cjs/lib/hiddenComment.helper.js +0 -119
  27. package/dist/esm/lib/hiddenComment.helper.js +0 -112
  28. package/src/lib/hiddenComment.helper.js +0 -107
@@ -21,20 +21,18 @@ jobs:
21
21
  uses: actions/checkout@v3
22
22
  with:
23
23
  fetch-depth: 0
24
- persist-credential: false
24
+ persist-credentials: false
25
25
  token: ${{ secrets.GH_TOKEN }}
26
26
  - name: Setup Node.js
27
- uses: actions/setup-node@v3
27
+ uses: actions/setup-node@v4
28
28
  with:
29
29
  node-version: "lts/*"
30
- - name: NPM Auth Setup
31
- run: echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_TOKEN }}" > ~/.npmrc
32
30
  - name: Install dependencies
31
+ env:
32
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
33
33
  run: npm clean-install
34
34
  - name: Run Babel Build
35
35
  run: npm run build
36
- - name: Verify signatures
37
- run: npm audit signatures
38
36
  - name: Release
39
37
  env:
40
38
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
package/CLAUDE.md ADDED
@@ -0,0 +1,70 @@
1
+ # conversations-api-services — Claude Code Instructions
2
+
3
+ ## `.native` files (`src/data-access/http/*.native.js`)
4
+
5
+ These modules call third-party social platform APIs (Instagram, Facebook, Twitter, etc.) that we do not control. Errors from these APIs are expected and noisy; they should **not** be treated as application errors.
6
+
7
+ ### Logging rules for `.native` files
8
+
9
+ - **Never use `loggerError`** in `.native` files. Use `loggerInfo` instead.
10
+ - **`loggerWarn` is allowed** for expected/known failure cases (e.g. a comment that was probably deleted).
11
+ - **Every log call must include a `PAYLOADDATA` block** with all relevant context available at that point.
12
+ - **Never include tokens, access keys, or credentials** in `PAYLOADDATA`.
13
+
14
+ ### Log message format
15
+
16
+ Log messages must follow this pattern:
17
+
18
+ ```
19
+ 'Failed to call <platform> api - <functionName>' // catch block (request threw)
20
+ 'Failed to call <platform> api - <functionName> bad status' // non-200 status check
21
+ ```
22
+
23
+ For example:
24
+ - `'Failed to call instagram api - requestApi'`
25
+ - `'Failed to call instagram api - getPost bad status'`
26
+
27
+ This makes logs searchable and distinguishable when multiple helper functions exist in the same file.
28
+
29
+ ### PAYLOADDATA pattern
30
+
31
+ ```js
32
+ import { loggerInfo, loggerWarn, MeltwaterAttributes } from '../../lib/logger.helpers.js';
33
+
34
+ // Catch block (request threw):
35
+ loggerInfo(logger, `Failed to call <platform> api - <functionName>`, {
36
+ [MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
37
+ apiUrl, // the URL called (no query string tokens)
38
+ someId, // any IDs relevant to the operation
39
+ error: err?.response?.body?.error?.message ?? err?.message,
40
+ }),
41
+ });
42
+
43
+ // Non-200 status check:
44
+ loggerInfo(logger, `Failed to call <platform> api - <functionName> bad status`, {
45
+ [MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
46
+ apiUrl,
47
+ status: response.status,
48
+ responseBody: response.body,
49
+ }),
50
+ });
51
+ ```
52
+
53
+ > **Do not pre-stringify nested objects** (e.g. `adCampaign`, `responseBody`) before passing them into `JSON.stringify({...})` — the outer call handles serialization. Pre-stringifying causes double-encoding.
54
+
55
+ ### What to include in PAYLOADDATA
56
+
57
+ Include whichever of these are available and relevant to the function:
58
+ - `apiUrl` — the endpoint called
59
+ - `externalId`, `sourceId`, `inReplyToId`, `profileId` — IDs involved in the operation
60
+ - `discussionType`, `hideStatus`, `fields` — operation parameters
61
+ - `status` — HTTP response status code
62
+ - `responseBody` — response body on non-200 status
63
+ - `error` — the error message (`err?.response?.body?.error ?? err?.message`)
64
+
65
+ ### What NOT to include
66
+
67
+ - `accessToken`, `token`, or any credential/key
68
+ - Raw `err` objects (extract `.message` instead)
69
+
70
+ See `instagram.native.js` as the reference implementation.
@@ -21,22 +21,14 @@ var _externalIdHelpers = require("../../lib/externalId.helpers.js");
21
21
  var _loggerHelpers = require("../../lib/logger.helpers.js");
22
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
23
  const FACEBOOK_URL = 'https://graph.facebook.com';
24
+ const versionLock = 'v25.0';
24
25
  async function shareCount(token, externalId, logger) {
25
- try {
26
- const response = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}/?fields=shares`, token);
27
- return response.body.shares && response.body.shares.count;
28
- } catch (error) {
29
- (0, _loggerHelpers.loggerError)(logger, `Facebook shareCount error recieved - ${error.code}`, error);
30
- }
26
+ const response = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}/?fields=shares`, token, undefined, {}, logger);
27
+ return response.body.shares && response.body.shares.count;
31
28
  }
32
29
  async function reactions(token, externalIds, logger) {
33
- try {
34
- const response = await getApi(`${FACEBOOK_URL}?ids=${externalIds.map(externalId => (0, _externalIdHelpers.removePrefix)(externalId)).join(',')}&fields=` + `reactions.limit(0).summary(viewer_reaction).as(fb_post_reaction_of_user),` + `reactions.type(LOVE).limit(0).summary(total_count).as(fb_post_reactions_love),` + `reactions.type(WOW).limit(0).summary(total_count).as(fb_post_reactions_wow),` + `reactions.type(SAD).limit(0).summary(total_count).as(fb_post_reactions_sad),` + `reactions.type(LIKE).limit(0).summary(total_count).as(fb_post_reactions_like),` + `reactions.type(ANGRY).limit(0).summary(total_count).as(fb_post_reactions_angry),` + `reactions.type(HAHA).limit(0).summary(total_count).as(fb_post_reactions_haha)`, token);
35
- return response.body;
36
- } catch (error) {
37
- (0, _loggerHelpers.loggerError)(logger, `Facebook reactions error recieved - ${error.code}`, error);
38
- return undefined;
39
- }
30
+ const response = await getApi(`${FACEBOOK_URL}?ids=${externalIds.map(externalId => (0, _externalIdHelpers.removePrefix)(externalId)).join(',')}&fields=` + `reactions.limit(0).summary(viewer_reaction).as(fb_post_reaction_of_user),` + `reactions.type(LOVE).limit(0).summary(total_count).as(fb_post_reactions_love),` + `reactions.type(WOW).limit(0).summary(total_count).as(fb_post_reactions_wow),` + `reactions.type(SAD).limit(0).summary(total_count).as(fb_post_reactions_sad),` + `reactions.type(LIKE).limit(0).summary(total_count).as(fb_post_reactions_like),` + `reactions.type(ANGRY).limit(0).summary(total_count).as(fb_post_reactions_angry),` + `reactions.type(HAHA).limit(0).summary(total_count).as(fb_post_reactions_haha)`, token, undefined, {}, logger);
31
+ return response.body;
40
32
  }
41
33
  async function comment(token, _ref) {
42
34
  let {
@@ -83,8 +75,12 @@ async function privateMessage(token, _ref2, logger) {
83
75
  });
84
76
  const imageResponse = await _superagent.default.get(attachment.link).responseType('arrayBuffer');
85
77
  if (imageResponse.status !== 200) {
86
- (0, _loggerHelpers.loggerError)(logger, 'Failed to fetch image from CDN', {
87
- responseBody: JSON.stringify(imageResponse.body)
78
+ (0, _loggerHelpers.loggerInfo)(logger, 'Failed to fetch image from CDN', {
79
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
80
+ recipientId,
81
+ status: imageResponse.status,
82
+ responseBody: imageResponse.body
83
+ })
88
84
  });
89
85
  throw new Error('Failed to fetch image from CDN');
90
86
  }
@@ -180,37 +176,36 @@ async function unlike(token, externalId, logger) {
180
176
  return response.body;
181
177
  }
182
178
  async function isUserBanned(token, authorId, pageId, logger) {
183
- try {
184
- if (!pageId) {
185
- // if no pageId to check this call will fail
186
- // should only happen with temp edge docs
187
- return false;
188
- }
189
- const response = await getApi(`${FACEBOOK_URL}/${pageId}/blocked`, token, undefined,
190
- // payload
191
- {
192
- user: (0, _externalIdHelpers.removePrefix)(authorId)
193
- }, logger);
194
- if (response && response.body && response.body.data) {
195
- const userNoPrefix = (0, _externalIdHelpers.removePrefix)(authorId);
196
- const user = response.body.data.find(user => {
197
- if (user.id == userNoPrefix) {
198
- return user;
199
- }
200
- });
201
- if (user) {
202
- return true;
203
- } else {
204
- return false;
179
+ if (!pageId) {
180
+ // if no pageId to check this call will fail
181
+ // should only happen with temp edge docs
182
+ return false;
183
+ }
184
+ const response = await getApi(`${FACEBOOK_URL}/${pageId}/blocked`, token, undefined,
185
+ // payload
186
+ {
187
+ user: (0, _externalIdHelpers.removePrefix)(authorId)
188
+ }, logger);
189
+ if (response && response.body && response.body.data) {
190
+ const userNoPrefix = (0, _externalIdHelpers.removePrefix)(authorId);
191
+ const user = response.body.data.find(user => {
192
+ if (user.id == userNoPrefix) {
193
+ return user;
205
194
  }
206
- }
207
- (0, _loggerHelpers.loggerInfo)(logger, `Native Facebook API is User Banned Response was invalid`, {
208
- responseBody: JSON.stringify(response.body)
209
195
  });
210
- } catch (err) {
211
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api isUserBanned for userId ${authorId} ${pageId}`, err);
196
+ if (user) {
197
+ return true;
198
+ } else {
199
+ return false;
200
+ }
212
201
  }
213
- return false;
202
+ (0, _loggerHelpers.loggerInfo)(logger, `Native Facebook API is User Banned Response was invalid`, {
203
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
204
+ authorId,
205
+ pageId,
206
+ responseBody: response.body
207
+ })
208
+ });
214
209
  }
215
210
  async function getProfile(token, authorId, fields, logger) {
216
211
  if (!authorId) {
@@ -227,16 +222,21 @@ async function getProfile(token, authorId, fields, logger) {
227
222
  try {
228
223
  response = await _superagent.default.get(`${FACEBOOK_URL}/${userNoPrefix}`).set('Accept', 'application/json').set('Content-Type', 'application/json').query(queryParams).send();
229
224
  } catch (err) {
230
- if (err?.response?.body?.error) {
231
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api for userId ${userNoPrefix}: ${err.response.body.error.message}`);
232
- } else {
233
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api for userId ${userNoPrefix}`, err);
234
- }
225
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call facebook api for userId`, {
226
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
227
+ userNoPrefix,
228
+ error: err?.response?.body?.error?.message ?? err?.message
229
+ })
230
+ });
235
231
  return null;
236
232
  }
237
233
  if (response.status !== 200) {
238
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api for userId ${userNoPrefix}`, {
239
- responseBody: JSON.stringify(response.body)
234
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call facebook api for userId`, {
235
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
236
+ userNoPrefix,
237
+ status: response.status,
238
+ responseBody: response.body
239
+ })
240
240
  });
241
241
  let error = new Error(`Failed to call facebook api for userId ${userNoPrefix}`);
242
242
  error.code = response.status;
@@ -246,8 +246,9 @@ async function getProfile(token, authorId, fields, logger) {
246
246
  }
247
247
  async function ban(token, sourceId, authorId, logger) {
248
248
  (0, _loggerHelpers.loggerDebug)(logger, `Starting to call facebook ban api for externalAuthorId ${authorId} ${sourceId}`);
249
- const response = await postApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(sourceId)}/blocked`, token, {
250
- psid: [(0, _externalIdHelpers.removePrefix)(authorId)]
249
+ const response = await postApi(`${FACEBOOK_URL}/${versionLock}/${(0, _externalIdHelpers.removePrefix)(sourceId)}/blocked`, undefined, {
250
+ user: `${(0, _externalIdHelpers.removePrefix)(authorId)}`,
251
+ access_token: token
251
252
  }, logger);
252
253
  (0, _loggerHelpers.loggerInfo)(logger, `Native Facebook API Hide Response for externalAuthorId ${authorId}`, {
253
254
  responseBody: JSON.stringify(response.body)
@@ -266,49 +267,44 @@ async function unban(token, sourceId, authorId, logger) {
266
267
  }
267
268
  async function getAttachment(token, externalId, discussionType, logger) {
268
269
  let result;
269
- try {
270
- switch (discussionType) {
271
- case 're':
272
- case 'qt':
273
- result = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}?fields=attachment`, token, undefined, undefined, logger);
274
- return {
275
- images: [{
276
- source: result?.body?.attachment?.media?.source || result?.body?.attachment?.media?.image?.src
277
- }]
278
- };
279
- case 'dm':
280
- result = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}?fields=attachments`, token, undefined, undefined, logger);
270
+ switch (discussionType) {
271
+ case 're':
272
+ case 'qt':
273
+ result = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}?fields=attachment`, token, undefined, undefined, logger);
274
+ return {
275
+ images: [{
276
+ source: result?.body?.attachment?.media?.source || result?.body?.attachment?.media?.image?.src
277
+ }]
278
+ };
279
+ case 'dm':
280
+ result = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}?fields=attachments`, token, undefined, undefined, logger);
281
+ return {
282
+ images: result?.body?.attachments?.data.map(item => {
283
+ return {
284
+ source: item.image_data?.url
285
+ };
286
+ })
287
+ };
288
+ default:
289
+ // og
290
+ result = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}/attachments?fields=media,subattachments,file_url`, token, undefined, undefined, logger);
291
+
292
+ // if subattachments exist, use them
293
+ const res = result?.body?.data[0];
294
+ if (res?.subattachments) {
281
295
  return {
282
- images: result?.body?.attachments?.data.map(item => {
296
+ images: res?.subattachments.data.map(item => {
283
297
  return {
284
- source: item.image_data?.url
298
+ source: item?.media?.source || item?.media?.image?.src
285
299
  };
286
300
  })
287
301
  };
288
- default:
289
- // og
290
- result = await getApi(`${FACEBOOK_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}/attachments?fields=media,subattachments,file_url`, token, undefined, undefined, logger);
291
-
292
- // if subattachments exist, use them
293
- const res = result?.body?.data[0];
294
- if (res?.subattachments) {
295
- return {
296
- images: res?.subattachments.data.map(item => {
297
- return {
298
- source: item?.media?.source || item?.media?.image?.src
299
- };
300
- })
301
- };
302
- }
303
- return {
304
- images: [{
305
- source: res?.media?.source || res?.media?.image?.src
306
- }]
307
- };
308
- }
309
- } catch (error) {
310
- (0, _loggerHelpers.loggerError)(logger, `Error getting facebook attachment`, error);
311
- throw error;
302
+ }
303
+ return {
304
+ images: [{
305
+ source: res?.media?.source || res?.media?.image?.src
306
+ }]
307
+ };
312
308
  }
313
309
  }
314
310
  async function getApi(apiUrl, accessToken, payload) {
@@ -321,16 +317,21 @@ async function getApi(apiUrl, accessToken, payload) {
321
317
  ...queryParams
322
318
  }).send(payload);
323
319
  } catch (err) {
324
- if (err && err.response && err.response.body && err.response.body.error) {
325
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook getApi ${apiUrl}: ${err.response.body.error.message}`);
326
- } else {
327
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook getApi ${apiUrl}`, err);
328
- }
320
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call facebook getApi`, {
321
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
322
+ apiUrl,
323
+ error: err?.response?.body?.error?.message ?? err?.message
324
+ })
325
+ });
329
326
  throw err;
330
327
  }
331
328
  if (response.status !== 200) {
332
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api ${apiUrl}`, {
333
- responseBody: JSON.stringify(response.body)
329
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call facebook api`, {
330
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
331
+ apiUrl,
332
+ status: response.status,
333
+ responseBody: response.body
334
+ })
334
335
  });
335
336
  let error = new Error(`Failed to call facebook api ${apiUrl}`);
336
337
  error.code = response.status;
@@ -342,9 +343,10 @@ async function postApi(apiUrl, accessToken, payload, logger) {
342
343
  let isMultipart = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
343
344
  let response = {};
344
345
  try {
345
- const request = _superagent.default.post(apiUrl).set('Accept', 'application/json').query({
346
+ const query = accessToken ? {
346
347
  access_token: accessToken
347
- });
348
+ } : payload;
349
+ const request = _superagent.default.post(apiUrl).set('Accept', 'application/json').query(query);
348
350
  if (isMultipart) {
349
351
  request.type('form');
350
352
  for (const key in payload) {
@@ -364,7 +366,10 @@ async function postApi(apiUrl, accessToken, payload, logger) {
364
366
  // Handle specific case where content is already marked as spam
365
367
  if (err?.response?.body?.error?.error_subcode === 1446036 && err?.response?.body?.error?.error_user_title === "Duplicate Mark Spam Request") {
366
368
  (0, _loggerHelpers.loggerInfo)(logger, `Content already marked as spam - treating as successful hide operation`, {
367
- responseBody: JSON.stringify(err.response.body)
369
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
370
+ apiUrl,
371
+ responseBody: err.response.body
372
+ })
368
373
  });
369
374
  return {
370
375
  status: 200,
@@ -374,12 +379,21 @@ async function postApi(apiUrl, accessToken, payload, logger) {
374
379
  }
375
380
  };
376
381
  }
377
- (0, _loggerHelpers.loggerDebug)(logger, `Failed to call facebook api`, err);
382
+ (0, _loggerHelpers.loggerDebug)(logger, `Failed to call facebook api`, {
383
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
384
+ apiUrl,
385
+ error: err?.message
386
+ })
387
+ });
378
388
  throw err;
379
389
  }
380
390
  if (response.status !== 200) {
381
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api`, {
382
- responseBody: JSON.stringify(response.body)
391
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call facebook api`, {
392
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
393
+ apiUrl,
394
+ status: response.status,
395
+ responseBody: response.body
396
+ })
383
397
  });
384
398
  throw new Error(`Failed to call facebook api ${response.body}`);
385
399
  }
@@ -392,16 +406,21 @@ async function deleteApi(apiUrl, accessToken, payload, logger) {
392
406
  access_token: accessToken
393
407
  }).send(payload);
394
408
  } catch (err) {
395
- if (err && err.response && err.response.body && err.response.body.error) {
396
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api delete: ${err.response.body.error.message}`);
397
- } else {
398
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api delete`, err);
399
- }
409
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call facebook api delete`, {
410
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
411
+ apiUrl,
412
+ error: err?.response?.body?.error?.message ?? err?.message
413
+ })
414
+ });
400
415
  throw err;
401
416
  }
402
417
  if (response.status !== 200) {
403
- (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api delete`, {
404
- responseBody: JSON.stringify(response.body)
418
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call facebook api delete`, {
419
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
420
+ apiUrl,
421
+ status: response.status,
422
+ responseBody: response.body
423
+ })
405
424
  });
406
425
  let error = new Error(`Failed to call facebook api delete`);
407
426
  error.code = response.status;
@@ -38,16 +38,26 @@ async function requestApi(apiUrl, accessToken, text, data) {
38
38
  response = await _superagent.default.post(apiUrl).set('Accept', 'application/json').set('Content-Type', 'application/json').send(data);
39
39
  }
40
40
  } catch (err) {
41
- if (err && err.response && err.response.body && err.response.body.error) {
42
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api: ${err.response.body.error.message}`);
43
- } else {
44
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, err);
45
- }
41
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - requestApi`, {
42
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
43
+ apiUrl,
44
+ discussionType,
45
+ adCampaign: adCampaign || undefined,
46
+ text: text || undefined,
47
+ error: err?.response?.body?.error?.message ?? err?.message
48
+ })
49
+ });
46
50
  throw err;
47
51
  }
48
52
  if (response.status !== 200) {
49
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, {
50
- responseBody: JSON.stringify(response.body)
53
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - requestApi bad status`, {
54
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
55
+ apiUrl,
56
+ discussionType,
57
+ adCampaign: adCampaign || undefined,
58
+ status: response.status,
59
+ responseBody: response.body
60
+ })
51
61
  });
52
62
  let error = new Error(`Failed to call instagram api`);
53
63
  error.code = response.status;
@@ -65,16 +75,24 @@ async function getPost(apiUrl, accessToken, fields, logger) {
65
75
  fields: fields
66
76
  }).send();
67
77
  } catch (err) {
68
- if (err && err.response && err.response.body) {
69
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, err.response.body.error);
70
- } else {
71
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, err);
72
- }
78
+ const errObject = {
79
+ apiUrl,
80
+ fields,
81
+ error: err?.response?.body?.error ?? err?.message
82
+ };
83
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - getPost`, {
84
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify(errObject)
85
+ });
73
86
  throw err;
74
87
  }
75
88
  if (response.status !== 200) {
76
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, {
77
- responseBody: JSON.stringify(response.body)
89
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - getPost bad status`, {
90
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
91
+ apiUrl,
92
+ fields,
93
+ status: response.status,
94
+ responseBody: response.body
95
+ })
78
96
  });
79
97
  let error = new Error(`Failed to call instagram api`);
80
98
  error.code = response.status;
@@ -88,7 +106,13 @@ async function getMessageData(accessToken, sourceId, inReplyToId, logger) {
88
106
  response = await getPost(`${INSTAGRAM_URL}/${sourceId}`, accessToken, `mentioned_comment.comment_id(${inReplyToId}){id, text, timestamp, media{id,media_url}}`, logger);
89
107
  return response.body;
90
108
  } catch (err) {
91
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, err);
109
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - getMessageData`, {
110
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
111
+ sourceId,
112
+ inReplyToId,
113
+ error: err?.message
114
+ })
115
+ });
92
116
  return null;
93
117
  }
94
118
  }
@@ -101,16 +125,25 @@ async function mentionRequestApi(apiUrl, accessToken, replayObject, text, logger
101
125
  message: text
102
126
  }).send();
103
127
  } catch (err) {
104
- if (err && err.response && err.response.body && err.response.body.error) {
105
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api: ${err.response.body.error.message}`);
106
- } else {
107
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, err);
108
- }
128
+ const errObject = {
129
+ apiUrl,
130
+ replayObject,
131
+ text,
132
+ error: err?.response?.body?.error?.message ?? err?.message
133
+ };
134
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - mentionRequestApi`, {
135
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify(errObject)
136
+ });
109
137
  throw err;
110
138
  }
111
139
  if (response.status !== 200) {
112
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, {
113
- responseBody: JSON.stringify(response.body)
140
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - mentionRequestApi bad status`, {
141
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
142
+ apiUrl,
143
+ replayObject,
144
+ status: response.status,
145
+ responseBody: response.body
146
+ })
114
147
  });
115
148
  let error = new Error(`Failed to call instagram api`);
116
149
  error.code = response.status;
@@ -127,16 +160,24 @@ async function hideApi(apiUrl, accessToken, hideStatus, logger) {
127
160
  hide: hideStatus
128
161
  }).send();
129
162
  } catch (err) {
130
- if (err && err.response && err.response.body) {
131
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, err.response.body.error);
132
- } else {
133
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, err);
134
- }
163
+ const errObject = {
164
+ apiUrl,
165
+ hideStatus,
166
+ error: err?.response?.body?.error ?? err?.message
167
+ };
168
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - hideApi`, {
169
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify(errObject)
170
+ });
135
171
  throw err;
136
172
  }
137
173
  if (response.status !== 200) {
138
- (0, _loggerHelpers.loggerError)(logger, `Failed to call instagram api`, {
139
- responseBody: JSON.stringify(response.body)
174
+ (0, _loggerHelpers.loggerInfo)(logger, `Failed to call instagram api - hideApi bad status`, {
175
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
176
+ apiUrl,
177
+ hideStatus,
178
+ status: response.status,
179
+ responseBody: response.body
180
+ })
140
181
  });
141
182
  let error = new Error(`Failed to call instagram api`);
142
183
  error.code = response.status;
@@ -154,10 +195,17 @@ async function getLikes(accessToken, externalId, logger) {
154
195
  });
155
196
  return response.body;
156
197
  } catch (err) {
198
+ const errPayload = {
199
+ [_loggerHelpers.MeltwaterAttributes.PAYLOADDATA]: JSON.stringify({
200
+ externalId,
201
+ status: err?.status,
202
+ error: err?.message
203
+ })
204
+ };
157
205
  if (err?.status === 400) {
158
- (0, _loggerHelpers.loggerWarn)(logger, 'Warn getLikes Instagram Comment probably deleted on native', err);
206
+ (0, _loggerHelpers.loggerWarn)(logger, 'Warn getLikes Instagram Comment probably deleted on native', errPayload);
159
207
  } else {
160
- (0, _loggerHelpers.loggerError)(logger, 'Error getLikes Instagram ' + externalId, err);
208
+ (0, _loggerHelpers.loggerInfo)(logger, 'Error getLikes Instagram', errPayload);
161
209
  }
162
210
  return 0;
163
211
  }
@@ -270,25 +318,20 @@ async function unhide(accessToken, externalId, logger) {
270
318
  return response.body;
271
319
  }
272
320
  async function getAttachment(token, externalId, logger) {
273
- try {
274
- const result = await getPost(`${INSTAGRAM_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}`, token, 'media_url,children{media_url}', logger);
275
- const res = result.body;
276
- if (res?.children?.data?.length) {
277
- return {
278
- images: res.children.data.map(item => {
279
- return {
280
- source: item?.media_url
281
- };
282
- })
283
- };
284
- }
321
+ const result = await getPost(`${INSTAGRAM_URL}/${(0, _externalIdHelpers.removePrefix)(externalId)}`, token, 'media_url,children{media_url}', logger);
322
+ const res = result.body;
323
+ if (res?.children?.data?.length) {
285
324
  return {
286
- images: [{
287
- source: res?.media_url
288
- }]
325
+ images: res.children.data.map(item => {
326
+ return {
327
+ source: item?.media_url
328
+ };
329
+ })
289
330
  };
290
- } catch (error) {
291
- (0, _loggerHelpers.loggerError)(logger, `Error getting instagram attachment`, error);
292
- throw error;
293
331
  }
332
+ return {
333
+ images: [{
334
+ source: res?.media_url
335
+ }]
336
+ };
294
337
  }