@memberjunction/actions-bizapps-social 2.111.1 → 2.112.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 +6 -6
  3. package/dist/base/base-social.action.d.ts.map +1 -1
  4. package/dist/base/base-social.action.js +18 -24
  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 +35 -34
  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 +34 -36
  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 +25 -27
  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 +19 -23
  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 +28 -32
  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 +42 -44
  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 +37 -39
  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 +44 -59
  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 +33 -31
  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 +28 -32
  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 +24 -26
  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 +32 -34
  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 +43 -52
  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 +30 -28
  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 +18 -20
  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 +27 -26
  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 +38 -59
  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 +23 -25
  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 +56 -60
  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 +25 -27
  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 +55 -45
  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 +31 -29
  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 +25 -23
  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 +32 -30
  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 +28 -30
  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 +33 -38
  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 +25 -26
  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 +25 -29
  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 +40 -47
  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 +30 -31
  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 +56 -58
  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 +58 -68
  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 +22 -25
  153. package/dist/providers/youtube/youtube-base.action.js.map +1 -1
  154. package/package.json +5 -6
  155. package/src/base/base-social.action.ts +217 -224
  156. package/src/providers/buffer/buffer-base.action.ts +435 -441
  157. package/src/providers/facebook/actions/boost-post.action.ts +350 -386
  158. package/src/providers/facebook/actions/create-album.action.ts +291 -307
  159. package/src/providers/facebook/actions/create-post.action.ts +224 -227
  160. package/src/providers/facebook/actions/get-page-insights.action.ts +383 -403
  161. package/src/providers/facebook/actions/get-page-posts.action.ts +214 -225
  162. package/src/providers/facebook/actions/get-post-insights.action.ts +300 -316
  163. package/src/providers/facebook/actions/respond-to-comments.action.ts +319 -336
  164. package/src/providers/facebook/actions/schedule-post.action.ts +289 -292
  165. package/src/providers/facebook/actions/search-posts.action.ts +399 -413
  166. package/src/providers/facebook/facebook-base.action.ts +653 -670
  167. package/src/providers/hootsuite/actions/bulk-schedule-posts.action.ts +257 -257
  168. package/src/providers/hootsuite/actions/create-scheduled-post.action.ts +184 -189
  169. package/src/providers/hootsuite/actions/delete-scheduled-post.action.ts +160 -161
  170. package/src/providers/hootsuite/actions/get-analytics.action.ts +249 -254
  171. package/src/providers/hootsuite/actions/get-scheduled-posts.action.ts +206 -207
  172. package/src/providers/hootsuite/actions/get-social-profiles.action.ts +206 -205
  173. package/src/providers/hootsuite/actions/search-posts.action.ts +351 -369
  174. package/src/providers/hootsuite/actions/update-scheduled-post.action.ts +211 -209
  175. package/src/providers/hootsuite/hootsuite-base.action.ts +301 -307
  176. package/src/providers/instagram/actions/create-post.action.ts +276 -296
  177. package/src/providers/instagram/actions/create-story.action.ts +378 -394
  178. package/src/providers/instagram/actions/get-account-insights.action.ts +384 -420
  179. package/src/providers/instagram/actions/get-business-posts.action.ts +233 -242
  180. package/src/providers/instagram/actions/get-comments.action.ts +365 -377
  181. package/src/providers/instagram/actions/get-post-insights.action.ts +265 -273
  182. package/src/providers/instagram/actions/schedule-post.action.ts +233 -235
  183. package/src/providers/instagram/actions/search-posts.action.ts +512 -538
  184. package/src/providers/instagram/instagram-base.action.ts +368 -393
  185. package/src/providers/linkedin/actions/create-article.action.ts +275 -266
  186. package/src/providers/linkedin/actions/create-post.action.ts +179 -177
  187. package/src/providers/linkedin/actions/get-followers.action.ts +211 -211
  188. package/src/providers/linkedin/actions/get-organization-posts.action.ts +146 -147
  189. package/src/providers/linkedin/actions/get-personal-posts.action.ts +138 -139
  190. package/src/providers/linkedin/actions/get-post-analytics.action.ts +190 -189
  191. package/src/providers/linkedin/actions/schedule-post.action.ts +191 -189
  192. package/src/providers/linkedin/actions/search-posts.action.ts +275 -283
  193. package/src/providers/linkedin/linkedin-base.action.ts +407 -421
  194. package/src/providers/tiktok/tiktok-base.action.ts +305 -320
  195. package/src/providers/twitter/actions/create-thread.action.ts +203 -207
  196. package/src/providers/twitter/actions/create-tweet.action.ts +187 -188
  197. package/src/providers/twitter/actions/delete-tweet.action.ts +128 -129
  198. package/src/providers/twitter/actions/get-analytics.action.ts +402 -411
  199. package/src/providers/twitter/actions/get-mentions.action.ts +218 -219
  200. package/src/providers/twitter/actions/get-timeline.action.ts +232 -233
  201. package/src/providers/twitter/actions/schedule-tweet.action.ts +221 -222
  202. package/src/providers/twitter/actions/search-tweets.action.ts +540 -543
  203. package/src/providers/twitter/twitter-base.action.ts +541 -560
  204. package/src/providers/youtube/youtube-base.action.ts +320 -333
@@ -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/core';
4
+ import { LogStatus, LogError } from '@memberjunction/global';
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}`;
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
- };
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}`;
78
46
  }
79
- }
80
47
 
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
- }
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
+ };
146
77
  }
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
- };
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
+ };
179
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;
180
145
  }
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';
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
+ };
226
179
  }
227
- }
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
+ }