@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, LinkedInAnalytics } 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 { SocialAnalytics } from '../../../base/base-social.action';
6
6
  import { BaseAction } from '@memberjunction/actions';
7
7
 
@@ -10,197 +10,198 @@ import { BaseAction } from '@memberjunction/actions';
10
10
  */
11
11
  @RegisterClass(BaseAction, 'LinkedInGetPostAnalyticsAction')
12
12
  export class LinkedInGetPostAnalyticsAction extends LinkedInBaseAction {
13
- /**
14
- * Get analytics for a specific LinkedIn post
15
- */
16
- protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
17
- const { Params, ContextUser } = params;
18
-
19
- try {
20
- // Initialize OAuth
21
- const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
22
- if (!await this.initializeOAuth(companyIntegrationId)) {
23
- throw new Error('Failed to initialize OAuth connection');
24
- }
25
-
26
- // Extract parameters
27
- const postId = this.getParamValue(Params, 'PostID');
28
- const authorType = this.getParamValue(Params, 'AuthorType') || 'organization'; // 'personal' or 'organization'
29
- const organizationId = this.getParamValue(Params, 'OrganizationID');
30
- const timeRange = this.getParamValue(Params, 'TimeRange'); // Optional: {start: Date, end: Date}
31
-
32
- // Validate required parameters
33
- if (!postId) {
34
- throw new Error('PostID is required');
35
- }
36
-
37
- let analytics: LinkedInAnalytics | null = null;
38
-
39
- if (authorType === 'organization') {
40
- // Get organization analytics
41
- let organizationUrn: string;
42
- if (!organizationId) {
43
- // Get first admin organization if not specified
44
- const orgs = await this.getAdminOrganizations();
45
- if (orgs.length === 0) {
46
- throw new Error('No organizations found. Please specify OrganizationID.');
47
- }
48
- organizationUrn = orgs[0].urn;
49
- LogStatus(`Using organization: ${orgs[0].name}`);
50
- } else {
51
- organizationUrn = `urn:li:organization:${organizationId}`;
52
- }
53
-
54
- analytics = await this.getOrganizationPostAnalytics(postId, organizationUrn, timeRange);
55
- } else {
56
- // Get personal post analytics (limited)
57
- analytics = await this.getPersonalPostAnalytics(postId);
58
- }
59
-
60
- if (!analytics) {
61
- throw new Error('No analytics data available for this post');
62
- }
63
-
64
- // Normalize analytics
65
- const normalizedAnalytics = this.normalizeAnalytics(analytics);
66
-
67
- // Update output parameters
68
- const outputParams = [...Params];
69
- const analyticsParam = outputParams.find(p => p.Name === 'Analytics');
70
- if (analyticsParam) analyticsParam.Value = normalizedAnalytics;
71
- const rawAnalyticsParam = outputParams.find(p => p.Name === 'RawAnalytics');
72
- if (rawAnalyticsParam) rawAnalyticsParam.Value = analytics;
73
-
74
- return {
75
- Success: true,
76
- ResultCode: 'SUCCESS',
77
- Message: `Successfully retrieved analytics for post ${postId}`,
78
- Params: outputParams
79
- };
80
-
81
- } catch (error) {
82
- const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
83
-
84
- return {
85
- Success: false,
86
- ResultCode: 'ERROR',
87
- Message: `Failed to get post analytics: ${errorMessage}`,
88
- Params
89
- };
13
+ /**
14
+ * Get analytics for a specific LinkedIn post
15
+ */
16
+ protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
17
+ const { Params, ContextUser } = params;
18
+
19
+ try {
20
+ // Initialize OAuth
21
+ const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
22
+ if (!(await this.initializeOAuth(companyIntegrationId))) {
23
+ throw new Error('Failed to initialize OAuth connection');
24
+ }
25
+
26
+ // Extract parameters
27
+ const postId = this.getParamValue(Params, 'PostID');
28
+ const authorType = this.getParamValue(Params, 'AuthorType') || 'organization'; // 'personal' or 'organization'
29
+ const organizationId = this.getParamValue(Params, 'OrganizationID');
30
+ const timeRange = this.getParamValue(Params, 'TimeRange'); // Optional: {start: Date, end: Date}
31
+
32
+ // Validate required parameters
33
+ if (!postId) {
34
+ throw new Error('PostID is required');
35
+ }
36
+
37
+ let analytics: LinkedInAnalytics | null = null;
38
+
39
+ if (authorType === 'organization') {
40
+ // Get organization analytics
41
+ let organizationUrn: string;
42
+ if (!organizationId) {
43
+ // Get first admin organization if not specified
44
+ const orgs = await this.getAdminOrganizations();
45
+ if (orgs.length === 0) {
46
+ throw new Error('No organizations found. Please specify OrganizationID.');
47
+ }
48
+ organizationUrn = orgs[0].urn;
49
+ LogStatus(`Using organization: ${orgs[0].name}`);
50
+ } else {
51
+ organizationUrn = `urn:li:organization:${organizationId}`;
90
52
  }
91
- }
92
53
 
93
- /**
94
- * Get analytics for an organization post
95
- */
96
- private async getOrganizationPostAnalytics(shareId: string, organizationUrn: string, timeRange?: any): Promise<LinkedInAnalytics> {
97
- try {
98
- const params: any = {
99
- q: 'organizationalEntity',
100
- organizationalEntity: organizationUrn,
101
- shares: `List(${shareId})`
102
- };
103
-
104
- // Add time range if specified
105
- if (timeRange) {
106
- if (timeRange.start) {
107
- params.timeIntervals = `List((start:${new Date(timeRange.start).getTime()},end:${new Date(timeRange.end || Date.now()).getTime()}))`;
108
- }
109
- }
110
-
111
- const response = await this.axiosInstance.get('/organizationalEntityShareStatistics', { params });
112
-
113
- if (response.data.elements && response.data.elements.length > 0) {
114
- const stats = response.data.elements[0];
115
- return {
116
- totalShareStatistics: stats.totalShareStatistics || {},
117
- timeRange: timeRange ? {
118
- start: new Date(timeRange.start).getTime(),
119
- end: new Date(timeRange.end || Date.now()).getTime()
120
- } : undefined
121
- };
122
- }
123
-
124
- throw new Error('No analytics data found');
125
- } catch (error) {
126
- LogError(`Failed to get organization post analytics: ${error instanceof Error ? error.message : 'Unknown error'}`);
127
- throw error;
128
- }
54
+ analytics = await this.getOrganizationPostAnalytics(postId, organizationUrn, timeRange);
55
+ } else {
56
+ // Get personal post analytics (limited)
57
+ analytics = await this.getPersonalPostAnalytics(postId);
58
+ }
59
+
60
+ if (!analytics) {
61
+ throw new Error('No analytics data available for this post');
62
+ }
63
+
64
+ // Normalize analytics
65
+ const normalizedAnalytics = this.normalizeAnalytics(analytics);
66
+
67
+ // Update output parameters
68
+ const outputParams = [...Params];
69
+ const analyticsParam = outputParams.find((p) => p.Name === 'Analytics');
70
+ if (analyticsParam) analyticsParam.Value = normalizedAnalytics;
71
+ const rawAnalyticsParam = outputParams.find((p) => p.Name === 'RawAnalytics');
72
+ if (rawAnalyticsParam) rawAnalyticsParam.Value = analytics;
73
+
74
+ return {
75
+ Success: true,
76
+ ResultCode: 'SUCCESS',
77
+ Message: `Successfully retrieved analytics for post ${postId}`,
78
+ Params: outputParams,
79
+ };
80
+ } catch (error) {
81
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
82
+
83
+ return {
84
+ Success: false,
85
+ ResultCode: 'ERROR',
86
+ Message: `Failed to get post analytics: ${errorMessage}`,
87
+ Params,
88
+ };
129
89
  }
130
-
131
- /**
132
- * Get analytics for a personal post (limited data available)
133
- */
134
- private async getPersonalPostAnalytics(shareId: string): Promise<LinkedInAnalytics> {
135
- try {
136
- // For personal posts, we need to fetch the post itself to get basic engagement metrics
137
- const response = await this.axiosInstance.get(`/ugcPosts/${shareId}`);
138
-
139
- if (response.data) {
140
- // Extract available metrics from the post data
141
- return {
142
- totalShareStatistics: {
143
- impressionCount: 0, // Not available for personal posts
144
- clickCount: 0, // Not available for personal posts
145
- engagement: response.data.likesSummary?.totalLikes || 0 + response.data.commentsSummary?.totalComments || 0,
146
- likeCount: response.data.likesSummary?.totalLikes || 0,
147
- commentCount: response.data.commentsSummary?.totalComments || 0,
148
- shareCount: 0, // Not directly available
149
- uniqueImpressionsCount: 0 // Not available for personal posts
150
- }
151
- };
152
- }
153
-
154
- throw new Error('Post not found');
155
- } catch (error) {
156
- LogError(`Failed to get personal post analytics: ${error instanceof Error ? error.message : 'Unknown error'}`);
157
- throw error;
90
+ }
91
+
92
+ /**
93
+ * Get analytics for an organization post
94
+ */
95
+ private async getOrganizationPostAnalytics(shareId: string, organizationUrn: string, timeRange?: any): Promise<LinkedInAnalytics> {
96
+ try {
97
+ const params: any = {
98
+ q: 'organizationalEntity',
99
+ organizationalEntity: organizationUrn,
100
+ shares: `List(${shareId})`,
101
+ };
102
+
103
+ // Add time range if specified
104
+ if (timeRange) {
105
+ if (timeRange.start) {
106
+ params.timeIntervals = `List((start:${new Date(timeRange.start).getTime()},end:${new Date(timeRange.end || Date.now()).getTime()}))`;
158
107
  }
108
+ }
109
+
110
+ const response = await this.axiosInstance.get('/organizationalEntityShareStatistics', { params });
111
+
112
+ if (response.data.elements && response.data.elements.length > 0) {
113
+ const stats = response.data.elements[0];
114
+ return {
115
+ totalShareStatistics: stats.totalShareStatistics || {},
116
+ timeRange: timeRange
117
+ ? {
118
+ start: new Date(timeRange.start).getTime(),
119
+ end: new Date(timeRange.end || Date.now()).getTime(),
120
+ }
121
+ : undefined,
122
+ };
123
+ }
124
+
125
+ throw new Error('No analytics data found');
126
+ } catch (error) {
127
+ LogError(`Failed to get organization post analytics: ${error instanceof Error ? error.message : 'Unknown error'}`);
128
+ throw error;
159
129
  }
160
-
161
- /**
162
- * Define the parameters this action expects
163
- */
164
- public get Params(): ActionParam[] {
165
- return [
166
- ...this.commonSocialParams,
167
- {
168
- Name: 'PostID',
169
- Type: 'Input',
170
- Value: null
171
- },
172
- {
173
- Name: 'AuthorType',
174
- Type: 'Input',
175
- Value: 'organization' // 'personal' or 'organization'
176
- },
177
- {
178
- Name: 'OrganizationID',
179
- Type: 'Input',
180
- Value: null
181
- },
182
- {
183
- Name: 'TimeRange',
184
- Type: 'Input',
185
- Value: null // Optional: {start: Date, end: Date}
186
- },
187
- {
188
- Name: 'Analytics',
189
- Type: 'Output',
190
- Value: null
191
- },
192
- {
193
- Name: 'RawAnalytics',
194
- Type: 'Output',
195
- Value: null
196
- }
197
- ];
198
- }
199
-
200
- /**
201
- * Get action description
202
- */
203
- public get Description(): string {
204
- return 'Retrieves detailed analytics for a LinkedIn post (organization posts have more detailed analytics than personal posts)';
130
+ }
131
+
132
+ /**
133
+ * Get analytics for a personal post (limited data available)
134
+ */
135
+ private async getPersonalPostAnalytics(shareId: string): Promise<LinkedInAnalytics> {
136
+ try {
137
+ // For personal posts, we need to fetch the post itself to get basic engagement metrics
138
+ const response = await this.axiosInstance.get(`/ugcPosts/${shareId}`);
139
+
140
+ if (response.data) {
141
+ // Extract available metrics from the post data
142
+ return {
143
+ totalShareStatistics: {
144
+ impressionCount: 0, // Not available for personal posts
145
+ clickCount: 0, // Not available for personal posts
146
+ engagement: response.data.likesSummary?.totalLikes || 0 + response.data.commentsSummary?.totalComments || 0,
147
+ likeCount: response.data.likesSummary?.totalLikes || 0,
148
+ commentCount: response.data.commentsSummary?.totalComments || 0,
149
+ shareCount: 0, // Not directly available
150
+ uniqueImpressionsCount: 0, // Not available for personal posts
151
+ },
152
+ };
153
+ }
154
+
155
+ throw new Error('Post not found');
156
+ } catch (error) {
157
+ LogError(`Failed to get personal post analytics: ${error instanceof Error ? error.message : 'Unknown error'}`);
158
+ throw error;
205
159
  }
206
- }
160
+ }
161
+
162
+ /**
163
+ * Define the parameters this action expects
164
+ */
165
+ public get Params(): ActionParam[] {
166
+ return [
167
+ ...this.commonSocialParams,
168
+ {
169
+ Name: 'PostID',
170
+ Type: 'Input',
171
+ Value: null,
172
+ },
173
+ {
174
+ Name: 'AuthorType',
175
+ Type: 'Input',
176
+ Value: 'organization', // 'personal' or 'organization'
177
+ },
178
+ {
179
+ Name: 'OrganizationID',
180
+ Type: 'Input',
181
+ Value: null,
182
+ },
183
+ {
184
+ Name: 'TimeRange',
185
+ Type: 'Input',
186
+ Value: null, // Optional: {start: Date, end: Date}
187
+ },
188
+ {
189
+ Name: 'Analytics',
190
+ Type: 'Output',
191
+ Value: null,
192
+ },
193
+ {
194
+ Name: 'RawAnalytics',
195
+ Type: 'Output',
196
+ Value: null,
197
+ },
198
+ ];
199
+ }
200
+
201
+ /**
202
+ * Get action description
203
+ */
204
+ public get Description(): string {
205
+ return 'Retrieves detailed analytics for a LinkedIn post (organization posts have more detailed analytics than personal posts)';
206
+ }
207
+ }