@memberjunction/actions-bizapps-social
Version:
Social Media Actions for MemberJunction - Twitter, LinkedIn, Facebook, Instagram, TikTok, YouTube, HootSuite, Buffer
165 lines (147 loc) • 6.01 kB
text/typescript
import { RegisterClass } from '@memberjunction/global';
import { LinkedInBaseAction } from '../linkedin-base.action';
import { ActionParam, ActionResultSimple, RunActionParams } from '@memberjunction/actions-base';
import { LogStatus, LogError } from '@memberjunction/core';
import { SocialPost } from '../../../base/base-social.action';
import { BaseAction } from '@memberjunction/actions';
/**
* Action to get posts from a LinkedIn organization page
*/
(BaseAction, 'LinkedInGetOrganizationPostsAction')
export class LinkedInGetOrganizationPostsAction extends LinkedInBaseAction {
/**
* Get posts from a LinkedIn organization page
*/
protected async InternalRunAction(params: RunActionParams): Promise<ActionResultSimple> {
const { Params, ContextUser } = params;
try {
// Initialize OAuth
const companyIntegrationId = this.getParamValue(Params, 'CompanyIntegrationID');
if (!await this.initializeOAuth(companyIntegrationId)) {
throw new Error('Failed to initialize OAuth connection');
}
// Extract parameters
const organizationId = this.getParamValue(Params, 'OrganizationID');
const count = this.getParamValue(Params, 'Count') || 50;
const startIndex = this.getParamValue(Params, 'StartIndex') || 0;
const includeAnalytics = this.getParamValue(Params, 'IncludeAnalytics') === true;
// Determine organization URN
let organizationUrn: string;
if (!organizationId) {
// Get first admin organization if not specified
const orgs = await this.getAdminOrganizations();
if (orgs.length === 0) {
throw new Error('No organizations found. Please specify OrganizationID.');
}
organizationUrn = orgs[0].urn;
LogStatus(`Using organization: ${orgs[0].name}`);
} else {
organizationUrn = `urn:li:organization:${organizationId}`;
}
// Get posts
LogStatus(`Fetching posts for organization...`);
const shares = await this.getShares(organizationUrn, count, startIndex);
// Convert to common format
const posts: SocialPost[] = [];
for (const share of shares) {
const post = this.normalizePost(share);
// Optionally fetch analytics
if (includeAnalytics) {
try {
const analytics = await this.getPostAnalytics(share.id, organizationUrn);
post.analytics = this.normalizeAnalytics(analytics);
} catch (error) {
LogError(`Failed to get analytics for post ${share.id}: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
posts.push(post);
}
LogStatus(`Retrieved ${posts.length} posts`);
// Update output parameters
const outputParams = [...Params];
const postsParam = outputParams.find(p => p.Name === 'Posts');
if (postsParam) postsParam.Value = posts;
const totalCountParam = outputParams.find(p => p.Name === 'TotalCount');
if (totalCountParam) totalCountParam.Value = posts.length;
return {
Success: true,
ResultCode: 'SUCCESS',
Message: `Successfully retrieved ${posts.length} organization posts`,
Params: outputParams
};
} catch (error) {
const errorMessage = error instanceof Error ? error.message : 'Unknown error occurred';
return {
Success: false,
ResultCode: 'ERROR',
Message: `Failed to get organization posts: ${errorMessage}`,
Params
};
}
}
/**
* Get analytics for a specific post
*/
private async getPostAnalytics(shareId: string, organizationUrn: string): Promise<any> {
try {
const response = await this.axiosInstance.get('/organizationalEntityShareStatistics', {
params: {
q: 'organizationalEntity',
organizationalEntity: organizationUrn,
shares: `List(${shareId})`
}
});
if (response.data.elements && response.data.elements.length > 0) {
return response.data.elements[0];
}
return null;
} catch (error) {
LogError(`Failed to get post analytics: ${error instanceof Error ? error.message : 'Unknown error'}`);
return null;
}
}
/**
* Define the parameters this action expects
*/
public get Params(): ActionParam[] {
return [
...this.commonSocialParams,
{
Name: 'OrganizationID',
Type: 'Input',
Value: null
},
{
Name: 'Count',
Type: 'Input',
Value: 50
},
{
Name: 'StartIndex',
Type: 'Input',
Value: 0
},
{
Name: 'IncludeAnalytics',
Type: 'Input',
Value: false
},
{
Name: 'Posts',
Type: 'Output',
Value: null
},
{
Name: 'TotalCount',
Type: 'Output',
Value: null
}
];
}
/**
* Get action description
*/
public get Description(): string {
return 'Retrieves posts from a LinkedIn organization page with optional analytics data';
}
}