@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 { HootSuiteBaseAction } from '../hootsuite-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 { MediaFile } from '../../../base/base-social.action';
6
6
  import { BaseAction } from '@memberjunction/actions';
7
7
 
@@ -10,214 +10,216 @@ import { BaseAction } from '@memberjunction/actions';
10
10
  */
11
11
  @RegisterClass(BaseAction, 'HootSuiteUpdateScheduledPostAction')
12
12
  export class HootSuiteUpdateScheduledPostAction extends HootSuiteBaseAction {
13
- /**
14
- * Update a scheduled post in HootSuite
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 content = this.getParamValue(Params, 'Content');
29
- const profileIds = this.getParamValue(Params, 'ProfileIDs');
30
- const scheduledTime = this.getParamValue(Params, 'ScheduledTime');
31
- const mediaFiles = this.getParamValue(Params, 'MediaFiles');
32
- const replaceMedia = this.getParamValue(Params, 'ReplaceMedia') || false;
33
- const tags = this.getParamValue(Params, 'Tags');
34
- const location = this.getParamValue(Params, 'Location');
35
-
36
- // Validate required parameters
37
- if (!postId) {
38
- throw new Error('PostID is required');
39
- }
40
-
41
- // First, get the existing post
42
- LogStatus(`Fetching existing post ${postId}...`);
43
- const existingPostResponse = await this.axiosInstance.get(`/messages/${postId}`);
44
- const existingPost = existingPostResponse.data;
45
-
46
- // Check if post can be updated
47
- if (existingPost.state !== 'SCHEDULED' && existingPost.state !== 'DRAFT') {
48
- throw new Error(`Cannot update post in ${existingPost.state} state. Only SCHEDULED and DRAFT posts can be updated.`);
49
- }
50
-
51
- // Build update data
52
- const updateData: any = {};
53
-
54
- // Update content if provided
55
- if (content !== undefined && content !== null) {
56
- updateData.text = content;
57
- }
58
-
59
- // Update profile IDs if provided
60
- if (profileIds) {
61
- if (Array.isArray(profileIds)) {
62
- updateData.socialProfileIds = profileIds;
63
- } else if (typeof profileIds === 'string') {
64
- updateData.socialProfileIds = [profileIds];
65
- }
66
- }
67
-
68
- // Update scheduled time if provided
69
- if (scheduledTime !== undefined) {
70
- updateData.scheduledTime = scheduledTime ? this.formatHootSuiteDate(scheduledTime) : null;
71
- }
72
-
73
- // Handle media updates
74
- if (mediaFiles !== undefined) {
75
- if (replaceMedia || !existingPost.mediaIds || existingPost.mediaIds.length === 0) {
76
- // Replace all media or add new media
77
- if (mediaFiles && Array.isArray(mediaFiles) && mediaFiles.length > 0) {
78
- LogStatus(`Uploading ${mediaFiles.length} media files...`);
79
- const mediaIds = await this.uploadMedia(mediaFiles as MediaFile[]);
80
- updateData.mediaIds = mediaIds;
81
- } else {
82
- // Remove all media
83
- updateData.mediaIds = [];
84
- }
85
- } else if (mediaFiles && Array.isArray(mediaFiles) && mediaFiles.length > 0) {
86
- // Append new media to existing
87
- LogStatus(`Uploading ${mediaFiles.length} additional media files...`);
88
- const newMediaIds = await this.uploadMedia(mediaFiles as MediaFile[]);
89
- updateData.mediaIds = [...(existingPost.mediaIds || []), ...newMediaIds];
90
- }
91
- }
92
-
93
- // Update tags if provided
94
- if (tags !== undefined) {
95
- updateData.tags = Array.isArray(tags) ? tags : [];
96
- }
97
-
98
- // Update location if provided
99
- if (location !== undefined) {
100
- updateData.location = location ? {
101
- latitude: location.latitude,
102
- longitude: location.longitude
103
- } : null;
104
- }
105
-
106
- // Only proceed if there are updates
107
- if (Object.keys(updateData).length === 0) {
108
- return {
109
- Success: true,
110
- ResultCode: 'NO_CHANGES',
111
- Message: 'No updates were provided',
112
- Params
113
- };
114
- }
115
-
116
- // Update the post
117
- LogStatus(`Updating post ${postId}...`);
118
- const response = await this.axiosInstance.patch(`/messages/${postId}`, updateData);
119
- const updatedPost = response.data;
120
-
121
- // Normalize the updated post
122
- const normalizedPost = this.normalizePost(updatedPost);
123
-
124
- // Update output parameters
125
- const outputParams = [...Params];
126
- const postParam = outputParams.find(p => p.Name === 'UpdatedPost');
127
- if (postParam) postParam.Value = normalizedPost;
128
- const changesSummaryParam = outputParams.find(p => p.Name === 'ChangesSummary');
129
- if (changesSummaryParam) changesSummaryParam.Value = {
130
- fieldsUpdated: Object.keys(updateData),
131
- previousState: existingPost.state,
132
- newState: updatedPost.state,
133
- mediaChanges: {
134
- before: existingPost.mediaIds?.length || 0,
135
- after: updatedPost.mediaIds?.length || 0
136
- }
137
- };
138
-
139
- return {
140
- Success: true,
141
- ResultCode: 'SUCCESS',
142
- Message: `Successfully updated scheduled post (ID: ${postId})`,
143
- Params: outputParams
144
- };
145
-
146
- } catch (error) {
147
- const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
148
-
149
- return {
150
- Success: false,
151
- ResultCode: 'ERROR',
152
- Message: `Failed to update scheduled post: ${errorMessage}`,
153
- Params
154
- };
13
+ /**
14
+ * Update a scheduled post in HootSuite
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 content = this.getParamValue(Params, 'Content');
29
+ const profileIds = this.getParamValue(Params, 'ProfileIDs');
30
+ const scheduledTime = this.getParamValue(Params, 'ScheduledTime');
31
+ const mediaFiles = this.getParamValue(Params, 'MediaFiles');
32
+ const replaceMedia = this.getParamValue(Params, 'ReplaceMedia') || false;
33
+ const tags = this.getParamValue(Params, 'Tags');
34
+ const location = this.getParamValue(Params, 'Location');
35
+
36
+ // Validate required parameters
37
+ if (!postId) {
38
+ throw new Error('PostID is required');
39
+ }
40
+
41
+ // First, get the existing post
42
+ LogStatus(`Fetching existing post ${postId}...`);
43
+ const existingPostResponse = await this.axiosInstance.get(`/messages/${postId}`);
44
+ const existingPost = existingPostResponse.data;
45
+
46
+ // Check if post can be updated
47
+ if (existingPost.state !== 'SCHEDULED' && existingPost.state !== 'DRAFT') {
48
+ throw new Error(`Cannot update post in ${existingPost.state} state. Only SCHEDULED and DRAFT posts can be updated.`);
49
+ }
50
+
51
+ // Build update data
52
+ const updateData: any = {};
53
+
54
+ // Update content if provided
55
+ if (content !== undefined && content !== null) {
56
+ updateData.text = content;
57
+ }
58
+
59
+ // Update profile IDs if provided
60
+ if (profileIds) {
61
+ if (Array.isArray(profileIds)) {
62
+ updateData.socialProfileIds = profileIds;
63
+ } else if (typeof profileIds === 'string') {
64
+ updateData.socialProfileIds = [profileIds];
155
65
  }
156
- }
157
-
158
- /**
159
- * Define the parameters this action expects
160
- */
161
- public get Params(): ActionParam[] {
162
- return [
163
- ...this.commonSocialParams,
164
- {
165
- Name: 'PostID',
166
- Type: 'Input',
167
- Value: null
168
- },
169
- {
170
- Name: 'Content',
171
- Type: 'Input',
172
- Value: null
173
- },
174
- {
175
- Name: 'ProfileIDs',
176
- Type: 'Input',
177
- Value: null
178
- },
179
- {
180
- Name: 'ScheduledTime',
181
- Type: 'Input',
182
- Value: null
183
- },
184
- {
185
- Name: 'MediaFiles',
186
- Type: 'Input',
187
- Value: null
188
- },
189
- {
190
- Name: 'ReplaceMedia',
191
- Type: 'Input',
192
- Value: null
193
- },
194
- {
195
- Name: 'Tags',
196
- Type: 'Input',
197
- Value: null
198
- },
199
- {
200
- Name: 'Location',
201
- Type: 'Input',
202
- Value: null
203
- },
204
- {
205
- Name: 'UpdatedPost',
206
- Type: 'Output',
207
- Value: null
208
- },
209
- {
210
- Name: 'ChangesSummary',
211
- Type: 'Output',
212
- Value: null
66
+ }
67
+
68
+ // Update scheduled time if provided
69
+ if (scheduledTime !== undefined) {
70
+ updateData.scheduledTime = scheduledTime ? this.formatHootSuiteDate(scheduledTime) : null;
71
+ }
72
+
73
+ // Handle media updates
74
+ if (mediaFiles !== undefined) {
75
+ if (replaceMedia || !existingPost.mediaIds || existingPost.mediaIds.length === 0) {
76
+ // Replace all media or add new media
77
+ if (mediaFiles && Array.isArray(mediaFiles) && mediaFiles.length > 0) {
78
+ LogStatus(`Uploading ${mediaFiles.length} media files...`);
79
+ const mediaIds = await this.uploadMedia(mediaFiles as MediaFile[]);
80
+ updateData.mediaIds = mediaIds;
81
+ } else {
82
+ // Remove all media
83
+ updateData.mediaIds = [];
84
+ }
85
+ } else if (mediaFiles && Array.isArray(mediaFiles) && mediaFiles.length > 0) {
86
+ // Append new media to existing
87
+ LogStatus(`Uploading ${mediaFiles.length} additional media files...`);
88
+ const newMediaIds = await this.uploadMedia(mediaFiles as MediaFile[]);
89
+ updateData.mediaIds = [...(existingPost.mediaIds || []), ...newMediaIds];
90
+ }
91
+ }
92
+
93
+ // Update tags if provided
94
+ if (tags !== undefined) {
95
+ updateData.tags = Array.isArray(tags) ? tags : [];
96
+ }
97
+
98
+ // Update location if provided
99
+ if (location !== undefined) {
100
+ updateData.location = location
101
+ ? {
102
+ latitude: location.latitude,
103
+ longitude: location.longitude,
213
104
  }
214
- ];
215
- }
216
-
217
- /**
218
- * Get action description
219
- */
220
- public get Description(): string {
221
- return 'Updates a scheduled post in HootSuite. Only SCHEDULED and DRAFT posts can be updated.';
105
+ : null;
106
+ }
107
+
108
+ // Only proceed if there are updates
109
+ if (Object.keys(updateData).length === 0) {
110
+ return {
111
+ Success: true,
112
+ ResultCode: 'NO_CHANGES',
113
+ Message: 'No updates were provided',
114
+ Params,
115
+ };
116
+ }
117
+
118
+ // Update the post
119
+ LogStatus(`Updating post ${postId}...`);
120
+ const response = await this.axiosInstance.patch(`/messages/${postId}`, updateData);
121
+ const updatedPost = response.data;
122
+
123
+ // Normalize the updated post
124
+ const normalizedPost = this.normalizePost(updatedPost);
125
+
126
+ // Update output parameters
127
+ const outputParams = [...Params];
128
+ const postParam = outputParams.find((p) => p.Name === 'UpdatedPost');
129
+ if (postParam) postParam.Value = normalizedPost;
130
+ const changesSummaryParam = outputParams.find((p) => p.Name === 'ChangesSummary');
131
+ if (changesSummaryParam)
132
+ changesSummaryParam.Value = {
133
+ fieldsUpdated: Object.keys(updateData),
134
+ previousState: existingPost.state,
135
+ newState: updatedPost.state,
136
+ mediaChanges: {
137
+ before: existingPost.mediaIds?.length || 0,
138
+ after: updatedPost.mediaIds?.length || 0,
139
+ },
140
+ };
141
+
142
+ return {
143
+ Success: true,
144
+ ResultCode: 'SUCCESS',
145
+ Message: `Successfully updated scheduled post (ID: ${postId})`,
146
+ Params: outputParams,
147
+ };
148
+ } catch (error) {
149
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
150
+
151
+ return {
152
+ Success: false,
153
+ ResultCode: 'ERROR',
154
+ Message: `Failed to update scheduled post: ${errorMessage}`,
155
+ Params,
156
+ };
222
157
  }
223
- }
158
+ }
159
+
160
+ /**
161
+ * Define the parameters this action expects
162
+ */
163
+ public get Params(): ActionParam[] {
164
+ return [
165
+ ...this.commonSocialParams,
166
+ {
167
+ Name: 'PostID',
168
+ Type: 'Input',
169
+ Value: null,
170
+ },
171
+ {
172
+ Name: 'Content',
173
+ Type: 'Input',
174
+ Value: null,
175
+ },
176
+ {
177
+ Name: 'ProfileIDs',
178
+ Type: 'Input',
179
+ Value: null,
180
+ },
181
+ {
182
+ Name: 'ScheduledTime',
183
+ Type: 'Input',
184
+ Value: null,
185
+ },
186
+ {
187
+ Name: 'MediaFiles',
188
+ Type: 'Input',
189
+ Value: null,
190
+ },
191
+ {
192
+ Name: 'ReplaceMedia',
193
+ Type: 'Input',
194
+ Value: null,
195
+ },
196
+ {
197
+ Name: 'Tags',
198
+ Type: 'Input',
199
+ Value: null,
200
+ },
201
+ {
202
+ Name: 'Location',
203
+ Type: 'Input',
204
+ Value: null,
205
+ },
206
+ {
207
+ Name: 'UpdatedPost',
208
+ Type: 'Output',
209
+ Value: null,
210
+ },
211
+ {
212
+ Name: 'ChangesSummary',
213
+ Type: 'Output',
214
+ Value: null,
215
+ },
216
+ ];
217
+ }
218
+
219
+ /**
220
+ * Get action description
221
+ */
222
+ public get Description(): string {
223
+ return 'Updates a scheduled post in HootSuite. Only SCHEDULED and DRAFT posts can be updated.';
224
+ }
225
+ }