@memberjunction/actions-bizapps-social 2.112.0 → 2.113.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 (204) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +13 -0
  3. package/dist/base/base-social.action.d.ts.map +1 -1
  4. package/dist/base/base-social.action.js +24 -18
  5. package/dist/base/base-social.action.js.map +1 -1
  6. package/dist/providers/buffer/buffer-base.action.d.ts.map +1 -1
  7. package/dist/providers/buffer/buffer-base.action.js +34 -35
  8. package/dist/providers/buffer/buffer-base.action.js.map +1 -1
  9. package/dist/providers/facebook/actions/boost-post.action.d.ts.map +1 -1
  10. package/dist/providers/facebook/actions/boost-post.action.js +33 -33
  11. package/dist/providers/facebook/actions/boost-post.action.js.map +1 -1
  12. package/dist/providers/facebook/actions/create-album.action.d.ts.map +1 -1
  13. package/dist/providers/facebook/actions/create-album.action.js +36 -34
  14. package/dist/providers/facebook/actions/create-album.action.js.map +1 -1
  15. package/dist/providers/facebook/actions/create-post.action.d.ts.map +1 -1
  16. package/dist/providers/facebook/actions/create-post.action.js +20 -20
  17. package/dist/providers/facebook/actions/create-post.action.js.map +1 -1
  18. package/dist/providers/facebook/actions/get-page-insights.action.d.ts.map +1 -1
  19. package/dist/providers/facebook/actions/get-page-insights.action.js +27 -25
  20. package/dist/providers/facebook/actions/get-page-insights.action.js.map +1 -1
  21. package/dist/providers/facebook/actions/get-page-posts.action.d.ts.map +1 -1
  22. package/dist/providers/facebook/actions/get-page-posts.action.js +23 -19
  23. package/dist/providers/facebook/actions/get-page-posts.action.js.map +1 -1
  24. package/dist/providers/facebook/actions/get-post-insights.action.d.ts.map +1 -1
  25. package/dist/providers/facebook/actions/get-post-insights.action.js +32 -28
  26. package/dist/providers/facebook/actions/get-post-insights.action.js.map +1 -1
  27. package/dist/providers/facebook/actions/respond-to-comments.action.d.ts.map +1 -1
  28. package/dist/providers/facebook/actions/respond-to-comments.action.js +44 -42
  29. package/dist/providers/facebook/actions/respond-to-comments.action.js.map +1 -1
  30. package/dist/providers/facebook/actions/schedule-post.action.d.ts.map +1 -1
  31. package/dist/providers/facebook/actions/schedule-post.action.js +29 -29
  32. package/dist/providers/facebook/actions/schedule-post.action.js.map +1 -1
  33. package/dist/providers/facebook/actions/search-posts.action.d.ts.map +1 -1
  34. package/dist/providers/facebook/actions/search-posts.action.js +39 -37
  35. package/dist/providers/facebook/actions/search-posts.action.js.map +1 -1
  36. package/dist/providers/facebook/facebook-base.action.d.ts.map +1 -1
  37. package/dist/providers/facebook/facebook-base.action.js +59 -44
  38. package/dist/providers/facebook/facebook-base.action.js.map +1 -1
  39. package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.d.ts.map +1 -1
  40. package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.js +31 -33
  41. package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.js.map +1 -1
  42. package/dist/providers/hootsuite/actions/create-scheduled-post.action.d.ts.map +1 -1
  43. package/dist/providers/hootsuite/actions/create-scheduled-post.action.js +32 -28
  44. package/dist/providers/hootsuite/actions/create-scheduled-post.action.js.map +1 -1
  45. package/dist/providers/hootsuite/actions/delete-scheduled-post.action.d.ts.map +1 -1
  46. package/dist/providers/hootsuite/actions/delete-scheduled-post.action.js +19 -19
  47. package/dist/providers/hootsuite/actions/delete-scheduled-post.action.js.map +1 -1
  48. package/dist/providers/hootsuite/actions/get-analytics.action.d.ts.map +1 -1
  49. package/dist/providers/hootsuite/actions/get-analytics.action.js +26 -24
  50. package/dist/providers/hootsuite/actions/get-analytics.action.js.map +1 -1
  51. package/dist/providers/hootsuite/actions/get-scheduled-posts.action.d.ts.map +1 -1
  52. package/dist/providers/hootsuite/actions/get-scheduled-posts.action.js +22 -22
  53. package/dist/providers/hootsuite/actions/get-scheduled-posts.action.js.map +1 -1
  54. package/dist/providers/hootsuite/actions/get-social-profiles.action.d.ts.map +1 -1
  55. package/dist/providers/hootsuite/actions/get-social-profiles.action.js +34 -32
  56. package/dist/providers/hootsuite/actions/get-social-profiles.action.js.map +1 -1
  57. package/dist/providers/hootsuite/actions/search-posts.action.d.ts.map +1 -1
  58. package/dist/providers/hootsuite/actions/search-posts.action.js +52 -43
  59. package/dist/providers/hootsuite/actions/search-posts.action.js.map +1 -1
  60. package/dist/providers/hootsuite/actions/update-scheduled-post.action.d.ts.map +1 -1
  61. package/dist/providers/hootsuite/actions/update-scheduled-post.action.js +28 -30
  62. package/dist/providers/hootsuite/actions/update-scheduled-post.action.js.map +1 -1
  63. package/dist/providers/hootsuite/hootsuite-base.action.d.ts.map +1 -1
  64. package/dist/providers/hootsuite/hootsuite-base.action.js +20 -18
  65. package/dist/providers/hootsuite/hootsuite-base.action.js.map +1 -1
  66. package/dist/providers/instagram/actions/create-post.action.d.ts.map +1 -1
  67. package/dist/providers/instagram/actions/create-post.action.js +26 -27
  68. package/dist/providers/instagram/actions/create-post.action.js.map +1 -1
  69. package/dist/providers/instagram/actions/create-story.action.d.ts.map +1 -1
  70. package/dist/providers/instagram/actions/create-story.action.js +35 -35
  71. package/dist/providers/instagram/actions/create-story.action.js.map +1 -1
  72. package/dist/providers/instagram/actions/get-account-insights.action.d.ts.map +1 -1
  73. package/dist/providers/instagram/actions/get-account-insights.action.js +59 -38
  74. package/dist/providers/instagram/actions/get-account-insights.action.js.map +1 -1
  75. package/dist/providers/instagram/actions/get-business-posts.action.d.ts.map +1 -1
  76. package/dist/providers/instagram/actions/get-business-posts.action.js +29 -29
  77. package/dist/providers/instagram/actions/get-business-posts.action.js.map +1 -1
  78. package/dist/providers/instagram/actions/get-comments.action.d.ts.map +1 -1
  79. package/dist/providers/instagram/actions/get-comments.action.js +36 -36
  80. package/dist/providers/instagram/actions/get-comments.action.js.map +1 -1
  81. package/dist/providers/instagram/actions/get-post-insights.action.d.ts.map +1 -1
  82. package/dist/providers/instagram/actions/get-post-insights.action.js +25 -23
  83. package/dist/providers/instagram/actions/get-post-insights.action.js.map +1 -1
  84. package/dist/providers/instagram/actions/schedule-post.action.d.ts.map +1 -1
  85. package/dist/providers/instagram/actions/schedule-post.action.js +25 -25
  86. package/dist/providers/instagram/actions/schedule-post.action.js.map +1 -1
  87. package/dist/providers/instagram/actions/search-posts.action.d.ts.map +1 -1
  88. package/dist/providers/instagram/actions/search-posts.action.js +60 -56
  89. package/dist/providers/instagram/actions/search-posts.action.js.map +1 -1
  90. package/dist/providers/instagram/instagram-base.action.d.ts.map +1 -1
  91. package/dist/providers/instagram/instagram-base.action.js +27 -25
  92. package/dist/providers/instagram/instagram-base.action.js.map +1 -1
  93. package/dist/providers/linkedin/actions/create-article.action.d.ts.map +1 -1
  94. package/dist/providers/linkedin/actions/create-article.action.js +45 -55
  95. package/dist/providers/linkedin/actions/create-article.action.js.map +1 -1
  96. package/dist/providers/linkedin/actions/create-post.action.d.ts.map +1 -1
  97. package/dist/providers/linkedin/actions/create-post.action.js +29 -31
  98. package/dist/providers/linkedin/actions/create-post.action.js.map +1 -1
  99. package/dist/providers/linkedin/actions/get-followers.action.d.ts.map +1 -1
  100. package/dist/providers/linkedin/actions/get-followers.action.js +28 -28
  101. package/dist/providers/linkedin/actions/get-followers.action.js.map +1 -1
  102. package/dist/providers/linkedin/actions/get-organization-posts.action.d.ts.map +1 -1
  103. package/dist/providers/linkedin/actions/get-organization-posts.action.js +20 -20
  104. package/dist/providers/linkedin/actions/get-organization-posts.action.js.map +1 -1
  105. package/dist/providers/linkedin/actions/get-personal-posts.action.d.ts.map +1 -1
  106. package/dist/providers/linkedin/actions/get-personal-posts.action.js +19 -19
  107. package/dist/providers/linkedin/actions/get-personal-posts.action.js.map +1 -1
  108. package/dist/providers/linkedin/actions/get-post-analytics.action.d.ts.map +1 -1
  109. package/dist/providers/linkedin/actions/get-post-analytics.action.js +23 -25
  110. package/dist/providers/linkedin/actions/get-post-analytics.action.js.map +1 -1
  111. package/dist/providers/linkedin/actions/schedule-post.action.d.ts.map +1 -1
  112. package/dist/providers/linkedin/actions/schedule-post.action.js +30 -32
  113. package/dist/providers/linkedin/actions/schedule-post.action.js.map +1 -1
  114. package/dist/providers/linkedin/actions/search-posts.action.d.ts.map +1 -1
  115. package/dist/providers/linkedin/actions/search-posts.action.js +30 -28
  116. package/dist/providers/linkedin/actions/search-posts.action.js.map +1 -1
  117. package/dist/providers/linkedin/linkedin-base.action.d.ts.map +1 -1
  118. package/dist/providers/linkedin/linkedin-base.action.js +38 -33
  119. package/dist/providers/linkedin/linkedin-base.action.js.map +1 -1
  120. package/dist/providers/tiktok/tiktok-base.action.d.ts.map +1 -1
  121. package/dist/providers/tiktok/tiktok-base.action.js +26 -25
  122. package/dist/providers/tiktok/tiktok-base.action.js.map +1 -1
  123. package/dist/providers/twitter/actions/create-thread.action.d.ts.map +1 -1
  124. package/dist/providers/twitter/actions/create-thread.action.js +29 -25
  125. package/dist/providers/twitter/actions/create-thread.action.js.map +1 -1
  126. package/dist/providers/twitter/actions/create-tweet.action.d.ts.map +1 -1
  127. package/dist/providers/twitter/actions/create-tweet.action.js +23 -23
  128. package/dist/providers/twitter/actions/create-tweet.action.js.map +1 -1
  129. package/dist/providers/twitter/actions/delete-tweet.action.d.ts.map +1 -1
  130. package/dist/providers/twitter/actions/delete-tweet.action.js +19 -19
  131. package/dist/providers/twitter/actions/delete-tweet.action.js.map +1 -1
  132. package/dist/providers/twitter/actions/get-analytics.action.d.ts.map +1 -1
  133. package/dist/providers/twitter/actions/get-analytics.action.js +47 -40
  134. package/dist/providers/twitter/actions/get-analytics.action.js.map +1 -1
  135. package/dist/providers/twitter/actions/get-mentions.action.d.ts.map +1 -1
  136. package/dist/providers/twitter/actions/get-mentions.action.js +31 -30
  137. package/dist/providers/twitter/actions/get-mentions.action.js.map +1 -1
  138. package/dist/providers/twitter/actions/get-timeline.action.d.ts.map +1 -1
  139. package/dist/providers/twitter/actions/get-timeline.action.js +29 -29
  140. package/dist/providers/twitter/actions/get-timeline.action.js.map +1 -1
  141. package/dist/providers/twitter/actions/schedule-tweet.action.d.ts.map +1 -1
  142. package/dist/providers/twitter/actions/schedule-tweet.action.js +26 -26
  143. package/dist/providers/twitter/actions/schedule-tweet.action.js.map +1 -1
  144. package/dist/providers/twitter/actions/search-tweets.action.d.ts.map +1 -1
  145. package/dist/providers/twitter/actions/search-tweets.action.js +58 -56
  146. package/dist/providers/twitter/actions/search-tweets.action.js.map +1 -1
  147. package/dist/providers/twitter/twitter-base.action.d.ts.map +1 -1
  148. package/dist/providers/twitter/twitter-base.action.js +68 -58
  149. package/dist/providers/twitter/twitter-base.action.js.map +1 -1
  150. package/dist/providers/youtube/youtube-base.action.d.ts +1 -1
  151. package/dist/providers/youtube/youtube-base.action.d.ts.map +1 -1
  152. package/dist/providers/youtube/youtube-base.action.js +25 -22
  153. package/dist/providers/youtube/youtube-base.action.js.map +1 -1
  154. package/package.json +6 -5
  155. package/src/base/base-social.action.ts +224 -217
  156. package/src/providers/buffer/buffer-base.action.ts +441 -435
  157. package/src/providers/facebook/actions/boost-post.action.ts +386 -350
  158. package/src/providers/facebook/actions/create-album.action.ts +307 -291
  159. package/src/providers/facebook/actions/create-post.action.ts +227 -224
  160. package/src/providers/facebook/actions/get-page-insights.action.ts +403 -383
  161. package/src/providers/facebook/actions/get-page-posts.action.ts +225 -214
  162. package/src/providers/facebook/actions/get-post-insights.action.ts +316 -300
  163. package/src/providers/facebook/actions/respond-to-comments.action.ts +336 -319
  164. package/src/providers/facebook/actions/schedule-post.action.ts +292 -289
  165. package/src/providers/facebook/actions/search-posts.action.ts +413 -399
  166. package/src/providers/facebook/facebook-base.action.ts +670 -653
  167. package/src/providers/hootsuite/actions/bulk-schedule-posts.action.ts +257 -257
  168. package/src/providers/hootsuite/actions/create-scheduled-post.action.ts +189 -184
  169. package/src/providers/hootsuite/actions/delete-scheduled-post.action.ts +161 -160
  170. package/src/providers/hootsuite/actions/get-analytics.action.ts +254 -249
  171. package/src/providers/hootsuite/actions/get-scheduled-posts.action.ts +207 -206
  172. package/src/providers/hootsuite/actions/get-social-profiles.action.ts +205 -206
  173. package/src/providers/hootsuite/actions/search-posts.action.ts +369 -351
  174. package/src/providers/hootsuite/actions/update-scheduled-post.action.ts +209 -211
  175. package/src/providers/hootsuite/hootsuite-base.action.ts +307 -301
  176. package/src/providers/instagram/actions/create-post.action.ts +296 -276
  177. package/src/providers/instagram/actions/create-story.action.ts +394 -378
  178. package/src/providers/instagram/actions/get-account-insights.action.ts +420 -384
  179. package/src/providers/instagram/actions/get-business-posts.action.ts +242 -233
  180. package/src/providers/instagram/actions/get-comments.action.ts +377 -365
  181. package/src/providers/instagram/actions/get-post-insights.action.ts +273 -265
  182. package/src/providers/instagram/actions/schedule-post.action.ts +235 -233
  183. package/src/providers/instagram/actions/search-posts.action.ts +538 -512
  184. package/src/providers/instagram/instagram-base.action.ts +393 -368
  185. package/src/providers/linkedin/actions/create-article.action.ts +266 -275
  186. package/src/providers/linkedin/actions/create-post.action.ts +177 -179
  187. package/src/providers/linkedin/actions/get-followers.action.ts +211 -211
  188. package/src/providers/linkedin/actions/get-organization-posts.action.ts +147 -146
  189. package/src/providers/linkedin/actions/get-personal-posts.action.ts +139 -138
  190. package/src/providers/linkedin/actions/get-post-analytics.action.ts +189 -190
  191. package/src/providers/linkedin/actions/schedule-post.action.ts +189 -191
  192. package/src/providers/linkedin/actions/search-posts.action.ts +283 -275
  193. package/src/providers/linkedin/linkedin-base.action.ts +421 -407
  194. package/src/providers/tiktok/tiktok-base.action.ts +320 -305
  195. package/src/providers/twitter/actions/create-thread.action.ts +207 -203
  196. package/src/providers/twitter/actions/create-tweet.action.ts +188 -187
  197. package/src/providers/twitter/actions/delete-tweet.action.ts +129 -128
  198. package/src/providers/twitter/actions/get-analytics.action.ts +411 -402
  199. package/src/providers/twitter/actions/get-mentions.action.ts +219 -218
  200. package/src/providers/twitter/actions/get-timeline.action.ts +233 -232
  201. package/src/providers/twitter/actions/schedule-tweet.action.ts +222 -221
  202. package/src/providers/twitter/actions/search-tweets.action.ts +543 -540
  203. package/src/providers/twitter/twitter-base.action.ts +560 -541
  204. package/src/providers/youtube/youtube-base.action.ts +333 -320
@@ -1,7 +1,7 @@
1
1
  import { RegisterClass } from '@memberjunction/global';
2
2
  import { InstagramBaseAction } from '../instagram-base.action';
3
3
  import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
4
- import { LogError } from '@memberjunction/global';
4
+ import { LogError } from '@memberjunction/core';
5
5
  import { BaseAction } from '@memberjunction/actions';
6
6
 
7
7
  /**
@@ -10,405 +10,441 @@ import { BaseAction } from '@memberjunction/actions';
10
10
  */
11
11
  @RegisterClass(BaseAction, 'Instagram - Get Account Insights')
12
12
  export class InstagramGetAccountInsightsAction extends InstagramBaseAction {
13
- protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
14
- try {
15
- const companyIntegrationId = this.getParamValue(params.Params, 'CompanyIntegrationID');
16
- const period = this.getParamValue(params.Params, 'Period') || 'day';
17
- const startDate = this.getParamValue(params.Params, 'StartDate');
18
- const endDate = this.getParamValue(params.Params, 'EndDate');
19
- const includeDemographics = this.getParamValue(params.Params, 'IncludeDemographics') !== false;
20
-
21
- // Initialize OAuth
22
- if (!(await this.initializeOAuth(companyIntegrationId))) {
23
- return {
24
- Success: false,
25
- Message: 'Failed to initialize Instagram authentication',
26
- ResultCode: 'AUTH_FAILED',
27
- };
28
- }
29
-
30
- // Define metrics based on period
31
- const metrics = this.getAccountMetrics(period);
32
-
33
- // Get account insights
34
- const insights = await this.getInsights(this.instagramBusinessAccountId, metrics, period as any);
35
-
36
- // Parse insights data
37
- const parsedInsights = this.parseAccountInsights(insights);
38
-
39
- // Get account info
40
- const accountInfo = await this.getAccountInfo();
41
-
42
- // Get demographics if requested
43
- let demographics = null;
44
- if (includeDemographics) {
45
- demographics = await this.getAccountDemographics();
46
- }
47
-
48
- // Get content performance summary
49
- const contentSummary = await this.getContentPerformanceSummary(startDate, endDate);
50
-
51
- // Calculate growth metrics
52
- const growthMetrics = this.calculateGrowthMetrics(parsedInsights, accountInfo);
53
-
54
- // Store result in output params
55
- const outputParams = [...params.Params];
56
- outputParams.push({
57
- Name: 'ResultData',
58
- Type: 'Output',
59
- Value: JSON.stringify({
60
- account: {
61
- id: this.instagramBusinessAccountId,
62
- username: accountInfo.username,
63
- name: accountInfo.name,
64
- biography: accountInfo.biography,
65
- followersCount: accountInfo.followers_count,
66
- followsCount: accountInfo.follows_count,
67
- mediaCount: accountInfo.media_count,
68
- profilePictureUrl: accountInfo.profile_picture_url,
69
- websiteUrl: accountInfo.website,
70
- },
71
- insights: parsedInsights,
72
- demographics,
73
- growth: growthMetrics,
74
- contentPerformance: contentSummary,
75
- period,
76
- dataCollectedAt: new Date().toISOString(),
77
- }),
78
- });
79
-
80
- return {
81
- Success: true,
82
- Message: 'Successfully retrieved Instagram account insights',
83
- ResultCode: 'SUCCESS',
84
- Params: outputParams,
85
- };
86
- } catch (error: any) {
87
- LogError('Failed to retrieve Instagram account insights', error);
88
-
89
- if (error.code === 'RATE_LIMIT') {
90
- return {
91
- Success: false,
92
- Message: 'Instagram API rate limit exceeded. Please try again later.',
93
- ResultCode: 'RATE_LIMIT',
94
- };
95
- }
13
+
14
+ protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
15
+ try {
16
+ const companyIntegrationId = this.getParamValue(params.Params, 'CompanyIntegrationID');
17
+ const period = this.getParamValue(params.Params, 'Period') || 'day';
18
+ const startDate = this.getParamValue(params.Params, 'StartDate');
19
+ const endDate = this.getParamValue(params.Params, 'EndDate');
20
+ const includeDemographics = this.getParamValue(params.Params, 'IncludeDemographics') !== false;
21
+
22
+ // Initialize OAuth
23
+ if (!await this.initializeOAuth(companyIntegrationId)) {
24
+ return {
25
+ Success: false,
26
+ Message: 'Failed to initialize Instagram authentication',
27
+ ResultCode: 'AUTH_FAILED'
28
+ };
29
+ }
30
+
31
+ // Define metrics based on period
32
+ const metrics = this.getAccountMetrics(period);
33
+
34
+ // Get account insights
35
+ const insights = await this.getInsights(
36
+ this.instagramBusinessAccountId,
37
+ metrics,
38
+ period as any
39
+ );
40
+
41
+ // Parse insights data
42
+ const parsedInsights = this.parseAccountInsights(insights);
43
+
44
+ // Get account info
45
+ const accountInfo = await this.getAccountInfo();
46
+
47
+ // Get demographics if requested
48
+ let demographics = null;
49
+ if (includeDemographics) {
50
+ demographics = await this.getAccountDemographics();
51
+ }
52
+
53
+ // Get content performance summary
54
+ const contentSummary = await this.getContentPerformanceSummary(startDate, endDate);
55
+
56
+ // Calculate growth metrics
57
+ const growthMetrics = this.calculateGrowthMetrics(parsedInsights, accountInfo);
58
+
59
+ // Store result in output params
60
+ const outputParams = [...params.Params];
61
+ outputParams.push({
62
+ Name: 'ResultData',
63
+ Type: 'Output',
64
+ Value: JSON.stringify({
65
+ account: {
66
+ id: this.instagramBusinessAccountId,
67
+ username: accountInfo.username,
68
+ name: accountInfo.name,
69
+ biography: accountInfo.biography,
70
+ followersCount: accountInfo.followers_count,
71
+ followsCount: accountInfo.follows_count,
72
+ mediaCount: accountInfo.media_count,
73
+ profilePictureUrl: accountInfo.profile_picture_url,
74
+ websiteUrl: accountInfo.website
75
+ },
76
+ insights: parsedInsights,
77
+ demographics,
78
+ growth: growthMetrics,
79
+ contentPerformance: contentSummary,
80
+ period,
81
+ dataCollectedAt: new Date().toISOString()
82
+ })
83
+ });
84
+
85
+ return {
86
+ Success: true,
87
+ Message: 'Successfully retrieved Instagram account insights',
88
+ ResultCode: 'SUCCESS',
89
+ Params: outputParams
90
+ };
91
+
92
+ } catch (error: any) {
93
+ LogError('Failed to retrieve Instagram account insights', error);
94
+
95
+ if (error.code === 'RATE_LIMIT') {
96
+ return {
97
+ Success: false,
98
+ Message: 'Instagram API rate limit exceeded. Please try again later.',
99
+ ResultCode: 'RATE_LIMIT'
100
+ };
101
+ }
102
+
103
+ if (error.code === 'INSUFFICIENT_PERMISSIONS') {
104
+ return {
105
+ Success: false,
106
+ Message: 'Insufficient permissions to access Instagram account insights',
107
+ ResultCode: 'INSUFFICIENT_PERMISSIONS'
108
+ };
109
+ }
110
+
111
+ return {
112
+ Success: false,
113
+ Message: `Failed to retrieve account insights: ${error.message}`,
114
+ ResultCode: 'ERROR'
115
+ };
116
+ }
117
+ }
96
118
 
97
- if (error.code === 'INSUFFICIENT_PERMISSIONS') {
98
- return {
99
- Success: false,
100
- Message: 'Insufficient permissions to access Instagram account insights',
101
- ResultCode: 'INSUFFICIENT_PERMISSIONS',
102
- };
103
- }
119
+ /**
120
+ * Get appropriate metrics based on period
121
+ */
122
+ private getAccountMetrics(period: string): string[] {
123
+ const baseMetrics = [
124
+ 'impressions',
125
+ 'reach',
126
+ 'profile_views',
127
+ 'website_clicks'
128
+ ];
129
+
130
+ if (period === 'day') {
131
+ return [
132
+ ...baseMetrics,
133
+ 'follower_count',
134
+ 'email_contacts',
135
+ 'phone_call_clicks',
136
+ 'text_message_clicks',
137
+ 'get_directions_clicks'
138
+ ];
139
+ } else if (period === 'week' || period === 'days_28') {
140
+ return [
141
+ ...baseMetrics,
142
+ 'accounts_engaged'
143
+ ];
144
+ }
104
145
 
105
- return {
106
- Success: false,
107
- Message: `Failed to retrieve account insights: ${error.message}`,
108
- ResultCode: 'ERROR',
109
- };
146
+ return baseMetrics;
110
147
  }
111
- }
112
-
113
- /**
114
- * Get appropriate metrics based on period
115
- */
116
- private getAccountMetrics(period: string): string[] {
117
- const baseMetrics = ['impressions', 'reach', 'profile_views', 'website_clicks'];
118
-
119
- if (period === 'day') {
120
- return [...baseMetrics, 'follower_count', 'email_contacts', 'phone_call_clicks', 'text_message_clicks', 'get_directions_clicks'];
121
- } else if (period === 'week' || period === 'days_28') {
122
- return [...baseMetrics, 'accounts_engaged'];
148
+
149
+ /**
150
+ * Get account information
151
+ */
152
+ private async getAccountInfo(): Promise<any> {
153
+ const response = await this.makeInstagramRequest(
154
+ this.instagramBusinessAccountId,
155
+ 'GET',
156
+ null,
157
+ {
158
+ fields: 'username,name,biography,followers_count,follows_count,media_count,profile_picture_url,website',
159
+ access_token: this.getAccessToken()
160
+ }
161
+ );
162
+
163
+ return response;
123
164
  }
124
165
 
125
- return baseMetrics;
126
- }
127
-
128
- /**
129
- * Get account information
130
- */
131
- private async getAccountInfo(): Promise<any> {
132
- const response = await this.makeInstagramRequest(this.instagramBusinessAccountId, 'GET', null, {
133
- fields: 'username,name,biography,followers_count,follows_count,media_count,profile_picture_url,website',
134
- access_token: this.getAccessToken(),
135
- });
136
-
137
- return response;
138
- }
139
-
140
- /**
141
- * Get account demographics
142
- */
143
- private async getAccountDemographics(): Promise<any> {
144
- try {
145
- // Get follower demographics
146
- const demographicMetrics = ['audience_city', 'audience_country', 'audience_gender_age', 'audience_locale', 'online_followers'];
147
-
148
- const demographics = await this.getInsights(this.instagramBusinessAccountId, demographicMetrics, 'lifetime');
149
-
150
- // Parse demographic data
151
- const parsed: any = {
152
- locations: {
153
- cities: {},
154
- countries: {},
155
- },
156
- genderAge: {},
157
- languages: {},
158
- onlineHours: {},
159
- };
160
-
161
- demographics.forEach((metric: any) => {
162
- const value = metric.values?.[0]?.value;
163
-
164
- switch (metric.name) {
165
- case 'audience_city':
166
- parsed.locations.cities = value || {};
167
- break;
168
- case 'audience_country':
169
- parsed.locations.countries = value || {};
170
- break;
171
- case 'audience_gender_age':
172
- parsed.genderAge = this.parseGenderAge(value || {});
173
- break;
174
- case 'audience_locale':
175
- parsed.languages = value || {};
176
- break;
177
- case 'online_followers':
178
- parsed.onlineHours = this.parseOnlineHours(value || {});
179
- break;
166
+ /**
167
+ * Get account demographics
168
+ */
169
+ private async getAccountDemographics(): Promise<any> {
170
+ try {
171
+ // Get follower demographics
172
+ const demographicMetrics = [
173
+ 'audience_city',
174
+ 'audience_country',
175
+ 'audience_gender_age',
176
+ 'audience_locale',
177
+ 'online_followers'
178
+ ];
179
+
180
+ const demographics = await this.getInsights(
181
+ this.instagramBusinessAccountId,
182
+ demographicMetrics,
183
+ 'lifetime'
184
+ );
185
+
186
+ // Parse demographic data
187
+ const parsed: any = {
188
+ locations: {
189
+ cities: {},
190
+ countries: {}
191
+ },
192
+ genderAge: {},
193
+ languages: {},
194
+ onlineHours: {}
195
+ };
196
+
197
+ demographics.forEach((metric: any) => {
198
+ const value = metric.values?.[0]?.value;
199
+
200
+ switch (metric.name) {
201
+ case 'audience_city':
202
+ parsed.locations.cities = value || {};
203
+ break;
204
+ case 'audience_country':
205
+ parsed.locations.countries = value || {};
206
+ break;
207
+ case 'audience_gender_age':
208
+ parsed.genderAge = this.parseGenderAge(value || {});
209
+ break;
210
+ case 'audience_locale':
211
+ parsed.languages = value || {};
212
+ break;
213
+ case 'online_followers':
214
+ parsed.onlineHours = this.parseOnlineHours(value || {});
215
+ break;
216
+ }
217
+ });
218
+
219
+ return parsed;
220
+ } catch (error) {
221
+ LogError('Failed to get demographics', error);
222
+ return null;
180
223
  }
181
- });
224
+ }
225
+
226
+ /**
227
+ * Parse gender/age demographics
228
+ */
229
+ private parseGenderAge(data: any): any {
230
+ const parsed: any = {
231
+ male: {},
232
+ female: {},
233
+ unknown: {}
234
+ };
182
235
 
183
- return parsed;
184
- } catch (error) {
185
- LogError('Failed to get demographics', error);
186
- return null;
236
+ Object.keys(data).forEach(key => {
237
+ const [gender, ageRange] = key.split('.');
238
+ if (parsed[gender]) {
239
+ parsed[gender][ageRange] = data[key];
240
+ }
241
+ });
242
+
243
+ return parsed;
187
244
  }
188
- }
189
-
190
- /**
191
- * Parse gender/age demographics
192
- */
193
- private parseGenderAge(data: any): any {
194
- const parsed: any = {
195
- male: {},
196
- female: {},
197
- unknown: {},
198
- };
199
-
200
- Object.keys(data).forEach((key) => {
201
- const [gender, ageRange] = key.split('.');
202
- if (parsed[gender]) {
203
- parsed[gender][ageRange] = data[key];
204
- }
205
- });
206
-
207
- return parsed;
208
- }
209
-
210
- /**
211
- * Parse online hours data
212
- */
213
- private parseOnlineHours(data: any): any {
214
- const parsed: any = {};
215
-
216
- Object.keys(data).forEach((hour) => {
217
- parsed[hour] = {
218
- count: data[hour],
219
- hour: parseInt(hour),
220
- label: `${hour}:00`,
221
- };
222
- });
223
-
224
- return parsed;
225
- }
226
-
227
- /**
228
- * Get content performance summary
229
- */
230
- private async getContentPerformanceSummary(startDate?: string, endDate?: string): Promise<any> {
231
- try {
232
- // Get recent posts
233
- const queryParams: any = {
234
- fields: 'id,media_type,like_count,comments_count,timestamp',
235
- access_token: this.getAccessToken(),
236
- limit: 50,
237
- };
238
-
239
- if (startDate) {
240
- queryParams.since = Math.floor(new Date(startDate).getTime() / 1000);
241
- }
242
- if (endDate) {
243
- queryParams.until = Math.floor(new Date(endDate).getTime() / 1000);
244
- }
245
-
246
- const response = await this.makeInstagramRequest<{ data: any[] }>(
247
- `${this.instagramBusinessAccountId}/media`,
248
- 'GET',
249
- null,
250
- queryParams
251
- );
252
-
253
- const posts = response.data || [];
254
-
255
- // Calculate performance metrics
256
- const summary = {
257
- totalPosts: posts.length,
258
- avgLikes: 0,
259
- avgComments: 0,
260
- totalEngagements: 0,
261
- topPerformingPost: null as any,
262
- mediaTypeBreakdown: {
263
- IMAGE: 0,
264
- VIDEO: 0,
265
- CAROUSEL_ALBUM: 0,
266
- REELS: 0,
267
- },
268
- };
269
-
270
- if (posts.length > 0) {
271
- let totalLikes = 0;
272
- let totalComments = 0;
273
- let topPost = posts[0];
274
-
275
- posts.forEach((post) => {
276
- totalLikes += post.like_count || 0;
277
- totalComments += post.comments_count || 0;
278
-
279
- // Track media types
280
- if (summary.mediaTypeBreakdown[post.media_type] !== undefined) {
281
- summary.mediaTypeBreakdown[post.media_type]++;
282
- }
283
-
284
- // Find top performing post
285
- const engagement = (post.like_count || 0) + (post.comments_count || 0);
286
- const topEngagement = (topPost.like_count || 0) + (topPost.comments_count || 0);
287
- if (engagement > topEngagement) {
288
- topPost = post;
289
- }
245
+
246
+ /**
247
+ * Parse online hours data
248
+ */
249
+ private parseOnlineHours(data: any): any {
250
+ const parsed: any = {};
251
+
252
+ Object.keys(data).forEach(hour => {
253
+ parsed[hour] = {
254
+ count: data[hour],
255
+ hour: parseInt(hour),
256
+ label: `${hour}:00`
257
+ };
290
258
  });
291
259
 
292
- summary.avgLikes = Math.round(totalLikes / posts.length);
293
- summary.avgComments = Math.round(totalComments / posts.length);
294
- summary.totalEngagements = totalLikes + totalComments;
295
- summary.topPerformingPost = {
296
- id: topPost.id,
297
- likes: topPost.like_count,
298
- comments: topPost.comments_count,
299
- engagement: (topPost.like_count || 0) + (topPost.comments_count || 0),
300
- publishedAt: topPost.timestamp,
301
- };
302
- }
260
+ return parsed;
261
+ }
262
+
263
+ /**
264
+ * Get content performance summary
265
+ */
266
+ private async getContentPerformanceSummary(startDate?: string, endDate?: string): Promise<any> {
267
+ try {
268
+ // Get recent posts
269
+ const queryParams: any = {
270
+ fields: 'id,media_type,like_count,comments_count,timestamp',
271
+ access_token: this.getAccessToken(),
272
+ limit: 50
273
+ };
274
+
275
+ if (startDate) {
276
+ queryParams.since = Math.floor(new Date(startDate).getTime() / 1000);
277
+ }
278
+ if (endDate) {
279
+ queryParams.until = Math.floor(new Date(endDate).getTime() / 1000);
280
+ }
281
+
282
+ const response = await this.makeInstagramRequest<{ data: any[] }>(
283
+ `${this.instagramBusinessAccountId}/media`,
284
+ 'GET',
285
+ null,
286
+ queryParams
287
+ );
288
+
289
+ const posts = response.data || [];
290
+
291
+ // Calculate performance metrics
292
+ const summary = {
293
+ totalPosts: posts.length,
294
+ avgLikes: 0,
295
+ avgComments: 0,
296
+ totalEngagements: 0,
297
+ topPerformingPost: null as any,
298
+ mediaTypeBreakdown: {
299
+ IMAGE: 0,
300
+ VIDEO: 0,
301
+ CAROUSEL_ALBUM: 0,
302
+ REELS: 0
303
+ }
304
+ };
305
+
306
+ if (posts.length > 0) {
307
+ let totalLikes = 0;
308
+ let totalComments = 0;
309
+ let topPost = posts[0];
310
+
311
+ posts.forEach(post => {
312
+ totalLikes += post.like_count || 0;
313
+ totalComments += post.comments_count || 0;
314
+
315
+ // Track media types
316
+ if (summary.mediaTypeBreakdown[post.media_type] !== undefined) {
317
+ summary.mediaTypeBreakdown[post.media_type]++;
318
+ }
319
+
320
+ // Find top performing post
321
+ const engagement = (post.like_count || 0) + (post.comments_count || 0);
322
+ const topEngagement = (topPost.like_count || 0) + (topPost.comments_count || 0);
323
+ if (engagement > topEngagement) {
324
+ topPost = post;
325
+ }
326
+ });
327
+
328
+ summary.avgLikes = Math.round(totalLikes / posts.length);
329
+ summary.avgComments = Math.round(totalComments / posts.length);
330
+ summary.totalEngagements = totalLikes + totalComments;
331
+ summary.topPerformingPost = {
332
+ id: topPost.id,
333
+ likes: topPost.like_count,
334
+ comments: topPost.comments_count,
335
+ engagement: (topPost.like_count || 0) + (topPost.comments_count || 0),
336
+ publishedAt: topPost.timestamp
337
+ };
338
+ }
339
+
340
+ return summary;
341
+ } catch (error) {
342
+ LogError('Failed to get content performance', error);
343
+ return null;
344
+ }
345
+ }
346
+
347
+ /**
348
+ * Parse account insights
349
+ */
350
+ private parseAccountInsights(insights: any[]): Record<string, any> {
351
+ const parsed: Record<string, any> = {};
352
+
353
+ insights.forEach(metric => {
354
+ const name = metric.name;
355
+ const values = metric.values || [];
356
+
357
+ if (values.length > 0) {
358
+ parsed[name] = {
359
+ value: values[0].value || 0,
360
+ title: metric.title,
361
+ description: metric.description,
362
+ period: metric.period
363
+ };
364
+
365
+ // For time series data
366
+ if (values.length > 1) {
367
+ parsed[name].timeSeries = values.map((v: any) => ({
368
+ value: v.value,
369
+ endTime: v.end_time
370
+ }));
371
+ }
372
+ }
373
+ });
303
374
 
304
- return summary;
305
- } catch (error) {
306
- LogError('Failed to get content performance', error);
307
- return null;
375
+ return parsed;
308
376
  }
309
- }
310
-
311
- /**
312
- * Parse account insights
313
- */
314
- private parseAccountInsights(insights: any[]): Record<string, any> {
315
- const parsed: Record<string, any> = {};
316
-
317
- insights.forEach((metric) => {
318
- const name = metric.name;
319
- const values = metric.values || [];
320
-
321
- if (values.length > 0) {
322
- parsed[name] = {
323
- value: values[0].value || 0,
324
- title: metric.title,
325
- description: metric.description,
326
- period: metric.period,
377
+
378
+ /**
379
+ * Calculate growth metrics
380
+ */
381
+ private calculateGrowthMetrics(insights: any, accountInfo: any): any {
382
+ const growth: any = {
383
+ followersGrowth: 0,
384
+ followersGrowthRate: 0,
385
+ reachGrowth: 0,
386
+ impressionsGrowth: 0,
387
+ engagementRate: 0
327
388
  };
328
389
 
329
- // For time series data
330
- if (values.length > 1) {
331
- parsed[name].timeSeries = values.map((v: any) => ({
332
- value: v.value,
333
- endTime: v.end_time,
334
- }));
390
+ // Calculate follower growth if we have time series data
391
+ const followerData = insights.follower_count;
392
+ if (followerData?.timeSeries && followerData.timeSeries.length > 1) {
393
+ const firstValue = followerData.timeSeries[0].value;
394
+ const lastValue = followerData.timeSeries[followerData.timeSeries.length - 1].value;
395
+ growth.followersGrowth = lastValue - firstValue;
396
+
397
+ if (firstValue > 0) {
398
+ growth.followersGrowthRate = ((lastValue - firstValue) / firstValue) * 100;
399
+ }
400
+ }
401
+
402
+ // Calculate engagement rate
403
+ const reach = insights.reach?.value || 0;
404
+ const profileViews = insights.profile_views?.value || 0;
405
+ const websiteClicks = insights.website_clicks?.value || 0;
406
+
407
+ if (reach > 0) {
408
+ const totalEngagements = profileViews + websiteClicks;
409
+ growth.engagementRate = (totalEngagements / reach) * 100;
335
410
  }
336
- }
337
- });
338
-
339
- return parsed;
340
- }
341
-
342
- /**
343
- * Calculate growth metrics
344
- */
345
- private calculateGrowthMetrics(insights: any, accountInfo: any): any {
346
- const growth: any = {
347
- followersGrowth: 0,
348
- followersGrowthRate: 0,
349
- reachGrowth: 0,
350
- impressionsGrowth: 0,
351
- engagementRate: 0,
352
- };
353
-
354
- // Calculate follower growth if we have time series data
355
- const followerData = insights.follower_count;
356
- if (followerData?.timeSeries && followerData.timeSeries.length > 1) {
357
- const firstValue = followerData.timeSeries[0].value;
358
- const lastValue = followerData.timeSeries[followerData.timeSeries.length - 1].value;
359
- growth.followersGrowth = lastValue - firstValue;
360
-
361
- if (firstValue > 0) {
362
- growth.followersGrowthRate = ((lastValue - firstValue) / firstValue) * 100;
363
- }
364
- }
365
411
 
366
- // Calculate engagement rate
367
- const reach = insights.reach?.value || 0;
368
- const profileViews = insights.profile_views?.value || 0;
369
- const websiteClicks = insights.website_clicks?.value || 0;
412
+ return growth;
413
+ }
370
414
 
371
- if (reach > 0) {
372
- const totalEngagements = profileViews + websiteClicks;
373
- growth.engagementRate = (totalEngagements / reach) * 100;
415
+ /**
416
+ * Define the parameters for this action
417
+ */
418
+ public get Params(): ActionParam[] {
419
+ return [
420
+ ...this.commonSocialParams,
421
+ {
422
+ Name: 'Period',
423
+ Type: 'Input',
424
+ Value: 'day'
425
+ },
426
+ {
427
+ Name: 'StartDate',
428
+ Type: 'Input',
429
+ Value: null
430
+ },
431
+ {
432
+ Name: 'EndDate',
433
+ Type: 'Input',
434
+ Value: null
435
+ },
436
+ {
437
+ Name: 'IncludeDemographics',
438
+ Type: 'Input',
439
+ Value: true
440
+ }
441
+ ];
374
442
  }
375
443
 
376
- return growth;
377
- }
378
-
379
- /**
380
- * Define the parameters for this action
381
- */
382
- public get Params(): ActionParam[] {
383
- return [
384
- ...this.commonSocialParams,
385
- {
386
- Name: 'Period',
387
- Type: 'Input',
388
- Value: 'day',
389
- },
390
- {
391
- Name: 'StartDate',
392
- Type: 'Input',
393
- Value: null,
394
- },
395
- {
396
- Name: 'EndDate',
397
- Type: 'Input',
398
- Value: null,
399
- },
400
- {
401
- Name: 'IncludeDemographics',
402
- Type: 'Input',
403
- Value: true,
404
- },
405
- ];
406
- }
407
-
408
- /**
409
- * Get the description for this action
410
- */
411
- public get Description(): string {
412
- return 'Retrieves comprehensive account-level insights including follower demographics, reach, impressions, and growth metrics.';
413
- }
414
- }
444
+ /**
445
+ * Get the description for this action
446
+ */
447
+ public get Description(): string {
448
+ return 'Retrieves comprehensive account-level insights including follower demographics, reach, impressions, and growth metrics.';
449
+ }
450
+ }