n8n/packages/nodes-base/nodes/Facebook/GenericFunctions.ts
Omar Ajoue 7ce7285f7a
Load credentials from the database (#1741)
* Changes to types so that credentials can be always loaded from DB

This first commit changes all return types from the execute functions
and calls to get credentials to be async so we can use await.

This is a first step as previously credentials were loaded in memory and
always available. We will now be loading them from the DB which requires
turning the whole call chain async.

* Fix updated files

* Removed unnecessary credential loading to improve performance

* Fix typo

*  Fix issue

* Updated new nodes to load credentials async

*  Remove not needed comment

Co-authored-by: Jan Oberhauser <jan.oberhauser@gmail.com>
2021-08-20 18:57:30 +02:00

553 lines
11 KiB
TypeScript

import {
OptionsWithUri,
} from 'request';
import {
IExecuteFunctions,
IExecuteSingleFunctions,
IHookFunctions,
ILoadOptionsFunctions,
IWebhookFunctions,
} from 'n8n-core';
import {
IDataObject, NodeApiError,
} from 'n8n-workflow';
import {
capitalCase,
} from 'change-case';
export async function facebookApiRequest(this: IHookFunctions | IExecuteFunctions | IExecuteSingleFunctions | ILoadOptionsFunctions | IWebhookFunctions, method: string, resource: string, body: any = {}, qs: IDataObject = {}, uri?: string, option: IDataObject = {}): Promise<any> { // tslint:disable-line:no-any
let credentials;
if (this.getNode().name.includes('Trigger')) {
credentials = await this.getCredentials('facebookGraphAppApi') as IDataObject;
} else {
credentials = await this.getCredentials('facebookGraphApi') as IDataObject;
}
qs.access_token = credentials!.accessToken;
const options: OptionsWithUri = {
headers: {
accept: 'application/json,text/*;q=0.99',
},
method,
qs,
body,
gzip: true,
uri: uri || `https://graph.facebook.com/v8.0${resource}`,
json: true,
};
try {
return await this.helpers.request!(options);
} catch (error) {
throw new NodeApiError(this.getNode(), error);
}
}
export function getFields(object: string) {
const data = {
'adAccount': [
{
value: 'in_process_ad_objects',
},
{
value: 'with_issues_ad_objects',
},
],
'page': [
{
value: 'affiliation',
description: `Describes changes to a page's Affliation profile field`,
},
{
value: 'attire',
description: `Describes changes to a page's Attire profile field`,
},
{
value: 'awards',
description: `Describes changes to a page's Awards profile field`,
},
{
value: 'bio',
description: `Describes changes to a page's Biography profile field`,
},
{
value: 'birthday',
description: `Describes changes to a page's Birthday profile field`,
},
{
value: 'category',
description: `Describes changes to a page's Birthday profile field`,
},
{
value: 'company_overview',
description: `Describes changes to a page's Company Overview profile field`,
},
{
value: 'culinary_team',
description: `Describes changes to a page's Culinary Team profile field`,
},
{
value: 'current_location',
description: `Describes changes to a page's Current Location profile field`,
},
{
value: 'description',
description: `Describes changes to a page's Story Description profile field`,
},
{
value: 'email',
description: `Describes changes to a page's Email profile field`,
},
{
value: 'feed',
description: `Describes nearly all changes to a Page's feed, such as Posts, shares, likes, etc`,
},
{
value: 'founded',
description: `Describes changes to a page's Founded profile field. This is different from the Start Date field`,
},
{
value: 'general_info',
description: `Describes changes to a page's General Information profile field`,
},
{
value: 'general_manager',
description: `Describes changes to a page's General Information profile field`,
},
{
value: 'hometown',
description: `Describes changes to a page's Homewtown profile field`,
},
{
value: 'hours',
description: `Describes changes to a page's Hours profile field`,
},
{
value: 'leadgen',
description: `Describes changes to a page's leadgen settings`,
},
{
value: 'live_videos',
description: `Describes changes to a page's live video status`,
},
{
value: 'location',
description: `Describes changes to a page's Location profile field`,
},
{
value: 'members',
description: `Describes changes to a page's Members profile field`,
},
{
value: 'mention',
description: `Describes new mentions of a page, including mentions in comments, posts, etc`,
},
{
value: 'merchant_review',
description: `Describes changes to a page's merchant review settings`,
},
{
value: 'mission',
description: `Describes changes to a page's Mission profile field`,
},
{
value: 'name',
description: `Describes changes to a page's Name profile field.`,
},
{
value: 'page_about_story',
},
{
value: 'page_change_proposal',
description: `Data for page change proposal.`,
},
{
value: 'page_upcoming_change',
description: `Webhooks data for page upcoming changes`,
},
{
value: 'parking',
description: `Describes changes to a page's Parking profile field`,
},
{
value: 'payment_options',
description: `Describes change to a page's Payment profile field`,
},
{
value: 'personal_info',
description: `Describes changes to a page's Personal Information profile field.`,
},
{
value: 'personal_interests',
description: `Describes changes to a page's Personal Interests profile field.`,
},
{
value: 'phone',
description: `Describes changes to a page's Phone profile field`,
},
{
value: 'picture',
description: `Describes changes to a page's profile picture`,
},
{
value: 'price_range',
description: `Describes changes to a page's Price Range profile field`,
},
{
value: 'product_review',
description: `Describes changes to a page's product review settings`,
},
{
value: 'products',
description: `Describes changes to a page's Products profile field`,
},
{
value: 'public_transit',
description: `Describes changes to a page's Public Transit profile field`,
},
{
value: 'ratings',
description: `Describes changes to a page's ratings, including new ratings or a user's comments or reactions on a rating`,
},
{
value: 'videos',
description: `Describes changes to the encoding status of a video on a page`,
},
{
value: 'website',
description: `Describes changes to a page's Website profile field`,
},
],
'application': [
{
value: 'ad_account',
},
{
value: 'ads_rules_engine',
},
{
value: 'async_requests',
},
{
value: 'async_sessions',
},
{
value: 'group_install',
},
{
value: 'oe_reseller_onboarding_request_created',
},
{
value: 'plugin_comment',
},
{
value: 'plugin_comment_reply',
},
{
value: 'plugin_comment_reply',
},
],
'certificateTransparency': [
{
value: 'certificate',
},
{
value: 'phishing',
},
],
'instagram': [
{
value: 'comments',
description: 'Notifies you when an Instagram User comments on a media object that you own',
},
{
value: 'messaging_handover',
},
{
value: 'mentions',
description: 'Notifies you when an Instagram User @mentions you in a comment or caption on a media object that you do not own',
},
{
value: 'messages',
},
{
value: 'messaging_seen',
},
{
value: 'standby',
},
{
value: 'story_insights',
},
],
'permissions': [
{
value: 'bookmarked',
description: 'Whether the user has added or removed the app bookmark',
},
{
value: 'connected',
description: 'Whether the user is connected or disconnected from the app',
},
{
value: 'user_birthday',
},
{
value: 'user_hometown',
},
{
value: 'user_location',
},
{
value: 'user_likes',
},
{
value: 'user_managed_groups',
},
{
value: 'user_events',
},
{
value: 'user_photos',
},
{
value: 'user_videos',
},
{
value: 'user_friends',
},
{
value: 'user_posts',
},
{
value: 'user_gender',
},
{
value: 'user_link',
},
{
value: 'user_age_range',
},
{
value: 'email',
},
{
value: 'read_insights',
},
{
value: 'read_page_mailboxes',
},
{
value: 'pages_show_list',
},
{
value: 'pages_manage_cta',
},
{
value: 'business_management',
},
{
value: 'pages_messaging',
},
{
value: 'pages_messaging_phone_number',
},
{
value: 'pages_messaging_subscriptions',
},
{
value: 'read_audience_network_insights',
},
{
value: 'pages_manage_instant_articles',
},
{
value: 'publish_video',
},
{
value: 'openid',
},
{
value: 'catalog_management',
},
{
value: 'gaming_user_locale',
},
{
value: 'groups_show_list',
},
{
value: 'instagram_basic',
},
{
value: 'instagram_manage_comments',
},
{
value: 'instagram_manage_insights',
},
{
value: 'instagram_content_publish',
},
{
value: 'publish_to_groups',
},
{
value: 'groups_access_member_info',
},
{
value: 'leads_retrieval',
},
{
value: 'whatsapp_business_management',
},
{
value: 'instagram_manage_messages',
},
{
value: 'attribution_read',
},
{
value: 'page_events',
},
{
value: 'ads_management',
},
{
value: 'ads_read',
},
{
value: 'pages_read_engagement',
},
{
value: 'pages_manage_metadata',
},
{
value: 'pages_read_user_content',
},
{
value: 'pages_manage_ads',
},
{
value: 'pages_manage_posts',
},
{
value: 'pages_manage_engagement',
},
{
value: 'public_search',
},
{
value: 'social_ads',
},
],
'users': [
{
value: 'about',
},
{
value: 'birthday',
},
{
value: 'books',
},
{
value: 'email',
},
{
value: 'feed',
},
{
value: 'first_name',
},
{
value: 'friends',
},
{
value: 'gender',
},
{
value: 'hometown',
},
{
value: 'last_name',
},
{
value: 'likes',
},
{
value: 'live_videos',
},
{
value: 'location',
},
{
value: 'music',
},
{
value: 'name',
},
{
value: 'photos',
},
{
value: 'pic_big_https',
},
{
value: 'pic_https',
},
{
value: 'pic_small_https',
},
{
value: 'pic_square_https',
},
{
value: 'platform',
},
{
value: 'quotes',
},
{
value: 'status',
},
{
value: 'television',
},
{
value: 'videos',
},
],
'whatsappBusinessAccount': [
{
value: 'message_template_status_update',
},
{
value: 'phone_number_name_update',
},
{
value: 'phone_number_quality_update',
},
{
value: 'account_review_update',
},
{
value: 'account_update',
},
],
// tslint:disable-next-line: no-any
} as { [key: string]: any };
return [{ name: '*', value: '*' }].concat(data[object as string] || [])
.map((fieldObject: IDataObject) =>
({ ...fieldObject, name: (fieldObject.value !== '*') ? capitalCase(fieldObject.value as string) : fieldObject.value }));
}
export function getAllFields(object: string) {
return getFields(object).filter((field: IDataObject) => field.value !== '*').map((field: IDataObject) => field.value);
}