@memberjunction/actions-bizapps-social 2.112.0 → 2.113.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 { LinkedInBaseAction } from '../linkedin-base.action';
3
3
  import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
4
- import { LogStatus, LogError } from '@memberjunction/global';
4
+ import { LogStatus, LogError } from '@memberjunction/core';
5
5
  import { BaseAction } from '@memberjunction/actions';
6
6
 
7
7
  /**
@@ -9,219 +9,219 @@ import { BaseAction } from '@memberjunction/actions';
9
9
  */
10
10
  @RegisterClass(BaseAction, 'LinkedInGetFollowersAction')
11
11
  export class LinkedInGetFollowersAction extends LinkedInBaseAction {
12
- /**
13
- * Get follower statistics for personal profile or organization
14
- */
15
- protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
16
- const { Params, ContextUser } = params;
17
-
18
- try {
19
- // Initialize OAuth
20
- const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
21
- if (!(await this.initializeOAuth(companyIntegrationId))) {
22
- throw new Error('Failed to initialize OAuth connection');
23
- }
24
-
25
- // Extract parameters
26
- const entityType = this.getParamValue(Params, 'EntityType') || 'organization'; // 'personal' or 'organization'
27
- const organizationId = this.getParamValue(Params, 'OrganizationID');
28
- const includeGrowth = this.getParamValue(Params, 'IncludeGrowth') === true;
29
- const timeRange = this.getParamValue(Params, 'TimeRange'); // Optional: {start: Date, end: Date}
30
-
31
- let followerData: any = {};
32
-
33
- if (entityType === 'organization') {
34
- // Get organization follower statistics
35
- let organizationUrn: string;
36
- if (!organizationId) {
37
- // Get first admin organization if not specified
38
- const orgs = await this.getAdminOrganizations();
39
- if (orgs.length === 0) {
40
- throw new Error('No organizations found. Please specify OrganizationID.');
41
- }
42
- organizationUrn = orgs[0].urn;
43
- LogStatus(`Using organization: ${orgs[0].name}`);
44
- } else {
45
- organizationUrn = `urn:li:organization:${organizationId}`;
12
+ /**
13
+ * Get follower statistics for personal profile or organization
14
+ */
15
+ protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
16
+ const { Params, ContextUser } = params;
17
+
18
+ try {
19
+ // Initialize OAuth
20
+ const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
21
+ if (!await this.initializeOAuth(companyIntegrationId)) {
22
+ throw new Error('Failed to initialize OAuth connection');
23
+ }
24
+
25
+ // Extract parameters
26
+ const entityType = this.getParamValue(Params, 'EntityType') || 'organization'; // 'personal' or 'organization'
27
+ const organizationId = this.getParamValue(Params, 'OrganizationID');
28
+ const includeGrowth = this.getParamValue(Params, 'IncludeGrowth') === true;
29
+ const timeRange = this.getParamValue(Params, 'TimeRange'); // Optional: {start: Date, end: Date}
30
+
31
+ let followerData: any = {};
32
+
33
+ if (entityType === 'organization') {
34
+ // Get organization follower statistics
35
+ let organizationUrn: string;
36
+ if (!organizationId) {
37
+ // Get first admin organization if not specified
38
+ const orgs = await this.getAdminOrganizations();
39
+ if (orgs.length === 0) {
40
+ throw new Error('No organizations found. Please specify OrganizationID.');
41
+ }
42
+ organizationUrn = orgs[0].urn;
43
+ LogStatus(`Using organization: ${orgs[0].name}`);
44
+ } else {
45
+ organizationUrn = `urn:li:organization:${organizationId}`;
46
+ }
47
+
48
+ followerData = await this.getOrganizationFollowers(organizationUrn, includeGrowth, timeRange);
49
+ } else {
50
+ // Get personal profile follower statistics
51
+ const userUrn = await this.getCurrentUserUrn();
52
+ followerData = await this.getPersonalFollowers(userUrn);
53
+ }
54
+
55
+ // Update output parameters
56
+ const outputParams = [...Params];
57
+ const followersParam = outputParams.find(p => p.Name === 'FollowerCount');
58
+ if (followersParam) followersParam.Value = followerData.followerCount || 0;
59
+ const statsParam = outputParams.find(p => p.Name === 'FollowerStatistics');
60
+ if (statsParam) statsParam.Value = followerData;
61
+
62
+ return {
63
+ Success: true,
64
+ ResultCode: 'SUCCESS',
65
+ Message: `Successfully retrieved follower statistics`,
66
+ Params: outputParams
67
+ };
68
+
69
+ } catch (error) {
70
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
71
+
72
+ return {
73
+ Success: false,
74
+ ResultCode: 'ERROR',
75
+ Message: `Failed to get followers: ${errorMessage}`,
76
+ Params
77
+ };
46
78
  }
79
+ }
47
80
 
48
- followerData = await this.getOrganizationFollowers(organizationUrn, includeGrowth, timeRange);
49
- } else {
50
- // Get personal profile follower statistics
51
- const userUrn = await this.getCurrentUserUrn();
52
- followerData = await this.getPersonalFollowers(userUrn);
53
- }
54
-
55
- // Update output parameters
56
- const outputParams = [...Params];
57
- const followersParam = outputParams.find((p) => p.Name === 'FollowerCount');
58
- if (followersParam) followersParam.Value = followerData.followerCount || 0;
59
- const statsParam = outputParams.find((p) => p.Name === 'FollowerStatistics');
60
- if (statsParam) statsParam.Value = followerData;
61
-
62
- return {
63
- Success: true,
64
- ResultCode: 'SUCCESS',
65
- Message: `Successfully retrieved follower statistics`,
66
- Params: outputParams,
67
- };
68
- } catch (error) {
69
- const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
70
-
71
- return {
72
- Success: false,
73
- ResultCode: 'ERROR',
74
- Message: `Failed to get followers: ${errorMessage}`,
75
- Params,
76
- };
81
+ /**
82
+ * Get organization follower statistics
83
+ */
84
+ private async getOrganizationFollowers(organizationUrn: string, includeGrowth: boolean, timeRange?: any): Promise<any> {
85
+ try {
86
+ const params: any = {
87
+ q: 'organizationalEntity',
88
+ organizationalEntity: organizationUrn
89
+ };
90
+
91
+ // Add time range if specified for growth metrics
92
+ if (includeGrowth && timeRange) {
93
+ params.timeIntervals = `List((start:${new Date(timeRange.start).getTime()},end:${new Date(timeRange.end || Date.now()).getTime()}))`;
94
+ }
95
+
96
+ // Get follower statistics
97
+ const response = await this.axiosInstance.get('/organizationalEntityFollowerStatistics', { params });
98
+
99
+ const stats = response.data.elements?.[0] || {};
100
+
101
+ const result: any = {
102
+ followerCount: stats.followerCounts?.organicFollowerCount || 0,
103
+ paidFollowerCount: stats.followerCounts?.paidFollowerCount || 0,
104
+ totalFollowerCount: (stats.followerCounts?.organicFollowerCount || 0) + (stats.followerCounts?.paidFollowerCount || 0)
105
+ };
106
+
107
+ // Add growth metrics if requested
108
+ if (includeGrowth && stats.followerGains) {
109
+ result.followerGrowth = {
110
+ organicGains: stats.followerGains.organicFollowerGains || 0,
111
+ paidGains: stats.followerGains.paidFollowerGains || 0,
112
+ totalGains: (stats.followerGains.organicFollowerGains || 0) + (stats.followerGains.paidFollowerGains || 0),
113
+ timeRange: timeRange
114
+ };
115
+ }
116
+
117
+ // Get demographics if available
118
+ try {
119
+ const demographicsResponse = await this.axiosInstance.get('/organizationalEntityFollowerStatistics', {
120
+ params: {
121
+ q: 'organizationalEntity',
122
+ organizationalEntity: organizationUrn,
123
+ projection: '(followerCountsByAssociationType,followerCountsByFunction,followerCountsBySeniority,followerCountsByIndustry,followerCountsByRegion,followerCountsByCountry)'
124
+ }
125
+ });
126
+
127
+ if (demographicsResponse.data.elements?.[0]) {
128
+ const demographics = demographicsResponse.data.elements[0];
129
+ result.demographics = {
130
+ byFunction: demographics.followerCountsByFunction || [],
131
+ bySeniority: demographics.followerCountsBySeniority || [],
132
+ byIndustry: demographics.followerCountsByIndustry || [],
133
+ byRegion: demographics.followerCountsByRegion || [],
134
+ byCountry: demographics.followerCountsByCountry || []
135
+ };
136
+ }
137
+ } catch (error) {
138
+ LogError(`Failed to get follower demographics: ${error instanceof Error ? error.message : 'Unknown error'}`);
139
+ }
140
+
141
+ return result;
142
+ } catch (error) {
143
+ LogError(`Failed to get organization followers: ${error instanceof Error ? error.message : 'Unknown error'}`);
144
+ throw error;
145
+ }
77
146
  }
78
- }
79
-
80
- /**
81
- * Get organization follower statistics
82
- */
83
- private async getOrganizationFollowers(organizationUrn: string, includeGrowth: boolean, timeRange?: any): Promise<any> {
84
- try {
85
- const params: any = {
86
- q: 'organizationalEntity',
87
- organizationalEntity: organizationUrn,
88
- };
89
-
90
- // Add time range if specified for growth metrics
91
- if (includeGrowth && timeRange) {
92
- params.timeIntervals = `List((start:${new Date(timeRange.start).getTime()},end:${new Date(timeRange.end || Date.now()).getTime()}))`;
93
- }
94
-
95
- // Get follower statistics
96
- const response = await this.axiosInstance.get('/organizationalEntityFollowerStatistics', { params });
97
-
98
- const stats = response.data.elements?.[0] || {};
99
-
100
- const result: any = {
101
- followerCount: stats.followerCounts?.organicFollowerCount || 0,
102
- paidFollowerCount: stats.followerCounts?.paidFollowerCount || 0,
103
- totalFollowerCount: (stats.followerCounts?.organicFollowerCount || 0) + (stats.followerCounts?.paidFollowerCount || 0),
104
- };
105
-
106
- // Add growth metrics if requested
107
- if (includeGrowth && stats.followerGains) {
108
- result.followerGrowth = {
109
- organicGains: stats.followerGains.organicFollowerGains || 0,
110
- paidGains: stats.followerGains.paidFollowerGains || 0,
111
- totalGains: (stats.followerGains.organicFollowerGains || 0) + (stats.followerGains.paidFollowerGains || 0),
112
- timeRange: timeRange,
113
- };
114
- }
115
-
116
- // Get demographics if available
117
- try {
118
- const demographicsResponse = await this.axiosInstance.get('/organizationalEntityFollowerStatistics', {
119
- params: {
120
- q: 'organizationalEntity',
121
- organizationalEntity: organizationUrn,
122
- projection:
123
- '(followerCountsByAssociationType,followerCountsByFunction,followerCountsBySeniority,followerCountsByIndustry,followerCountsByRegion,followerCountsByCountry)',
124
- },
125
- });
126
-
127
- if (demographicsResponse.data.elements?.[0]) {
128
- const demographics = demographicsResponse.data.elements[0];
129
- result.demographics = {
130
- byFunction: demographics.followerCountsByFunction || [],
131
- bySeniority: demographics.followerCountsBySeniority || [],
132
- byIndustry: demographics.followerCountsByIndustry || [],
133
- byRegion: demographics.followerCountsByRegion || [],
134
- byCountry: demographics.followerCountsByCountry || [],
135
- };
147
+
148
+ /**
149
+ * Get personal profile follower statistics
150
+ * Note: LinkedIn provides limited follower data for personal profiles
151
+ */
152
+ private async getPersonalFollowers(userUrn: string): Promise<any> {
153
+ try {
154
+ // Get basic profile information including follower count
155
+ const response = await this.axiosInstance.get('/me', {
156
+ params: {
157
+ projection: '(id,firstName,lastName,headline,publicProfileUrl,followerCount)'
158
+ }
159
+ });
160
+
161
+ return {
162
+ followerCount: response.data.followerCount || 0,
163
+ profileInfo: {
164
+ name: `${response.data.firstName?.localized?.en_US || ''} ${response.data.lastName?.localized?.en_US || ''}`.trim(),
165
+ headline: response.data.headline?.localized?.en_US || '',
166
+ profileUrl: response.data.publicProfileUrl || ''
167
+ },
168
+ note: 'LinkedIn API provides limited follower statistics for personal profiles'
169
+ };
170
+ } catch (error) {
171
+ LogError(`Failed to get personal followers: ${error instanceof Error ? error.message : 'Unknown error'}`);
172
+
173
+ // Fallback: return basic info
174
+ return {
175
+ followerCount: 0,
176
+ note: 'Unable to retrieve follower count for personal profile',
177
+ error: error instanceof Error ? error.message : 'Unknown error'
178
+ };
136
179
  }
137
- } catch (error) {
138
- LogError(`Failed to get follower demographics: ${error instanceof Error ? error.message : 'Unknown error'}`);
139
- }
140
-
141
- return result;
142
- } catch (error) {
143
- LogError(`Failed to get organization followers: ${error instanceof Error ? error.message : 'Unknown error'}`);
144
- throw error;
145
180
  }
146
- }
147
-
148
- /**
149
- * Get personal profile follower statistics
150
- * Note: LinkedIn provides limited follower data for personal profiles
151
- */
152
- private async getPersonalFollowers(userUrn: string): Promise<any> {
153
- try {
154
- // Get basic profile information including follower count
155
- const response = await this.axiosInstance.get('/me', {
156
- params: {
157
- projection: '(id,firstName,lastName,headline,publicProfileUrl,followerCount)',
158
- },
159
- });
160
-
161
- return {
162
- followerCount: response.data.followerCount || 0,
163
- profileInfo: {
164
- name: `${response.data.firstName?.localized?.en_US || ''} ${response.data.lastName?.localized?.en_US || ''}`.trim(),
165
- headline: response.data.headline?.localized?.en_US || '',
166
- profileUrl: response.data.publicProfileUrl || '',
167
- },
168
- note: 'LinkedIn API provides limited follower statistics for personal profiles',
169
- };
170
- } catch (error) {
171
- LogError(`Failed to get personal followers: ${error instanceof Error ? error.message : 'Unknown error'}`);
172
-
173
- // Fallback: return basic info
174
- return {
175
- followerCount: 0,
176
- note: 'Unable to retrieve follower count for personal profile',
177
- error: error instanceof Error ? error.message : 'Unknown error',
178
- };
181
+
182
+ /**
183
+ * Define the parameters this action expects
184
+ */
185
+ public get Params(): ActionParam[] {
186
+ return [
187
+ ...this.commonSocialParams,
188
+ {
189
+ Name: 'EntityType',
190
+ Type: 'Input',
191
+ Value: 'organization' // 'personal' or 'organization'
192
+ },
193
+ {
194
+ Name: 'OrganizationID',
195
+ Type: 'Input',
196
+ Value: null
197
+ },
198
+ {
199
+ Name: 'IncludeGrowth',
200
+ Type: 'Input',
201
+ Value: false
202
+ },
203
+ {
204
+ Name: 'TimeRange',
205
+ Type: 'Input',
206
+ Value: null // Optional: {start: Date, end: Date}
207
+ },
208
+ {
209
+ Name: 'FollowerCount',
210
+ Type: 'Output',
211
+ Value: null
212
+ },
213
+ {
214
+ Name: 'FollowerStatistics',
215
+ Type: 'Output',
216
+ Value: null
217
+ }
218
+ ];
219
+ }
220
+
221
+ /**
222
+ * Get action description
223
+ */
224
+ public get Description(): string {
225
+ return 'Retrieves follower statistics for LinkedIn personal profiles or organization pages, including demographics and growth metrics where available';
179
226
  }
180
- }
181
-
182
- /**
183
- * Define the parameters this action expects
184
- */
185
- public get Params(): ActionParam[] {
186
- return [
187
- ...this.commonSocialParams,
188
- {
189
- Name: 'EntityType',
190
- Type: 'Input',
191
- Value: 'organization', // 'personal' or 'organization'
192
- },
193
- {
194
- Name: 'OrganizationID',
195
- Type: 'Input',
196
- Value: null,
197
- },
198
- {
199
- Name: 'IncludeGrowth',
200
- Type: 'Input',
201
- Value: false,
202
- },
203
- {
204
- Name: 'TimeRange',
205
- Type: 'Input',
206
- Value: null, // Optional: {start: Date, end: Date}
207
- },
208
- {
209
- Name: 'FollowerCount',
210
- Type: 'Output',
211
- Value: null,
212
- },
213
- {
214
- Name: 'FollowerStatistics',
215
- Type: 'Output',
216
- Value: null,
217
- },
218
- ];
219
- }
220
-
221
- /**
222
- * Get action description
223
- */
224
- public get Description(): string {
225
- return 'Retrieves follower statistics for LinkedIn personal profiles or organization pages, including demographics and growth metrics where available';
226
- }
227
- }
227
+ }