@meltwater/conversations-api-services 1.0.19 → 1.0.21

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 (70) hide show
  1. package/.github/workflows/release.yml +2 -0
  2. package/babel.config.js +18 -0
  3. package/dist/cjs/data-access/http/InstagramVideoClient.js +42 -0
  4. package/dist/cjs/data-access/http/WarpZoneApi.client.js +32 -0
  5. package/dist/cjs/data-access/http/amazonS3.js +44 -0
  6. package/dist/cjs/data-access/http/asset-manager-tvm.client.js +35 -0
  7. package/dist/cjs/data-access/http/companiesApi.client.js +38 -0
  8. package/dist/cjs/data-access/http/credentialsApi.client.js +102 -0
  9. package/dist/cjs/data-access/http/entitlementsApi.client.js +40 -0
  10. package/dist/cjs/data-access/http/facebook.native.js +344 -0
  11. package/dist/cjs/data-access/http/facebookApi.client.js +631 -0
  12. package/dist/cjs/data-access/http/featureToggleApi.client.js +31 -0
  13. package/dist/cjs/data-access/http/identityServices.client.js +97 -0
  14. package/dist/cjs/data-access/http/instagramApi.client.js +428 -0
  15. package/dist/cjs/data-access/http/ir.client.js +242 -0
  16. package/dist/cjs/data-access/http/linkedInApi.client.js +491 -0
  17. package/dist/cjs/data-access/http/masf.client.js +101 -0
  18. package/dist/cjs/data-access/http/tiktok.native.js +162 -0
  19. package/dist/cjs/data-access/http/tiktokApi.client.js +441 -0
  20. package/dist/cjs/data-access/index.js +132 -0
  21. package/dist/cjs/errors/engage-error.js +16 -0
  22. package/dist/cjs/errors/http-error.js +23 -0
  23. package/dist/cjs/lib/applicationTags.helpers.js +30 -0
  24. package/dist/cjs/lib/configuration.js +14 -0
  25. package/dist/cjs/lib/document-action-events.js +12 -0
  26. package/dist/cjs/lib/externalId.helpers.js +19 -0
  27. package/dist/cjs/lib/hidden.helpers.js +13 -0
  28. package/dist/cjs/lib/hiddenComment.helper.js +119 -0
  29. package/dist/cjs/lib/logger.helpers.js +68 -0
  30. package/dist/cjs/lib/logger.js +23 -0
  31. package/dist/cjs/lib/message.helpers.js +58 -0
  32. package/dist/cjs/lib/metrics.helper.js +97 -0
  33. package/dist/esm/data-access/http/InstagramVideoClient.js +34 -0
  34. package/dist/esm/data-access/http/WarpZoneApi.client.js +24 -0
  35. package/dist/esm/data-access/http/amazonS3.js +37 -0
  36. package/dist/esm/data-access/http/asset-manager-tvm.client.js +28 -0
  37. package/dist/esm/data-access/http/companiesApi.client.js +30 -0
  38. package/dist/esm/data-access/http/credentialsApi.client.js +92 -0
  39. package/dist/esm/data-access/http/entitlementsApi.client.js +32 -0
  40. package/dist/esm/data-access/http/facebook.native.js +325 -0
  41. package/dist/esm/data-access/http/facebookApi.client.js +621 -0
  42. package/dist/esm/data-access/http/featureToggleApi.client.js +23 -0
  43. package/dist/esm/data-access/http/identityServices.client.js +89 -0
  44. package/dist/esm/data-access/http/instagramApi.client.js +420 -0
  45. package/dist/esm/data-access/http/ir.client.js +234 -0
  46. package/dist/esm/data-access/http/linkedInApi.client.js +481 -0
  47. package/dist/esm/data-access/http/masf.client.js +93 -0
  48. package/dist/esm/data-access/http/tiktok.native.js +146 -0
  49. package/dist/esm/data-access/http/tiktokApi.client.js +433 -0
  50. package/dist/esm/data-access/index.js +30 -0
  51. package/dist/esm/errors/engage-error.js +9 -0
  52. package/dist/esm/errors/http-error.js +16 -0
  53. package/dist/esm/lib/applicationTags.helpers.js +22 -0
  54. package/dist/esm/lib/configuration.js +8 -0
  55. package/dist/esm/lib/document-action-events.js +6 -0
  56. package/dist/esm/lib/externalId.helpers.js +12 -0
  57. package/dist/esm/lib/hidden.helpers.js +6 -0
  58. package/dist/esm/lib/hiddenComment.helper.js +112 -0
  59. package/dist/esm/lib/logger.helpers.js +60 -0
  60. package/dist/esm/lib/logger.js +16 -0
  61. package/dist/esm/lib/message.helpers.js +52 -0
  62. package/dist/esm/lib/metrics.helper.js +90 -0
  63. package/package.json +14 -4
  64. package/src/data-access/http/facebook.native.js +542 -0
  65. package/src/data-access/http/tiktok.native.js +248 -0
  66. package/src/data-access/index.js +4 -0
  67. package/src/errors/engage-error.js +11 -0
  68. package/src/errors/http-error.js +19 -0
  69. package/src/lib/logger.helpers.js +15 -0
  70. package/src/lib/message.helpers.js +7 -1
@@ -0,0 +1,542 @@
1
+ import superagent from 'superagent';
2
+ import { removePrefix } from '../../lib/externalId.helpers.js';
3
+ import { loggerDebug, loggerError, loggerInfo } from '../../lib/logger.helpers.js';
4
+ import { EngageHttpError } from '../../errors/http-error.js';
5
+ import { EngageError } from '../../errors/engage-error.js';
6
+
7
+ const FACEBOOK_URL = 'https://graph.facebook.com';
8
+
9
+
10
+ export async function shareCount(token, externalId, logger) {
11
+ try{
12
+ const response = await getApi(
13
+ `${FACEBOOK_URL}/${removePrefix(
14
+ externalId
15
+ )}/?fields=shares`,
16
+ token
17
+ );
18
+ return response.body.shares && response.body.shares.count;
19
+ }catch(err){
20
+ loggerError(logger,
21
+ `Facebook shareCount error recieved - ${error.code}`,
22
+ error,
23
+ );
24
+ }
25
+ }
26
+
27
+ export async function reactions(token, externalIds, logger) {
28
+
29
+ try {
30
+ const response = await getApi(
31
+ `${FACEBOOK_URL}?ids=${externalIds
32
+ .map((externalId) => removePrefix(externalId))
33
+ .join(',')}&fields=` +
34
+ `reactions.limit(0).summary(viewer_reaction).as(fb_post_reaction_of_user),` +
35
+ `reactions.type(LOVE).limit(0).summary(total_count).as(fb_post_reactions_love),` +
36
+ `reactions.type(WOW).limit(0).summary(total_count).as(fb_post_reactions_wow),` +
37
+ `reactions.type(SAD).limit(0).summary(total_count).as(fb_post_reactions_sad),` +
38
+ `reactions.type(LIKE).limit(0).summary(total_count).as(fb_post_reactions_like),` +
39
+ `reactions.type(ANGRY).limit(0).summary(total_count).as(fb_post_reactions_angry),` +
40
+ `reactions.type(HAHA).limit(0).summary(total_count).as(fb_post_reactions_haha)`,
41
+ token
42
+ );
43
+ return response.body;
44
+ } catch (error) {
45
+ loggerError(logger,
46
+ `Facebook reactions error recieved - ${error.code}`,
47
+ error
48
+ );
49
+ return undefined;
50
+ }
51
+ }
52
+
53
+ export async function comment(token, {
54
+ inReplyToExternalId,
55
+ text,
56
+ attachment = undefined,
57
+ }, logger = undefined) {
58
+ let response;
59
+ const isGif = attachment && attachment.mimeType === 'image/gif';
60
+
61
+ loggerDebug(logger,
62
+ `Starting to call facebook comment api inReplyToExternalId ${inReplyToExternalId}`,
63
+ { text, attachment }
64
+ );
65
+
66
+ response = await postApi(
67
+ `${FACEBOOK_URL}/${removePrefix(inReplyToExternalId)}/comments`,
68
+ token,
69
+ {
70
+ ...(text && text.length && { message: text }),
71
+ ...(attachment &&
72
+ !isGif && { attachment_url: attachment.link }),
73
+ ...(attachment &&
74
+ isGif && { attachment_share_url: attachment.link }),
75
+ },
76
+ logger
77
+ );
78
+ loggerInfo(logger,
79
+ `Native Facebook API Publish Comment Response to externalId ${inReplyToExternalId}`,
80
+ { responseBody: JSON.stringify(response.body) }
81
+ );
82
+ return response.body;
83
+ }
84
+
85
+ export async function privateMessage(token, {
86
+ recipientId,
87
+ text,
88
+ attachment = undefined,
89
+ }, logger){
90
+ let response;
91
+ const isGif = attachment && attachment.mimeType === 'image/gif';
92
+
93
+ loggerDebug(logger,
94
+ `Starting to call facebook PM api to recipientId ${recipientId}`,
95
+ { payload: JSON.stringify({text, attachment}) }
96
+ );
97
+
98
+ response = await postApi(
99
+ `${FACEBOOK_URL}/me/messages`,
100
+ token,
101
+ {
102
+ recipient: { id: removePrefix(recipientId) },
103
+ message: {
104
+ text: text,
105
+ ...(attachment && {
106
+ attachment: {
107
+ type: isGif
108
+ ? 'video'
109
+ : attachment.mimeType.split('/')[0],
110
+ payload: {
111
+ url: attachment.link,
112
+ is_reusable: true,
113
+ },
114
+ },
115
+ }),
116
+ },
117
+ tag: 'HUMAN_AGENT',
118
+ },
119
+ logger
120
+ );
121
+ loggerInfo(logger,
122
+ `Native Facebook API Publish Private Message Response for documentId ${documentId}`,
123
+ { responseBody: JSON.stringify(response.body) }
124
+ );
125
+ return response.body;
126
+ }
127
+
128
+ export async function hide(token, externalId, logger) {
129
+ loggerDebug(logger,
130
+ `Starting to call facebook hide api`
131
+ );
132
+
133
+ const response = await postApi(
134
+ `${FACEBOOK_URL}/${removePrefix(externalId)}`,
135
+ token,
136
+ { is_hidden: true },
137
+ logger
138
+ );
139
+
140
+ loggerInfo(logger
141
+ `Native Facebook API Hide Response`,
142
+ { responseBody: JSON.stringify(response.body) }
143
+ );
144
+ return response.body;
145
+ }
146
+
147
+ export async function unhide(token, externalId, logger) {
148
+ loggerDebug(logger,
149
+ `Starting to call facebook unhide api`
150
+ );
151
+
152
+ const response = await postApi(
153
+ `${FACEBOOK_URL}/${removePrefix(externalId)}`,
154
+ token,
155
+ { is_hidden: false },
156
+ logger
157
+ );
158
+
159
+ loggerChild.info(
160
+ `Native Facebook API Unhide Response`,
161
+ { responseBody: JSON.stringify(response.body) }
162
+ );
163
+ return response.body;
164
+ }
165
+
166
+ export async function like(token, externalId, logger) {
167
+
168
+ loggerDebug(logger,
169
+ `Starting to call facebook like api`
170
+ );
171
+
172
+ const response = await postApi(
173
+ `${FACEBOOK_URL}/${removePrefix(externalId)}/likes`,
174
+ token,
175
+ undefined,
176
+ logger
177
+ );
178
+
179
+ loggerInfo(logger,
180
+ `Native Facebook API Like Response`,
181
+ { responseBody: JSON.stringify(response.body) }
182
+ );
183
+ return response.body;
184
+ }
185
+
186
+ export async function unlike(token, externalId, logger) {
187
+
188
+ loggerDebug(logger,
189
+ `Starting to call facebook unlike api`
190
+ );
191
+
192
+ const response = await deleteApi(
193
+ `${FACEBOOK_URL}/${removePrefix(externalId)}/likes`,
194
+ token,
195
+ undefined,
196
+ logger
197
+ );
198
+
199
+ loggerInfo( logger,
200
+ `Native Facebook API Unlike Response`,
201
+ { responseBody: JSON.stringify(response.body) }
202
+ );
203
+ return response.body;
204
+ }
205
+
206
+ export async function isUserBanned(token, authorId, pageId, logger) {
207
+ if (!pageId) {
208
+ // if no pageId to check this call will fail
209
+ // should only happen with temp edge docs
210
+ return false;
211
+ }
212
+ const response = await getApi(
213
+ `${FACEBOOK_URL}/${pageId}/blocked`,
214
+ token,
215
+ undefined, // payload
216
+ {
217
+ user: removePrefix(authorId),
218
+ },
219
+ logger
220
+ );
221
+
222
+ if (response && response.body && response.body.data) {
223
+ const userNoPrefix = removePrefix(authorId);
224
+ const user = response.body.data.find((user) => {
225
+ if (user.id == userNoPrefix) {
226
+ return user;
227
+ }
228
+ });
229
+ if (user) {
230
+ return true;
231
+ } else {
232
+ return false;
233
+ }
234
+ }
235
+
236
+ loggerInfo( logger,
237
+ `Native Facebook API is User Banned Response was invalid`,
238
+ {
239
+ responseBody: JSON.stringify(response.body),
240
+ }
241
+ );
242
+ return false;
243
+ }
244
+
245
+ export async function getProfile(token, authorId, logger) {
246
+ if (!authorId) {
247
+ return false;
248
+ }
249
+
250
+ let response = {};
251
+ const userNoPrefix = removePrefix(authorId);
252
+
253
+ try {
254
+ response = await superagent
255
+ .get(`${FACEBOOK_URL}/${userNoPrefix}`)
256
+ .set('Accept', 'application/json')
257
+ .set('Content-Type', 'application/json')
258
+ .query({ access_token: token })
259
+ .send();
260
+ } catch (err) {
261
+ if (
262
+ err?.response?.body?.error
263
+ ) {
264
+ loggerError(logger,
265
+ `Failed to call facebook api for userId ${userNoPrefix}: ${err.response.body.error.message}`
266
+ );
267
+ } else {
268
+ loggerError(logger,
269
+ `Failed to call facebook api for userId ${userNoPrefix}`,
270
+ err
271
+ );
272
+ }
273
+
274
+ return null;
275
+ }
276
+
277
+ if (response.status !== 200) {
278
+ loggerError(logger,
279
+ `Failed to call facebook api for userId ${userNoPrefix}`,
280
+ { responseBody: JSON.stringify(response.body) }
281
+ );
282
+ let error = new Error(
283
+ `Failed to call facebook api for userId ${userNoPrefix}`
284
+ );
285
+ error.code = response.status;
286
+ return null;
287
+ }
288
+
289
+ return response;
290
+ }
291
+
292
+ export async function ban(token, sourceId, authorId, logger) {
293
+ loggerDebug( logger,
294
+ `Starting to call facebook ban api for externalAuthorId ${authorId} ${sourceId}`
295
+ );
296
+
297
+ const response = await postApi(
298
+ `${FACEBOOK_URL}/${removePrefix(sourceId)}/blocked`,
299
+ token,
300
+ { psid: [removePrefix(authorId)] },
301
+ logger
302
+ );
303
+
304
+ loggerInfo(logger,
305
+ `Native Facebook API Hide Response for externalAuthorId ${authorId}`,
306
+ { responseBody: JSON.stringify(response.body) }
307
+ );
308
+ return response.body;
309
+ }
310
+
311
+ export async function unban(token, sourceId, authorId, logger) {
312
+
313
+ loggerDebug( logger,
314
+ `Starting to call facebook unban api for externalAuthorId ${authorId} ${sourceId}`
315
+ );
316
+
317
+ const response = await deleteApi(
318
+ `${FACEBOOK_URL}/${removePrefix(sourceId)}/blocked`,
319
+ token,
320
+ { psid: [removePrefix(authorId)] },
321
+ logger
322
+ );
323
+
324
+ loggerInfo( logger,
325
+ `Native Facebook API Unban Response for externalAuthorId ${authorId}`,
326
+ { responseBody: JSON.stringify(response.body) }
327
+ );
328
+ return response.body;
329
+ }
330
+
331
+ export async function getAttachment(token, externalId, discussionType, logger) {
332
+ let result;
333
+ try {
334
+ switch(discussionType) {
335
+ case 're':
336
+ case 'qt':
337
+ result = await getApi(
338
+ `${FACEBOOK_URL}/${removePrefix(
339
+ externalId
340
+ )}?fields=attachment`,
341
+ token,
342
+ undefined,
343
+ undefined,
344
+ logger
345
+ );
346
+
347
+ return {
348
+ images: [
349
+ {
350
+ source:
351
+ result?.body?.attachment?.media?.source ||
352
+ result?.body?.attachment?.media?.image?.src,
353
+ },
354
+ ],
355
+ };
356
+ case 'dm':
357
+ result = await getApi(
358
+ `${FACEBOOK_URL}/${removePrefix(
359
+ externalId
360
+ )}?fields=attachments`,
361
+ token,undefined,undefined,
362
+ logger
363
+ );
364
+
365
+ return {
366
+ images: result?.body?.attachments?.data.map((item) => {
367
+ return {
368
+ source: item.image_data?.url,
369
+ };
370
+ }),
371
+ };
372
+ default: // og
373
+ result = await getApi(
374
+ `${FACEBOOK_URL}/${removePrefix(
375
+ externalId
376
+ )}/attachments?fields=media,subattachments,file_url`,
377
+ token, undefined, undefined,
378
+ logger
379
+ );
380
+
381
+ // if subattachments exist, use them
382
+ const res = result?.body?.data[0];
383
+ if (res?.subattachments) {
384
+ return {
385
+ images: res?.subattachments.data.map((item) => {
386
+ return {
387
+ source:
388
+ item?.media?.source || item?.media?.image?.src,
389
+ };
390
+ }),
391
+ };
392
+ }
393
+
394
+ return {
395
+ images: [
396
+ {
397
+ source: res?.media?.source || res?.media?.image?.src,
398
+ },
399
+ ],
400
+ };
401
+ }
402
+ } catch (error) {
403
+ loggerError(logger,`Error getting facebook attachment`, error);
404
+ throw error;
405
+ }
406
+ }
407
+
408
+ async function getApi(apiUrl, accessToken, payload, queryParams = {}, logger) {
409
+
410
+ let response = {};
411
+ try {
412
+ response = await superagent
413
+ .get(apiUrl)
414
+ .set('Accept', 'application/json')
415
+ .set('Content-Type', 'application/json')
416
+ .query({ access_token: accessToken, ...queryParams })
417
+ .send(payload);
418
+ } catch (err) {
419
+ if (
420
+ err &&
421
+ err.response &&
422
+ err.response.body &&
423
+ err.response.body.error
424
+ ) {
425
+ loggerError(logger,
426
+ `Failed to call facebook getApi ${apiUrl}: ${err.response.body.error.message}`
427
+ );
428
+ } else {
429
+ loggerError(logger,
430
+ `Failed to call facebook getApi ${apiUrl}`,
431
+ err
432
+ );
433
+ }
434
+
435
+ throw err;
436
+ }
437
+
438
+ if (response.status !== 200) {
439
+ loggerError(logger,
440
+ `Failed to call facebook api ${apiUrl}`,
441
+ { responseBody: JSON.stringify(response.body) }
442
+ );
443
+ let error = new Error(
444
+ `Failed to call facebook api ${apiUrl}`
445
+ );
446
+ error.code = response.status;
447
+ throw error;
448
+ }
449
+
450
+ return response;
451
+ }
452
+
453
+ async function postApi(apiUrl, accessToken, payload, logger) {
454
+
455
+ let response = {};
456
+ try {
457
+ response = await superagent
458
+ .post(apiUrl)
459
+ .set('Accept', 'application/json')
460
+ .set('Content-Type', 'application/json')
461
+ .query({ access_token: accessToken })
462
+ .send(payload);
463
+ } catch (err) {
464
+ if (
465
+ err &&
466
+ err.response &&
467
+ err.response.body &&
468
+ err.response.body.error
469
+ ) {
470
+ loggerError(logger,
471
+ `Failed to call facebook api: ${err.response.body.error.message}`
472
+ );
473
+ } else {
474
+ loggerError(logger,
475
+ `Failed to call facebook api`,
476
+ err
477
+ );
478
+ }
479
+ if(response.status){
480
+ throw new EngageHttpError(response.status, response.statusText, response.body, response.headers);
481
+ }
482
+ throw err;
483
+ }
484
+
485
+ if (response.status !== 200) {
486
+ logger.error(logger,
487
+ `Failed to call facebook api`,
488
+ { responseBody: JSON.stringify(response.body) }
489
+ );
490
+ throw new EngageError(
491
+ response.status,
492
+ `Failed to call facebook api ${response.body}`
493
+ );
494
+ }
495
+
496
+ return response;
497
+ }
498
+
499
+ async function deleteApi(apiUrl, accessToken, payload, logger) {
500
+
501
+ let response = {};
502
+ try {
503
+ response = await superagent
504
+ .delete(apiUrl)
505
+ .set('Accept', 'application/json')
506
+ .set('Content-Type', 'application/json')
507
+ .query({ access_token: accessToken })
508
+ .send(payload);
509
+ } catch (err) {
510
+ if (
511
+ err &&
512
+ err.response &&
513
+ err.response.body &&
514
+ err.response.body.error
515
+ ) {
516
+ loggerError(logger,
517
+ `Failed to call facebook api delete: ${err.response.body.error.message}`
518
+ );
519
+ } else {
520
+ loggerError(logger,
521
+ `Failed to call facebook api delete`,
522
+ err
523
+ );
524
+ }
525
+
526
+ throw err;
527
+ }
528
+
529
+ if (response.status !== 200) {
530
+ loggerError(logger,
531
+ `Failed to call facebook api delete`,
532
+ { responseBody: JSON.stringify(response.body) }
533
+ );
534
+ let error = new Error(
535
+ `Failed to call facebook api delete`
536
+ );
537
+ error.code = response.status;
538
+ throw error;
539
+ }
540
+
541
+ return response;
542
+ }