@meltwater/conversations-api-services 1.0.23 → 1.0.25

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.
@@ -0,0 +1,584 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.addOAuthToToken = addOAuthToToken;
7
+ exports.followUser = followUser;
8
+ exports.getBrandUserRelationship = getBrandUserRelationship;
9
+ exports.getCurrentInfo = getCurrentInfo;
10
+ exports.getDirectMessageImage = getDirectMessageImage;
11
+ exports.getMentionHandleInfo = getMentionHandleInfo;
12
+ exports.getUserInfoFromHandle = getUserInfoFromHandle;
13
+ exports.getUserInfoFromHandles = getUserInfoFromHandles;
14
+ exports.like = like;
15
+ exports.privateMessage = privateMessage;
16
+ exports.reply = reply;
17
+ exports.retweet = retweet;
18
+ exports.retweetWithComment = retweetWithComment;
19
+ exports.unFollowUser = unFollowUser;
20
+ exports.unLike = unLike;
21
+ exports.unRetweet = unRetweet;
22
+ exports.userFollowStatus = userFollowStatus;
23
+ var _superagent = _interopRequireDefault(require("superagent"));
24
+ var _externalIdHelpers = require("../../lib/externalId.helpers.js");
25
+ var _loggerHelpers = require("../../lib/logger.helpers.js");
26
+ var _oauth = _interopRequireDefault(require("oauth-1.0a"));
27
+ var _crypto = _interopRequireDefault(require("crypto"));
28
+ var _axios = _interopRequireDefault(require("axios"));
29
+ var _fs = _interopRequireDefault(require("fs"));
30
+ var _socialTwit = _interopRequireDefault(require("@meltwater/social-twit"));
31
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
32
+ function addOAuthToToken(token, TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET) {
33
+ if (!token.oauth) {
34
+ token.oauth = (0, _oauth.default)({
35
+ consumer: {
36
+ key: TWITTER_CONSUMER_KEY,
37
+ secret: TWITTER_CONSUMER_SECRET
38
+ },
39
+ signature_method: 'HMAC-SHA1',
40
+ hash_function(base_string, key) {
41
+ return _crypto.default.createHmac('sha1', key).update(base_string).digest('base64');
42
+ }
43
+ });
44
+ token.consumer_key = TWITTER_CONSUMER_KEY;
45
+ token.consumer_secret = TWITTER_CONSUMER_SECRET;
46
+ }
47
+ return token;
48
+ }
49
+ async function getUserInfoFromHandles(token, handles, logger) {
50
+ try {
51
+ let query = `users/lookup.json?screen_name=${handles.join(',')}`;
52
+ let result = await postRequest({
53
+ token,
54
+ uri: query,
55
+ logger
56
+ });
57
+ return result.data;
58
+ } catch (e) {
59
+ (0, _loggerHelpers.loggerError)(logger, `Error getting UserInfo`, e);
60
+ }
61
+ }
62
+ async function getUserInfoFromHandle(token, handleId, logger) {
63
+ try {
64
+ let query = `users/show.json?user_id=${(0, _externalIdHelpers.removePrefix)(handleId)}`;
65
+ let result = await getRequest({
66
+ token,
67
+ uri: query,
68
+ logger
69
+ });
70
+ return result.data;
71
+ } catch (e) {
72
+ (0, _loggerHelpers.loggerError)(logger, `Error getting UserInfo`, e);
73
+ }
74
+ }
75
+ async function getDirectMessageImage(token, imageUrl, logger) {
76
+ try {
77
+ let result = await getRequest({
78
+ token,
79
+ uri: imageUrl,
80
+ attachUrlPrefix: false,
81
+ logger
82
+ });
83
+ return {
84
+ image: result.data,
85
+ contentType: result.contentType
86
+ };
87
+ } catch (e) {
88
+ (0, _loggerHelpers.loggerError)(logger, `Error getting image`, e);
89
+ throw e;
90
+ }
91
+ }
92
+ async function getCurrentInfo(token, externalId, logger) {
93
+ try {
94
+ const uri = `https://api.twitter.com/2/tweets?ids=${(0, _externalIdHelpers.removePrefix)(externalId)}&tweet.fields=public_metrics&expansions=author_id`;
95
+ let result = await getRequest({
96
+ token,
97
+ uri,
98
+ attachUrlPrefix: false,
99
+ convertPayloadToUri: false,
100
+ logger
101
+ });
102
+
103
+ // this makes it so 'retweeted' is only true on a retweet that isn't a comment
104
+ // sometimes 'retweeted' is true if user retweeted with comment, sometimes not :sadness:
105
+ result.data.retweeted = !!result.data.current_user_retweet;
106
+ return result.data.data[0].public_metrics;
107
+ } catch (error) {
108
+ (0, _loggerHelpers.loggerDebug)(logger, 'Error in twitter getCurrentInfo', error);
109
+ }
110
+ }
111
+ async function getMentionHandleInfo(token, externalId, logger) {
112
+ try {
113
+ const uri = `https://api.twitter.com/2/tweets/${(0, _externalIdHelpers.removePrefix)(externalId)}?tweet.fields=entities&expansions=entities.mentions.username,author_id&user.fields=id,name,username,profile_image_url`;
114
+ let result = await getRequest({
115
+ token,
116
+ uri,
117
+ attachUrlPrefix: false,
118
+ convertPayloadToUri: false
119
+ });
120
+ return result.data;
121
+ } catch (error) {
122
+ (0, _loggerHelpers.loggerDebug)(logger, 'Error in twitter getMentionHandleInfo', error);
123
+ }
124
+ }
125
+ async function retweet(token, sourceId, externalId, logger) {
126
+ try {
127
+ let response = await postRequest({
128
+ token,
129
+ uri: `https://api.twitter.com/2/users/${(0, _externalIdHelpers.removePrefix)(sourceId)}/retweets`,
130
+ payload: {
131
+ tweet_id: (0, _externalIdHelpers.removePrefix)(externalId)
132
+ },
133
+ attachUrlPrefix: false,
134
+ convertPayloadToUri: false,
135
+ logger
136
+ });
137
+ if (response.data.data.retweeted !== undefined && response.resp.statusCode === 200) {
138
+ return true;
139
+ } else {
140
+ return false;
141
+ }
142
+ } catch (error) {
143
+ (0, _loggerHelpers.loggerDebug)(logger, `Error in retweet user: ${sourceId}`, error);
144
+ }
145
+ }
146
+ async function unRetweet(token, sourceId, externalId, logger) {
147
+ try {
148
+ let response = await deleteRequest({
149
+ token,
150
+ uri: `https://api.twitter.com/2/users/${sourceId}/retweets/${(0, _externalIdHelpers.removePrefix)(externalId)}`,
151
+ logger
152
+ });
153
+ if (response.data.data.retweeted !== undefined && response.resp.statusCode === 200) {
154
+ return true;
155
+ } else {
156
+ return false;
157
+ }
158
+ } catch (error) {
159
+ (0, _loggerHelpers.loggerDebug)(logger, `Error in unretweet user: ${sourceId}`, error, {
160
+ [MeltwaterAttributes.SOCIALEXTERNALID]: externalId
161
+ });
162
+ }
163
+ }
164
+ async function like(token, externalId, logger) {
165
+ try {
166
+ let response = await postRequest({
167
+ token,
168
+ uri: 'favorites/create.json?id=' + (0, _externalIdHelpers.removePrefix)(externalId),
169
+ logger
170
+ });
171
+ if (response.data.favorited !== undefined && response.resp.statusCode === 200) {
172
+ return true;
173
+ } else {
174
+ (0, _loggerHelpers.loggerInfo)(logger, 'Twitter Error in like user statusCode non 200 ', {
175
+ response: JSON.stringify(response)
176
+ });
177
+ return false;
178
+ }
179
+ } catch (error) {
180
+ (0, _loggerHelpers.loggerDebug)(logger, `Twitter Error in like user: ${externalId}`, error);
181
+ throw error;
182
+ }
183
+ }
184
+ async function unLike(token, externalId, logger) {
185
+ try {
186
+ let response = await postRequest({
187
+ token,
188
+ uri: 'favorites/destroy.json?id=' + (0, _externalIdHelpers.removePrefix)(externalId),
189
+ logger
190
+ });
191
+ if (response.data.favorited !== undefined && response.resp.statusCode === 200) {
192
+ return true;
193
+ } else {
194
+ return false;
195
+ }
196
+ } catch (error) {
197
+ (0, _loggerHelpers.loggerDebug)(logger, `Error in unlike user: ${externalId}`, error);
198
+ throw error;
199
+ }
200
+ }
201
+ async function followUser(token, profileId, logger) {
202
+ try {
203
+ let response = await postRequest({
204
+ token,
205
+ uri: 'friendships/create.json',
206
+ payload: {
207
+ user_id: (0, _externalIdHelpers.removePrefix)(profileId),
208
+ follow: true
209
+ },
210
+ logger
211
+ });
212
+ if (response.data.following !== undefined) {
213
+ return true;
214
+ } else {
215
+ return false;
216
+ }
217
+ } catch (error) {
218
+ (0, _loggerHelpers.loggerDebug)(logger, `Error in following user: ${profileId}`, error);
219
+ }
220
+ }
221
+ async function unFollowUser(token, profileId, logger) {
222
+ try {
223
+ let response = await postRequest({
224
+ token,
225
+ uri: 'friendships/destroy.json',
226
+ payload: {
227
+ user_id: (0, _externalIdHelpers.removePrefix)(profileId)
228
+ },
229
+ logger
230
+ });
231
+ if (response.data.following !== undefined) {
232
+ return true;
233
+ } else {
234
+ return false;
235
+ }
236
+ } catch (error) {
237
+ (0, _loggerHelpers.loggerDebug)(logger, `Error in unfollowing user: ${profileId}`, error);
238
+ }
239
+ }
240
+ async function userFollowStatus(token, profileId, logger) {
241
+ try {
242
+ let response = await getRequest({
243
+ token,
244
+ uri: 'friendships/lookup.json',
245
+ payload: {
246
+ user_id: (0, _externalIdHelpers.removePrefix)(profileId)
247
+ },
248
+ logger
249
+ });
250
+ if (response.data.length > 0) {
251
+ if (response.data[0].connections.length > 0) {
252
+ for (var i = 0; i < response.data[0].connections.length; i++) {
253
+ if (response.data[0].connections[i] === 'following') {
254
+ return true;
255
+ }
256
+ }
257
+ return false;
258
+ } else {
259
+ return false;
260
+ }
261
+ }
262
+ } catch (error) {
263
+ (0, _loggerHelpers.loggerDebug)(logger, `Error in getting user follow status: ${profileId}`, error);
264
+ if (error.message != 'Bad Request') {
265
+ // if we hit a minor rate limit here, we wait for 5 seconds before attempting again, usually long enough to continue
266
+ await new Promise(r => setTimeout(r, 5000));
267
+ return userFollowStatus(token, profileId, logger);
268
+ }
269
+ }
270
+ }
271
+ async function getBrandUserRelationship(token, profileId, brandProfileId, logger) {
272
+ try {
273
+ let {
274
+ data: {
275
+ relationship
276
+ } = {}
277
+ } = await getRequest({
278
+ token,
279
+ uri: `friendships/show.json?source_id=${brandProfileId}&target_id=${(0, _externalIdHelpers.removePrefix)(profileId)}`,
280
+ logger
281
+ });
282
+ return relationship;
283
+ } catch (error) {
284
+ (0, _loggerHelpers.loggerDebug)(logger, `Error in getting user brand friendship info: ${profileId} and ${brandProfileId}`, error);
285
+ }
286
+ }
287
+ async function reply(token, text, attachment, inReplyToId, removeInReplyToId, logger) {
288
+ let mediaId;
289
+ if (attachment) {
290
+ // discussionType only matters if DM or Not
291
+ mediaId = await uploadMedia(attachment, token, 're', logger);
292
+ }
293
+ const payload = {
294
+ text,
295
+ ...(attachment && {
296
+ media: {
297
+ media_ids: [mediaId]
298
+ }
299
+ }),
300
+ reply: {
301
+ in_reply_to_tweet_id: (0, _externalIdHelpers.removePrefix)(inReplyToId)
302
+ }
303
+ };
304
+ if (removeInReplyToId.length) {
305
+ payload.reply.exclude_reply_user_ids = removeInReplyToId.map(_externalIdHelpers.removePrefix);
306
+ }
307
+ let query = 'https://api.twitter.com/2/tweets';
308
+ return publishTweet(token, payload, query, false, logger);
309
+ }
310
+ async function privateMessage(token, text, attachment, profileId, logger) {
311
+ let query = 'direct_messages/events/new.json';
312
+ let mediaId;
313
+ if (attachment) {
314
+ // discussionType only matters if DM or Not
315
+ mediaId = await uploadMedia(attachment, token, 'dm', logger);
316
+ }
317
+ const payload = {
318
+ event: {
319
+ type: 'message_create',
320
+ message_create: {
321
+ target: {
322
+ recipient_id: (0, _externalIdHelpers.removePrefix)(profileId)
323
+ },
324
+ message_data: {
325
+ text: text || ' ',
326
+ ...(attachment && {
327
+ attachment: {
328
+ type: 'media',
329
+ media: {
330
+ id: mediaId
331
+ }
332
+ }
333
+ })
334
+ }
335
+ }
336
+ }
337
+ };
338
+ return publishTweet(token, payload, query, true, logger);
339
+ }
340
+ async function retweetWithComment(token, text, attachment, logger) {
341
+ let mediaId;
342
+ if (attachment) {
343
+ // discussionType only matters if DM or Not
344
+ mediaId = await uploadMedia(attachment, token, 're', logger);
345
+ }
346
+ const payload = {
347
+ text,
348
+ ...(attachment && {
349
+ media: {
350
+ media_ids: [mediaId]
351
+ }
352
+ })
353
+ };
354
+ let query = 'https://api.twitter.com/2/tweets';
355
+ return publishTweet(token, payload, query, false, logger);
356
+ }
357
+ async function publishTweet(token, payload, query, isDirectMessage, logger) {
358
+ try {
359
+ let nativeResponse = await postRequest({
360
+ token,
361
+ uri: query,
362
+ payload,
363
+ convertPayloadToUri: false,
364
+ attachUrlPrefix: isDirectMessage
365
+ });
366
+ if (!isDirectMessage && nativeResponse.resp.statusCode === 201) {
367
+ const uri = `https://api.twitter.com/2/tweets?ids=${nativeResponse.data.data.id}&tweet.fields=public_metrics&expansions=author_id`;
368
+ nativeResponse = await getRequest({
369
+ token,
370
+ uri,
371
+ payload,
372
+ attachUrlPrefix: false,
373
+ convertPayloadToUri: false
374
+ });
375
+ }
376
+ (0, _loggerHelpers.loggerInfo)(logger, `finished fetching twitterAPI nativeResponse `, {
377
+ data: JSON.stringify(nativeResponse.data)
378
+ });
379
+ const response = nativeResponse.resp ? {
380
+ statusCode: nativeResponse.resp.statusCode,
381
+ statusMessage: nativeResponse.resp.statusCode === 200 ? 'Success' : 'Unknown Failure',
382
+ data: isDirectMessage ? nativeResponse.data.event : nativeResponse.data.data[0]
383
+ } : {
384
+ statusCode: nativeResponse.statusCode,
385
+ statusMessage: nativeResponse.message
386
+ };
387
+ (0, _loggerHelpers.loggerDebug)(logger, `Twitter the data response is`, {
388
+ response: JSON.stringify(response)
389
+ });
390
+ return response;
391
+ } catch (err) {
392
+ (0, _loggerHelpers.loggerError)(`Twitter publish exception details`, err);
393
+ throw err;
394
+ }
395
+ }
396
+ async function postRequest(_ref) {
397
+ let {
398
+ token,
399
+ uri,
400
+ payload,
401
+ attachUrlPrefix = true,
402
+ convertPayloadToUri = true,
403
+ logger
404
+ } = _ref;
405
+ return doRequest({
406
+ requestMethod: 'post',
407
+ token,
408
+ convertPayloadToUri,
409
+ payload,
410
+ uri,
411
+ attachUrlPrefix,
412
+ logger
413
+ });
414
+ }
415
+ async function getRequest(_ref2) {
416
+ let {
417
+ token,
418
+ uri,
419
+ payload,
420
+ attachUrlPrefix = true,
421
+ convertPayloadToUri = true,
422
+ logger
423
+ } = _ref2;
424
+ return doRequest({
425
+ requestMethod: 'get',
426
+ payload,
427
+ token,
428
+ uri,
429
+ attachUrlPrefix,
430
+ convertPayloadToUri,
431
+ logger
432
+ });
433
+ }
434
+ async function deleteRequest(_ref3) {
435
+ let {
436
+ token,
437
+ uri,
438
+ payload,
439
+ attachUrlPrefix = false,
440
+ convertPayloadToUri = false,
441
+ logger
442
+ } = _ref3;
443
+ return doRequest({
444
+ requestMethod: 'delete',
445
+ token,
446
+ convertPayloadToUri,
447
+ payload,
448
+ uri,
449
+ attachUrlPrefix,
450
+ logger
451
+ });
452
+ }
453
+ function fixedEncodeURIComponent(str) {
454
+ return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
455
+ return '%' + c.charCodeAt(0).toString(16);
456
+ });
457
+ }
458
+ async function doRequest(_ref4) {
459
+ let {
460
+ requestMethod,
461
+ token,
462
+ uri,
463
+ payload,
464
+ attachUrlPrefix = true,
465
+ convertPayloadToUri = true,
466
+ logger
467
+ } = _ref4;
468
+ if (payload && convertPayloadToUri) {
469
+ uri = uri + (uri.endsWith('?') ? '' : '?') + Object.keys(payload).map(key => {
470
+ return fixedEncodeURIComponent(key) + '=' + fixedEncodeURIComponent(payload[key]);
471
+ }).join('&');
472
+ }
473
+ let url = attachUrlPrefix ? `https://api.twitter.com/1.1/${uri}` : uri;
474
+ return new Promise(async (resolve, reject) => {
475
+ try {
476
+ const {
477
+ Authorization
478
+ } = token.oauth.toHeader(token.oauth.authorize({
479
+ url,
480
+ method: requestMethod,
481
+ data: {}
482
+ }, {
483
+ key: token.token,
484
+ secret: token.tokenSecret
485
+ }));
486
+ const result = await (requestMethod === 'get' ? _superagent.default.get(url).set('Authorization', Authorization) : requestMethod === 'post' ? _superagent.default.post(url).set('Authorization', Authorization).send(payload && !convertPayloadToUri ? payload : undefined) : _superagent.default.del(url).set('Authorization', Authorization));
487
+ (0, _loggerHelpers.loggerDebug)(logger, 'Twitter Native Response ', {
488
+ native: {
489
+ //data: result.body,
490
+ contentType: result.headers['content-type']
491
+ },
492
+ methodParams: {
493
+ uri,
494
+ payload: JSON.stringify(payload)
495
+ }
496
+ });
497
+ resolve({
498
+ data: result.body,
499
+ contentType: result.headers['content-type'],
500
+ resp: {
501
+ ...result
502
+ }
503
+ });
504
+ } catch (e) {
505
+ (0, _loggerHelpers.loggerError)(logger, `Error in twitter doRequest`, e, {
506
+ url,
507
+ convertPayloadToUri,
508
+ payload: JSON.stringify(payload)
509
+ });
510
+ reject(e);
511
+ }
512
+ });
513
+ }
514
+
515
+ // local
516
+ async function downloadImage(url, fileName) {
517
+ const writer = _fs.default.createWriteStream(fileName);
518
+ const response = await (0, _axios.default)({
519
+ url,
520
+ method: 'GET',
521
+ responseType: 'stream'
522
+ });
523
+ response.data = response.data;
524
+ response.data.pipe(writer);
525
+ return new Promise((resolve, reject) => {
526
+ writer.on('finish', resolve);
527
+ writer.on('error', reject);
528
+ });
529
+ }
530
+
531
+ // local
532
+ function generateFilePath(mimeType) {
533
+ let dir = `${__dirname}/temporaryTwitterMedia`;
534
+ if (!_fs.default.existsSync(dir)) {
535
+ _fs.default.mkdirSync(dir);
536
+ }
537
+ let randomFileName = Math.floor(Math.random() * 100);
538
+ let fileExtension = mimeType.split('/')[1];
539
+ if (mimeType === 'video/quicktime') {
540
+ fileExtension = 'mov';
541
+ }
542
+ return `${dir}/${randomFileName}.${fileExtension}`;
543
+ }
544
+ // local
545
+ async function uploadMedia(attachment, token, discussionType, logger) {
546
+ return new Promise(async (resolve, reject) => {
547
+ let filePath = generateFilePath(attachment.mimeType);
548
+ await downloadImage(attachment.url, filePath);
549
+ const T = new _socialTwit.default({
550
+ consumer_key: token.consumer_key,
551
+ consumer_secret: token.consumer_secret,
552
+ access_token: token.token,
553
+ access_token_secret: token.tokenSecret
554
+ });
555
+ let mediaCategory = discussionType === 'dm' ? 'dm' : 'tweet';
556
+ try {
557
+ T.postMediaChunked({
558
+ file_path: filePath
559
+ }, mediaCategory, function (err, data, response) {
560
+ if (err) {
561
+ reject(err);
562
+ }
563
+ resolve(data.media_id_string);
564
+ removeMedia(filePath, logger);
565
+ });
566
+ } catch (e) {
567
+ (0, _loggerHelpers.loggerError)(logger, `Failed posting media`, e);
568
+ // this is just a safety precaution
569
+ removeMedia(filePath, logger);
570
+ }
571
+ });
572
+ }
573
+ function removeMedia(file, logger) {
574
+ try {
575
+ _fs.default.unlink(file, function (err) {
576
+ if (err) {
577
+ (0, _loggerHelpers.loggerError)(logger, `Failed removing ${file}`, err);
578
+ }
579
+ });
580
+ } catch (e) {
581
+ (0, _loggerHelpers.loggerError)(logger, `failed trying to remove media ${file} it may have already been removed`);
582
+ }
583
+ }
584
+ ;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.comment = comment;
7
+ exports.likeVideo = likeVideo;
8
+ exports.reply = reply;
9
+ exports.sendRequest = sendRequest;
10
+ exports.unlikeVideo = unlikeVideo;
11
+ var _superagent = _interopRequireDefault(require("superagent"));
12
+ var _externalIdHelpers = require("../../lib/externalId.helpers.js");
13
+ var _loggerHelpers = require("../../lib/logger.helpers.js");
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ const YOUTUBE_API_URL = "https://www.googleapis.com/youtube/v3/";
16
+ async function sendPost(token) {
17
+ let paramString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
18
+ let postData = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
19
+ let logger = arguments.length > 3 ? arguments[3] : undefined;
20
+ let response = {};
21
+ try {
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
+ } 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
+ }
29
+ throw err;
30
+ }
31
+ return response;
32
+ }
33
+ async function sendRequest(token) {
34
+ let paramString = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
35
+ let logger = arguments.length > 2 ? arguments[2] : undefined;
36
+ let response = {};
37
+ try {
38
+ response = await _superagent.default.get(YOUTUBE_API_URL + paramString).set('Accept', 'application/json').set('Content-Type', 'application/json').set('Authorization', `Bearer ${token}`).send();
39
+ } 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
+ }
45
+ throw err;
46
+ }
47
+ if (response.status !== 200) {
48
+ (0, _loggerHelpers.loggerError)(logger, `Failed to call facebook api`, {
49
+ responseBody: JSON.stringify(response.body)
50
+ });
51
+ let error = new Error(`Failed to call facebook api`);
52
+ error.code = response.status;
53
+ throw error;
54
+ }
55
+ return response.body;
56
+ }
57
+ async function likeVideo(token, externalId, logger) {
58
+ return setVideoRating(token, externalId, true, logger);
59
+ }
60
+ async function unlikeVideo(token, externalId, logger) {
61
+ return setVideoRating(token, externalId, false, logger);
62
+ }
63
+ async function setVideoRating(token, externalId) {
64
+ let like = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;
65
+ let logger = arguments.length > 3 ? arguments[3] : undefined;
66
+ const requestResult = await sendPost(token, `videos/rate?id=${(0, _externalIdHelpers.removePrefix)(externalId)}&rating=${like ? 'like' : 'dislike'}`, logger);
67
+ return requestResult;
68
+ }
69
+ async function comment(token, inReplyToId, textOriginal, logger) {
70
+ const {
71
+ body: publishedMessage
72
+ } = (await sendPost(token, 'commentThreads?part=snippet', {
73
+ snippet: {
74
+ videoId: inReplyToId,
75
+ topLevelComment: {
76
+ snippet: {
77
+ textOriginal
78
+ }
79
+ }
80
+ }
81
+ }, logger)) || {};
82
+ return publishedMessage;
83
+ }
84
+ async function reply(token, inReplyToId, textOriginal, logger) {
85
+ const {
86
+ body: publishedMessage
87
+ } = await sendPost(token, 'comments?part=snippet', {
88
+ snippet: {
89
+ textOriginal,
90
+ parentId: inReplyToId
91
+ }
92
+ }, logger);
93
+ return publishedMessage;
94
+ }
@@ -78,13 +78,14 @@ Object.defineProperty(exports, "TikTokApiClient", {
78
78
  return _tiktokApiClient.TikTokApiClient;
79
79
  }
80
80
  });
81
- exports.TiktokNative = void 0;
81
+ exports.TwitterNative = exports.TiktokNative = void 0;
82
82
  Object.defineProperty(exports, "WarpZoneApiClient", {
83
83
  enumerable: true,
84
84
  get: function () {
85
85
  return _WarpZoneApiClient.WarpZoneApiClient;
86
86
  }
87
87
  });
88
+ exports.YoutubeNative = void 0;
88
89
  Object.defineProperty(exports, "assetManagerTvmRepository", {
89
90
  enumerable: true,
90
91
  get: function () {
@@ -119,8 +120,12 @@ var FacebookNative = _interopRequireWildcard(require("./http/facebook.native.js"
119
120
  exports.FacebookNative = FacebookNative;
120
121
  var TiktokNative = _interopRequireWildcard(require("./http/tiktok.native.js"));
121
122
  exports.TiktokNative = TiktokNative;
123
+ var YoutubeNative = _interopRequireWildcard(require("./http/youtube.native.js"));
124
+ exports.YoutubeNative = YoutubeNative;
122
125
  var LinkedinNative = _interopRequireWildcard(require("./http/linkedin.native.js"));
123
126
  exports.LinkedinNative = LinkedinNative;
127
+ var TwitterNative = _interopRequireWildcard(require("./http/twitter.native.js"));
128
+ exports.TwitterNative = TwitterNative;
124
129
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
125
130
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
126
131
  const DocumentHelperFunctions = exports.DocumentHelperFunctions = {