@memberjunction/actions-bizapps-social 2.112.0 → 2.113.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +13 -0
  3. package/dist/base/base-social.action.d.ts.map +1 -1
  4. package/dist/base/base-social.action.js +24 -18
  5. package/dist/base/base-social.action.js.map +1 -1
  6. package/dist/providers/buffer/buffer-base.action.d.ts.map +1 -1
  7. package/dist/providers/buffer/buffer-base.action.js +34 -35
  8. package/dist/providers/buffer/buffer-base.action.js.map +1 -1
  9. package/dist/providers/facebook/actions/boost-post.action.d.ts.map +1 -1
  10. package/dist/providers/facebook/actions/boost-post.action.js +33 -33
  11. package/dist/providers/facebook/actions/boost-post.action.js.map +1 -1
  12. package/dist/providers/facebook/actions/create-album.action.d.ts.map +1 -1
  13. package/dist/providers/facebook/actions/create-album.action.js +36 -34
  14. package/dist/providers/facebook/actions/create-album.action.js.map +1 -1
  15. package/dist/providers/facebook/actions/create-post.action.d.ts.map +1 -1
  16. package/dist/providers/facebook/actions/create-post.action.js +20 -20
  17. package/dist/providers/facebook/actions/create-post.action.js.map +1 -1
  18. package/dist/providers/facebook/actions/get-page-insights.action.d.ts.map +1 -1
  19. package/dist/providers/facebook/actions/get-page-insights.action.js +27 -25
  20. package/dist/providers/facebook/actions/get-page-insights.action.js.map +1 -1
  21. package/dist/providers/facebook/actions/get-page-posts.action.d.ts.map +1 -1
  22. package/dist/providers/facebook/actions/get-page-posts.action.js +23 -19
  23. package/dist/providers/facebook/actions/get-page-posts.action.js.map +1 -1
  24. package/dist/providers/facebook/actions/get-post-insights.action.d.ts.map +1 -1
  25. package/dist/providers/facebook/actions/get-post-insights.action.js +32 -28
  26. package/dist/providers/facebook/actions/get-post-insights.action.js.map +1 -1
  27. package/dist/providers/facebook/actions/respond-to-comments.action.d.ts.map +1 -1
  28. package/dist/providers/facebook/actions/respond-to-comments.action.js +44 -42
  29. package/dist/providers/facebook/actions/respond-to-comments.action.js.map +1 -1
  30. package/dist/providers/facebook/actions/schedule-post.action.d.ts.map +1 -1
  31. package/dist/providers/facebook/actions/schedule-post.action.js +29 -29
  32. package/dist/providers/facebook/actions/schedule-post.action.js.map +1 -1
  33. package/dist/providers/facebook/actions/search-posts.action.d.ts.map +1 -1
  34. package/dist/providers/facebook/actions/search-posts.action.js +39 -37
  35. package/dist/providers/facebook/actions/search-posts.action.js.map +1 -1
  36. package/dist/providers/facebook/facebook-base.action.d.ts.map +1 -1
  37. package/dist/providers/facebook/facebook-base.action.js +59 -44
  38. package/dist/providers/facebook/facebook-base.action.js.map +1 -1
  39. package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.d.ts.map +1 -1
  40. package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.js +31 -33
  41. package/dist/providers/hootsuite/actions/bulk-schedule-posts.action.js.map +1 -1
  42. package/dist/providers/hootsuite/actions/create-scheduled-post.action.d.ts.map +1 -1
  43. package/dist/providers/hootsuite/actions/create-scheduled-post.action.js +32 -28
  44. package/dist/providers/hootsuite/actions/create-scheduled-post.action.js.map +1 -1
  45. package/dist/providers/hootsuite/actions/delete-scheduled-post.action.d.ts.map +1 -1
  46. package/dist/providers/hootsuite/actions/delete-scheduled-post.action.js +19 -19
  47. package/dist/providers/hootsuite/actions/delete-scheduled-post.action.js.map +1 -1
  48. package/dist/providers/hootsuite/actions/get-analytics.action.d.ts.map +1 -1
  49. package/dist/providers/hootsuite/actions/get-analytics.action.js +26 -24
  50. package/dist/providers/hootsuite/actions/get-analytics.action.js.map +1 -1
  51. package/dist/providers/hootsuite/actions/get-scheduled-posts.action.d.ts.map +1 -1
  52. package/dist/providers/hootsuite/actions/get-scheduled-posts.action.js +22 -22
  53. package/dist/providers/hootsuite/actions/get-scheduled-posts.action.js.map +1 -1
  54. package/dist/providers/hootsuite/actions/get-social-profiles.action.d.ts.map +1 -1
  55. package/dist/providers/hootsuite/actions/get-social-profiles.action.js +34 -32
  56. package/dist/providers/hootsuite/actions/get-social-profiles.action.js.map +1 -1
  57. package/dist/providers/hootsuite/actions/search-posts.action.d.ts.map +1 -1
  58. package/dist/providers/hootsuite/actions/search-posts.action.js +52 -43
  59. package/dist/providers/hootsuite/actions/search-posts.action.js.map +1 -1
  60. package/dist/providers/hootsuite/actions/update-scheduled-post.action.d.ts.map +1 -1
  61. package/dist/providers/hootsuite/actions/update-scheduled-post.action.js +28 -30
  62. package/dist/providers/hootsuite/actions/update-scheduled-post.action.js.map +1 -1
  63. package/dist/providers/hootsuite/hootsuite-base.action.d.ts.map +1 -1
  64. package/dist/providers/hootsuite/hootsuite-base.action.js +20 -18
  65. package/dist/providers/hootsuite/hootsuite-base.action.js.map +1 -1
  66. package/dist/providers/instagram/actions/create-post.action.d.ts.map +1 -1
  67. package/dist/providers/instagram/actions/create-post.action.js +26 -27
  68. package/dist/providers/instagram/actions/create-post.action.js.map +1 -1
  69. package/dist/providers/instagram/actions/create-story.action.d.ts.map +1 -1
  70. package/dist/providers/instagram/actions/create-story.action.js +35 -35
  71. package/dist/providers/instagram/actions/create-story.action.js.map +1 -1
  72. package/dist/providers/instagram/actions/get-account-insights.action.d.ts.map +1 -1
  73. package/dist/providers/instagram/actions/get-account-insights.action.js +59 -38
  74. package/dist/providers/instagram/actions/get-account-insights.action.js.map +1 -1
  75. package/dist/providers/instagram/actions/get-business-posts.action.d.ts.map +1 -1
  76. package/dist/providers/instagram/actions/get-business-posts.action.js +29 -29
  77. package/dist/providers/instagram/actions/get-business-posts.action.js.map +1 -1
  78. package/dist/providers/instagram/actions/get-comments.action.d.ts.map +1 -1
  79. package/dist/providers/instagram/actions/get-comments.action.js +36 -36
  80. package/dist/providers/instagram/actions/get-comments.action.js.map +1 -1
  81. package/dist/providers/instagram/actions/get-post-insights.action.d.ts.map +1 -1
  82. package/dist/providers/instagram/actions/get-post-insights.action.js +25 -23
  83. package/dist/providers/instagram/actions/get-post-insights.action.js.map +1 -1
  84. package/dist/providers/instagram/actions/schedule-post.action.d.ts.map +1 -1
  85. package/dist/providers/instagram/actions/schedule-post.action.js +25 -25
  86. package/dist/providers/instagram/actions/schedule-post.action.js.map +1 -1
  87. package/dist/providers/instagram/actions/search-posts.action.d.ts.map +1 -1
  88. package/dist/providers/instagram/actions/search-posts.action.js +60 -56
  89. package/dist/providers/instagram/actions/search-posts.action.js.map +1 -1
  90. package/dist/providers/instagram/instagram-base.action.d.ts.map +1 -1
  91. package/dist/providers/instagram/instagram-base.action.js +27 -25
  92. package/dist/providers/instagram/instagram-base.action.js.map +1 -1
  93. package/dist/providers/linkedin/actions/create-article.action.d.ts.map +1 -1
  94. package/dist/providers/linkedin/actions/create-article.action.js +45 -55
  95. package/dist/providers/linkedin/actions/create-article.action.js.map +1 -1
  96. package/dist/providers/linkedin/actions/create-post.action.d.ts.map +1 -1
  97. package/dist/providers/linkedin/actions/create-post.action.js +29 -31
  98. package/dist/providers/linkedin/actions/create-post.action.js.map +1 -1
  99. package/dist/providers/linkedin/actions/get-followers.action.d.ts.map +1 -1
  100. package/dist/providers/linkedin/actions/get-followers.action.js +28 -28
  101. package/dist/providers/linkedin/actions/get-followers.action.js.map +1 -1
  102. package/dist/providers/linkedin/actions/get-organization-posts.action.d.ts.map +1 -1
  103. package/dist/providers/linkedin/actions/get-organization-posts.action.js +20 -20
  104. package/dist/providers/linkedin/actions/get-organization-posts.action.js.map +1 -1
  105. package/dist/providers/linkedin/actions/get-personal-posts.action.d.ts.map +1 -1
  106. package/dist/providers/linkedin/actions/get-personal-posts.action.js +19 -19
  107. package/dist/providers/linkedin/actions/get-personal-posts.action.js.map +1 -1
  108. package/dist/providers/linkedin/actions/get-post-analytics.action.d.ts.map +1 -1
  109. package/dist/providers/linkedin/actions/get-post-analytics.action.js +23 -25
  110. package/dist/providers/linkedin/actions/get-post-analytics.action.js.map +1 -1
  111. package/dist/providers/linkedin/actions/schedule-post.action.d.ts.map +1 -1
  112. package/dist/providers/linkedin/actions/schedule-post.action.js +30 -32
  113. package/dist/providers/linkedin/actions/schedule-post.action.js.map +1 -1
  114. package/dist/providers/linkedin/actions/search-posts.action.d.ts.map +1 -1
  115. package/dist/providers/linkedin/actions/search-posts.action.js +30 -28
  116. package/dist/providers/linkedin/actions/search-posts.action.js.map +1 -1
  117. package/dist/providers/linkedin/linkedin-base.action.d.ts.map +1 -1
  118. package/dist/providers/linkedin/linkedin-base.action.js +38 -33
  119. package/dist/providers/linkedin/linkedin-base.action.js.map +1 -1
  120. package/dist/providers/tiktok/tiktok-base.action.d.ts.map +1 -1
  121. package/dist/providers/tiktok/tiktok-base.action.js +26 -25
  122. package/dist/providers/tiktok/tiktok-base.action.js.map +1 -1
  123. package/dist/providers/twitter/actions/create-thread.action.d.ts.map +1 -1
  124. package/dist/providers/twitter/actions/create-thread.action.js +29 -25
  125. package/dist/providers/twitter/actions/create-thread.action.js.map +1 -1
  126. package/dist/providers/twitter/actions/create-tweet.action.d.ts.map +1 -1
  127. package/dist/providers/twitter/actions/create-tweet.action.js +23 -23
  128. package/dist/providers/twitter/actions/create-tweet.action.js.map +1 -1
  129. package/dist/providers/twitter/actions/delete-tweet.action.d.ts.map +1 -1
  130. package/dist/providers/twitter/actions/delete-tweet.action.js +19 -19
  131. package/dist/providers/twitter/actions/delete-tweet.action.js.map +1 -1
  132. package/dist/providers/twitter/actions/get-analytics.action.d.ts.map +1 -1
  133. package/dist/providers/twitter/actions/get-analytics.action.js +47 -40
  134. package/dist/providers/twitter/actions/get-analytics.action.js.map +1 -1
  135. package/dist/providers/twitter/actions/get-mentions.action.d.ts.map +1 -1
  136. package/dist/providers/twitter/actions/get-mentions.action.js +31 -30
  137. package/dist/providers/twitter/actions/get-mentions.action.js.map +1 -1
  138. package/dist/providers/twitter/actions/get-timeline.action.d.ts.map +1 -1
  139. package/dist/providers/twitter/actions/get-timeline.action.js +29 -29
  140. package/dist/providers/twitter/actions/get-timeline.action.js.map +1 -1
  141. package/dist/providers/twitter/actions/schedule-tweet.action.d.ts.map +1 -1
  142. package/dist/providers/twitter/actions/schedule-tweet.action.js +26 -26
  143. package/dist/providers/twitter/actions/schedule-tweet.action.js.map +1 -1
  144. package/dist/providers/twitter/actions/search-tweets.action.d.ts.map +1 -1
  145. package/dist/providers/twitter/actions/search-tweets.action.js +58 -56
  146. package/dist/providers/twitter/actions/search-tweets.action.js.map +1 -1
  147. package/dist/providers/twitter/twitter-base.action.d.ts.map +1 -1
  148. package/dist/providers/twitter/twitter-base.action.js +68 -58
  149. package/dist/providers/twitter/twitter-base.action.js.map +1 -1
  150. package/dist/providers/youtube/youtube-base.action.d.ts +1 -1
  151. package/dist/providers/youtube/youtube-base.action.d.ts.map +1 -1
  152. package/dist/providers/youtube/youtube-base.action.js +25 -22
  153. package/dist/providers/youtube/youtube-base.action.js.map +1 -1
  154. package/package.json +6 -5
  155. package/src/base/base-social.action.ts +224 -217
  156. package/src/providers/buffer/buffer-base.action.ts +441 -435
  157. package/src/providers/facebook/actions/boost-post.action.ts +386 -350
  158. package/src/providers/facebook/actions/create-album.action.ts +307 -291
  159. package/src/providers/facebook/actions/create-post.action.ts +227 -224
  160. package/src/providers/facebook/actions/get-page-insights.action.ts +403 -383
  161. package/src/providers/facebook/actions/get-page-posts.action.ts +225 -214
  162. package/src/providers/facebook/actions/get-post-insights.action.ts +316 -300
  163. package/src/providers/facebook/actions/respond-to-comments.action.ts +336 -319
  164. package/src/providers/facebook/actions/schedule-post.action.ts +292 -289
  165. package/src/providers/facebook/actions/search-posts.action.ts +413 -399
  166. package/src/providers/facebook/facebook-base.action.ts +670 -653
  167. package/src/providers/hootsuite/actions/bulk-schedule-posts.action.ts +257 -257
  168. package/src/providers/hootsuite/actions/create-scheduled-post.action.ts +189 -184
  169. package/src/providers/hootsuite/actions/delete-scheduled-post.action.ts +161 -160
  170. package/src/providers/hootsuite/actions/get-analytics.action.ts +254 -249
  171. package/src/providers/hootsuite/actions/get-scheduled-posts.action.ts +207 -206
  172. package/src/providers/hootsuite/actions/get-social-profiles.action.ts +205 -206
  173. package/src/providers/hootsuite/actions/search-posts.action.ts +369 -351
  174. package/src/providers/hootsuite/actions/update-scheduled-post.action.ts +209 -211
  175. package/src/providers/hootsuite/hootsuite-base.action.ts +307 -301
  176. package/src/providers/instagram/actions/create-post.action.ts +296 -276
  177. package/src/providers/instagram/actions/create-story.action.ts +394 -378
  178. package/src/providers/instagram/actions/get-account-insights.action.ts +420 -384
  179. package/src/providers/instagram/actions/get-business-posts.action.ts +242 -233
  180. package/src/providers/instagram/actions/get-comments.action.ts +377 -365
  181. package/src/providers/instagram/actions/get-post-insights.action.ts +273 -265
  182. package/src/providers/instagram/actions/schedule-post.action.ts +235 -233
  183. package/src/providers/instagram/actions/search-posts.action.ts +538 -512
  184. package/src/providers/instagram/instagram-base.action.ts +393 -368
  185. package/src/providers/linkedin/actions/create-article.action.ts +266 -275
  186. package/src/providers/linkedin/actions/create-post.action.ts +177 -179
  187. package/src/providers/linkedin/actions/get-followers.action.ts +211 -211
  188. package/src/providers/linkedin/actions/get-organization-posts.action.ts +147 -146
  189. package/src/providers/linkedin/actions/get-personal-posts.action.ts +139 -138
  190. package/src/providers/linkedin/actions/get-post-analytics.action.ts +189 -190
  191. package/src/providers/linkedin/actions/schedule-post.action.ts +189 -191
  192. package/src/providers/linkedin/actions/search-posts.action.ts +283 -275
  193. package/src/providers/linkedin/linkedin-base.action.ts +421 -407
  194. package/src/providers/tiktok/tiktok-base.action.ts +320 -305
  195. package/src/providers/twitter/actions/create-thread.action.ts +207 -203
  196. package/src/providers/twitter/actions/create-tweet.action.ts +188 -187
  197. package/src/providers/twitter/actions/delete-tweet.action.ts +129 -128
  198. package/src/providers/twitter/actions/get-analytics.action.ts +411 -402
  199. package/src/providers/twitter/actions/get-mentions.action.ts +219 -218
  200. package/src/providers/twitter/actions/get-timeline.action.ts +233 -232
  201. package/src/providers/twitter/actions/schedule-tweet.action.ts +222 -221
  202. package/src/providers/twitter/actions/search-tweets.action.ts +543 -540
  203. package/src/providers/twitter/twitter-base.action.ts +560 -541
  204. package/src/providers/youtube/youtube-base.action.ts +333 -320
@@ -2,7 +2,7 @@ import { RegisterClass } from '@memberjunction/global';
2
2
  import { FacebookBaseAction, GetPagePostsParams } from '../facebook-base.action';
3
3
  import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
4
4
  import { SocialMediaErrorCode } from '../../../base/base-social.action';
5
- import { LogStatus, LogError } from '@memberjunction/global';
5
+ import { LogStatus, LogError } from '@memberjunction/core';
6
6
  import { BaseAction } from '@memberjunction/actions';
7
7
 
8
8
  /**
@@ -11,221 +11,232 @@ import { BaseAction } from '@memberjunction/actions';
11
11
  */
12
12
  @RegisterClass(BaseAction, 'FacebookGetPagePostsAction')
13
13
  export class FacebookGetPagePostsAction extends FacebookBaseAction {
14
- /**
15
- * Get action description
16
- */
17
- public get Description(): string {
18
- return 'Retrieves posts from a Facebook page with optional date range filtering and pagination';
19
- }
20
-
21
- /**
22
- * Define the parameters for this action
23
- */
24
- public get Params(): ActionParam[] {
25
- return [
26
- ...this.commonSocialParams,
27
- {
28
- Name: 'PageID',
29
- Type: 'Input',
30
- Value: null,
31
- },
32
- {
33
- Name: 'StartDate',
34
- Type: 'Input',
35
- Value: null,
36
- },
37
- {
38
- Name: 'EndDate',
39
- Type: 'Input',
40
- Value: null,
41
- },
42
- {
43
- Name: 'Limit',
44
- Type: 'Input',
45
- Value: 100,
46
- },
47
- {
48
- Name: 'MaxResults',
49
- Type: 'Input',
50
- Value: null,
51
- },
52
- {
53
- Name: 'IncludeUnpublished',
54
- Type: 'Input',
55
- Value: false,
56
- },
57
- {
58
- Name: 'IncludeInsights',
59
- Type: 'Input',
60
- Value: true,
61
- },
62
- ];
63
- }
64
-
65
- /**
66
- * Execute the action
67
- */
68
- protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
69
- const { Params, ContextUser } = params;
70
-
71
- try {
72
- // Validate required parameters
73
- const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
74
- const pageId = this.getParamValue(Params, 'PageID');
75
-
76
- if (!companyIntegrationId) {
77
- return {
78
- Success: false,
79
- Message: 'CompanyIntegrationID is required',
80
- ResultCode: 'INVALID_TOKEN',
81
- };
82
- }
14
+ /**
15
+ * Get action description
16
+ */
17
+ public get Description(): string {
18
+ return 'Retrieves posts from a Facebook page with optional date range filtering and pagination';
19
+ }
83
20
 
84
- if (!pageId) {
85
- return {
86
- Success: false,
87
- Message: 'PageID is required',
88
- ResultCode: 'MISSING_REQUIRED_PARAM',
89
- };
90
- }
91
-
92
- // Initialize OAuth
93
- if (!(await this.initializeOAuth(companyIntegrationId))) {
94
- return {
95
- Success: false,
96
- Message: 'Failed to initialize Facebook OAuth connection',
97
- ResultCode: 'INVALID_TOKEN',
98
- };
99
- }
100
-
101
- // Get parameters
102
- const startDate = this.getParamValue(Params, 'StartDate') as string;
103
- const endDate = this.getParamValue(Params, 'EndDate') as string;
104
- const limit = (this.getParamValue(Params, 'Limit') as number) || 100;
105
- const maxResults = this.getParamValue(Params, 'MaxResults') as number;
106
- const includeUnpublished = this.getParamValue(Params, 'IncludeUnpublished') as boolean;
107
- const includeInsights = this.getParamValue(Params, 'IncludeInsights') as boolean;
108
-
109
- // Build query parameters
110
- const queryParams: GetPagePostsParams = {
111
- limit: Math.min(limit, 100), // Facebook max is 100 per request
112
- published: includeUnpublished ? undefined : true,
113
- };
114
-
115
- if (startDate) {
116
- queryParams.since = new Date(startDate);
117
- }
118
-
119
- if (endDate) {
120
- queryParams.until = new Date(endDate);
121
- }
122
-
123
- LogStatus(`Retrieving posts from Facebook page ${pageId}...`);
124
-
125
- // Get posts with pagination support
126
- let allPosts = await this.getPagePosts(pageId, queryParams);
127
-
128
- // If we need more posts and have a maxResults, use pagination
129
- if (maxResults && allPosts.length < maxResults && allPosts.length === queryParams.limit) {
130
- LogStatus(`Fetching additional pages of posts...`);
131
-
132
- const pageToken = await this.getPageAccessToken(pageId);
133
- const fields = includeInsights ? this.getPostFields() : this.getPostFieldsWithoutInsights();
134
-
135
- allPosts = await this.getPaginatedResults(
136
- `${this.apiBaseUrl}/${pageId}/posts`,
137
- {
138
- access_token: pageToken,
139
- fields,
140
- ...queryParams,
141
- since: queryParams.since ? Math.floor(queryParams.since.getTime() / 1000) : undefined,
142
- until: queryParams.until ? Math.floor(queryParams.until.getTime() / 1000) : undefined,
143
- },
144
- maxResults
145
- );
146
- }
147
-
148
- // Limit results if maxResults specified
149
- if (maxResults && allPosts.length > maxResults) {
150
- allPosts = allPosts.slice(0, maxResults);
151
- }
152
-
153
- LogStatus(`Retrieved ${allPosts.length} posts from Facebook page`);
154
-
155
- // Normalize posts to common format
156
- const normalizedPosts = allPosts.map((post) => this.normalizePost(post));
157
-
158
- // Calculate summary statistics
159
- const summary = {
160
- totalPosts: normalizedPosts.length,
161
- dateRange: {
162
- earliest: normalizedPosts.length > 0 ? normalizedPosts[normalizedPosts.length - 1].publishedAt : null,
163
- latest: normalizedPosts.length > 0 ? normalizedPosts[0].publishedAt : null,
164
- },
165
- postTypes: this.categorizePostTypes(allPosts),
166
- totalEngagements: normalizedPosts.reduce((sum, post) => sum + (post.analytics?.engagements || 0), 0),
167
- totalImpressions: normalizedPosts.reduce((sum, post) => sum + (post.analytics?.impressions || 0), 0),
168
- };
169
-
170
- // Update output parameters
171
- const outputParams = [...Params];
172
- // TODO: Set output parameters based on result
173
-
174
- return {
175
- Success: true,
176
- Message: `Successfully retrieved ${normalizedPosts.length} posts`,
177
- ResultCode: 'SUCCESS',
178
- Params: outputParams,
179
- };
180
- } catch (error) {
181
- LogError(`Failed to get Facebook page posts: ${error instanceof Error ? error.message : 'Unknown error'}`);
182
-
183
- if (this.isAuthError(error)) {
184
- return this.handleOAuthError(error);
185
- }
186
-
187
- return {
188
- Success: false,
189
- Message: error instanceof Error ? error.message : 'Unknown error occurred',
190
- ResultCode: 'ERROR',
191
- };
21
+ /**
22
+ * Define the parameters for this action
23
+ */
24
+ public get Params(): ActionParam[] {
25
+ return [
26
+ ...this.commonSocialParams,
27
+ {
28
+ Name: 'PageID',
29
+ Type: 'Input',
30
+ Value: null,
31
+ },
32
+ {
33
+ Name: 'StartDate',
34
+ Type: 'Input',
35
+ Value: null,
36
+ },
37
+ {
38
+ Name: 'EndDate',
39
+ Type: 'Input',
40
+ Value: null,
41
+ },
42
+ {
43
+ Name: 'Limit',
44
+ Type: 'Input',
45
+ Value: 100,
46
+ },
47
+ {
48
+ Name: 'MaxResults',
49
+ Type: 'Input',
50
+ Value: null,
51
+ },
52
+ {
53
+ Name: 'IncludeUnpublished',
54
+ Type: 'Input',
55
+ Value: false,
56
+ },
57
+ {
58
+ Name: 'IncludeInsights',
59
+ Type: 'Input',
60
+ Value: true,
61
+ }
62
+ ];
63
+ }
64
+
65
+ /**
66
+ * Execute the action
67
+ */
68
+ protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
69
+ const { Params, ContextUser } = params;
70
+
71
+ try {
72
+ // Validate required parameters
73
+ const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
74
+ const pageId = this.getParamValue(Params, 'PageID');
75
+
76
+ if (!companyIntegrationId) {
77
+ return {
78
+ Success: false,
79
+ Message: 'CompanyIntegrationID is required',
80
+ ResultCode: 'INVALID_TOKEN'
81
+ };
82
+ }
83
+
84
+ if (!pageId) {
85
+ return {
86
+ Success: false,
87
+ Message: 'PageID is required',
88
+ ResultCode: 'MISSING_REQUIRED_PARAM'
89
+ };
90
+ }
91
+
92
+ // Initialize OAuth
93
+ if (!await this.initializeOAuth(companyIntegrationId)) {
94
+ return {
95
+ Success: false,
96
+ Message: 'Failed to initialize Facebook OAuth connection',
97
+ ResultCode: 'INVALID_TOKEN'
98
+ };
99
+ }
100
+
101
+ // Get parameters
102
+ const startDate = this.getParamValue(Params, 'StartDate') as string;
103
+ const endDate = this.getParamValue(Params, 'EndDate') as string;
104
+ const limit = this.getParamValue(Params, 'Limit') as number || 100;
105
+ const maxResults = this.getParamValue(Params, 'MaxResults') as number;
106
+ const includeUnpublished = this.getParamValue(Params, 'IncludeUnpublished') as boolean;
107
+ const includeInsights = this.getParamValue(Params, 'IncludeInsights') as boolean;
108
+
109
+ // Build query parameters
110
+ const queryParams: GetPagePostsParams = {
111
+ limit: Math.min(limit, 100), // Facebook max is 100 per request
112
+ published: includeUnpublished ? undefined : true
113
+ };
114
+
115
+ if (startDate) {
116
+ queryParams.since = new Date(startDate);
117
+ }
118
+
119
+ if (endDate) {
120
+ queryParams.until = new Date(endDate);
121
+ }
122
+
123
+ LogStatus(`Retrieving posts from Facebook page ${pageId}...`);
124
+
125
+ // Get posts with pagination support
126
+ let allPosts = await this.getPagePosts(pageId, queryParams);
127
+
128
+ // If we need more posts and have a maxResults, use pagination
129
+ if (maxResults && allPosts.length < maxResults && allPosts.length === queryParams.limit) {
130
+ LogStatus(`Fetching additional pages of posts...`);
131
+
132
+ const pageToken = await this.getPageAccessToken(pageId);
133
+ const fields = includeInsights ? this.getPostFields() : this.getPostFieldsWithoutInsights();
134
+
135
+ allPosts = await this.getPaginatedResults(
136
+ `${this.apiBaseUrl}/${pageId}/posts`,
137
+ {
138
+ access_token: pageToken,
139
+ fields,
140
+ ...queryParams,
141
+ since: queryParams.since ? Math.floor(queryParams.since.getTime() / 1000) : undefined,
142
+ until: queryParams.until ? Math.floor(queryParams.until.getTime() / 1000) : undefined
143
+ },
144
+ maxResults
145
+ );
146
+ }
147
+
148
+ // Limit results if maxResults specified
149
+ if (maxResults && allPosts.length > maxResults) {
150
+ allPosts = allPosts.slice(0, maxResults);
151
+ }
152
+
153
+ LogStatus(`Retrieved ${allPosts.length} posts from Facebook page`);
154
+
155
+ // Normalize posts to common format
156
+ const normalizedPosts = allPosts.map(post => this.normalizePost(post));
157
+
158
+ // Calculate summary statistics
159
+ const summary = {
160
+ totalPosts: normalizedPosts.length,
161
+ dateRange: {
162
+ earliest: normalizedPosts.length > 0
163
+ ? normalizedPosts[normalizedPosts.length - 1].publishedAt
164
+ : null,
165
+ latest: normalizedPosts.length > 0
166
+ ? normalizedPosts[0].publishedAt
167
+ : null
168
+ },
169
+ postTypes: this.categorizePostTypes(allPosts),
170
+ totalEngagements: normalizedPosts.reduce((sum, post) =>
171
+ sum + (post.analytics?.engagements || 0), 0
172
+ ),
173
+ totalImpressions: normalizedPosts.reduce((sum, post) =>
174
+ sum + (post.analytics?.impressions || 0), 0
175
+ )
176
+ };
177
+
178
+ // Update output parameters
179
+ const outputParams = [...Params];
180
+ // TODO: Set output parameters based on result
181
+
182
+ return {
183
+ Success: true,
184
+ Message: `Successfully retrieved ${normalizedPosts.length} posts`,
185
+ ResultCode: 'SUCCESS',
186
+ Params: outputParams
187
+ };
188
+
189
+ } catch (error) {
190
+ LogError(`Failed to get Facebook page posts: ${error instanceof Error ? error.message : 'Unknown error'}`);
191
+
192
+ if (this.isAuthError(error)) {
193
+ return this.handleOAuthError(error);
194
+ }
195
+
196
+ return {
197
+ Success: false,
198
+ Message: error instanceof Error ? error.message : 'Unknown error occurred',
199
+ ResultCode: 'ERROR'
200
+ };
201
+ }
192
202
  }
193
- }
194
-
195
- /**
196
- * Get post fields without insights (for faster queries or when insights not available)
197
- */
198
- private getPostFieldsWithoutInsights(): string {
199
- return 'id,message,created_time,updated_time,from,story,permalink_url,attachments,shares,reactions.summary(true),comments.summary(true)';
200
- }
201
-
202
- /**
203
- * Categorize posts by type based on attachments
204
- */
205
- private categorizePostTypes(posts: any[]): Record<string, number> {
206
- const types: Record<string, number> = {
207
- status: 0,
208
- photo: 0,
209
- video: 0,
210
- link: 0,
211
- event: 0,
212
- offer: 0,
213
- album: 0,
214
- };
215
-
216
- for (const post of posts) {
217
- if (post.attachments?.data?.[0]?.type) {
218
- const type = post.attachments.data[0].type.toLowerCase();
219
- if (type in types) {
220
- types[type]++;
221
- } else {
222
- types.status++;
203
+
204
+ /**
205
+ * Get post fields without insights (for faster queries or when insights not available)
206
+ */
207
+ private getPostFieldsWithoutInsights(): string {
208
+ return 'id,message,created_time,updated_time,from,story,permalink_url,attachments,shares,reactions.summary(true),comments.summary(true)';
209
+ }
210
+
211
+ /**
212
+ * Categorize posts by type based on attachments
213
+ */
214
+ private categorizePostTypes(posts: any[]): Record<string, number> {
215
+ const types: Record<string, number> = {
216
+ status: 0,
217
+ photo: 0,
218
+ video: 0,
219
+ link: 0,
220
+ event: 0,
221
+ offer: 0,
222
+ album: 0
223
+ };
224
+
225
+ for (const post of posts) {
226
+ if (post.attachments?.data?.[0]?.type) {
227
+ const type = post.attachments.data[0].type.toLowerCase();
228
+ if (type in types) {
229
+ types[type]++;
230
+ } else {
231
+ types.status++;
232
+ }
233
+ } else {
234
+ types.status++;
235
+ }
223
236
  }
224
- } else {
225
- types.status++;
226
- }
237
+
238
+ return types;
227
239
  }
228
240
 
229
- return types;
230
- }
231
- }
241
+
242
+ }