@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, FacebookAlbum } 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/global';
5
+ import { LogStatus, LogError } from '@memberjunction/core';
6
6
  import axios from 'axios';
7
7
  import FormData from 'form-data';
8
8
  import { BaseAction } from '@memberjunction/actions';
@@ -13,308 +13,324 @@ import { BaseAction } from '@memberjunction/actions';
13
13
  */
14
14
  @RegisterClass(BaseAction, 'FacebookCreateAlbumAction')
15
15
  export class FacebookCreateAlbumAction extends FacebookBaseAction {
16
- /**
17
- * Get action description
18
- */
19
- public get Description(): string {
20
- return 'Creates a photo album on a Facebook page and optionally uploads photos to it';
21
- }
22
-
23
- /**
24
- * Define the parameters for this action
25
- */
26
- public get Params(): ActionParam[] {
27
- return [
28
- ...this.commonSocialParams,
29
- {
30
- Name: 'PageID',
31
- Type: 'Input',
32
- Value: null,
33
- },
34
- {
35
- Name: 'AlbumName',
36
- Type: 'Input',
37
- Value: null,
38
- },
39
- {
40
- Name: 'Description',
41
- Type: 'Input',
42
- Value: null,
43
- },
44
- {
45
- Name: 'Location',
46
- Type: 'Input',
47
- Value: null,
48
- },
49
- {
50
- Name: 'Privacy',
51
- Type: 'Input',
52
- Value: 'EVERYONE',
53
- },
54
- {
55
- Name: 'Photos',
56
- Type: 'Input',
57
- Value: null,
58
- },
59
- {
60
- Name: 'PhotoCaptions',
61
- Type: 'Input',
62
- Value: null,
63
- },
64
- {
65
- Name: 'CoverPhotoIndex',
66
- Type: 'Input',
67
- Value: 0,
68
- },
69
- {
70
- Name: 'MakeAlbumPublic',
71
- Type: 'Input',
72
- Value: true,
73
- },
74
- ];
75
- }
76
-
77
- /**
78
- * Execute the action
79
- */
80
- protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
81
- const { Params, ContextUser } = params;
82
-
83
- try {
84
- // Validate required parameters
85
- const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
86
- const pageId = this.getParamValue(Params, 'PageID');
87
- const albumName = this.getParamValue(Params, 'AlbumName');
88
-
89
- if (!companyIntegrationId) {
90
- return {
91
- Success: false,
92
- Message: 'CompanyIntegrationID is required',
93
- ResultCode: 'INVALID_TOKEN',
94
- };
95
- }
96
-
97
- if (!pageId) {
98
- return {
99
- Success: false,
100
- Message: 'PageID is required',
101
- ResultCode: 'MISSING_REQUIRED_PARAM',
102
- };
103
- }
104
-
105
- if (!albumName) {
106
- return {
107
- Success: false,
108
- Message: 'AlbumName is required',
109
- ResultCode: 'MISSING_REQUIRED_PARAM',
110
- };
111
- }
112
-
113
- // Initialize OAuth
114
- if (!(await this.initializeOAuth(companyIntegrationId))) {
115
- return {
116
- Success: false,
117
- Message: 'Failed to initialize Facebook OAuth connection',
118
- ResultCode: 'INVALID_TOKEN',
119
- };
120
- }
121
-
122
- // Get parameters
123
- const description = this.getParamValue(Params, 'Description') as string;
124
- const location = this.getParamValue(Params, 'Location') as string;
125
- const privacy = this.getParamValue(Params, 'Privacy') as string;
126
- const photos = this.getParamValue(Params, 'Photos') as MediaFile[];
127
- const photoCaptions = this.getParamValue(Params, 'PhotoCaptions') as string[];
128
- const coverPhotoIndex = (this.getParamValue(Params, 'CoverPhotoIndex') as number) || 0;
129
- const makeAlbumPublic = this.getParamValue(Params, 'MakeAlbumPublic') !== false;
130
-
131
- // Validate photos are images
132
- if (photos && photos.length > 0) {
133
- for (const photo of photos) {
134
- if (!photo.mimeType.startsWith('image/')) {
135
- return {
136
- Success: false,
137
- Message: `Only image files are allowed in albums. File ${photo.filename} is ${photo.mimeType}`,
138
- ResultCode: 'INVALID_MEDIA',
16
+ /**
17
+ * Get action description
18
+ */
19
+ public get Description(): string {
20
+ return 'Creates a photo album on a Facebook page and optionally uploads photos to it';
21
+ }
22
+
23
+ /**
24
+ * Define the parameters for this action
25
+ */
26
+ public get Params(): ActionParam[] {
27
+ return [
28
+ ...this.commonSocialParams,
29
+ {
30
+ Name: 'PageID',
31
+ Type: 'Input',
32
+ Value: null,
33
+ },
34
+ {
35
+ Name: 'AlbumName',
36
+ Type: 'Input',
37
+ Value: null,
38
+ },
39
+ {
40
+ Name: 'Description',
41
+ Type: 'Input',
42
+ Value: null,
43
+ },
44
+ {
45
+ Name: 'Location',
46
+ Type: 'Input',
47
+ Value: null,
48
+ },
49
+ {
50
+ Name: 'Privacy',
51
+ Type: 'Input',
52
+ Value: 'EVERYONE',
53
+ },
54
+ {
55
+ Name: 'Photos',
56
+ Type: 'Input',
57
+ Value: null,
58
+ },
59
+ {
60
+ Name: 'PhotoCaptions',
61
+ Type: 'Input',
62
+ Value: null,
63
+ },
64
+ {
65
+ Name: 'CoverPhotoIndex',
66
+ Type: 'Input',
67
+ Value: 0,
68
+ },
69
+ {
70
+ Name: 'MakeAlbumPublic',
71
+ Type: 'Input',
72
+ Value: true,
73
+ }
74
+ ];
75
+ }
76
+
77
+ /**
78
+ * Execute the action
79
+ */
80
+ protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
81
+ const { Params, ContextUser } = params;
82
+
83
+ try {
84
+ // Validate required parameters
85
+ const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
86
+ const pageId = this.getParamValue(Params, 'PageID');
87
+ const albumName = this.getParamValue(Params, 'AlbumName');
88
+
89
+ if (!companyIntegrationId) {
90
+ return {
91
+ Success: false,
92
+ Message: 'CompanyIntegrationID is required',
93
+ ResultCode: 'INVALID_TOKEN'
139
94
  };
140
- }
141
- }
142
- }
143
-
144
- LogStatus(`Creating album "${albumName}" on Facebook page ${pageId}...`);
145
-
146
- // Get page access token
147
- const pageToken = await this.getPageAccessToken(pageId);
148
-
149
- // Create the album
150
- const albumData: any = {
151
- name: albumName,
152
- privacy: {
153
- value: privacy,
154
- },
155
- };
156
-
157
- if (description) {
158
- albumData.message = description;
159
- }
160
-
161
- if (location) {
162
- albumData.location = location;
163
- }
164
-
165
- const albumResponse = await axios.post(`${this.apiBaseUrl}/${pageId}/albums`, albumData, {
166
- params: {
167
- access_token: pageToken,
168
- },
169
- });
170
-
171
- const albumId = albumResponse.data.id;
172
- LogStatus(`Album created with ID: ${albumId}`);
173
-
174
- // Upload photos if provided
175
- const uploadedPhotos: any[] = [];
176
- let coverPhotoId: string | null = null;
177
-
178
- if (photos && photos.length > 0) {
179
- LogStatus(`Uploading ${photos.length} photos to the album...`);
180
-
181
- for (let i = 0; i < photos.length; i++) {
182
- const photo = photos[i];
183
- const caption = photoCaptions?.[i] || '';
184
-
185
- try {
186
- const photoId = await this.uploadPhotoToAlbum(
187
- albumId,
188
- photo,
189
- caption,
190
- pageToken,
191
- !makeAlbumPublic // Keep unpublished if album is not public yet
95
+ }
96
+
97
+ if (!pageId) {
98
+ return {
99
+ Success: false,
100
+ Message: 'PageID is required',
101
+ ResultCode: 'MISSING_REQUIRED_PARAM'
102
+ };
103
+ }
104
+
105
+ if (!albumName) {
106
+ return {
107
+ Success: false,
108
+ Message: 'AlbumName is required',
109
+ ResultCode: 'MISSING_REQUIRED_PARAM'
110
+ };
111
+ }
112
+
113
+ // Initialize OAuth
114
+ if (!await this.initializeOAuth(companyIntegrationId)) {
115
+ return {
116
+ Success: false,
117
+ Message: 'Failed to initialize Facebook OAuth connection',
118
+ ResultCode: 'INVALID_TOKEN'
119
+ };
120
+ }
121
+
122
+ // Get parameters
123
+ const description = this.getParamValue(Params, 'Description') as string;
124
+ const location = this.getParamValue(Params, 'Location') as string;
125
+ const privacy = this.getParamValue(Params, 'Privacy') as string;
126
+ const photos = this.getParamValue(Params, 'Photos') as MediaFile[];
127
+ const photoCaptions = this.getParamValue(Params, 'PhotoCaptions') as string[];
128
+ const coverPhotoIndex = this.getParamValue(Params, 'CoverPhotoIndex') as number || 0;
129
+ const makeAlbumPublic = this.getParamValue(Params, 'MakeAlbumPublic') !== false;
130
+
131
+ // Validate photos are images
132
+ if (photos && photos.length > 0) {
133
+ for (const photo of photos) {
134
+ if (!photo.mimeType.startsWith('image/')) {
135
+ return {
136
+ Success: false,
137
+ Message: `Only image files are allowed in albums. File ${photo.filename} is ${photo.mimeType}`,
138
+ ResultCode: 'INVALID_MEDIA'
139
+ };
140
+ }
141
+ }
142
+ }
143
+
144
+ LogStatus(`Creating album "${albumName}" on Facebook page ${pageId}...`);
145
+
146
+ // Get page access token
147
+ const pageToken = await this.getPageAccessToken(pageId);
148
+
149
+ // Create the album
150
+ const albumData: any = {
151
+ name: albumName,
152
+ privacy: {
153
+ value: privacy
154
+ }
155
+ };
156
+
157
+ if (description) {
158
+ albumData.message = description;
159
+ }
160
+
161
+ if (location) {
162
+ albumData.location = location;
163
+ }
164
+
165
+ const albumResponse = await axios.post(
166
+ `${this.apiBaseUrl}/${pageId}/albums`,
167
+ albumData,
168
+ {
169
+ params: {
170
+ access_token: pageToken
171
+ }
172
+ }
192
173
  );
193
174
 
194
- uploadedPhotos.push({
195
- id: photoId,
196
- filename: photo.filename,
197
- caption,
198
- });
175
+ const albumId = albumResponse.data.id;
176
+ LogStatus(`Album created with ID: ${albumId}`);
177
+
178
+ // Upload photos if provided
179
+ const uploadedPhotos: any[] = [];
180
+ let coverPhotoId: string | null = null;
181
+
182
+ if (photos && photos.length > 0) {
183
+ LogStatus(`Uploading ${photos.length} photos to the album...`);
184
+
185
+ for (let i = 0; i < photos.length; i++) {
186
+ const photo = photos[i];
187
+ const caption = photoCaptions?.[i] || '';
188
+
189
+ try {
190
+ const photoId = await this.uploadPhotoToAlbum(
191
+ albumId,
192
+ photo,
193
+ caption,
194
+ pageToken,
195
+ !makeAlbumPublic // Keep unpublished if album is not public yet
196
+ );
197
+
198
+ uploadedPhotos.push({
199
+ id: photoId,
200
+ filename: photo.filename,
201
+ caption
202
+ });
203
+
204
+ if (i === coverPhotoIndex) {
205
+ coverPhotoId = photoId;
206
+ }
207
+
208
+ LogStatus(`Uploaded photo ${i + 1}/${photos.length}: ${photo.filename}`);
209
+ } catch (error) {
210
+ LogError(`Failed to upload photo ${photo.filename}: ${error}`);
211
+ // Continue with other photos
212
+ }
213
+ }
214
+ }
199
215
 
200
- if (i === coverPhotoIndex) {
201
- coverPhotoId = photoId;
216
+ // Set cover photo if specified and photos were uploaded
217
+ if (coverPhotoId) {
218
+ try {
219
+ await this.setAlbumCoverPhoto(albumId, coverPhotoId, pageToken);
220
+ LogStatus(`Set cover photo for album`);
221
+ } catch (error) {
222
+ LogError(`Failed to set cover photo: ${error}`);
223
+ // Non-critical error, continue
224
+ }
202
225
  }
203
226
 
204
- LogStatus(`Uploaded photo ${i + 1}/${photos.length}: ${photo.filename}`);
205
- } catch (error) {
206
- LogError(`Failed to upload photo ${photo.filename}: ${error}`);
207
- // Continue with other photos
208
- }
209
- }
210
- }
227
+ // Get the final album details
228
+ const album = await this.getAlbumDetails(albumId, pageToken);
229
+
230
+ LogStatus(`Album "${albumName}" created successfully with ${uploadedPhotos.length} photos`);
231
+
232
+ return {
233
+ Success: true,
234
+ Message: `Album created successfully with ${uploadedPhotos.length} photos`,
235
+ ResultCode: 'SUCCESS',
236
+ Params
237
+ };
211
238
 
212
- // Set cover photo if specified and photos were uploaded
213
- if (coverPhotoId) {
214
- try {
215
- await this.setAlbumCoverPhoto(albumId, coverPhotoId, pageToken);
216
- LogStatus(`Set cover photo for album`);
217
239
  } catch (error) {
218
- LogError(`Failed to set cover photo: ${error}`);
219
- // Non-critical error, continue
240
+ LogError(`Failed to create Facebook album: ${error instanceof Error ? error.message : 'Unknown error'}`);
241
+
242
+ if (this.isAuthError(error)) {
243
+ return this.handleOAuthError(error);
244
+ }
245
+
246
+ return {
247
+ Success: false,
248
+ Message: error instanceof Error ? error.message : 'Unknown error occurred',
249
+ ResultCode: 'ERROR'
250
+ };
220
251
  }
221
- }
222
-
223
- // Get the final album details
224
- const album = await this.getAlbumDetails(albumId, pageToken);
225
-
226
- LogStatus(`Album "${albumName}" created successfully with ${uploadedPhotos.length} photos`);
227
-
228
- return {
229
- Success: true,
230
- Message: `Album created successfully with ${uploadedPhotos.length} photos`,
231
- ResultCode: 'SUCCESS',
232
- Params,
233
- };
234
- } catch (error) {
235
- LogError(`Failed to create Facebook album: ${error instanceof Error ? error.message : 'Unknown error'}`);
236
-
237
- if (this.isAuthError(error)) {
238
- return this.handleOAuthError(error);
239
- }
240
-
241
- return {
242
- Success: false,
243
- Message: error instanceof Error ? error.message : 'Unknown error occurred',
244
- ResultCode: 'ERROR',
245
- };
246
252
  }
247
- }
248
-
249
- /**
250
- * Upload a photo to an album
251
- */
252
- private async uploadPhotoToAlbum(
253
- albumId: string,
254
- photo: MediaFile,
255
- caption: string,
256
- pageToken: string,
257
- unpublished: boolean = false
258
- ): Promise<string> {
259
- const fileData = typeof photo.data === 'string' ? Buffer.from(photo.data, 'base64') : photo.data;
260
-
261
- const formData = new FormData();
262
- formData.append('source', fileData, {
263
- filename: photo.filename,
264
- contentType: photo.mimeType,
265
- });
266
-
267
- if (caption) {
268
- formData.append('message', caption);
253
+
254
+ /**
255
+ * Upload a photo to an album
256
+ */
257
+ private async uploadPhotoToAlbum(
258
+ albumId: string,
259
+ photo: MediaFile,
260
+ caption: string,
261
+ pageToken: string,
262
+ unpublished: boolean = false
263
+ ): Promise<string> {
264
+ const fileData = typeof photo.data === 'string'
265
+ ? Buffer.from(photo.data, 'base64')
266
+ : photo.data;
267
+
268
+ const formData = new FormData();
269
+ formData.append('source', fileData, {
270
+ filename: photo.filename,
271
+ contentType: photo.mimeType
272
+ });
273
+
274
+ if (caption) {
275
+ formData.append('message', caption);
276
+ }
277
+
278
+ if (unpublished) {
279
+ formData.append('published', 'false');
280
+ }
281
+
282
+ const response = await axios.post(
283
+ `${this.apiBaseUrl}/${albumId}/photos`,
284
+ formData,
285
+ {
286
+ headers: formData.getHeaders(),
287
+ params: {
288
+ access_token: pageToken
289
+ }
290
+ }
291
+ );
292
+
293
+ return response.data.id;
269
294
  }
270
295
 
271
- if (unpublished) {
272
- formData.append('published', 'false');
296
+ /**
297
+ * Set the cover photo for an album
298
+ */
299
+ private async setAlbumCoverPhoto(albumId: string, photoId: string, pageToken: string): Promise<void> {
300
+ await axios.post(
301
+ `${this.apiBaseUrl}/${albumId}`,
302
+ {
303
+ cover_photo: photoId
304
+ },
305
+ {
306
+ params: {
307
+ access_token: pageToken
308
+ }
309
+ }
310
+ );
273
311
  }
274
312
 
275
- const response = await axios.post(`${this.apiBaseUrl}/${albumId}/photos`, formData, {
276
- headers: formData.getHeaders(),
277
- params: {
278
- access_token: pageToken,
279
- },
280
- });
281
-
282
- return response.data.id;
283
- }
284
-
285
- /**
286
- * Set the cover photo for an album
287
- */
288
- private async setAlbumCoverPhoto(albumId: string, photoId: string, pageToken: string): Promise<void> {
289
- await axios.post(
290
- `${this.apiBaseUrl}/${albumId}`,
291
- {
292
- cover_photo: photoId,
293
- },
294
- {
295
- params: {
296
- access_token: pageToken,
297
- },
298
- }
299
- );
300
- }
301
-
302
- /**
303
- * Get album details
304
- */
305
- private async getAlbumDetails(albumId: string, pageToken: string): Promise<FacebookAlbum | null> {
306
- try {
307
- const response = await axios.get(`${this.apiBaseUrl}/${albumId}`, {
308
- params: {
309
- access_token: pageToken,
310
- fields: 'id,name,description,link,cover_photo,count,created_time,photos.limit(1){id,images}',
311
- },
312
- });
313
-
314
- return response.data;
315
- } catch (error) {
316
- LogError(`Failed to get album details: ${error}`);
317
- return null;
313
+ /**
314
+ * Get album details
315
+ */
316
+ private async getAlbumDetails(albumId: string, pageToken: string): Promise<FacebookAlbum | null> {
317
+ try {
318
+ const response = await axios.get(
319
+ `${this.apiBaseUrl}/${albumId}`,
320
+ {
321
+ params: {
322
+ access_token: pageToken,
323
+ fields: 'id,name,description,link,cover_photo,count,created_time,photos.limit(1){id,images}'
324
+ }
325
+ }
326
+ );
327
+
328
+ return response.data;
329
+ } catch (error) {
330
+ LogError(`Failed to get album details: ${error}`);
331
+ return null;
332
+ }
318
333
  }
319
- }
320
- }
334
+
335
+
336
+ }