@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, LinkedInShareData } 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 { MediaFile } from '../../../base/base-social.action';
6
6
  import { BaseAction } from '@memberjunction/actions';
7
7
 
@@ -12,196 +12,198 @@ import { BaseAction } from '@memberjunction/actions';
12
12
  */
13
13
  @RegisterClass(BaseAction, 'LinkedInSchedulePostAction')
14
14
  export class LinkedInSchedulePostAction extends LinkedInBaseAction {
15
- /**
16
- * Schedule a post for future publishing on LinkedIn
17
- */
18
- protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
19
- const { Params, ContextUser } = params;
20
-
21
- try {
22
- // Initialize OAuth
23
- const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
24
- if (!await this.initializeOAuth(companyIntegrationId)) {
25
- throw new Error('Failed to initialize OAuth connection');
26
- }
27
-
28
- // Extract parameters
29
- const content = this.getParamValue(Params, 'Content');
30
- const scheduledTime = this.getParamValue(Params, 'ScheduledTime');
31
- const authorType = this.getParamValue(Params, 'AuthorType') || 'personal'; // 'personal' or 'organization'
32
- const organizationId = this.getParamValue(Params, 'OrganizationID');
33
- const mediaFiles = this.getParamValue(Params, 'MediaFiles');
34
- const visibility = this.getParamValue(Params, 'Visibility') || 'PUBLIC';
35
- const visibleToGuest = this.getParamValue(Params, 'VisibleToGuest') !== false; // Default true
36
-
37
- // Validate required parameters
38
- if (!content) {
39
- throw new Error('Content is required');
40
- }
41
- if (!scheduledTime) {
42
- throw new Error('ScheduledTime is required');
43
- }
44
-
45
- // Validate scheduled time is in the future
46
- const scheduledDate = new Date(scheduledTime);
47
- if (scheduledDate <= new Date()) {
48
- throw new Error('ScheduledTime must be in the future');
49
- }
50
-
51
- // Determine author URN
52
- let authorUrn: string;
53
- if (authorType === 'organization') {
54
- if (!organizationId) {
55
- // Get first admin organization if not specified
56
- const orgs = await this.getAdminOrganizations();
57
- if (orgs.length === 0) {
58
- throw new Error('No organizations found. Please specify OrganizationID.');
59
- }
60
- authorUrn = orgs[0].urn;
61
- LogStatus(`Using organization: ${orgs[0].name}`);
62
- } else {
63
- authorUrn = `urn:li:organization:${organizationId}`;
64
- }
65
- } else {
66
- // Personal post
67
- authorUrn = await this.getCurrentUserUrn();
68
- }
69
-
70
- // Upload media if provided (to ensure they're valid and get URNs)
71
- let mediaUrns: string[] = [];
72
- if (mediaFiles && Array.isArray(mediaFiles)) {
73
- LogStatus(`Uploading ${mediaFiles.length} media files...`);
74
- mediaUrns = await this.uploadMedia(mediaFiles as MediaFile[]);
75
- }
76
-
77
- // Build share data for future publishing
78
- const shareData: LinkedInShareData = {
79
- author: authorUrn,
80
- lifecycleState: 'PUBLISHED',
81
- specificContent: {
82
- 'com.linkedin.ugc.ShareContent': {
83
- shareCommentary: {
84
- text: content
85
- },
86
- shareMediaCategory: mediaUrns.length > 0 ? 'IMAGE' : 'NONE',
87
- media: mediaUrns.length > 0 ? mediaUrns.map(urn => ({
88
- status: 'READY' as const,
89
- media: urn
90
- })) : undefined
91
- }
92
- },
93
- visibility: {
94
- 'com.linkedin.ugc.MemberNetworkVisibility': visibility as any
95
- }
96
- };
97
-
98
- // Add distribution settings if public
99
- if (visibility === 'PUBLIC') {
100
- shareData.distribution = {
101
- linkedInDistributionTarget: {
102
- visibleToGuest: visibleToGuest
103
- }
104
- };
105
- }
106
-
107
- // Create a scheduled post record
108
- // Note: This would typically be stored in a database or queue for processing
109
- const scheduledPost = {
110
- id: `scheduled_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
111
- platform: 'LinkedIn',
112
- companyIntegrationId: companyIntegrationId,
113
- scheduledTime: scheduledDate.toISOString(),
114
- shareData: shareData,
115
- status: 'SCHEDULED',
116
- createdAt: new Date().toISOString()
117
- };
118
-
119
- LogStatus(`Post scheduled for ${scheduledDate.toISOString()}`);
120
-
121
- // Update output parameters
122
- const outputParams = [...Params];
123
- const scheduledPostParam = outputParams.find(p => p.Name === 'ScheduledPost');
124
- if (scheduledPostParam) scheduledPostParam.Value = scheduledPost;
125
- const scheduledIdParam = outputParams.find(p => p.Name === 'ScheduledID');
126
- if (scheduledIdParam) scheduledIdParam.Value = scheduledPost.id;
127
-
128
- return {
129
- Success: true,
130
- ResultCode: 'SUCCESS',
131
- Message: `Successfully scheduled LinkedIn post for ${scheduledDate.toISOString()}`,
132
- Params: outputParams
133
- };
134
-
135
- } catch (error) {
136
- const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
137
-
138
- return {
139
- Success: false,
140
- ResultCode: 'ERROR',
141
- Message: `Failed to schedule LinkedIn post: ${errorMessage}`,
142
- Params
143
- };
15
+ /**
16
+ * Schedule a post for future publishing on LinkedIn
17
+ */
18
+ protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
19
+ const { Params, ContextUser } = params;
20
+
21
+ try {
22
+ // Initialize OAuth
23
+ const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
24
+ if (!(await this.initializeOAuth(companyIntegrationId))) {
25
+ throw new Error('Failed to initialize OAuth connection');
26
+ }
27
+
28
+ // Extract parameters
29
+ const content = this.getParamValue(Params, 'Content');
30
+ const scheduledTime = this.getParamValue(Params, 'ScheduledTime');
31
+ const authorType = this.getParamValue(Params, 'AuthorType') || 'personal'; // 'personal' or 'organization'
32
+ const organizationId = this.getParamValue(Params, 'OrganizationID');
33
+ const mediaFiles = this.getParamValue(Params, 'MediaFiles');
34
+ const visibility = this.getParamValue(Params, 'Visibility') || 'PUBLIC';
35
+ const visibleToGuest = this.getParamValue(Params, 'VisibleToGuest') !== false; // Default true
36
+
37
+ // Validate required parameters
38
+ if (!content) {
39
+ throw new Error('Content is required');
40
+ }
41
+ if (!scheduledTime) {
42
+ throw new Error('ScheduledTime is required');
43
+ }
44
+
45
+ // Validate scheduled time is in the future
46
+ const scheduledDate = new Date(scheduledTime);
47
+ if (scheduledDate <= new Date()) {
48
+ throw new Error('ScheduledTime must be in the future');
49
+ }
50
+
51
+ // Determine author URN
52
+ let authorUrn: string;
53
+ if (authorType === 'organization') {
54
+ if (!organizationId) {
55
+ // Get first admin organization if not specified
56
+ const orgs = await this.getAdminOrganizations();
57
+ if (orgs.length === 0) {
58
+ throw new Error('No organizations found. Please specify OrganizationID.');
59
+ }
60
+ authorUrn = orgs[0].urn;
61
+ LogStatus(`Using organization: ${orgs[0].name}`);
62
+ } else {
63
+ authorUrn = `urn:li:organization:${organizationId}`;
144
64
  }
145
- }
65
+ } else {
66
+ // Personal post
67
+ authorUrn = await this.getCurrentUserUrn();
68
+ }
146
69
 
147
- /**
148
- * Define the parameters this action expects
149
- */
150
- public get Params(): ActionParam[] {
151
- return [
152
- ...this.commonSocialParams,
153
- {
154
- Name: 'Content',
155
- Type: 'Input',
156
- Value: null
157
- },
158
- {
159
- Name: 'ScheduledTime',
160
- Type: 'Input',
161
- Value: null
162
- },
163
- {
164
- Name: 'AuthorType',
165
- Type: 'Input',
166
- Value: 'personal' // 'personal' or 'organization'
167
- },
168
- {
169
- Name: 'OrganizationID',
170
- Type: 'Input',
171
- Value: null
172
- },
173
- {
174
- Name: 'MediaFiles',
175
- Type: 'Input',
176
- Value: null
177
- },
178
- {
179
- Name: 'Visibility',
180
- Type: 'Input',
181
- Value: 'PUBLIC' // 'PUBLIC', 'CONNECTIONS', 'LOGGED_IN', 'CONTAINER'
182
- },
183
- {
184
- Name: 'VisibleToGuest',
185
- Type: 'Input',
186
- Value: true
187
- },
188
- {
189
- Name: 'ScheduledPost',
190
- Type: 'Output',
191
- Value: null
70
+ // Upload media if provided (to ensure they're valid and get URNs)
71
+ let mediaUrns: string[] = [];
72
+ if (mediaFiles && Array.isArray(mediaFiles)) {
73
+ LogStatus(`Uploading ${mediaFiles.length} media files...`);
74
+ mediaUrns = await this.uploadMedia(mediaFiles as MediaFile[]);
75
+ }
76
+
77
+ // Build share data for future publishing
78
+ const shareData: LinkedInShareData = {
79
+ author: authorUrn,
80
+ lifecycleState: 'PUBLISHED',
81
+ specificContent: {
82
+ 'com.linkedin.ugc.ShareContent': {
83
+ shareCommentary: {
84
+ text: content,
192
85
  },
193
- {
194
- Name: 'ScheduledID',
195
- Type: 'Output',
196
- Value: null
197
- }
198
- ];
199
- }
86
+ shareMediaCategory: mediaUrns.length > 0 ? 'IMAGE' : 'NONE',
87
+ media:
88
+ mediaUrns.length > 0
89
+ ? mediaUrns.map((urn) => ({
90
+ status: 'READY' as const,
91
+ media: urn,
92
+ }))
93
+ : undefined,
94
+ },
95
+ },
96
+ visibility: {
97
+ 'com.linkedin.ugc.MemberNetworkVisibility': visibility as any,
98
+ },
99
+ };
100
+
101
+ // Add distribution settings if public
102
+ if (visibility === 'PUBLIC') {
103
+ shareData.distribution = {
104
+ linkedInDistributionTarget: {
105
+ visibleToGuest: visibleToGuest,
106
+ },
107
+ };
108
+ }
109
+
110
+ // Create a scheduled post record
111
+ // Note: This would typically be stored in a database or queue for processing
112
+ const scheduledPost = {
113
+ id: `scheduled_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
114
+ platform: 'LinkedIn',
115
+ companyIntegrationId: companyIntegrationId,
116
+ scheduledTime: scheduledDate.toISOString(),
117
+ shareData: shareData,
118
+ status: 'SCHEDULED',
119
+ createdAt: new Date().toISOString(),
120
+ };
200
121
 
201
- /**
202
- * Get action description
203
- */
204
- public get Description(): string {
205
- return 'Schedules a post for future publishing on LinkedIn. Note: LinkedIn API does not support native scheduling, so this stores the post for later publishing via a scheduler service.';
122
+ LogStatus(`Post scheduled for ${scheduledDate.toISOString()}`);
123
+
124
+ // Update output parameters
125
+ const outputParams = [...Params];
126
+ const scheduledPostParam = outputParams.find((p) => p.Name === 'ScheduledPost');
127
+ if (scheduledPostParam) scheduledPostParam.Value = scheduledPost;
128
+ const scheduledIdParam = outputParams.find((p) => p.Name === 'ScheduledID');
129
+ if (scheduledIdParam) scheduledIdParam.Value = scheduledPost.id;
130
+
131
+ return {
132
+ Success: true,
133
+ ResultCode: 'SUCCESS',
134
+ Message: `Successfully scheduled LinkedIn post for ${scheduledDate.toISOString()}`,
135
+ Params: outputParams,
136
+ };
137
+ } catch (error) {
138
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
139
+
140
+ return {
141
+ Success: false,
142
+ ResultCode: 'ERROR',
143
+ Message: `Failed to schedule LinkedIn post: ${errorMessage}`,
144
+ Params,
145
+ };
206
146
  }
207
- }
147
+ }
148
+
149
+ /**
150
+ * Define the parameters this action expects
151
+ */
152
+ public get Params(): ActionParam[] {
153
+ return [
154
+ ...this.commonSocialParams,
155
+ {
156
+ Name: 'Content',
157
+ Type: 'Input',
158
+ Value: null,
159
+ },
160
+ {
161
+ Name: 'ScheduledTime',
162
+ Type: 'Input',
163
+ Value: null,
164
+ },
165
+ {
166
+ Name: 'AuthorType',
167
+ Type: 'Input',
168
+ Value: 'personal', // 'personal' or 'organization'
169
+ },
170
+ {
171
+ Name: 'OrganizationID',
172
+ Type: 'Input',
173
+ Value: null,
174
+ },
175
+ {
176
+ Name: 'MediaFiles',
177
+ Type: 'Input',
178
+ Value: null,
179
+ },
180
+ {
181
+ Name: 'Visibility',
182
+ Type: 'Input',
183
+ Value: 'PUBLIC', // 'PUBLIC', 'CONNECTIONS', 'LOGGED_IN', 'CONTAINER'
184
+ },
185
+ {
186
+ Name: 'VisibleToGuest',
187
+ Type: 'Input',
188
+ Value: true,
189
+ },
190
+ {
191
+ Name: 'ScheduledPost',
192
+ Type: 'Output',
193
+ Value: null,
194
+ },
195
+ {
196
+ Name: 'ScheduledID',
197
+ Type: 'Output',
198
+ Value: null,
199
+ },
200
+ ];
201
+ }
202
+
203
+ /**
204
+ * Get action description
205
+ */
206
+ public get Description(): string {
207
+ return 'Schedules a post for future publishing on LinkedIn. Note: LinkedIn API does not support native scheduling, so this stores the post for later publishing via a scheduler service.';
208
+ }
209
+ }