@memberjunction/actions-bizapps-social 2.111.0 → 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
@@ -2,243 +2,240 @@ import { RegisterClass } from '@memberjunction/global';
2
2
  import { FacebookBaseAction, CreatePostData } from '../facebook-base.action';
3
3
  import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
4
4
  import { MediaFile, SocialMediaErrorCode } from '../../../base/base-social.action';
5
- import { LogStatus, LogError } from '@memberjunction/core';
5
+ import { LogStatus, LogError } from '@memberjunction/global';
6
6
  import { BaseAction } from '@memberjunction/actions';
7
7
 
8
8
  /**
9
9
  * Creates a new post on a Facebook page.
10
10
  * Supports text, links, images, videos, and scheduling.
11
11
  */
12
- @RegisterClass(BaseAction, 'FacebookCreatePostAction')
12
+ @RegisterClass(BaseAction, 'FacebookCreatePostAction')
13
13
  export class FacebookCreatePostAction extends FacebookBaseAction {
14
- /**
15
- * Get action description
16
- */
17
- public get Description(): string {
18
- return 'Creates a new post on a Facebook page with optional media attachments and scheduling';
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: 'Content',
34
- Type: 'Input',
35
- Value: null,
36
- },
37
- {
38
- Name: 'Link',
39
- Type: 'Input',
40
- Value: null,
41
- },
42
- {
43
- Name: 'MediaFiles',
44
- Type: 'Input',
45
- Value: null,
46
- },
47
- {
48
- Name: 'ScheduledTime',
49
- Type: 'Input',
50
- Value: null,
51
- },
52
- {
53
- Name: 'Tags',
54
- Type: 'Input',
55
- Value: null,
56
- },
57
- {
58
- Name: 'PlaceID',
59
- Type: 'Input',
60
- Value: null,
61
- },
62
- {
63
- Name: 'Privacy',
64
- Type: 'Input',
65
- Value: null,
66
- },
67
- {
68
- Name: 'Published',
69
- Type: 'Input',
70
- Value: true,
71
- }
72
- ];
73
- }
74
-
75
- /**
76
- * Execute the action
77
- */
78
- protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
79
- const { Params, ContextUser } = params;
80
-
81
- try {
82
- // Validate required parameters
83
- const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
84
- const pageId = this.getParamValue(Params, 'PageID');
85
-
86
- if (!companyIntegrationId) {
87
- return {
88
- Success: false,
89
- Message: 'CompanyIntegrationID is required',
90
- ResultCode: 'INVALID_TOKEN'
91
- };
92
- }
93
-
94
- if (!pageId) {
95
- return {
96
- Success: false,
97
- Message: 'PageID is required',
98
- ResultCode: 'MISSING_REQUIRED_PARAM'
99
- };
100
- }
101
-
102
- // Initialize OAuth
103
- if (!await this.initializeOAuth(companyIntegrationId)) {
104
- return {
105
- Success: false,
106
- Message: 'Failed to initialize Facebook OAuth connection',
107
- ResultCode: 'INVALID_TOKEN'
108
- };
109
- }
110
-
111
- // Get parameters
112
- const content = this.getParamValue(Params, 'Content') as string;
113
- const link = this.getParamValue(Params, 'Link') as string;
114
- const mediaFiles = this.getParamValue(Params, 'MediaFiles') as MediaFile[];
115
- const scheduledTime = this.getParamValue(Params, 'ScheduledTime') as string;
116
- const tags = this.getParamValue(Params, 'Tags') as string[];
117
- const placeId = this.getParamValue(Params, 'PlaceID') as string;
118
- const privacy = this.getParamValue(Params, 'Privacy') as string;
119
- const published = this.getParamValue(Params, 'Published') !== false;
120
-
121
- // Validate that we have some content
122
- if (!content && !link && (!mediaFiles || mediaFiles.length === 0)) {
123
- return {
124
- Success: false,
125
- Message: 'At least one of Content, Link, or MediaFiles is required',
126
- ResultCode: 'MISSING_CONTENT'
127
- };
128
- }
129
-
130
- // Build post data
131
- const postData: CreatePostData = {};
132
-
133
- if (content) {
134
- postData.message = content;
135
- }
136
-
137
- if (link) {
138
- postData.link = link;
139
- }
140
-
141
- if (placeId) {
142
- postData.place = placeId;
143
- }
144
-
145
- if (tags && tags.length > 0) {
146
- postData.tags = tags;
147
- }
148
-
149
- if (privacy) {
150
- postData.privacy = {
151
- value: privacy as 'EVERYONE' | 'ALL_FRIENDS' | 'FRIENDS_OF_FRIENDS' | 'SELF'
152
- };
153
- }
154
-
155
- postData.published = published;
156
-
157
- // Handle scheduling
158
- if (scheduledTime) {
159
- const scheduledDate = new Date(scheduledTime);
160
- const now = new Date();
161
- const minScheduleTime = new Date(now.getTime() + 10 * 60 * 1000); // 10 minutes from now
162
- const maxScheduleTime = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000); // 6 months from now
163
-
164
- if (scheduledDate < minScheduleTime) {
165
- return {
166
- Success: false,
167
- Message: 'Scheduled time must be at least 10 minutes in the future',
168
- ResultCode: 'INVALID_SCHEDULE_TIME'
169
- };
170
- }
171
-
172
- if (scheduledDate > maxScheduleTime) {
173
- return {
174
- Success: false,
175
- Message: 'Scheduled time cannot be more than 6 months in the future',
176
- ResultCode: 'INVALID_SCHEDULE_TIME'
177
- };
178
- }
179
-
180
- postData.scheduled_publish_time = Math.floor(scheduledDate.getTime() / 1000);
181
- postData.published = false; // Must be unpublished when scheduling
182
- }
183
-
184
- // Handle media uploads
185
- if (mediaFiles && mediaFiles.length > 0) {
186
- LogStatus(`Uploading ${mediaFiles.length} media files to Facebook...`);
187
-
188
- const mediaIds: string[] = [];
189
- for (const file of mediaFiles) {
190
- try {
191
- const mediaId = await this.uploadMediaToPage(pageId, file);
192
- mediaIds.push(mediaId);
193
- LogStatus(`Uploaded media: ${file.filename}`);
194
- } catch (error) {
195
- LogError(`Failed to upload media ${file.filename}: ${error}`);
196
- return {
197
- Success: false,
198
- Message: `Failed to upload media: ${error instanceof Error ? error.message : 'Unknown error'}`,
199
- ResultCode: 'INVALID_MEDIA'
200
- };
201
- }
202
- }
203
-
204
- // Attach media to post
205
- postData.attached_media = mediaIds.map(id => ({ media_fbid: id }));
206
- }
207
-
208
- // Create the post
209
- LogStatus('Creating Facebook post...');
210
- const post = await this.createPost(pageId, postData);
211
-
212
- LogStatus(`Facebook post created successfully: ${post.id}`);
213
-
214
- // Return normalized post data
215
- const normalizedPost = this.normalizePost(post);
216
-
217
- // Update output parameters
218
- const outputParams = [...Params];
219
- // TODO: Set output parameters based on result
220
-
221
- return {
222
- Success: true,
223
- Message: scheduledTime ? 'Post scheduled successfully' : 'Post created successfully',
224
- ResultCode: 'SUCCESS',
225
- Params: outputParams
226
- };
14
+ /**
15
+ * Get action description
16
+ */
17
+ public get Description(): string {
18
+ return 'Creates a new post on a Facebook page with optional media attachments and scheduling';
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: 'Content',
34
+ Type: 'Input',
35
+ Value: null,
36
+ },
37
+ {
38
+ Name: 'Link',
39
+ Type: 'Input',
40
+ Value: null,
41
+ },
42
+ {
43
+ Name: 'MediaFiles',
44
+ Type: 'Input',
45
+ Value: null,
46
+ },
47
+ {
48
+ Name: 'ScheduledTime',
49
+ Type: 'Input',
50
+ Value: null,
51
+ },
52
+ {
53
+ Name: 'Tags',
54
+ Type: 'Input',
55
+ Value: null,
56
+ },
57
+ {
58
+ Name: 'PlaceID',
59
+ Type: 'Input',
60
+ Value: null,
61
+ },
62
+ {
63
+ Name: 'Privacy',
64
+ Type: 'Input',
65
+ Value: null,
66
+ },
67
+ {
68
+ Name: 'Published',
69
+ Type: 'Input',
70
+ Value: true,
71
+ },
72
+ ];
73
+ }
74
+
75
+ /**
76
+ * Execute the action
77
+ */
78
+ protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
79
+ const { Params, ContextUser } = params;
80
+
81
+ try {
82
+ // Validate required parameters
83
+ const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
84
+ const pageId = this.getParamValue(Params, 'PageID');
85
+
86
+ if (!companyIntegrationId) {
87
+ return {
88
+ Success: false,
89
+ Message: 'CompanyIntegrationID is required',
90
+ ResultCode: 'INVALID_TOKEN',
91
+ };
92
+ }
93
+
94
+ if (!pageId) {
95
+ return {
96
+ Success: false,
97
+ Message: 'PageID is required',
98
+ ResultCode: 'MISSING_REQUIRED_PARAM',
99
+ };
100
+ }
101
+
102
+ // Initialize OAuth
103
+ if (!(await this.initializeOAuth(companyIntegrationId))) {
104
+ return {
105
+ Success: false,
106
+ Message: 'Failed to initialize Facebook OAuth connection',
107
+ ResultCode: 'INVALID_TOKEN',
108
+ };
109
+ }
110
+
111
+ // Get parameters
112
+ const content = this.getParamValue(Params, 'Content') as string;
113
+ const link = this.getParamValue(Params, 'Link') as string;
114
+ const mediaFiles = this.getParamValue(Params, 'MediaFiles') as MediaFile[];
115
+ const scheduledTime = this.getParamValue(Params, 'ScheduledTime') as string;
116
+ const tags = this.getParamValue(Params, 'Tags') as string[];
117
+ const placeId = this.getParamValue(Params, 'PlaceID') as string;
118
+ const privacy = this.getParamValue(Params, 'Privacy') as string;
119
+ const published = this.getParamValue(Params, 'Published') !== false;
120
+
121
+ // Validate that we have some content
122
+ if (!content && !link && (!mediaFiles || mediaFiles.length === 0)) {
123
+ return {
124
+ Success: false,
125
+ Message: 'At least one of Content, Link, or MediaFiles is required',
126
+ ResultCode: 'MISSING_CONTENT',
127
+ };
128
+ }
129
+
130
+ // Build post data
131
+ const postData: CreatePostData = {};
132
+
133
+ if (content) {
134
+ postData.message = content;
135
+ }
136
+
137
+ if (link) {
138
+ postData.link = link;
139
+ }
140
+
141
+ if (placeId) {
142
+ postData.place = placeId;
143
+ }
144
+
145
+ if (tags && tags.length > 0) {
146
+ postData.tags = tags;
147
+ }
148
+
149
+ if (privacy) {
150
+ postData.privacy = {
151
+ value: privacy as 'EVERYONE' | 'ALL_FRIENDS' | 'FRIENDS_OF_FRIENDS' | 'SELF',
152
+ };
153
+ }
154
+
155
+ postData.published = published;
156
+
157
+ // Handle scheduling
158
+ if (scheduledTime) {
159
+ const scheduledDate = new Date(scheduledTime);
160
+ const now = new Date();
161
+ const minScheduleTime = new Date(now.getTime() + 10 * 60 * 1000); // 10 minutes from now
162
+ const maxScheduleTime = new Date(now.getTime() + 180 * 24 * 60 * 60 * 1000); // 6 months from now
163
+
164
+ if (scheduledDate < minScheduleTime) {
165
+ return {
166
+ Success: false,
167
+ Message: 'Scheduled time must be at least 10 minutes in the future',
168
+ ResultCode: 'INVALID_SCHEDULE_TIME',
169
+ };
170
+ }
227
171
 
228
- } catch (error) {
229
- LogError(`Failed to create Facebook post: ${error instanceof Error ? error.message : 'Unknown error'}`);
230
-
231
- if (this.isAuthError(error)) {
232
- return this.handleOAuthError(error);
233
- }
172
+ if (scheduledDate > maxScheduleTime) {
173
+ return {
174
+ Success: false,
175
+ Message: 'Scheduled time cannot be more than 6 months in the future',
176
+ ResultCode: 'INVALID_SCHEDULE_TIME',
177
+ };
178
+ }
234
179
 
180
+ postData.scheduled_publish_time = Math.floor(scheduledDate.getTime() / 1000);
181
+ postData.published = false; // Must be unpublished when scheduling
182
+ }
183
+
184
+ // Handle media uploads
185
+ if (mediaFiles && mediaFiles.length > 0) {
186
+ LogStatus(`Uploading ${mediaFiles.length} media files to Facebook...`);
187
+
188
+ const mediaIds: string[] = [];
189
+ for (const file of mediaFiles) {
190
+ try {
191
+ const mediaId = await this.uploadMediaToPage(pageId, file);
192
+ mediaIds.push(mediaId);
193
+ LogStatus(`Uploaded media: ${file.filename}`);
194
+ } catch (error) {
195
+ LogError(`Failed to upload media ${file.filename}: ${error}`);
235
196
  return {
236
- Success: false,
237
- Message: error instanceof Error ? error.message : 'Unknown error occurred',
238
- ResultCode: 'ERROR'
197
+ Success: false,
198
+ Message: `Failed to upload media: ${error instanceof Error ? error.message : 'Unknown error'}`,
199
+ ResultCode: 'INVALID_MEDIA',
239
200
  };
201
+ }
240
202
  }
241
- }
242
-
243
203
 
244
- }
204
+ // Attach media to post
205
+ postData.attached_media = mediaIds.map((id) => ({ media_fbid: id }));
206
+ }
207
+
208
+ // Create the post
209
+ LogStatus('Creating Facebook post...');
210
+ const post = await this.createPost(pageId, postData);
211
+
212
+ LogStatus(`Facebook post created successfully: ${post.id}`);
213
+
214
+ // Return normalized post data
215
+ const normalizedPost = this.normalizePost(post);
216
+
217
+ // Update output parameters
218
+ const outputParams = [...Params];
219
+ // TODO: Set output parameters based on result
220
+
221
+ return {
222
+ Success: true,
223
+ Message: scheduledTime ? 'Post scheduled successfully' : 'Post created successfully',
224
+ ResultCode: 'SUCCESS',
225
+ Params: outputParams,
226
+ };
227
+ } catch (error) {
228
+ LogError(`Failed to create Facebook post: ${error instanceof Error ? error.message : 'Unknown error'}`);
229
+
230
+ if (this.isAuthError(error)) {
231
+ return this.handleOAuthError(error);
232
+ }
233
+
234
+ return {
235
+ Success: false,
236
+ Message: error instanceof Error ? error.message : 'Unknown error occurred',
237
+ ResultCode: 'ERROR',
238
+ };
239
+ }
240
+ }
241
+ }