@olastudio/social-media-sdk 0.1.3 → 0.3.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.
- package/dist/adapters/expo.d.mts +1 -1
- package/dist/adapters/expo.d.ts +1 -1
- package/dist/adapters/index.d.mts +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/{auth.types-DTXCyA56.d.mts → auth.types-Do2L11TO.d.mts} +1 -1
- package/dist/{auth.types-DTXCyA56.d.ts → auth.types-Do2L11TO.d.ts} +1 -1
- package/dist/core/index.d.mts +128 -5
- package/dist/core/index.d.ts +128 -5
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +209 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +209 -5
- package/dist/index.mjs.map +1 -1
- package/dist/{insights.types-DF2_r0L1.d.ts → insights.types-BCalhgkj.d.ts} +1 -1
- package/dist/{insights.types-5z7HJnbt.d.mts → insights.types-hLzNJATM.d.mts} +1 -1
- package/dist/providers/facebook/index.d.mts +114 -7
- package/dist/providers/facebook/index.d.ts +114 -7
- package/dist/providers/facebook/index.js +110 -5
- package/dist/providers/facebook/index.js.map +1 -1
- package/dist/providers/facebook/index.mjs +110 -5
- package/dist/providers/facebook/index.mjs.map +1 -1
- package/dist/providers/instagram/index.d.mts +102 -2
- package/dist/providers/instagram/index.d.ts +102 -2
- package/dist/providers/instagram/index.js +99 -0
- package/dist/providers/instagram/index.js.map +1 -1
- package/dist/providers/instagram/index.mjs +99 -0
- package/dist/providers/instagram/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../core/errors/BaseError.ts","../core/errors/AuthError.ts","../core/errors/APIError.ts","../core/http/HttpClient.ts","../core/constants.ts","../core/insights.constants.ts","../providers/facebook/api/FacebookAPI.ts","../providers/facebook/auth/FacebookAuth.ts","../providers/facebook/FacebookProvider.ts","../providers/facebook/types/index.ts","../providers/instagram/auth/InstagramAuth.ts","../providers/instagram/api/InstagramAPI.ts","../providers/instagram/InstagramProvider.ts","../providers/instagram/types/index.ts","../providers/tiktok/constants.ts","../providers/tiktok/api/index.ts","../providers/tiktok/auth/index.ts","../providers/tiktok/TikTokProvider.ts"],"names":["FacebookScopesBusiness","FacebookScopesUser","InstagramScopes"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Base Error - Error base para la librería\n */\n\nexport class BaseError extends Error {\n public code?: string | number;\n public statusCode?: number;\n public details?: any;\n\n constructor(message: string, code?: string | number, details?: any) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.details = details;\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n\n","/**\n * Auth Error - Authentication errors\n */\n\nimport { BaseError } from './BaseError';\n\nexport class AuthError extends BaseError {\n constructor(message: string, code?: string | number, details?: any) {\n super(message, code, details);\n this.name = 'AuthError';\n }\n}\n\n\n","/**\n * API Error - Errores de API\n */\n\nimport { BaseError } from './BaseError';\n\nexport class APIError extends BaseError {\n constructor(\n message: string,\n statusCode?: number,\n code?: string | number,\n details?: any\n ) {\n super(message, code, details);\n this.name = 'APIError';\n this.statusCode = statusCode;\n }\n}\n\n\n","/**\n * HTTP Client - Generic HTTP client for all APIs\n */\n\nimport { APIClient, HttpClientConfig, RequestOptions } from '../types';\nimport { APIError } from '../errors';\n\nexport class HttpClient implements APIClient {\n private config: HttpClientConfig;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n timeout: 30000, // 30 seconds default\n headers: {\n 'Content-Type': 'application/json',\n },\n ...config,\n };\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n const url = this.buildURL(endpoint, options.params);\n const method = options.method || 'GET';\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n ...options.headers,\n };\n\n // Add token if exists\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const config: RequestInit = {\n method,\n headers,\n signal: this.createAbortSignal(options.timeout || this.config.timeout),\n };\n\n // Add body if exists (not for GET)\n if (options.body && method !== 'GET') {\n if (headers['Content-Type'] === 'application/json') {\n config.body = JSON.stringify(options.body);\n } else if (\n headers['Content-Type'] === 'application/x-www-form-urlencoded'\n ) {\n config.body = this.encodeFormBody(options.body);\n } else {\n config.body = options.body;\n }\n }\n\n try {\n const response = await fetch(url, config);\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n 'NETWORK_ERROR',\n error\n );\n }\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Build URL with query params\n */\n private buildURL(endpoint: string, params?: Record<string, any>): string {\n const url = endpoint.startsWith('http')\n ? endpoint\n : `${this.config.baseURL}${endpoint}`;\n\n if (!params || Object.keys(params).length === 0) {\n return url;\n }\n\n const queryString = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n\n return queryString ? `${url}?${queryString}` : url;\n }\n\n /**\n * Encode body as form-urlencoded\n */\n private encodeFormBody(body: Record<string, any>): string {\n return Object.entries(body)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n }\n\n /**\n * Create AbortSignal for timeout\n */\n private createAbortSignal(timeout?: number): AbortSignal | undefined {\n if (!timeout) return undefined;\n\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n return controller.signal;\n }\n\n /**\n * Handle HTTP response\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n // Try to parse as JSON\n let data: any;\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n\n // If response is not successful, throw error\n if (!response.ok) {\n const errorMessage =\n data?.error?.message || data?.message || 'API request failed';\n const errorCode = data?.error?.code || data?.code || response.status;\n\n throw new APIError(errorMessage, response.status, errorCode, data);\n }\n\n return data as T;\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.config.accessToken = token;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HttpClientConfig {\n return { ...this.config };\n }\n}\n\n\n","/**\n * Constants - SDK global constants\n */\n\n/**\n * Facebook & Instagram Graph API Version\n * IMPORTANT: Do not change this version unless you have tested all functionality\n * Different API versions may have different response structures\n * \n * @see https://developers.facebook.com/docs/graph-api/changelog\n */\nexport const FACEBOOK_GRAPH_API_VERSION = 'v24.0' as const;\n\n/**\n * Facebook Graph API Base URL\n */\nexport const FACEBOOK_GRAPH_API_BASE_URL = `https://graph.facebook.com/${FACEBOOK_GRAPH_API_VERSION}` as const;\n\n/**\n * Facebook OAuth Authorization Endpoint\n */\nexport const FACEBOOK_OAUTH_AUTHORIZATION_URL = `https://www.facebook.com/${FACEBOOK_GRAPH_API_VERSION}/dialog/oauth` as const;\n\n","/**\n * Insights Constants - Metrics available for Facebook/Instagram APIs\n * Updated for Graph API v24.0 (includes Nov 2025 changes)\n * \n * @see https://developers.facebook.com/docs/insights/guides\n */\n\n// ============= Page Insights Metrics =============\n\n/**\n * Facebook Page metrics (lifetime)\n * Note: 'page_fans' deprecated Nov 2025, use 'followers_count' field instead\n */\nexport const PAGE_METRICS_LIFETIME = [\n 'page_fans_country',\n 'page_fans_city',\n 'page_fans_gender_age',\n] as const;\n\n/**\n * Facebook Page metrics (day/week/days_28)\n * Note: 'page_impressions' deprecated Nov 2025, use 'page_views' instead\n */\nexport const PAGE_METRICS_PERIODIC = [\n 'page_views_total',\n 'page_views',\n 'page_post_engagements',\n 'page_fans_online',\n 'page_fans_online_per_day',\n 'page_video_views',\n 'page_daily_follows',\n 'page_daily_unfollows',\n] as const;\n\n// ============= Post Insights Metrics =============\n\n/**\n * Post metrics (lifetime only)\n * Note: 'post_impressions' deprecated, use 'post_views' equivalents\n */\nexport const POST_METRICS = [\n 'post_engaged_users',\n 'post_negative_feedback',\n 'post_engaged_fan',\n 'post_clicks',\n 'post_clicks_unique',\n 'post_reactions_by_type_total',\n] as const;\n\n// ============= Video Insights Metrics =============\n\n/**\n * Video metrics (lifetime)\n * Note: 'video_views' deprecated Apr 2024, use 'total_video_views'\n */\nexport const VIDEO_METRICS = [\n 'total_video_views',\n 'total_video_views_unique',\n 'total_video_views_autoplayed',\n 'total_video_views_clicked_to_play',\n 'total_video_views_organic',\n 'total_video_views_organic_unique',\n 'total_video_views_paid',\n 'total_video_views_paid_unique',\n 'total_video_avg_time_watched',\n 'total_video_view_total_time',\n 'total_video_complete_views',\n 'total_video_complete_views_unique',\n 'total_video_complete_views_organic',\n 'total_video_complete_views_organic_unique',\n 'total_video_complete_views_paid',\n 'total_video_complete_views_paid_unique',\n] as const;\n\n// ============= Reels Insights Metrics =============\n\n/**\n * Facebook Reels metrics (added Dec 2024)\n * Available via Video Insights API\n */\nexport const REELS_METRICS = [\n 'blue_reels_play_count',\n 'post_video_avg_time_watched',\n 'post_video_views',\n 'post_video_social_actions',\n] as const;\n\n/**\n * Extended Reels metrics for detailed analysis\n */\nexport const REELS_METRICS_EXTENDED = [\n 'plays',\n 'comments',\n 'likes',\n 'shares',\n 'reach',\n 'total_plays',\n 'average_minutes_viewed',\n 'minutes_viewed',\n] as const;\n\n// ============= Photo Insights Metrics =============\n\n/**\n * Photo metrics (lifetime only)\n */\nexport const PHOTO_METRICS = [\n 'photo_views',\n 'photo_reach',\n 'engaged_users',\n] as const;\n\n// ============= Instagram Account Metrics =============\n\n/**\n * Instagram account metrics (day/week/days_28)\n * Note: 'impressions' deprecated Apr 2025, use 'views'\n */\nexport const INSTAGRAM_ACCOUNT_METRICS = [\n 'views',\n 'reach',\n 'accounts_engaged',\n 'total_interactions',\n 'likes',\n 'comments',\n 'shares',\n 'saves',\n 'follows_and_unfollows',\n 'profile_links_taps',\n 'profile_views',\n] as const;\n\n/**\n * Instagram account metrics - Demographics\n */\nexport const INSTAGRAM_DEMOGRAPHICS_METRICS = [\n 'follower_demographics',\n 'reached_audience_demographics',\n 'engaged_audience_demographics',\n] as const;\n\n// ============= Instagram Media Metrics =============\n\n/**\n * Instagram media metrics (all types)\n */\nexport const INSTAGRAM_MEDIA_METRICS_COMMON = [\n 'views',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Reels specific metrics\n */\nexport const INSTAGRAM_REELS_METRICS = [\n 'plays',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Stories specific metrics\n */\nexport const INSTAGRAM_STORIES_METRICS = [\n 'exits',\n 'replies',\n 'taps_forward',\n 'taps_back',\n 'views',\n 'reach',\n] as const;\n\n// ============= Insights Periods =============\n\nexport const INSIGHTS_PERIODS = {\n DAY: 'day',\n WEEK: 'week',\n DAYS_28: 'days_28',\n MONTH: 'month',\n LIFETIME: 'lifetime',\n} as const;\n\nexport type InsightsPeriod = typeof INSIGHTS_PERIODS[keyof typeof INSIGHTS_PERIODS];\n\n// ============= Helper - Preset Metric Groups =============\n\n/**\n * Common metric presets for quick access\n */\nexport const METRIC_PRESETS = {\n // Facebook Page quick overview\n PAGE_OVERVIEW: ['page_views_total', 'page_post_engagements', 'page_video_views'],\n \n // Facebook Video performance\n VIDEO_PERFORMANCE: ['total_video_views', 'total_video_avg_time_watched', 'total_video_complete_views'],\n \n // Facebook Reels performance\n REELS_PERFORMANCE: ['blue_reels_play_count', 'post_video_avg_time_watched', 'post_video_social_actions'],\n \n // Instagram account overview\n INSTAGRAM_OVERVIEW: ['views', 'reach', 'accounts_engaged', 'total_interactions'],\n \n // Instagram content engagement\n INSTAGRAM_ENGAGEMENT: ['likes', 'comments', 'shares', 'saves'],\n} as const;\n","/**\n * Facebook API - Facebook API Client\n */\n\nimport { FACEBOOK_GRAPH_API_BASE_URL, FACEBOOK_GRAPH_API_VERSION } from '../../../core/constants';\nimport { APIError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport { APIClient, RequestOptions } from '../../../core/types';\nimport {\n FacebookConfig,\n FacebookPage,\n FacebookPagesResponse,\n FacebookPostResponse,\n FacebookPublishPostParams,\n} from '../types';\nimport {\n InsightsResponse,\n VideoInsights,\n ReelsInsights,\n PostInsights,\n PhotoInsights,\n PageOverview,\n} from '../../../core/types/insights.types';\nimport {\n VIDEO_METRICS,\n REELS_METRICS,\n POST_METRICS,\n PHOTO_METRICS,\n METRIC_PRESETS,\n} from '../../../core/insights.constants';\n\nexport class FacebookAPI implements APIClient {\n private httpClient: HttpClient;\n private config: FacebookConfig;\n private accessToken?: string;\n\n constructor(config: FacebookConfig, accessToken?: string) {\n this.config = config;\n this.accessToken = accessToken;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n accessToken: this.accessToken,\n });\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n // Add access token to params if exists\n if (this.accessToken && !options.params?.access_token) {\n options.params = {\n ...options.params,\n access_token: this.accessToken,\n };\n }\n\n return this.httpClient.request<T>(endpoint, options);\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n this.httpClient.setAccessToken(token);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.accessToken;\n }\n\n // ============= Facebook-specific methods =============\n\n /**\n * Get user's pages\n */\n async getPages(userAccessToken?: string): Promise<FacebookPage[]> {\n try {\n const token = userAccessToken || this.accessToken;\n if (!token) {\n throw new APIError('Access token is required', 401, 'NO_TOKEN');\n }\n\n const response = await this.get<FacebookPagesResponse>('/me/accounts', {\n fields: 'id,name,access_token,picture',\n access_token: token,\n });\n\n return response.data;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Facebook pages: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGES_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Publish post to Facebook page\n */\n async publishPost(\n params: FacebookPublishPostParams\n ): Promise<FacebookPostResponse> {\n const { pageId, pageAccessToken, message, imageUrl, scheduledPublishTime } =\n params;\n\n try {\n let endpoint = `/${pageId}/`;\n const body: any = {\n access_token: pageAccessToken,\n };\n\n // If scheduled, mark as unpublished\n if (scheduledPublishTime) {\n body.published = false;\n body.scheduled_publish_time = scheduledPublishTime;\n }\n\n // Post with photo\n if (imageUrl) {\n endpoint += 'photos';\n body.url = imageUrl;\n if (message) body.caption = message;\n }\n // Text-only post\n else if (message) {\n endpoint += 'feed';\n body.message = message;\n } else {\n throw new APIError(\n 'Either message or imageUrl must be provided',\n 400,\n 'INVALID_PARAMS'\n );\n }\n\n const response = await this.request<FacebookPostResponse>(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body,\n });\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to publish post: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_PUBLISH_ERROR',\n error\n );\n }\n }\n\n /**\n * Delete Facebook post\n */\n async deletePost(postId: string, pageAccessToken: string): Promise<boolean> {\n try {\n const response = await this.delete<{ success: boolean }>(\n `/${postId}?access_token=${pageAccessToken}`\n );\n\n return response.success === true;\n } catch (error) {\n throw new APIError(\n `Failed to delete post: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_DELETE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page information\n */\n async getPage(pageId: string, fields?: string[]): Promise<FacebookPage> {\n try {\n const fieldsParam = fields?.join(',') || 'id,name,access_token,picture';\n\n return await this.get<FacebookPage>(`/${pageId}`, {\n fields: fieldsParam,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page info: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Debug/validate a Facebook access token\n * Uses Facebook's debug_token endpoint\n *\n * @param inputToken - The token to validate\n * @param appAccessToken - App token (app_id|app_secret)\n * @returns Token debug information\n */\n async debugToken(\n inputToken: string,\n appAccessToken: string\n ): Promise<{\n data: {\n is_valid: boolean;\n expires_at?: number;\n scopes?: string[];\n error?: { message: string; code: number };\n };\n }> {\n try {\n return await this.get('/debug_token', {\n input_token: inputToken,\n access_token: appAccessToken,\n });\n } catch (error) {\n throw new APIError(\n `Failed to debug token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'TOKEN_DEBUG_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page insights/analytics\n * @param pageId - Facebook Page ID\n * @param options - Insights options\n * @returns Page insights data\n */\n async getPageInsights(\n pageId: string,\n options: {\n metric: string[];\n period?: 'day' | 'week' | 'days_28' | 'month' | 'lifetime';\n since?: number;\n until?: number;\n }\n ): Promise<{\n data: Array<{\n name: string;\n period: string;\n values: Array<{ value: number; end_time?: string }>;\n title?: string;\n description?: string;\n }>;\n }> {\n try {\n const params: Record<string, any> = {\n metric: options.metric.join(','),\n period: options.period || 'day',\n };\n\n if (options.since) params.since = options.since;\n if (options.until) params.until = options.until;\n\n const response = await this.get<{\n data: Array<{\n name: string;\n period: string;\n values: Array<{ value: number; end_time?: string }>;\n title?: string;\n description?: string;\n }>;\n }>(`/${pageId}/insights`, params);\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch page insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'INSIGHTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page fans count (total followers)\n * @param pageId - Facebook Page ID\n * @returns Page with fan count\n */\n async getPageFansCount(pageId: string): Promise<{ id: string; fan_count: number }> {\n try {\n return await this.get<{ id: string; fan_count: number }>(`/${pageId}`, {\n fields: 'id,fan_count',\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page fans count: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'FANS_COUNT_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page overview with key metrics\n * @param pageId - Facebook Page ID\n * @returns Page overview data\n */\n async getPageOverview(pageId: string): Promise<PageOverview> {\n try {\n const response = await this.get<{\n id: string;\n name: string;\n followers_count?: number;\n fan_count?: number;\n }>(`/${pageId}`, {\n fields: 'id,name,followers_count,fan_count',\n });\n\n return {\n id: response.id,\n name: response.name,\n followers_count: response.followers_count || response.fan_count || 0,\n fan_count: response.fan_count,\n };\n } catch (error) {\n throw new APIError(\n `Failed to fetch page overview: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_OVERVIEW_ERROR',\n error\n );\n }\n }\n\n // ============= Video Insights Methods =============\n\n /**\n * Get video insights\n * @param videoId - Facebook Video ID\n * @param metrics - Specific metrics to fetch (defaults to common metrics)\n * @returns Video insights data\n */\n async getVideoInsights(\n videoId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || METRIC_PRESETS.VIDEO_PERFORMANCE;\n\n const response = await this.get<InsightsResponse>(\n `/${videoId}/video_insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch video insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'VIDEO_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get video insights with parsed values\n * @param videoId - Facebook Video ID\n * @returns Parsed video insights\n */\n async getVideoInsightsParsed(videoId: string): Promise<VideoInsights> {\n try {\n const response = await this.getVideoInsights(videoId, [...VIDEO_METRICS.slice(0, 8)]);\n\n const insights: VideoInsights = { id: videoId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'total_video_views':\n insights.total_views = value;\n break;\n case 'total_video_views_unique':\n insights.unique_views = value;\n break;\n case 'total_video_avg_time_watched':\n insights.avg_time_watched = value;\n break;\n case 'total_video_complete_views':\n insights.complete_views = value;\n break;\n case 'total_video_views_organic':\n insights.organic_views = value;\n break;\n case 'total_video_views_paid':\n insights.paid_views = value;\n break;\n case 'total_video_view_total_time':\n insights.total_time_watched = value;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed video insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'VIDEO_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page videos with basic info\n * @param pageId - Facebook Page ID\n * @param limit - Number of videos to fetch\n * @returns List of videos\n */\n async getPageVideos(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; title?: string; description?: string; created_time: string; length?: number }> }> {\n try {\n return await this.get(`/${pageId}/videos`, {\n fields: 'id,title,description,created_time,length',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page videos: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_VIDEOS_ERROR',\n error\n );\n }\n }\n\n // ============= Reels Insights Methods =============\n\n /**\n * Get reels insights\n * @param reelId - Facebook Reel ID\n * @param metrics - Specific metrics to fetch\n * @returns Reels insights data\n */\n async getReelsInsights(\n reelId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || METRIC_PRESETS.REELS_PERFORMANCE;\n\n const response = await this.get<InsightsResponse>(\n `/${reelId}/video_insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch reels insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'REELS_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get reels insights with parsed values\n * @param reelId - Facebook Reel ID\n * @returns Parsed reels insights\n */\n async getReelsInsightsParsed(reelId: string): Promise<ReelsInsights> {\n try {\n const response = await this.getReelsInsights(reelId, [...REELS_METRICS]);\n\n const insights: ReelsInsights = { id: reelId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'blue_reels_play_count':\n insights.plays = value;\n break;\n case 'post_video_avg_time_watched':\n insights.avg_time_watched = value;\n break;\n case 'post_video_views':\n insights.total_plays = value;\n break;\n }\n }\n\n // Get engagement metrics from post insights\n try {\n const postResponse = await this.get<{\n reactions?: { summary: { total_count: number } };\n comments?: { summary: { total_count: number } };\n shares?: { count: number };\n }>(`/${reelId}`, {\n fields: 'reactions.summary(true),comments.summary(true),shares',\n });\n\n insights.likes = postResponse.reactions?.summary?.total_count;\n insights.comments = postResponse.comments?.summary?.total_count;\n insights.shares = postResponse.shares?.count;\n } catch {\n // Engagement metrics optional\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed reels insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'REELS_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page reels\n * @param pageId - Facebook Page ID\n * @param limit - Number of reels to fetch\n * @returns List of reels\n */\n async getPageReels(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; description?: string; created_time: string }> }> {\n try {\n return await this.get(`/${pageId}/video_reels`, {\n fields: 'id,description,created_time',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page reels: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_REELS_ERROR',\n error\n );\n }\n }\n\n // ============= Post Insights Methods =============\n\n /**\n * Get post insights\n * @param postId - Facebook Post ID\n * @param metrics - Specific metrics to fetch\n * @returns Post insights data\n */\n async getPostInsights(\n postId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || [...POST_METRICS];\n\n const response = await this.get<InsightsResponse>(\n `/${postId}/insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch post insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get post insights with parsed values\n * @param postId - Facebook Post ID\n * @returns Parsed post insights\n */\n async getPostInsightsParsed(postId: string): Promise<PostInsights> {\n try {\n const response = await this.getPostInsights(postId);\n\n const insights: PostInsights = { id: postId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n\n switch (item.name) {\n case 'post_engaged_users':\n if (typeof value === 'number') insights.engaged_users = value;\n break;\n case 'post_clicks':\n if (typeof value === 'number') insights.clicks = value;\n break;\n case 'post_negative_feedback':\n if (typeof value === 'number') insights.negative_feedback = value;\n break;\n case 'post_reactions_by_type_total':\n if (typeof value === 'object') insights.reactions_by_type = value as Record<string, number>;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed post insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page posts/feed\n * @param pageId - Facebook Page ID\n * @param limit - Number of posts to fetch\n * @returns List of posts\n */\n async getPagePosts(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; message?: string; created_time: string; type?: string }> }> {\n try {\n return await this.get(`/${pageId}/feed`, {\n fields: 'id,message,created_time,type',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page posts: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_POSTS_ERROR',\n error\n );\n }\n }\n\n // ============= Photo Insights Methods =============\n\n /**\n * Get photo insights\n * @param photoId - Facebook Photo ID\n * @param metrics - Specific metrics to fetch\n * @returns Photo insights data\n */\n async getPhotoInsights(\n photoId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || [...PHOTO_METRICS];\n\n const response = await this.get<InsightsResponse>(\n `/${photoId}/insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch photo insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PHOTO_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get photo insights with parsed values\n * @param photoId - Facebook Photo ID\n * @returns Parsed photo insights\n */\n async getPhotoInsightsParsed(photoId: string): Promise<PhotoInsights> {\n try {\n const response = await this.getPhotoInsights(photoId);\n\n const insights: PhotoInsights = { id: photoId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'photo_views':\n insights.views = value;\n break;\n case 'photo_reach':\n insights.reach = value;\n break;\n case 'engaged_users':\n insights.engaged_users = value;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed photo insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PHOTO_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page photos\n * @param pageId - Facebook Page ID\n * @param limit - Number of photos to fetch\n * @returns List of photos\n */\n async getPagePhotos(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; name?: string; created_time: string }> }> {\n try {\n return await this.get(`/${pageId}/photos`, {\n fields: 'id,name,created_time',\n type: 'uploaded',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page photos: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_PHOTOS_ERROR',\n error\n );\n }\n }\n\n // ============= Batch/Helper Methods =============\n\n /**\n * Get quick insights summary for a page\n * Combines key metrics in a single call\n * @param pageId - Facebook Page ID\n * @param period - Period for time-based metrics\n * @returns Summary of page insights\n */\n async getPageInsightsSummary(\n pageId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<{\n overview: PageOverview;\n engagement: { views?: number; post_engagements?: number; video_views?: number };\n }> {\n try {\n // Get page overview\n const overview = await this.getPageOverview(pageId);\n\n // Get key metrics\n const insightsResponse = await this.getPageInsights(pageId, {\n metric: [...METRIC_PRESETS.PAGE_OVERVIEW],\n period,\n });\n\n const engagement: { views?: number; post_engagements?: number; video_views?: number } = {};\n\n for (const item of insightsResponse.data) {\n const values = item.values || [];\n const total = values.reduce((sum, v) => sum + (typeof v.value === 'number' ? v.value : 0), 0);\n\n switch (item.name) {\n case 'page_views_total':\n engagement.views = total;\n break;\n case 'page_post_engagements':\n engagement.post_engagements = total;\n break;\n case 'page_video_views':\n engagement.video_views = total;\n break;\n }\n }\n\n return { overview, engagement };\n } catch (error) {\n throw new APIError(\n `Failed to fetch page insights summary: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_SUMMARY_ERROR',\n error\n );\n }\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n}\n\n\n","/**\n * Facebook Auth - Facebook Authentication\n */\n\nimport {\n FACEBOOK_GRAPH_API_BASE_URL,\n FACEBOOK_GRAPH_API_VERSION,\n FACEBOOK_OAUTH_AUTHORIZATION_URL,\n} from '../../../core/constants';\nimport { AuthError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport { AuthProvider, AuthResult, UserProfile } from '../../../core/types';\nimport {\n FacebookConfig,\n FacebookExchangeTokenParams,\n FacebookTokenResponse,\n FacebookUserProfile,\n} from '../types';\n\nexport class FacebookAuth implements AuthProvider {\n private httpClient: HttpClient;\n private config: FacebookConfig;\n\n constructor(config: FacebookConfig) {\n this.config = config;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n });\n }\n\n /**\n * Exchange Facebook token for session\n * In Expo + Supabase, this is handled in the app\n * This function only validates and gets profile info\n */\n async exchangeToken(facebookToken: string): Promise<AuthResult> {\n try {\n const profile = await this.getProfile(facebookToken);\n\n return {\n accessToken: facebookToken,\n user: profile,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to exchange Facebook token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'TOKEN_EXCHANGE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Facebook user profile\n */\n async getProfile(accessToken: string): Promise<UserProfile> {\n try {\n const profile = await this.httpClient.get<FacebookUserProfile>('/me', {\n fields: 'id,name,email,picture',\n access_token: accessToken,\n });\n\n return {\n id: profile.id,\n name: profile.name,\n email: profile.email,\n picture: profile.picture?.data?.url,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to fetch Facebook profile: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'PROFILE_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Exchange short-lived token for long-lived token\n */\n async exchangeForLongLivedToken(\n params: FacebookExchangeTokenParams\n ): Promise<string> {\n try {\n const response = await this.httpClient.get<FacebookTokenResponse>(\n '/oauth/access_token',\n {\n grant_type: 'fb_exchange_token',\n client_id: params.appId,\n client_secret: params.appSecret,\n fb_exchange_token: params.shortLivedToken,\n }\n );\n\n return response.access_token;\n } catch (error) {\n throw new AuthError(\n `Failed to exchange for long-lived token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'LONG_LIVED_TOKEN_ERROR',\n error\n );\n }\n }\n\n /**\n * Get OAuth configuration for Facebook\n */\n getOAuthConfig(scopes: string[], redirectUri: string) {\n return {\n authorizationEndpoint: FACEBOOK_OAUTH_AUTHORIZATION_URL,\n tokenEndpoint: `${FACEBOOK_GRAPH_API_BASE_URL}/oauth/access_token`,\n clientId: this.config.appId,\n clientSecret: this.config.appSecret,\n redirectUri,\n scopes,\n responseType: 'token' as const,\n extraParams: {\n display: 'popup',\n },\n };\n }\n\n /**\n * Get authorization URL\n */\n getAuthorizationUrl(scopes: string[], redirectUri: string, state?: string) {\n const params = new URLSearchParams({\n client_id: this.config.appId,\n redirect_uri: redirectUri,\n scope: scopes.join(','),\n response_type: 'token',\n display: 'popup',\n ...(state && { state }),\n });\n\n return `${FACEBOOK_OAUTH_AUTHORIZATION_URL}?${params.toString()}`;\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n}\n\n\n","/**\n * Facebook Provider - Main Facebook provider\n */\n\nimport { FacebookAPI } from './api';\nimport { FacebookAuth } from './auth';\nimport { FacebookConfig } from './types';\n\n/**\n * Facebook provider that encapsulates Auth and API\n */\nexport class FacebookProvider {\n public readonly name = 'facebook' as const;\n public auth: FacebookAuth;\n public api: FacebookAPI;\n public config: FacebookConfig;\n\n constructor(config: FacebookConfig) {\n this.config = config;\n this.auth = new FacebookAuth(config);\n this.api = new FacebookAPI(config);\n }\n\n /**\n * Create new API instance with access token\n */\n createAPIClient(accessToken: string): FacebookAPI {\n return new FacebookAPI(this.config, accessToken);\n }\n\n /**\n * Update access token of existing API client\n */\n setAccessToken(accessToken: string) {\n this.api.setAccessToken(accessToken);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.api.getAccessToken();\n }\n}\n\n","/**\n * Facebook Types - Facebook-specific types\n */\n\nimport { UserProfile } from '../../../core/types';\n\n/**\n * Facebook provider configuration\n * Note: apiVersion is fixed to v24.0 to ensure API compatibility\n */\nexport interface FacebookConfig {\n appId: string;\n appSecret?: string;\n redirectUri?: string;\n}\n\n/**\n * Facebook Scopes (Business Permissions)\n */\nexport enum FacebookScopesBusiness {\n PUBLIC_PROFILE = 'public_profile',\n EMAIL = 'email',\n PAGES_SHOW_LIST = 'pages_show_list',\n PAGES_READ_ENGAGEMENT = 'pages_read_engagement',\n PAGES_MANAGE_POSTS = 'pages_manage_posts',\n ADS_MANAGEMENT = 'ads_management',\n ADS_READ = 'ads_read',\n BUSINESS_MANAGEMENT = 'business_management',\n CATALOG_MANAGEMENT = 'catalog_management',\n COMMERCE_ACCOUNT_MANAGE_ORDERS = 'commerce_account_manage_orders',\n COMMERCE_ACCOUNT_READ_ORDERS = 'commerce_account_read_orders',\n COMMERCE_ACCOUNT_READ_REPORTS = 'commerce_account_read_reports',\n COMMERCE_ACCOUNT_READ_SETTINGS = 'commerce_account_read_settings',\n COMMERCE_MANAGE_ACCOUNTS = 'commerce_manage_accounts',\n INSTAGRAM_BASIC = 'instagram_basic',\n INSTAGRAM_CONTENT_PUBLISH = 'instagram_content_publish',\n INSTAGRAM_MANAGE_COMMENTS = 'instagram_manage_comments',\n INSTAGRAM_MANAGE_INSIGHTS = 'instagram_manage_insights',\n INSTAGRAM_MANAGE_MESSAGES = 'instagram_manage_messages',\n INSTAGRAM_SHOPPING_TAG_PRODUCTS = 'instagram_shopping_tag_products',\n LEADS_RETRIEVAL = 'leads_retrieval',\n MANAGE_APP_SOLUTIONS = 'manage_app_solutions',\n MANAGE_FUNDRAISERS = 'manage_fundraisers',\n PAGES_MANAGE_CTA = 'pages_manage_cta',\n PAGE_EVENTS = 'page_events',\n PAGES_MANAGE_ADS = 'pages_manage_ads',\n PAGES_MANAGE_ENGAGEMENT = 'pages_manage_engagement',\n PAGES_MANAGE_INSTANT_ARTICLES = 'pages_manage_instant_articles',\n PAGES_MANAGE_METADATA = 'pages_manage_metadata',\n PAGES_MESSAGING = 'pages_messaging',\n PAGES_READ_USER_CONTENT = 'pages_read_user_content',\n PRIVATE_COMPUTATION_ACCESS = 'private_computation_access',\n PUBLISH_VIDEO = 'publish_video',\n READ_INSIGHTS = 'read_insights',\n READ_AUDIENCE_NETWORK_INSIGHTS = 'read_audience_network_insights',\n WHATSAPP_BUSINESS_MANAGEMENT = 'whatsapp_business_management',\n WHATSAPP_BUSINESS_MESSAGING = 'whatsapp_business_messaging',\n}\n\n/**\n * Facebook Scopes (User Permissions)\n */\nexport enum FacebookScopesUser {\n PUBLIC_PROFILE = 'public_profile',\n EMAIL = 'email',\n USER_FRIENDS = 'user_friends',\n}\n\n/**\n * Facebook Page\n */\nexport interface FacebookPage {\n id: string;\n name: string;\n access_token: string;\n picture?: {\n data: {\n url: string;\n };\n };\n}\n\n/**\n * Facebook user profile\n */\nexport interface FacebookUserProfile extends UserProfile {\n id: string;\n name: string;\n email?: string;\n picture?: {\n data: {\n url: string;\n };\n };\n}\n\n/**\n * Facebook pages response\n */\nexport interface FacebookPagesResponse {\n data: FacebookPage[];\n paging?: {\n cursors: {\n before: string;\n after: string;\n };\n next?: string;\n previous?: string;\n };\n}\n\n/**\n * Facebook post response\n */\nexport interface FacebookPostResponse {\n id: string;\n post_id?: string;\n}\n\n/**\n * Parameters for publishing to Facebook\n */\nexport interface FacebookPublishPostParams {\n pageId: string;\n pageAccessToken: string;\n message?: string;\n imageUrl?: string;\n scheduledPublishTime?: number; // Unix timestamp\n}\n\n/**\n * Parameters for token exchange\n */\nexport interface FacebookExchangeTokenParams {\n shortLivedToken: string;\n appId: string;\n appSecret: string;\n}\n\n/**\n * Token exchange response\n */\nexport interface FacebookTokenResponse {\n access_token: string;\n token_type?: string;\n expires_in?: number;\n}\n\n/**\n * Facebook error\n */\nexport interface FacebookErrorResponse {\n error: {\n message: string;\n type: string;\n code: number;\n fbtrace_id: string;\n };\n}\n\n\n","/**\n * Instagram Auth - Instagram Authentication\n * Instagram uses Facebook Graph API, so authentication is similar\n */\n\nimport {\n FACEBOOK_GRAPH_API_BASE_URL,\n FACEBOOK_GRAPH_API_VERSION,\n FACEBOOK_OAUTH_AUTHORIZATION_URL,\n} from '../../../core/constants';\nimport { AuthError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport { AuthProvider, AuthResult, UserProfile } from '../../../core/types';\nimport { InstagramConfig, InstagramProfile } from '../types';\n\nexport class InstagramAuth implements AuthProvider {\n private httpClient: HttpClient;\n private config: InstagramConfig;\n\n constructor(config: InstagramConfig) {\n this.config = config;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n });\n }\n\n /**\n * Exchange Instagram/Facebook token for session\n */\n async exchangeToken(instagramToken: string): Promise<AuthResult> {\n try {\n const profile = await this.getProfile(instagramToken);\n\n return {\n accessToken: instagramToken,\n user: profile,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to exchange Instagram token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'TOKEN_EXCHANGE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Instagram user profile\n * First gets Facebook profile, then Instagram Business profile\n */\n async getProfile(accessToken: string): Promise<UserProfile> {\n try {\n // Get Instagram accounts connected to Facebook page\n const response = await this.httpClient.get<any>('/me/accounts', {\n fields: 'instagram_business_account',\n access_token: accessToken,\n });\n\n if (!response.data || response.data.length === 0) {\n throw new AuthError(\n 'No Instagram business account found',\n 'NO_INSTAGRAM_ACCOUNT'\n );\n }\n\n // Get first Instagram account\n const instagramAccountId =\n response.data[0]?.instagram_business_account?.id;\n\n if (!instagramAccountId) {\n throw new AuthError(\n 'No Instagram business account ID found',\n 'NO_INSTAGRAM_ACCOUNT_ID'\n );\n }\n\n // Get Instagram profile data\n const profile = await this.httpClient.get<InstagramProfile>(\n `/${instagramAccountId}`,\n {\n fields: 'id,username,name,account_type,profile_picture_url',\n access_token: accessToken,\n }\n );\n\n return {\n id: profile.id,\n name: profile.name || profile.username,\n username: profile.username,\n picture: profile.profile_picture_url,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to fetch Instagram profile: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'PROFILE_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get OAuth configuration for Instagram\n * Instagram uses the same OAuth flow as Facebook\n */\n getOAuthConfig(scopes: string[], redirectUri: string) {\n return {\n authorizationEndpoint: FACEBOOK_OAUTH_AUTHORIZATION_URL,\n tokenEndpoint: `${FACEBOOK_GRAPH_API_BASE_URL}/oauth/access_token`,\n clientId: this.config.appId,\n clientSecret: this.config.appSecret,\n redirectUri,\n scopes,\n responseType: 'token' as const,\n extraParams: {\n display: 'popup',\n },\n };\n }\n\n /**\n * Get authorization URL\n */\n getAuthorizationUrl(scopes: string[], redirectUri: string, state?: string) {\n const params = new URLSearchParams({\n client_id: this.config.appId,\n redirect_uri: redirectUri,\n scope: scopes.join(','),\n response_type: 'token',\n display: 'popup',\n ...(state && { state }),\n });\n\n return `${FACEBOOK_OAUTH_AUTHORIZATION_URL}?${params.toString()}`;\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n}\n\n\n","/**\n * Instagram API - Instagram API Client\n * Uses Instagram Graph API (part of Facebook Graph API)\n */\n\nimport { FACEBOOK_GRAPH_API_BASE_URL, FACEBOOK_GRAPH_API_VERSION } from '../../../core/constants';\nimport { APIError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport {\n INSTAGRAM_MEDIA_METRICS_COMMON,\n INSTAGRAM_REELS_METRICS,\n INSTAGRAM_STORIES_METRICS,\n METRIC_PRESETS\n} from '../../../core/insights.constants';\nimport { APIClient, RequestOptions } from '../../../core/types';\nimport {\n InstagramAccountSummary,\n InstagramMediaInsights,\n} from '../../../core/types/insights.types';\nimport {\n InstagramAccount,\n InstagramComment,\n InstagramCommentsResponse,\n InstagramConfig,\n InstagramInsights,\n InstagramInsightsParams,\n InstagramMedia,\n InstagramMediaContainerResponse,\n InstagramMediaResponse,\n InstagramPublishParams,\n InstagramPublishResponse\n} from '../types';\n\nexport class InstagramAPI implements APIClient {\n private httpClient: HttpClient;\n private config: InstagramConfig;\n private accessToken?: string;\n\n constructor(config: InstagramConfig, accessToken?: string) {\n this.config = config;\n this.accessToken = accessToken;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n accessToken: this.accessToken,\n });\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n // Add access token to params if exists\n if (this.accessToken && !options.params?.access_token) {\n options.params = {\n ...options.params,\n access_token: this.accessToken,\n };\n }\n\n return this.httpClient.request<T>(endpoint, options);\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n this.httpClient.setAccessToken(token);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.accessToken;\n }\n\n // ============= Instagram-specific methods =============\n\n /**\n * Get user's Instagram Business account (single account from first page)\n */\n async getAccount(pageAccessToken?: string): Promise<InstagramAccount> {\n try {\n const token = pageAccessToken || this.accessToken;\n if (!token) {\n throw new APIError('Access token is required', 401, 'NO_TOKEN');\n }\n\n // Get Facebook pages with Instagram accounts\n const response = await this.get<any>('/me/accounts', {\n fields: 'instagram_business_account',\n access_token: token,\n });\n\n if (!response.data || response.data.length === 0) {\n throw new APIError(\n 'No Instagram business account found',\n 404,\n 'NO_INSTAGRAM_ACCOUNT'\n );\n }\n\n const instagramAccountId =\n response.data[0]?.instagram_business_account?.id;\n\n if (!instagramAccountId) {\n throw new APIError(\n 'No Instagram business account ID found',\n 404,\n 'NO_INSTAGRAM_ACCOUNT_ID'\n );\n }\n\n // Get Instagram account data\n const account = await this.get<InstagramAccount>(\n `/${instagramAccountId}`,\n {\n fields:\n 'id,username,name,profile_picture_url,followers_count,follows_count,media_count',\n access_token: token,\n }\n );\n\n return account;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram account: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'ACCOUNT_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get all Instagram Business accounts linked to user's Facebook pages\n * Returns all Instagram accounts from all connected Facebook pages\n */\n async getInstagramAccounts(userAccessToken?: string): Promise<InstagramAccount[]> {\n try {\n const token = userAccessToken || this.accessToken;\n if (!token) {\n throw new APIError('Access token is required', 401, 'NO_TOKEN');\n }\n\n // Get Facebook pages with Instagram business accounts\n const response = await this.get<any>('/me/accounts', {\n fields: 'id,name,instagram_business_account{id,username,name,profile_picture_url,followers_count,follows_count,media_count}',\n access_token: token,\n });\n\n if (!response.data || response.data.length === 0) {\n console.log(' ℹ️ No Facebook pages found');\n return [];\n }\n\n // Extract Instagram accounts from pages that have them\n const instagramAccounts: InstagramAccount[] = [];\n\n for (const page of response.data) {\n if (page.instagram_business_account) {\n instagramAccounts.push({\n id: page.instagram_business_account.id,\n username: page.instagram_business_account.username,\n name: page.instagram_business_account.name,\n profile_picture_url: page.instagram_business_account.profile_picture_url,\n followers_count: page.instagram_business_account.followers_count,\n follows_count: page.instagram_business_account.follows_count,\n media_count: page.instagram_business_account.media_count,\n });\n }\n }\n\n console.log(` ✅ Found ${instagramAccounts.length} Instagram account(s)`);\n return instagramAccounts;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram accounts: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'ACCOUNTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Instagram media\n */\n async getMedia(\n instagramAccountId: string,\n limit: number = 25\n ): Promise<InstagramMedia[]> {\n try {\n const response = await this.get<InstagramMediaResponse>(\n `/${instagramAccountId}/media`,\n {\n fields:\n 'id,media_type,media_url,thumbnail_url,permalink,caption,timestamp,like_count,comments_count',\n limit,\n }\n );\n\n return response.data;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram media: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Publish photo to Instagram (2-step process)\n */\n async publishPhoto(\n params: InstagramPublishParams\n ): Promise<InstagramPublishResponse> {\n const { instagramAccountId, imageUrl, caption } = params;\n\n if (!imageUrl) {\n throw new APIError(\n 'Image URL is required for photo posts',\n 400,\n 'INVALID_PARAMS'\n );\n }\n\n try {\n // Step 1: Create media container\n const containerResponse =\n await this.post<InstagramMediaContainerResponse>(\n `/${instagramAccountId}/media`,\n {\n image_url: imageUrl,\n caption: caption || '',\n }\n );\n\n // Step 2: Publish the container\n const publishResponse = await this.post<InstagramPublishResponse>(\n `/${instagramAccountId}/media_publish`,\n {\n creation_id: containerResponse.id,\n }\n );\n\n return publishResponse;\n } catch (error) {\n throw new APIError(\n `Failed to publish photo: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PHOTO_PUBLISH_ERROR',\n error\n );\n }\n }\n\n /**\n * Publish video to Instagram (2-step process)\n */\n async publishVideo(\n params: InstagramPublishParams\n ): Promise<InstagramPublishResponse> {\n const { instagramAccountId, videoUrl, caption } = params;\n\n if (!videoUrl) {\n throw new APIError(\n 'Video URL is required for video posts',\n 400,\n 'INVALID_PARAMS'\n );\n }\n\n try {\n // Step 1: Create media container\n const containerResponse =\n await this.post<InstagramMediaContainerResponse>(\n `/${instagramAccountId}/media`,\n {\n media_type: 'VIDEO',\n video_url: videoUrl,\n caption: caption || '',\n }\n );\n\n // Step 2: Publish the container (may take time while video is processed)\n const publishResponse = await this.post<InstagramPublishResponse>(\n `/${instagramAccountId}/media_publish`,\n {\n creation_id: containerResponse.id,\n }\n );\n\n return publishResponse;\n } catch (error) {\n throw new APIError(\n `Failed to publish video: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'VIDEO_PUBLISH_ERROR',\n error\n );\n }\n }\n\n /**\n * Delete Instagram media\n */\n async deleteMedia(mediaId: string): Promise<boolean> {\n try {\n const response = await this.delete<{ success: boolean }>(\n `/${mediaId}`\n );\n\n return response.success === true;\n } catch (error) {\n throw new APIError(\n `Failed to delete media: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_DELETE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get comments for a media item\n * @param mediaId - Media ID\n * @param limit - Max number of comments to fetch (default: 25)\n * @returns Array of comments\n */\n async getMediaComments(\n mediaId: string,\n limit: number = 25\n ): Promise<InstagramComment[]> {\n try {\n const response = await this.get<InstagramCommentsResponse>(\n `/${mediaId}/comments`,\n {\n fields: 'id,text,timestamp,username,like_count,from{id,username},replies{id,text,timestamp,username,like_count}',\n limit,\n }\n );\n\n return response.data || [];\n } catch (error) {\n throw new APIError(\n `Failed to fetch comments: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'COMMENTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Instagram account insights\n */\n async getAccountInsights(\n instagramAccountId: string,\n params: InstagramInsightsParams\n ): Promise<InstagramInsights> {\n try {\n const { metric, period, metric_type, since, until } = params;\n\n const response = await this.get<InstagramInsights>(\n `/${instagramAccountId}/insights`,\n {\n metric: metric.join(','),\n period: period || 'day',\n metric_type: metric_type || 'total_value',\n ...(since && { since }),\n ...(until && { until }),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'INSIGHTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get specific media insights\n */\n async getMediaInsights(mediaId: string, metrics: string[]): Promise<InstagramInsights> {\n try {\n const response = await this.get<InstagramInsights>(\n `/${mediaId}/insights`,\n {\n metric: metrics.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch media insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n // ============= Enhanced Insights Methods =============\n\n /**\n * Get account insights with default metrics\n * Uses updated metrics (views instead of impressions)\n * @param instagramAccountId - Instagram Account ID\n * @param period - Period for metrics\n * @returns Account insights\n */\n async getAccountInsightsOverview(\n instagramAccountId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<InstagramInsights> {\n return this.getAccountInsights(instagramAccountId, {\n metric: [...METRIC_PRESETS.INSTAGRAM_OVERVIEW],\n period,\n metric_type: 'total_value',\n });\n }\n\n /**\n * Get account summary with parsed values\n * @param instagramAccountId - Instagram Account ID\n * @param period - Period for metrics\n * @returns Parsed account summary\n */\n async getAccountSummary(\n instagramAccountId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<InstagramAccountSummary> {\n try {\n // Get account basic info\n const account = await this.get<InstagramAccount>(`/${instagramAccountId}`, {\n fields: 'id,username,followers_count',\n });\n\n // Get insights\n const insights = await this.getAccountInsightsOverview(instagramAccountId, period);\n\n const summary: InstagramAccountSummary = {\n id: account.id,\n username: account.username,\n followers_count: account.followers_count || 0,\n };\n\n for (const item of insights.data) {\n const value = item.total_value?.value ?? item.values?.[0]?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'views':\n summary.views = value;\n break;\n case 'reach':\n summary.reach = value;\n break;\n case 'accounts_engaged':\n summary.accounts_engaged = value;\n break;\n case 'total_interactions':\n summary.total_interactions = value;\n break;\n }\n }\n\n return summary;\n } catch (error) {\n throw new APIError(\n `Failed to fetch account summary: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'ACCOUNT_SUMMARY_ERROR',\n error\n );\n }\n }\n\n /**\n * Get media insights based on media type\n * Automatically selects appropriate metrics\n * @param mediaId - Media ID\n * @param mediaType - Type of media\n * @returns Media insights\n */\n async getMediaInsightsByType(\n mediaId: string,\n mediaType: 'IMAGE' | 'VIDEO' | 'CAROUSEL_ALBUM' | 'REELS'\n ): Promise<InstagramInsights> {\n let metrics: readonly string[];\n\n switch (mediaType) {\n case 'REELS':\n metrics = INSTAGRAM_REELS_METRICS;\n break;\n case 'VIDEO':\n metrics = [...INSTAGRAM_MEDIA_METRICS_COMMON, 'plays'];\n break;\n default:\n metrics = INSTAGRAM_MEDIA_METRICS_COMMON;\n }\n\n return this.getMediaInsights(mediaId, [...metrics]);\n }\n\n /**\n * Get media insights with parsed values\n * @param mediaId - Media ID\n * @param mediaType - Type of media\n * @returns Parsed media insights\n */\n async getMediaInsightsParsed(\n mediaId: string,\n mediaType: 'IMAGE' | 'VIDEO' | 'CAROUSEL_ALBUM' | 'REELS' = 'IMAGE'\n ): Promise<InstagramMediaInsights> {\n try {\n const response = await this.getMediaInsightsByType(mediaId, mediaType);\n\n const insights: InstagramMediaInsights = {\n id: mediaId,\n media_type: mediaType,\n };\n\n for (const item of response.data) {\n const value = item.total_value?.value ?? item.values?.[0]?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'views':\n insights.views = value;\n break;\n case 'reach':\n insights.reach = value;\n break;\n case 'likes':\n insights.likes = value;\n break;\n case 'comments':\n insights.comments = value;\n break;\n case 'shares':\n insights.shares = value;\n break;\n case 'saved':\n insights.saves = value;\n break;\n case 'plays':\n insights.plays = value;\n break;\n case 'total_interactions':\n insights.total_interactions = value;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed media insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get story insights\n * @param storyId - Story media ID\n * @returns Story insights\n */\n async getStoryInsights(storyId: string): Promise<InstagramInsights> {\n return this.getMediaInsights(storyId, [...INSTAGRAM_STORIES_METRICS]);\n }\n\n /**\n * Get reels insights\n * @param reelId - Reel media ID\n * @returns Reel insights\n */\n async getReelInsights(reelId: string): Promise<InstagramInsights> {\n return this.getMediaInsights(reelId, [...INSTAGRAM_REELS_METRICS]);\n }\n\n /**\n * Get engagement metrics for account\n * @param instagramAccountId - Instagram Account ID\n * @param period - Period for metrics\n * @returns Engagement insights\n */\n async getEngagementInsights(\n instagramAccountId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<InstagramInsights> {\n return this.getAccountInsights(instagramAccountId, {\n metric: [...METRIC_PRESETS.INSTAGRAM_ENGAGEMENT],\n period,\n metric_type: 'total_value',\n });\n }\n\n /**\n * Get demographics insights for account\n * @param instagramAccountId - Instagram Account ID\n * @param breakdown - Demographic breakdown type\n * @returns Demographics insights\n */\n async getDemographicsInsights(\n instagramAccountId: string,\n breakdown: 'city' | 'country' | 'age' | 'gender' = 'country'\n ): Promise<InstagramInsights> {\n try {\n const response = await this.get<InstagramInsights>(\n `/${instagramAccountId}/insights`,\n {\n metric: 'follower_demographics',\n period: 'lifetime',\n metric_type: 'total_value',\n breakdown,\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch demographics insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'DEMOGRAPHICS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n}\n\n\n","/**\n * Instagram Provider - Main Instagram provider\n */\n\nimport { InstagramAuth } from './auth';\nimport { InstagramAPI } from './api';\nimport { InstagramConfig } from './types';\n\n/**\n * Instagram provider that encapsulates Auth and API\n */\nexport class InstagramProvider {\n public readonly name = 'instagram' as const;\n public auth: InstagramAuth;\n public api: InstagramAPI;\n public config: InstagramConfig;\n\n constructor(config: InstagramConfig) {\n this.config = config;\n this.auth = new InstagramAuth(config);\n this.api = new InstagramAPI(config);\n }\n\n /**\n * Create new API instance with access token\n */\n createAPIClient(accessToken: string): InstagramAPI {\n return new InstagramAPI(this.config, accessToken);\n }\n\n /**\n * Update access token of existing API client\n */\n setAccessToken(accessToken: string) {\n this.api.setAccessToken(accessToken);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.api.getAccessToken();\n }\n}\n\n\n","/**\n * Instagram Types - Instagram-specific types\n */\n\nimport { UserProfile } from '../../../core/types';\n\n/**\n * Instagram provider configuration\n * Note: Instagram uses Facebook Graph API, version is fixed to v24.0 to ensure API compatibility\n */\nexport interface InstagramConfig {\n appId: string; // Facebook App ID (Instagram uses Facebook Graph API)\n appSecret?: string;\n redirectUri?: string;\n}\n\n/**\n * Instagram Scopes\n */\nexport enum InstagramScopes {\n BASIC = 'instagram_basic',\n CONTENT_PUBLISH = 'instagram_content_publish',\n MANAGE_COMMENTS = 'instagram_manage_comments',\n MANAGE_INSIGHTS = 'instagram_manage_insights',\n MANAGE_MESSAGES = 'instagram_manage_messages',\n SHOPPING_TAG_PRODUCTS = 'instagram_shopping_tag_products',\n}\n\n/**\n * Instagram Profile\n */\nexport interface InstagramProfile extends UserProfile {\n id: string;\n username: string;\n name?: string;\n account_type?: 'BUSINESS' | 'MEDIA_CREATOR' | 'PERSONAL';\n profile_picture_url?: string;\n followers_count?: number;\n follows_count?: number;\n media_count?: number;\n}\n\n/**\n * Instagram Business/Creator Account\n */\nexport interface InstagramAccount {\n id: string;\n username: string;\n name?: string;\n profile_picture_url?: string;\n followers_count?: number;\n follows_count?: number;\n media_count?: number;\n}\n\n/**\n * Instagram media types\n */\nexport type InstagramMediaType = 'IMAGE' | 'VIDEO' | 'CAROUSEL_ALBUM' | 'REELS';\n\n/**\n * Instagram Media\n */\nexport interface InstagramMedia {\n id: string;\n media_type: InstagramMediaType;\n media_url: string;\n thumbnail_url?: string;\n permalink: string;\n caption?: string;\n timestamp: string;\n like_count?: number;\n comments_count?: number;\n}\n\n/**\n * Parameters for publishing to Instagram\n */\nexport interface InstagramPublishParams {\n instagramAccountId: string;\n imageUrl?: string;\n videoUrl?: string;\n caption?: string;\n location_id?: string;\n user_tags?: Array<{ username: string; x: number; y: number }>;\n is_carousel?: boolean;\n children?: string[]; // Media IDs for carousel\n}\n\n/**\n * Media container creation response\n */\nexport interface InstagramMediaContainerResponse {\n id: string;\n}\n\n/**\n * Instagram publish response\n */\nexport interface InstagramPublishResponse {\n id: string;\n}\n\n/**\n * Media list response\n */\nexport interface InstagramMediaResponse {\n data: InstagramMedia[];\n paging?: {\n cursors: {\n before: string;\n after: string;\n };\n next?: string;\n previous?: string;\n };\n}\n\n/**\n * Instagram Insights\n */\nexport interface InstagramInsights {\n data: Array<{\n name: string;\n period: string;\n values?: Array<{\n value: number;\n end_time?: string;\n }>;\n total_value?: {\n value: number;\n breakdowns?: Array<{\n dimension_keys: string[];\n results: Array<{\n dimension_values: string[];\n value: number;\n end_time?: string;\n }>;\n }>;\n };\n title?: string;\n description?: string;\n }>;\n}\n\n/**\n * Parameters for getting insights\n */\nexport interface InstagramInsightsParams {\n metric: string[];\n period?: 'day' | 'week' | 'days_28' | 'lifetime';\n metric_type?: 'time_series' | 'total_value';\n since?: number;\n until?: number;\n}\n\n/**\n * Instagram Comment\n */\nexport interface InstagramComment {\n id: string;\n text: string;\n timestamp: string;\n username: string;\n like_count?: number;\n from?: {\n id: string;\n username: string;\n };\n replies?: {\n data: InstagramComment[];\n };\n}\n\n/**\n * Instagram Comments Response\n */\nexport interface InstagramCommentsResponse {\n data: InstagramComment[];\n paging?: {\n cursors: {\n before: string;\n after: string;\n };\n next?: string;\n previous?: string;\n };\n}\n\n","/**\n * TikTok API Constants\n */\n\n/**\n * TikTok API Version\n * @see https://developers.tiktok.com/doc/about-tiktok-api-versions\n */\nexport const TIKTOK_API_VERSION = 'v2' as const;\n\n/**\n * TikTok API Base URL\n */\nexport const TIKTOK_API_BASE_URL = `https://open.tiktokapis.com/${TIKTOK_API_VERSION}` as const;\n\n/**\n * TikTok OAuth URLs\n */\nexport const TIKTOK_OAUTH_AUTHORIZATION_URL = 'https://www.tiktok.com/v2/auth/authorize/' as const;\nexport const TIKTOK_OAUTH_TOKEN_URL = 'https://open.tiktokapis.com/v2/oauth/token/' as const;\nexport const TIKTOK_OAUTH_REVOKE_URL = 'https://open.tiktokapis.com/v2/oauth/revoke/' as const;\n\n/**\n * TikTok OAuth Scopes\n * @see https://developers.tiktok.com/doc/tiktok-api-scopes\n */\nexport const TikTokScopes = {\n // User info scopes\n USER_INFO_BASIC: 'user.info.basic',\n USER_INFO_PROFILE: 'user.info.profile',\n USER_INFO_STATS: 'user.info.stats',\n \n // Video scopes\n VIDEO_LIST: 'video.list',\n VIDEO_PUBLISH: 'video.publish',\n VIDEO_UPLOAD: 'video.upload',\n} as const;\n\nexport type TikTokScope = typeof TikTokScopes[keyof typeof TikTokScopes];\n\n/**\n * Default scopes for TikTok connection\n */\nexport const TIKTOK_DEFAULT_SCOPES: TikTokScope[] = [\n TikTokScopes.USER_INFO_BASIC,\n TikTokScopes.USER_INFO_PROFILE,\n TikTokScopes.USER_INFO_STATS,\n TikTokScopes.VIDEO_LIST,\n TikTokScopes.VIDEO_PUBLISH,\n TikTokScopes.VIDEO_UPLOAD,\n];\n","/**\n * TikTok API - API client for TikTok endpoints\n */\n\nimport { TIKTOK_API_BASE_URL } from '../constants';\nimport {\n TikTokAccountInsights,\n TikTokAPIResponse,\n TikTokConfig,\n TikTokInsights,\n TikTokInsightsParams,\n TikTokPublishStatusResponse,\n TikTokUploadInitResponse,\n TikTokUserInfo,\n TikTokVideoInsights,\n TikTokVideoListResponse,\n} from '../types';\n\n/**\n * TikTok API client\n */\nexport class TikTokAPI {\n private _config: TikTokConfig;\n private accessToken?: string;\n\n constructor(config: TikTokConfig, accessToken?: string) {\n this._config = config;\n this.accessToken = accessToken;\n }\n\n /**\n * Set access token\n */\n setAccessToken(accessToken: string) {\n this.accessToken = accessToken;\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.accessToken;\n }\n\n /**\n * Make authenticated API request\n */\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<TikTokAPIResponse<T>> {\n if (!this.accessToken) {\n throw new Error('Access token is required');\n }\n\n const url = `${TIKTOK_API_BASE_URL}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (data.error && data.error.code !== 'ok') {\n throw new Error(data.error.message || 'TikTok API error');\n }\n\n return data;\n }\n\n /**\n * Get user info\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-get-user-info\n */\n async getUserInfo(fields?: string[]): Promise<TikTokUserInfo> {\n const defaultFields = [\n 'open_id',\n 'union_id',\n 'avatar_url',\n 'avatar_url_100',\n 'avatar_large_url',\n 'display_name',\n 'bio_description',\n 'profile_deep_link',\n 'is_verified',\n 'follower_count',\n 'following_count',\n 'likes_count',\n 'video_count',\n ];\n\n const params = new URLSearchParams({\n fields: (fields || defaultFields).join(','),\n });\n\n const response = await this.request<{ user: TikTokUserInfo }>(\n `/user/info/?${params.toString()}`\n );\n\n return response.data.user;\n }\n\n /**\n * Get user's videos\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-video-list\n */\n async getVideoList(options?: {\n cursor?: number;\n maxCount?: number;\n fields?: string[];\n }): Promise<TikTokVideoListResponse> {\n const defaultFields = [\n 'id',\n 'create_time',\n 'cover_image_url',\n 'share_url',\n 'video_description',\n 'duration',\n 'height',\n 'width',\n 'title',\n 'embed_html',\n 'embed_link',\n 'like_count',\n 'comment_count',\n 'share_count',\n 'view_count',\n ];\n\n const body = {\n max_count: options?.maxCount || 20,\n cursor: options?.cursor,\n fields: options?.fields || defaultFields,\n };\n\n const response = await this.request<TikTokVideoListResponse>('/video/list/', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n return response.data;\n }\n\n /**\n * Initialize direct video upload\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-post-publish-video-init\n */\n async initVideoUpload(options: {\n sourceInfo: {\n source: 'FILE_UPLOAD' | 'PULL_FROM_URL';\n videoSize?: number;\n chunkSize?: number;\n totalChunkCount?: number;\n videoUrl?: string;\n };\n postInfo?: {\n title?: string;\n privacyLevel?: 'PUBLIC_TO_EVERYONE' | 'MUTUAL_FOLLOW_FRIENDS' | 'SELF_ONLY';\n disableDuet?: boolean;\n disableStitch?: boolean;\n disableComment?: boolean;\n videoCoverTimestampMs?: number;\n };\n }): Promise<TikTokUploadInitResponse> {\n const response = await this.request<TikTokUploadInitResponse>(\n '/post/publish/video/init/',\n {\n method: 'POST',\n body: JSON.stringify({\n source_info: options.sourceInfo,\n post_info: options.postInfo,\n }),\n }\n );\n\n return response.data;\n }\n\n /**\n * Get publish status\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-post-publish-status-fetch\n */\n async getPublishStatus(publishId: string): Promise<TikTokPublishStatusResponse> {\n const response = await this.request<TikTokPublishStatusResponse>(\n '/post/publish/status/fetch/',\n {\n method: 'POST',\n body: JSON.stringify({ publish_id: publishId }),\n }\n );\n\n return response.data;\n }\n\n /**\n * Get account insights (aggregated from user info and recent videos)\n * TikTok doesn't have a dedicated insights API like Instagram/Facebook,\n * so we compute metrics from user info and video stats\n */\n async getAccountInsights(): Promise<TikTokAccountInsights> {\n // Get user info for follower/following counts\n const userInfo = await this.getUserInfo();\n\n // Get recent videos for engagement metrics\n const videoList = await this.getVideoList({ maxCount: 50 });\n\n // Calculate totals from videos\n let totalViews = 0;\n let totalLikes = 0;\n let totalComments = 0;\n let totalShares = 0;\n\n for (const video of videoList.videos) {\n totalViews += video.view_count || 0;\n totalLikes += video.like_count || 0;\n totalComments += video.comment_count || 0;\n totalShares += video.share_count || 0;\n }\n\n // Calculate average engagement rate\n // Engagement Rate = (likes + comments + shares) / views * 100\n const totalEngagements = totalLikes + totalComments + totalShares;\n const averageEngagementRate = totalViews > 0\n ? (totalEngagements / totalViews) * 100\n : 0;\n\n return {\n followerCount: userInfo.follower_count || 0,\n followingCount: userInfo.following_count || 0,\n likesCount: userInfo.likes_count || 0,\n videoCount: userInfo.video_count || 0,\n totalViews,\n totalComments,\n totalShares,\n averageEngagementRate: Math.round(averageEngagementRate * 100) / 100, // Round to 2 decimals\n };\n }\n\n /**\n * Get insights for a specific video\n */\n async getVideoInsights(videoId: string): Promise<TikTokVideoInsights | null> {\n const videoList = await this.getVideoList({ maxCount: 50 });\n\n const video = videoList.videos.find(v => v.id === videoId);\n if (!video) {\n return null;\n }\n\n const viewCount = video.view_count || 0;\n const likeCount = video.like_count || 0;\n const commentCount = video.comment_count || 0;\n const shareCount = video.share_count || 0;\n\n // Calculate engagement rate for this video\n const engagementRate = viewCount > 0\n ? ((likeCount + commentCount + shareCount) / viewCount) * 100\n : 0;\n\n return {\n videoId: video.id,\n viewCount,\n likeCount,\n commentCount,\n shareCount,\n engagementRate: Math.round(engagementRate * 100) / 100,\n createTime: video.create_time,\n };\n }\n\n /**\n * Get insights for multiple videos\n */\n async getVideosInsights(maxCount: number = 20): Promise<TikTokVideoInsights[]> {\n const videoList = await this.getVideoList({ maxCount });\n\n return videoList.videos.map(video => {\n const viewCount = video.view_count || 0;\n const likeCount = video.like_count || 0;\n const commentCount = video.comment_count || 0;\n const shareCount = video.share_count || 0;\n\n const engagementRate = viewCount > 0\n ? ((likeCount + commentCount + shareCount) / viewCount) * 100\n : 0;\n\n return {\n videoId: video.id,\n viewCount,\n likeCount,\n commentCount,\n shareCount,\n engagementRate: Math.round(engagementRate * 100) / 100,\n createTime: video.create_time,\n };\n });\n }\n\n /**\n * Get formatted insights (unified format similar to Instagram/Facebook)\n * This allows for easier aggregation across platforms\n */\n async getInsights(params: TikTokInsightsParams): Promise<TikTokInsights> {\n const accountInsights = await this.getAccountInsights();\n const now = new Date();\n const endTime = now.toISOString();\n\n const metricsMap: Record<string, number> = {\n followers: accountInsights.followerCount,\n following: accountInsights.followingCount,\n likes: accountInsights.likesCount,\n video_count: accountInsights.videoCount,\n views: accountInsights.totalViews,\n comments: accountInsights.totalComments,\n shares: accountInsights.totalShares,\n engagement_rate: accountInsights.averageEngagementRate,\n };\n\n const data = params.metric.map(metricName => ({\n name: metricName,\n period: 'lifetime',\n values: [{\n value: metricsMap[metricName] || 0,\n end_time: endTime,\n }],\n title: metricName.charAt(0).toUpperCase() + metricName.slice(1).replace(/_/g, ' '),\n }));\n\n return { data };\n }\n}\n\n","/**\n * TikTok Auth - Authentication utilities\n */\n\nimport {\n TIKTOK_DEFAULT_SCOPES,\n TIKTOK_OAUTH_AUTHORIZATION_URL,\n TIKTOK_OAUTH_REVOKE_URL,\n TIKTOK_OAUTH_TOKEN_URL,\n TikTokScope,\n} from '../constants';\nimport { TikTokConfig, TikTokTokenResponse } from '../types';\n\n/**\n * TikTok Auth class for OAuth operations\n */\nexport class TikTokAuth {\n private config: TikTokConfig;\n\n constructor(config: TikTokConfig) {\n this.config = config;\n }\n\n /**\n * Build authorization URL for OAuth flow\n */\n getAuthorizationUrl(options?: {\n redirectUri?: string;\n scopes?: TikTokScope[];\n state?: string;\n }): string {\n const params = new URLSearchParams({\n client_key: this.config.clientKey,\n redirect_uri: options?.redirectUri || this.config.redirectUri || '',\n response_type: 'code',\n scope: (options?.scopes || this.config.scopes || TIKTOK_DEFAULT_SCOPES).join(','),\n });\n\n if (options?.state) {\n params.set('state', options.state);\n }\n\n return `${TIKTOK_OAUTH_AUTHORIZATION_URL}?${params.toString()}`;\n }\n\n /**\n * Exchange authorization code for access token\n * NOTE: This should be done server-side to protect client_secret\n */\n async exchangeCodeForToken(\n code: string,\n redirectUri?: string\n ): Promise<TikTokTokenResponse> {\n if (!this.config.clientSecret) {\n throw new Error('Client secret is required for token exchange');\n }\n\n const response = await fetch(TIKTOK_OAUTH_TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_key: this.config.clientKey,\n client_secret: this.config.clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: redirectUri || this.config.redirectUri || '',\n }).toString(),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error?.message || 'Failed to exchange code for token');\n }\n\n return response.json();\n }\n\n /**\n * Refresh access token using refresh token\n * NOTE: This should be done server-side to protect client_secret\n */\n async refreshToken(refreshToken: string): Promise<TikTokTokenResponse> {\n if (!this.config.clientSecret) {\n throw new Error('Client secret is required for token refresh');\n }\n\n const response = await fetch(TIKTOK_OAUTH_TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_key: this.config.clientKey,\n client_secret: this.config.clientSecret,\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n }).toString(),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error?.message || 'Failed to refresh token');\n }\n\n return response.json();\n }\n\n /**\n * Revoke access token\n */\n async revokeToken(accessToken: string): Promise<void> {\n const response = await fetch(TIKTOK_OAUTH_REVOKE_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_key: this.config.clientKey,\n token: accessToken,\n }).toString(),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error?.message || 'Failed to revoke token');\n }\n }\n}\n","/**\n * TikTok Provider - Main TikTok provider\n */\n\nimport { TikTokAPI } from './api';\nimport { TikTokAuth } from './auth';\nimport { TikTokConfig } from './types';\n\n/**\n * TikTok provider that encapsulates Auth and API\n */\nexport class TikTokProvider {\n public readonly name = 'tiktok' as const;\n public auth: TikTokAuth;\n public api: TikTokAPI;\n public config: TikTokConfig;\n\n constructor(config: TikTokConfig) {\n this.config = config;\n this.auth = new TikTokAuth(config);\n this.api = new TikTokAPI(config);\n }\n\n /**\n * Create new API instance with access token\n */\n createAPIClient(accessToken: string): TikTokAPI {\n return new TikTokAPI(this.config, accessToken);\n }\n\n /**\n * Update access token of existing API client\n */\n setAccessToken(accessToken: string) {\n this.api.setAccessToken(accessToken);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.api.getAccessToken();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../core/errors/BaseError.ts","../core/errors/AuthError.ts","../core/errors/APIError.ts","../core/http/HttpClient.ts","../core/constants.ts","../core/insights.constants.ts","../providers/facebook/api/FacebookAPI.ts","../providers/facebook/auth/FacebookAuth.ts","../providers/facebook/FacebookProvider.ts","../providers/facebook/types/index.ts","../providers/instagram/auth/InstagramAuth.ts","../providers/instagram/api/InstagramAPI.ts","../providers/instagram/InstagramProvider.ts","../providers/instagram/types/index.ts","../providers/tiktok/constants.ts","../providers/tiktok/api/index.ts","../providers/tiktok/auth/index.ts","../providers/tiktok/TikTokProvider.ts"],"names":["FacebookScopesBusiness","FacebookScopesUser","InstagramScopes"],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * Base Error - Error base para la librería\n */\n\nexport class BaseError extends Error {\n public code?: string | number;\n public statusCode?: number;\n public details?: any;\n\n constructor(message: string, code?: string | number, details?: any) {\n super(message);\n this.name = this.constructor.name;\n this.code = code;\n this.details = details;\n Error.captureStackTrace(this, this.constructor);\n }\n}\n\n\n","/**\n * Auth Error - Authentication errors\n */\n\nimport { BaseError } from './BaseError';\n\nexport class AuthError extends BaseError {\n constructor(message: string, code?: string | number, details?: any) {\n super(message, code, details);\n this.name = 'AuthError';\n }\n}\n\n\n","/**\n * API Error - Errores de API\n */\n\nimport { BaseError } from './BaseError';\n\nexport class APIError extends BaseError {\n constructor(\n message: string,\n statusCode?: number,\n code?: string | number,\n details?: any\n ) {\n super(message, code, details);\n this.name = 'APIError';\n this.statusCode = statusCode;\n }\n}\n\n\n","/**\n * HTTP Client - Generic HTTP client for all APIs\n */\n\nimport { APIClient, HttpClientConfig, RequestOptions } from '../types';\nimport { APIError } from '../errors';\n\nexport class HttpClient implements APIClient {\n private config: HttpClientConfig;\n\n constructor(config: HttpClientConfig) {\n this.config = {\n timeout: 30000, // 30 seconds default\n headers: {\n 'Content-Type': 'application/json',\n },\n ...config,\n };\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n const url = this.buildURL(endpoint, options.params);\n const method = options.method || 'GET';\n\n const headers: Record<string, string> = {\n ...this.config.headers,\n ...options.headers,\n };\n\n // Add token if exists\n if (this.config.accessToken) {\n headers['Authorization'] = `Bearer ${this.config.accessToken}`;\n }\n\n const config: RequestInit = {\n method,\n headers,\n signal: this.createAbortSignal(options.timeout || this.config.timeout),\n };\n\n // Add body if exists (not for GET)\n if (options.body && method !== 'GET') {\n if (headers['Content-Type'] === 'application/json') {\n config.body = JSON.stringify(options.body);\n } else if (\n headers['Content-Type'] === 'application/x-www-form-urlencoded'\n ) {\n config.body = this.encodeFormBody(options.body);\n } else {\n config.body = options.body;\n }\n }\n\n try {\n const response = await fetch(url, config);\n return await this.handleResponse<T>(response);\n } catch (error) {\n if (error instanceof APIError) {\n throw error;\n }\n throw new APIError(\n `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 0,\n 'NETWORK_ERROR',\n error\n );\n }\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Build URL with query params\n */\n private buildURL(endpoint: string, params?: Record<string, any>): string {\n const url = endpoint.startsWith('http')\n ? endpoint\n : `${this.config.baseURL}${endpoint}`;\n\n if (!params || Object.keys(params).length === 0) {\n return url;\n }\n\n const queryString = Object.entries(params)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n\n return queryString ? `${url}?${queryString}` : url;\n }\n\n /**\n * Encode body as form-urlencoded\n */\n private encodeFormBody(body: Record<string, any>): string {\n return Object.entries(body)\n .filter(([_, value]) => value !== undefined && value !== null)\n .map(\n ([key, value]) =>\n `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`\n )\n .join('&');\n }\n\n /**\n * Create AbortSignal for timeout\n */\n private createAbortSignal(timeout?: number): AbortSignal | undefined {\n if (!timeout) return undefined;\n\n const controller = new AbortController();\n setTimeout(() => controller.abort(), timeout);\n return controller.signal;\n }\n\n /**\n * Handle HTTP response\n */\n private async handleResponse<T>(response: Response): Promise<T> {\n // Try to parse as JSON\n let data: any;\n const contentType = response.headers.get('content-type');\n\n if (contentType?.includes('application/json')) {\n data = await response.json();\n } else {\n data = await response.text();\n }\n\n // If response is not successful, throw error\n if (!response.ok) {\n const errorMessage =\n data?.error?.message || data?.message || 'API request failed';\n const errorCode = data?.error?.code || data?.code || response.status;\n\n throw new APIError(errorMessage, response.status, errorCode, data);\n }\n\n return data as T;\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.config.accessToken = token;\n }\n\n /**\n * Get current configuration\n */\n getConfig(): HttpClientConfig {\n return { ...this.config };\n }\n}\n\n\n","/**\n * Constants - SDK global constants\n */\n\n/**\n * Facebook & Instagram Graph API Version\n * IMPORTANT: Do not change this version unless you have tested all functionality\n * Different API versions may have different response structures\n * \n * @see https://developers.facebook.com/docs/graph-api/changelog\n */\nexport const FACEBOOK_GRAPH_API_VERSION = 'v24.0' as const;\n\n/**\n * Facebook Graph API Base URL\n */\nexport const FACEBOOK_GRAPH_API_BASE_URL = `https://graph.facebook.com/${FACEBOOK_GRAPH_API_VERSION}` as const;\n\n/**\n * Facebook OAuth Authorization Endpoint\n */\nexport const FACEBOOK_OAUTH_AUTHORIZATION_URL = `https://www.facebook.com/${FACEBOOK_GRAPH_API_VERSION}/dialog/oauth` as const;\n\n","/**\n * Insights Constants - Metrics available for Facebook/Instagram APIs\n * Updated for Graph API v24.0 (includes Nov 2025 changes)\n * \n * @see https://developers.facebook.com/docs/insights/guides\n */\n\n// ============= Page Insights Metrics =============\n\n/**\n * Facebook Page metrics (lifetime)\n * Note: 'page_fans' deprecated Nov 2025, use 'followers_count' field instead\n */\nexport const PAGE_METRICS_LIFETIME = [\n 'page_fans_country',\n 'page_fans_city',\n 'page_fans_gender_age',\n] as const;\n\n/**\n * Facebook Page metrics (day/week/days_28)\n * Note: 'page_impressions' deprecated Nov 2025, use 'page_views' instead\n */\nexport const PAGE_METRICS_PERIODIC = [\n 'page_views_total',\n 'page_views',\n 'page_post_engagements',\n 'page_fans_online',\n 'page_fans_online_per_day',\n 'page_video_views',\n 'page_daily_follows',\n 'page_daily_unfollows',\n] as const;\n\n// ============= Post Insights Metrics =============\n\n/**\n * Post metrics (lifetime only)\n * Note: 'post_impressions' deprecated, use 'post_views' equivalents\n */\nexport const POST_METRICS = [\n 'post_engaged_users',\n 'post_negative_feedback',\n 'post_engaged_fan',\n 'post_clicks',\n 'post_clicks_unique',\n 'post_reactions_by_type_total',\n] as const;\n\n// ============= Video Insights Metrics =============\n\n/**\n * Video metrics (lifetime)\n * Note: 'video_views' deprecated Apr 2024, use 'total_video_views'\n */\nexport const VIDEO_METRICS = [\n 'total_video_views',\n 'total_video_views_unique',\n 'total_video_views_autoplayed',\n 'total_video_views_clicked_to_play',\n 'total_video_views_organic',\n 'total_video_views_organic_unique',\n 'total_video_views_paid',\n 'total_video_views_paid_unique',\n 'total_video_avg_time_watched',\n 'total_video_view_total_time',\n 'total_video_complete_views',\n 'total_video_complete_views_unique',\n 'total_video_complete_views_organic',\n 'total_video_complete_views_organic_unique',\n 'total_video_complete_views_paid',\n 'total_video_complete_views_paid_unique',\n] as const;\n\n// ============= Reels Insights Metrics =============\n\n/**\n * Facebook Reels metrics (added Dec 2024)\n * Available via Video Insights API\n */\nexport const REELS_METRICS = [\n 'blue_reels_play_count',\n 'post_video_avg_time_watched',\n 'post_video_views',\n 'post_video_social_actions',\n] as const;\n\n/**\n * Extended Reels metrics for detailed analysis\n */\nexport const REELS_METRICS_EXTENDED = [\n 'plays',\n 'comments',\n 'likes',\n 'shares',\n 'reach',\n 'total_plays',\n 'average_minutes_viewed',\n 'minutes_viewed',\n] as const;\n\n// ============= Photo Insights Metrics =============\n\n/**\n * Photo metrics (lifetime only)\n */\nexport const PHOTO_METRICS = [\n 'photo_views',\n 'photo_reach',\n 'engaged_users',\n] as const;\n\n// ============= Instagram Account Metrics =============\n\n/**\n * Instagram account metrics (day/week/days_28)\n * Note: 'impressions' deprecated Apr 2025, use 'views'\n */\nexport const INSTAGRAM_ACCOUNT_METRICS = [\n 'views',\n 'reach',\n 'accounts_engaged',\n 'total_interactions',\n 'likes',\n 'comments',\n 'shares',\n 'saves',\n 'follows_and_unfollows',\n 'profile_links_taps',\n 'profile_views',\n] as const;\n\n/**\n * Instagram account metrics - Demographics\n */\nexport const INSTAGRAM_DEMOGRAPHICS_METRICS = [\n 'follower_demographics',\n 'reached_audience_demographics',\n 'engaged_audience_demographics',\n] as const;\n\n// ============= Instagram Media Metrics =============\n\n/**\n * Instagram media metrics (all types)\n */\nexport const INSTAGRAM_MEDIA_METRICS_COMMON = [\n 'views',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Reels specific metrics\n */\nexport const INSTAGRAM_REELS_METRICS = [\n 'plays',\n 'reach',\n 'likes',\n 'comments',\n 'shares',\n 'saved',\n 'total_interactions',\n] as const;\n\n/**\n * Instagram Stories specific metrics\n */\nexport const INSTAGRAM_STORIES_METRICS = [\n 'exits',\n 'replies',\n 'taps_forward',\n 'taps_back',\n 'views',\n 'reach',\n] as const;\n\n// ============= Insights Periods =============\n\nexport const INSIGHTS_PERIODS = {\n DAY: 'day',\n WEEK: 'week',\n DAYS_28: 'days_28',\n MONTH: 'month',\n LIFETIME: 'lifetime',\n} as const;\n\nexport type InsightsPeriod = typeof INSIGHTS_PERIODS[keyof typeof INSIGHTS_PERIODS];\n\n// ============= Helper - Preset Metric Groups =============\n\n/**\n * Common metric presets for quick access\n */\nexport const METRIC_PRESETS = {\n // Facebook Page quick overview\n PAGE_OVERVIEW: ['page_views_total', 'page_post_engagements', 'page_video_views'],\n \n // Facebook Video performance\n VIDEO_PERFORMANCE: ['total_video_views', 'total_video_avg_time_watched', 'total_video_complete_views'],\n \n // Facebook Reels performance\n REELS_PERFORMANCE: ['blue_reels_play_count', 'post_video_avg_time_watched', 'post_video_social_actions'],\n \n // Instagram account overview\n INSTAGRAM_OVERVIEW: ['views', 'reach', 'accounts_engaged', 'total_interactions'],\n \n // Instagram content engagement\n INSTAGRAM_ENGAGEMENT: ['likes', 'comments', 'shares', 'saves'],\n} as const;\n","/**\n * Facebook API - Facebook API Client\n */\n\nimport { FACEBOOK_GRAPH_API_BASE_URL, FACEBOOK_GRAPH_API_VERSION } from '../../../core/constants';\nimport { APIError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport {\n METRIC_PRESETS,\n PHOTO_METRICS,\n POST_METRICS,\n REELS_METRICS,\n VIDEO_METRICS,\n} from '../../../core/insights.constants';\nimport { APIClient, RequestOptions } from '../../../core/types';\nimport {\n InsightsResponse,\n PageOverview,\n PhotoInsights,\n PostInsights,\n ReelsInsights,\n VideoInsights,\n} from '../../../core/types/insights.types';\nimport {\n FacebookConfig,\n FacebookPage,\n FacebookPagesResponse,\n FacebookPostResponse,\n FacebookPublishPostParams,\n} from '../types';\n\nexport class FacebookAPI implements APIClient {\n private httpClient: HttpClient;\n private config: FacebookConfig;\n private accessToken?: string;\n\n constructor(config: FacebookConfig, accessToken?: string) {\n this.config = config;\n this.accessToken = accessToken;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n accessToken: this.accessToken,\n });\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n // Add access token to params if exists\n if (this.accessToken && !options.params?.access_token) {\n options.params = {\n ...options.params,\n access_token: this.accessToken,\n };\n }\n\n return this.httpClient.request<T>(endpoint, options);\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n this.httpClient.setAccessToken(token);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.accessToken;\n }\n\n // ============= Facebook-specific methods =============\n\n /**\n * Get user's pages\n */\n async getPages(userAccessToken?: string): Promise<FacebookPage[]> {\n try {\n const token = userAccessToken || this.accessToken;\n if (!token) {\n throw new APIError('Access token is required', 401, 'NO_TOKEN');\n }\n\n const response = await this.get<FacebookPagesResponse>('/me/accounts', {\n fields: 'id,name,access_token,picture',\n access_token: token,\n });\n\n return response.data;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Facebook pages: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGES_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Publish post to Facebook page\n */\n async publishPost(\n params: FacebookPublishPostParams\n ): Promise<FacebookPostResponse> {\n const { pageId, pageAccessToken, message, imageUrl, scheduledPublishTime } =\n params;\n\n try {\n let endpoint = `/${pageId}/`;\n const body: any = {\n access_token: pageAccessToken,\n };\n\n // If scheduled, mark as unpublished\n if (scheduledPublishTime) {\n body.published = false;\n body.scheduled_publish_time = scheduledPublishTime;\n }\n\n // Post with photo\n if (imageUrl) {\n endpoint += 'photos';\n body.url = imageUrl;\n if (message) body.caption = message;\n }\n // Text-only post\n else if (message) {\n endpoint += 'feed';\n body.message = message;\n } else {\n throw new APIError(\n 'Either message or imageUrl must be provided',\n 400,\n 'INVALID_PARAMS'\n );\n }\n\n const response = await this.request<FacebookPostResponse>(endpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body,\n });\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to publish post: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_PUBLISH_ERROR',\n error\n );\n }\n }\n\n /**\n * Delete Facebook post\n */\n async deletePost(postId: string, pageAccessToken: string): Promise<boolean> {\n try {\n const response = await this.delete<{ success: boolean }>(\n `/${postId}?access_token=${pageAccessToken}`\n );\n\n return response.success === true;\n } catch (error) {\n throw new APIError(\n `Failed to delete post: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_DELETE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page information\n */\n async getPage(pageId: string, fields?: string[]): Promise<FacebookPage> {\n try {\n const fieldsParam = fields?.join(',') || 'id,name,access_token,picture';\n\n return await this.get<FacebookPage>(`/${pageId}`, {\n fields: fieldsParam,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page info: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Debug/validate a Facebook access token\n * Uses Facebook's debug_token endpoint\n *\n * @param inputToken - The token to validate\n * @param appAccessToken - App token (app_id|app_secret)\n * @returns Token debug information\n */\n async debugToken(\n inputToken: string,\n appAccessToken: string\n ): Promise<{\n data: {\n is_valid: boolean;\n expires_at?: number;\n scopes?: string[];\n error?: { message: string; code: number };\n };\n }> {\n try {\n return await this.get('/debug_token', {\n input_token: inputToken,\n access_token: appAccessToken,\n });\n } catch (error) {\n throw new APIError(\n `Failed to debug token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'TOKEN_DEBUG_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page insights/analytics\n * @param pageId - Facebook Page ID\n * @param options - Insights options\n * @returns Page insights data\n */\n async getPageInsights(\n pageId: string,\n options: {\n metric: string[];\n period?: 'day' | 'week' | 'days_28' | 'month' | 'lifetime';\n since?: number;\n until?: number;\n }\n ): Promise<{\n data: Array<{\n name: string;\n period: string;\n values: Array<{ value: number; end_time?: string }>;\n title?: string;\n description?: string;\n }>;\n }> {\n try {\n const params: Record<string, any> = {\n metric: options.metric.join(','),\n period: options.period || 'day',\n };\n\n if (options.since) params.since = options.since;\n if (options.until) params.until = options.until;\n\n const response = await this.get<{\n data: Array<{\n name: string;\n period: string;\n values: Array<{ value: number; end_time?: string }>;\n title?: string;\n description?: string;\n }>;\n }>(`/${pageId}/insights`, params);\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch page insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'INSIGHTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page fans count (total followers)\n * @param pageId - Facebook Page ID\n * @returns Page with fan count\n */\n async getPageFansCount(pageId: string): Promise<{ id: string; fan_count: number }> {\n try {\n return await this.get<{ id: string; fan_count: number }>(`/${pageId}`, {\n fields: 'id,fan_count',\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page fans count: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'FANS_COUNT_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page overview with key metrics\n * @param pageId - Facebook Page ID\n * @returns Page overview data\n */\n async getPageOverview(pageId: string): Promise<PageOverview> {\n try {\n const response = await this.get<{\n id: string;\n name: string;\n followers_count?: number;\n fan_count?: number;\n }>(`/${pageId}`, {\n fields: 'id,name,followers_count,fan_count',\n });\n\n return {\n id: response.id,\n name: response.name,\n followers_count: response.followers_count || response.fan_count || 0,\n fan_count: response.fan_count,\n };\n } catch (error) {\n throw new APIError(\n `Failed to fetch page overview: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_OVERVIEW_ERROR',\n error\n );\n }\n }\n\n // ============= Video Insights Methods =============\n\n /**\n * Get video insights\n * @param videoId - Facebook Video ID\n * @param metrics - Specific metrics to fetch (defaults to common metrics)\n * @returns Video insights data\n */\n async getVideoInsights(\n videoId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || METRIC_PRESETS.VIDEO_PERFORMANCE;\n\n const response = await this.get<InsightsResponse>(\n `/${videoId}/video_insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch video insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'VIDEO_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get video insights with parsed values\n * @param videoId - Facebook Video ID\n * @returns Parsed video insights\n */\n async getVideoInsightsParsed(videoId: string): Promise<VideoInsights> {\n try {\n const response = await this.getVideoInsights(videoId, [...VIDEO_METRICS.slice(0, 8)]);\n\n const insights: VideoInsights = { id: videoId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'total_video_views':\n insights.total_views = value;\n break;\n case 'total_video_views_unique':\n insights.unique_views = value;\n break;\n case 'total_video_avg_time_watched':\n insights.avg_time_watched = value;\n break;\n case 'total_video_complete_views':\n insights.complete_views = value;\n break;\n case 'total_video_views_organic':\n insights.organic_views = value;\n break;\n case 'total_video_views_paid':\n insights.paid_views = value;\n break;\n case 'total_video_view_total_time':\n insights.total_time_watched = value;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed video insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'VIDEO_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page videos with basic info\n * @param pageId - Facebook Page ID\n * @param limit - Number of videos to fetch\n * @returns List of videos\n */\n async getPageVideos(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; title?: string; description?: string; created_time: string; length?: number }> }> {\n try {\n return await this.get(`/${pageId}/videos`, {\n fields: 'id,title,description,created_time,length',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page videos: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_VIDEOS_ERROR',\n error\n );\n }\n }\n\n // ============= Reels Insights Methods =============\n\n /**\n * Get reels insights\n * @param reelId - Facebook Reel ID\n * @param metrics - Specific metrics to fetch\n * @returns Reels insights data\n */\n async getReelsInsights(\n reelId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || METRIC_PRESETS.REELS_PERFORMANCE;\n\n const response = await this.get<InsightsResponse>(\n `/${reelId}/video_insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch reels insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'REELS_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get reels insights with parsed values\n * @param reelId - Facebook Reel ID\n * @returns Parsed reels insights\n */\n async getReelsInsightsParsed(reelId: string): Promise<ReelsInsights> {\n try {\n const response = await this.getReelsInsights(reelId, [...REELS_METRICS]);\n\n const insights: ReelsInsights = { id: reelId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'blue_reels_play_count':\n insights.plays = value;\n break;\n case 'post_video_avg_time_watched':\n insights.avg_time_watched = value;\n break;\n case 'post_video_views':\n insights.total_plays = value;\n break;\n }\n }\n\n // Get engagement metrics from post insights\n try {\n const postResponse = await this.get<{\n reactions?: { summary: { total_count: number } };\n comments?: { summary: { total_count: number } };\n shares?: { count: number };\n }>(`/${reelId}`, {\n fields: 'reactions.summary(true),comments.summary(true),shares',\n });\n\n insights.likes = postResponse.reactions?.summary?.total_count;\n insights.comments = postResponse.comments?.summary?.total_count;\n insights.shares = postResponse.shares?.count;\n } catch {\n // Engagement metrics optional\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed reels insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'REELS_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page reels\n * @param pageId - Facebook Page ID\n * @param limit - Number of reels to fetch\n * @returns List of reels\n */\n async getPageReels(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; description?: string; created_time: string }> }> {\n try {\n return await this.get(`/${pageId}/video_reels`, {\n fields: 'id,description,created_time',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page reels: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_REELS_ERROR',\n error\n );\n }\n }\n\n // ============= Post Insights Methods =============\n\n /**\n * Get post insights\n * @param postId - Facebook Post ID\n * @param metrics - Specific metrics to fetch\n * @returns Post insights data\n */\n async getPostInsights(\n postId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || [...POST_METRICS];\n\n const response = await this.get<InsightsResponse>(\n `/${postId}/insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch post insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get post insights with parsed values\n * @param postId - Facebook Post ID\n * @returns Parsed post insights\n */\n async getPostInsightsParsed(postId: string): Promise<PostInsights> {\n try {\n const response = await this.getPostInsights(postId);\n\n const insights: PostInsights = { id: postId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n\n switch (item.name) {\n case 'post_engaged_users':\n if (typeof value === 'number') insights.engaged_users = value;\n break;\n case 'post_clicks':\n if (typeof value === 'number') insights.clicks = value;\n break;\n case 'post_negative_feedback':\n if (typeof value === 'number') insights.negative_feedback = value;\n break;\n case 'post_reactions_by_type_total':\n if (typeof value === 'object') insights.reactions_by_type = value as Record<string, number>;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed post insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'POST_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page posts/feed\n * @param pageId - Facebook Page ID\n * @param limit - Number of posts to fetch\n * @returns List of posts\n */\n async getPagePosts(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; message?: string; created_time: string; type?: string }> }> {\n try {\n return await this.get(`/${pageId}/feed`, {\n fields: 'id,message,created_time,type',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page posts: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_POSTS_ERROR',\n error\n );\n }\n }\n\n // ============= Photo Insights Methods =============\n\n /**\n * Get photo insights\n * @param photoId - Facebook Photo ID\n * @param metrics - Specific metrics to fetch\n * @returns Photo insights data\n */\n async getPhotoInsights(\n photoId: string,\n metrics?: string[]\n ): Promise<InsightsResponse> {\n try {\n const metricsToFetch = metrics || [...PHOTO_METRICS];\n\n const response = await this.get<InsightsResponse>(\n `/${photoId}/insights`,\n {\n metric: metricsToFetch.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch photo insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PHOTO_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get photo insights with parsed values\n * @param photoId - Facebook Photo ID\n * @returns Parsed photo insights\n */\n async getPhotoInsightsParsed(photoId: string): Promise<PhotoInsights> {\n try {\n const response = await this.getPhotoInsights(photoId);\n\n const insights: PhotoInsights = { id: photoId };\n\n for (const item of response.data) {\n const value = item.values?.[0]?.value ?? item.total_value?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'photo_views':\n insights.views = value;\n break;\n case 'photo_reach':\n insights.reach = value;\n break;\n case 'engaged_users':\n insights.engaged_users = value;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed photo insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PHOTO_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get page photos\n * @param pageId - Facebook Page ID\n * @param limit - Number of photos to fetch\n * @returns List of photos\n */\n async getPagePhotos(\n pageId: string,\n limit: number = 25\n ): Promise<{ data: Array<{ id: string; name?: string; created_time: string }> }> {\n try {\n return await this.get(`/${pageId}/photos`, {\n fields: 'id,name,created_time',\n type: 'uploaded',\n limit,\n });\n } catch (error) {\n throw new APIError(\n `Failed to fetch page photos: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_PHOTOS_ERROR',\n error\n );\n }\n }\n\n // ============= Batch/Helper Methods =============\n\n /**\n * Get quick insights summary for a page\n * Combines key metrics in a single call\n * @param pageId - Facebook Page ID\n * @param period - Period for time-based metrics\n * @returns Summary of page insights\n */\n async getPageInsightsSummary(\n pageId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<{\n overview: PageOverview;\n engagement: { views?: number; post_engagements?: number; video_views?: number };\n }> {\n try {\n // Get page overview\n const overview = await this.getPageOverview(pageId);\n\n // Get key metrics\n const insightsResponse = await this.getPageInsights(pageId, {\n metric: [...METRIC_PRESETS.PAGE_OVERVIEW],\n period,\n });\n\n const engagement: { views?: number; post_engagements?: number; video_views?: number } = {};\n\n for (const item of insightsResponse.data) {\n const values = item.values || [];\n const total = values.reduce((sum, v) => sum + (typeof v.value === 'number' ? v.value : 0), 0);\n\n switch (item.name) {\n case 'page_views_total':\n engagement.views = total;\n break;\n case 'page_post_engagements':\n engagement.post_engagements = total;\n break;\n case 'page_video_views':\n engagement.video_views = total;\n break;\n }\n }\n\n return { overview, engagement };\n } catch (error) {\n throw new APIError(\n `Failed to fetch page insights summary: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PAGE_SUMMARY_ERROR',\n error\n );\n }\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n\n // ============= Messaging Methods =============\n\n /**\n * Get conversations (inbox) for a Facebook Page\n * Requires `pages_messaging` permission\n * \n * @param pageId - Facebook Page ID\n * @param options - Pagination and field options\n * @returns Paginated list of conversations\n */\n async getPageConversations(\n pageId: string,\n options: {\n limit?: number;\n after?: string;\n fields?: string[];\n } = {}\n ): Promise<{\n data: Array<{\n id: string;\n participants: { data: Array<{ id: string; name: string; email?: string }> };\n updated_time: string;\n unread_count?: number;\n snippet?: string;\n can_reply?: boolean;\n messages?: { data: Array<{ id: string; message: string; from: { id: string; name: string }; created_time: string }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }> {\n try {\n const defaultFields = [\n 'id',\n 'participants',\n 'updated_time',\n 'unread_count',\n 'snippet',\n 'can_reply',\n 'messages.limit(1){id,message,from,created_time}'\n ];\n\n const params: Record<string, any> = {\n fields: (options.fields || defaultFields).join(','),\n limit: options.limit || 25,\n };\n\n if (options.after) {\n params.after = options.after;\n }\n\n const response = await this.get<{\n data: Array<{\n id: string;\n participants: { data: Array<{ id: string; name: string; email?: string }> };\n updated_time: string;\n unread_count?: number;\n snippet?: string;\n can_reply?: boolean;\n messages?: { data: Array<{ id: string; message: string; from: { id: string; name: string }; created_time: string }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }>(`/${pageId}/conversations`, params);\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch page conversations: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'CONVERSATIONS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get messages from a specific conversation\n * \n * @param conversationId - Conversation ID\n * @param options - Pagination options\n * @returns Paginated list of messages\n */\n async getConversationMessages(\n conversationId: string,\n options: {\n limit?: number;\n after?: string;\n fields?: string[];\n } = {}\n ): Promise<{\n data: Array<{\n id: string;\n message: string;\n from: { id: string; name: string; email?: string };\n to: { data: Array<{ id: string; name: string }> };\n created_time: string;\n attachments?: { data: Array<{ id: string; mime_type: string; name?: string; file_url?: string; image_data?: { url: string } }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }> {\n try {\n const defaultFields = [\n 'id',\n 'message',\n 'from',\n 'to',\n 'created_time',\n 'attachments'\n ];\n\n const params: Record<string, any> = {\n fields: (options.fields || defaultFields).join(','),\n limit: options.limit || 25,\n };\n\n if (options.after) {\n params.after = options.after;\n }\n\n const response = await this.get<{\n data: Array<{\n id: string;\n message: string;\n from: { id: string; name: string; email?: string };\n to: { data: Array<{ id: string; name: string }> };\n created_time: string;\n attachments?: { data: Array<{ id: string; mime_type: string; name?: string; file_url?: string; image_data?: { url: string } }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }>(`/${conversationId}/messages`, params);\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch conversation messages: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MESSAGES_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Send a message in a conversation\n * Uses the Send API for Page messaging\n * \n * @param pageId - Facebook Page ID\n * @param recipientId - PSID (Page-Scoped User ID) of the recipient\n * @param message - Message text to send\n * @param pageAccessToken - Page access token with messaging permission\n * @returns Message send response\n */\n async sendMessage(\n pageId: string,\n recipientId: string,\n message: string,\n pageAccessToken?: string\n ): Promise<{ recipient_id: string; message_id: string }> {\n try {\n const body = {\n recipient: { id: recipientId },\n message: { text: message },\n messaging_type: 'RESPONSE',\n access_token: pageAccessToken || this.accessToken,\n };\n\n const response = await this.post<{ recipient_id: string; message_id: string }>(\n `/${pageId}/messages`,\n body\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to send message: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MESSAGE_SEND_ERROR',\n error\n );\n }\n }\n}\n\n\n","/**\n * Facebook Auth - Facebook Authentication\n */\n\nimport {\n FACEBOOK_GRAPH_API_BASE_URL,\n FACEBOOK_GRAPH_API_VERSION,\n FACEBOOK_OAUTH_AUTHORIZATION_URL,\n} from '../../../core/constants';\nimport { AuthError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport { AuthProvider, AuthResult, UserProfile } from '../../../core/types';\nimport {\n FacebookConfig,\n FacebookExchangeTokenParams,\n FacebookTokenResponse,\n FacebookUserProfile,\n} from '../types';\n\nexport class FacebookAuth implements AuthProvider {\n private httpClient: HttpClient;\n private config: FacebookConfig;\n\n constructor(config: FacebookConfig) {\n this.config = config;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n });\n }\n\n /**\n * Exchange Facebook token for session\n * In Expo + Supabase, this is handled in the app\n * This function only validates and gets profile info\n */\n async exchangeToken(facebookToken: string): Promise<AuthResult> {\n try {\n const profile = await this.getProfile(facebookToken);\n\n return {\n accessToken: facebookToken,\n user: profile,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to exchange Facebook token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'TOKEN_EXCHANGE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Facebook user profile\n */\n async getProfile(accessToken: string): Promise<UserProfile> {\n try {\n const profile = await this.httpClient.get<FacebookUserProfile>('/me', {\n fields: 'id,name,email,picture',\n access_token: accessToken,\n });\n\n return {\n id: profile.id,\n name: profile.name,\n email: profile.email,\n picture: profile.picture?.data?.url,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to fetch Facebook profile: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'PROFILE_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Exchange short-lived token for long-lived token\n */\n async exchangeForLongLivedToken(\n params: FacebookExchangeTokenParams\n ): Promise<string> {\n try {\n const response = await this.httpClient.get<FacebookTokenResponse>(\n '/oauth/access_token',\n {\n grant_type: 'fb_exchange_token',\n client_id: params.appId,\n client_secret: params.appSecret,\n fb_exchange_token: params.shortLivedToken,\n }\n );\n\n return response.access_token;\n } catch (error) {\n throw new AuthError(\n `Failed to exchange for long-lived token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'LONG_LIVED_TOKEN_ERROR',\n error\n );\n }\n }\n\n /**\n * Get OAuth configuration for Facebook\n */\n getOAuthConfig(scopes: string[], redirectUri: string) {\n return {\n authorizationEndpoint: FACEBOOK_OAUTH_AUTHORIZATION_URL,\n tokenEndpoint: `${FACEBOOK_GRAPH_API_BASE_URL}/oauth/access_token`,\n clientId: this.config.appId,\n clientSecret: this.config.appSecret,\n redirectUri,\n scopes,\n responseType: 'token' as const,\n extraParams: {\n display: 'popup',\n },\n };\n }\n\n /**\n * Get authorization URL\n */\n getAuthorizationUrl(scopes: string[], redirectUri: string, state?: string) {\n const params = new URLSearchParams({\n client_id: this.config.appId,\n redirect_uri: redirectUri,\n scope: scopes.join(','),\n response_type: 'token',\n display: 'popup',\n ...(state && { state }),\n });\n\n return `${FACEBOOK_OAUTH_AUTHORIZATION_URL}?${params.toString()}`;\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n}\n\n\n","/**\n * Facebook Provider - Main Facebook provider\n */\n\nimport { FacebookAPI } from './api';\nimport { FacebookAuth } from './auth';\nimport { FacebookConfig } from './types';\n\n/**\n * Facebook provider that encapsulates Auth and API\n */\nexport class FacebookProvider {\n public readonly name = 'facebook' as const;\n public auth: FacebookAuth;\n public api: FacebookAPI;\n public config: FacebookConfig;\n\n constructor(config: FacebookConfig) {\n this.config = config;\n this.auth = new FacebookAuth(config);\n this.api = new FacebookAPI(config);\n }\n\n /**\n * Create new API instance with access token\n */\n createAPIClient(accessToken: string): FacebookAPI {\n return new FacebookAPI(this.config, accessToken);\n }\n\n /**\n * Update access token of existing API client\n */\n setAccessToken(accessToken: string) {\n this.api.setAccessToken(accessToken);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.api.getAccessToken();\n }\n}\n\n","/**\n * Facebook Types - Facebook-specific types\n */\n\nimport { UserProfile } from '../../../core/types';\n\n/**\n * Facebook provider configuration\n * Note: apiVersion is fixed to v24.0 to ensure API compatibility\n */\nexport interface FacebookConfig {\n appId: string;\n appSecret?: string;\n redirectUri?: string;\n}\n\n/**\n * Facebook Scopes (Business Permissions)\n */\nexport enum FacebookScopesBusiness {\n PUBLIC_PROFILE = 'public_profile',\n EMAIL = 'email',\n PAGES_SHOW_LIST = 'pages_show_list',\n PAGES_READ_ENGAGEMENT = 'pages_read_engagement',\n PAGES_MANAGE_POSTS = 'pages_manage_posts',\n ADS_MANAGEMENT = 'ads_management',\n ADS_READ = 'ads_read',\n BUSINESS_MANAGEMENT = 'business_management',\n CATALOG_MANAGEMENT = 'catalog_management',\n COMMERCE_ACCOUNT_MANAGE_ORDERS = 'commerce_account_manage_orders',\n COMMERCE_ACCOUNT_READ_ORDERS = 'commerce_account_read_orders',\n COMMERCE_ACCOUNT_READ_REPORTS = 'commerce_account_read_reports',\n COMMERCE_ACCOUNT_READ_SETTINGS = 'commerce_account_read_settings',\n COMMERCE_MANAGE_ACCOUNTS = 'commerce_manage_accounts',\n // Instagram scopes (updated January 2025 - use instagram_business_ prefix)\n INSTAGRAM_BASIC = 'instagram_business_basic',\n INSTAGRAM_CONTENT_PUBLISH = 'instagram_business_content_publish',\n INSTAGRAM_MANAGE_COMMENTS = 'instagram_business_manage_comments',\n INSTAGRAM_MANAGE_INSIGHTS = 'instagram_business_manage_insights',\n INSTAGRAM_MANAGE_MESSAGES = 'instagram_business_manage_messages',\n INSTAGRAM_SHOPPING_TAG_PRODUCTS = 'instagram_shopping_tag_products',\n LEADS_RETRIEVAL = 'leads_retrieval',\n MANAGE_APP_SOLUTIONS = 'manage_app_solutions',\n MANAGE_FUNDRAISERS = 'manage_fundraisers',\n PAGES_MANAGE_CTA = 'pages_manage_cta',\n PAGE_EVENTS = 'page_events',\n PAGES_MANAGE_ADS = 'pages_manage_ads',\n PAGES_MANAGE_ENGAGEMENT = 'pages_manage_engagement',\n PAGES_MANAGE_INSTANT_ARTICLES = 'pages_manage_instant_articles',\n PAGES_MANAGE_METADATA = 'pages_manage_metadata',\n PAGES_MESSAGING = 'pages_messaging',\n PAGES_READ_USER_CONTENT = 'pages_read_user_content',\n PRIVATE_COMPUTATION_ACCESS = 'private_computation_access',\n PUBLISH_VIDEO = 'publish_video',\n READ_INSIGHTS = 'read_insights',\n READ_AUDIENCE_NETWORK_INSIGHTS = 'read_audience_network_insights',\n WHATSAPP_BUSINESS_MANAGEMENT = 'whatsapp_business_management',\n WHATSAPP_BUSINESS_MESSAGING = 'whatsapp_business_messaging',\n}\n\n/**\n * Facebook Scopes (User Permissions)\n */\nexport enum FacebookScopesUser {\n PUBLIC_PROFILE = 'public_profile',\n EMAIL = 'email',\n USER_FRIENDS = 'user_friends',\n}\n\n/**\n * Facebook Page\n */\nexport interface FacebookPage {\n id: string;\n name: string;\n access_token: string;\n picture?: {\n data: {\n url: string;\n };\n };\n}\n\n/**\n * Facebook user profile\n */\nexport interface FacebookUserProfile extends UserProfile {\n id: string;\n name: string;\n email?: string;\n picture?: {\n data: {\n url: string;\n };\n };\n}\n\n/**\n * Facebook pages response\n */\nexport interface FacebookPagesResponse {\n data: FacebookPage[];\n paging?: {\n cursors: {\n before: string;\n after: string;\n };\n next?: string;\n previous?: string;\n };\n}\n\n/**\n * Facebook post response\n */\nexport interface FacebookPostResponse {\n id: string;\n post_id?: string;\n}\n\n/**\n * Parameters for publishing to Facebook\n */\nexport interface FacebookPublishPostParams {\n pageId: string;\n pageAccessToken: string;\n message?: string;\n imageUrl?: string;\n scheduledPublishTime?: number; // Unix timestamp\n}\n\n/**\n * Parameters for token exchange\n */\nexport interface FacebookExchangeTokenParams {\n shortLivedToken: string;\n appId: string;\n appSecret: string;\n}\n\n/**\n * Token exchange response\n */\nexport interface FacebookTokenResponse {\n access_token: string;\n token_type?: string;\n expires_in?: number;\n}\n\n/**\n * Facebook error\n */\nexport interface FacebookErrorResponse {\n error: {\n message: string;\n type: string;\n code: number;\n fbtrace_id: string;\n };\n}\n\n\n","/**\n * Instagram Auth - Instagram Authentication\n * Instagram uses Facebook Graph API, so authentication is similar\n */\n\nimport {\n FACEBOOK_GRAPH_API_BASE_URL,\n FACEBOOK_GRAPH_API_VERSION,\n FACEBOOK_OAUTH_AUTHORIZATION_URL,\n} from '../../../core/constants';\nimport { AuthError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport { AuthProvider, AuthResult, UserProfile } from '../../../core/types';\nimport { InstagramConfig, InstagramProfile } from '../types';\n\nexport class InstagramAuth implements AuthProvider {\n private httpClient: HttpClient;\n private config: InstagramConfig;\n\n constructor(config: InstagramConfig) {\n this.config = config;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n });\n }\n\n /**\n * Exchange Instagram/Facebook token for session\n */\n async exchangeToken(instagramToken: string): Promise<AuthResult> {\n try {\n const profile = await this.getProfile(instagramToken);\n\n return {\n accessToken: instagramToken,\n user: profile,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to exchange Instagram token: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'TOKEN_EXCHANGE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Instagram user profile\n * First gets Facebook profile, then Instagram Business profile\n */\n async getProfile(accessToken: string): Promise<UserProfile> {\n try {\n // Get Instagram accounts connected to Facebook page\n const response = await this.httpClient.get<any>('/me/accounts', {\n fields: 'instagram_business_account',\n access_token: accessToken,\n });\n\n if (!response.data || response.data.length === 0) {\n throw new AuthError(\n 'No Instagram business account found',\n 'NO_INSTAGRAM_ACCOUNT'\n );\n }\n\n // Get first Instagram account\n const instagramAccountId =\n response.data[0]?.instagram_business_account?.id;\n\n if (!instagramAccountId) {\n throw new AuthError(\n 'No Instagram business account ID found',\n 'NO_INSTAGRAM_ACCOUNT_ID'\n );\n }\n\n // Get Instagram profile data\n const profile = await this.httpClient.get<InstagramProfile>(\n `/${instagramAccountId}`,\n {\n fields: 'id,username,name,account_type,profile_picture_url',\n access_token: accessToken,\n }\n );\n\n return {\n id: profile.id,\n name: profile.name || profile.username,\n username: profile.username,\n picture: profile.profile_picture_url,\n };\n } catch (error) {\n throw new AuthError(\n `Failed to fetch Instagram profile: ${error instanceof Error ? error.message : 'Unknown error'}`,\n 'PROFILE_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get OAuth configuration for Instagram\n * Instagram uses the same OAuth flow as Facebook\n */\n getOAuthConfig(scopes: string[], redirectUri: string) {\n return {\n authorizationEndpoint: FACEBOOK_OAUTH_AUTHORIZATION_URL,\n tokenEndpoint: `${FACEBOOK_GRAPH_API_BASE_URL}/oauth/access_token`,\n clientId: this.config.appId,\n clientSecret: this.config.appSecret,\n redirectUri,\n scopes,\n responseType: 'token' as const,\n extraParams: {\n display: 'popup',\n },\n };\n }\n\n /**\n * Get authorization URL\n */\n getAuthorizationUrl(scopes: string[], redirectUri: string, state?: string) {\n const params = new URLSearchParams({\n client_id: this.config.appId,\n redirect_uri: redirectUri,\n scope: scopes.join(','),\n response_type: 'token',\n display: 'popup',\n ...(state && { state }),\n });\n\n return `${FACEBOOK_OAUTH_AUTHORIZATION_URL}?${params.toString()}`;\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n}\n\n\n","/**\n * Instagram API - Instagram API Client\n * Uses Instagram Graph API (part of Facebook Graph API)\n */\n\nimport { FACEBOOK_GRAPH_API_BASE_URL, FACEBOOK_GRAPH_API_VERSION } from '../../../core/constants';\nimport { APIError } from '../../../core/errors';\nimport { HttpClient } from '../../../core/http';\nimport {\n INSTAGRAM_MEDIA_METRICS_COMMON,\n INSTAGRAM_REELS_METRICS,\n INSTAGRAM_STORIES_METRICS,\n METRIC_PRESETS\n} from '../../../core/insights.constants';\nimport { APIClient, RequestOptions } from '../../../core/types';\nimport {\n InstagramAccountSummary,\n InstagramMediaInsights,\n} from '../../../core/types/insights.types';\nimport {\n InstagramAccount,\n InstagramComment,\n InstagramCommentsResponse,\n InstagramConfig,\n InstagramInsights,\n InstagramInsightsParams,\n InstagramMedia,\n InstagramMediaContainerResponse,\n InstagramMediaResponse,\n InstagramPublishParams,\n InstagramPublishResponse\n} from '../types';\n\nexport class InstagramAPI implements APIClient {\n private httpClient: HttpClient;\n private config: InstagramConfig;\n private accessToken?: string;\n\n constructor(config: InstagramConfig, accessToken?: string) {\n this.config = config;\n this.accessToken = accessToken;\n\n this.httpClient = new HttpClient({\n baseURL: FACEBOOK_GRAPH_API_BASE_URL,\n accessToken: this.accessToken,\n });\n }\n\n /**\n * Generic request\n */\n async request<T>(endpoint: string, options: RequestOptions = {}): Promise<T> {\n // Add access token to params if exists\n if (this.accessToken && !options.params?.access_token) {\n options.params = {\n ...options.params,\n access_token: this.accessToken,\n };\n }\n\n return this.httpClient.request<T>(endpoint, options);\n }\n\n /**\n * GET request\n */\n async get<T>(endpoint: string, params?: Record<string, any>): Promise<T> {\n return this.request<T>(endpoint, { method: 'GET', params });\n }\n\n /**\n * POST request\n */\n async post<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'POST', body });\n }\n\n /**\n * PUT request\n */\n async put<T>(endpoint: string, body?: any): Promise<T> {\n return this.request<T>(endpoint, { method: 'PUT', body });\n }\n\n /**\n * DELETE request\n */\n async delete<T>(endpoint: string): Promise<T> {\n return this.request<T>(endpoint, { method: 'DELETE' });\n }\n\n /**\n * Update access token\n */\n setAccessToken(token: string) {\n this.accessToken = token;\n this.httpClient.setAccessToken(token);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.accessToken;\n }\n\n // ============= Instagram-specific methods =============\n\n /**\n * Get user's Instagram Business account (single account from first page)\n */\n async getAccount(pageAccessToken?: string): Promise<InstagramAccount> {\n try {\n const token = pageAccessToken || this.accessToken;\n if (!token) {\n throw new APIError('Access token is required', 401, 'NO_TOKEN');\n }\n\n // Get Facebook pages with Instagram accounts\n const response = await this.get<any>('/me/accounts', {\n fields: 'instagram_business_account',\n access_token: token,\n });\n\n if (!response.data || response.data.length === 0) {\n throw new APIError(\n 'No Instagram business account found',\n 404,\n 'NO_INSTAGRAM_ACCOUNT'\n );\n }\n\n const instagramAccountId =\n response.data[0]?.instagram_business_account?.id;\n\n if (!instagramAccountId) {\n throw new APIError(\n 'No Instagram business account ID found',\n 404,\n 'NO_INSTAGRAM_ACCOUNT_ID'\n );\n }\n\n // Get Instagram account data\n const account = await this.get<InstagramAccount>(\n `/${instagramAccountId}`,\n {\n fields:\n 'id,username,name,profile_picture_url,followers_count,follows_count,media_count',\n access_token: token,\n }\n );\n\n return account;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram account: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'ACCOUNT_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get all Instagram Business accounts linked to user's Facebook pages\n * Returns all Instagram accounts from all connected Facebook pages\n */\n async getInstagramAccounts(userAccessToken?: string): Promise<InstagramAccount[]> {\n try {\n const token = userAccessToken || this.accessToken;\n if (!token) {\n throw new APIError('Access token is required', 401, 'NO_TOKEN');\n }\n\n // Get Facebook pages with Instagram business accounts\n const response = await this.get<any>('/me/accounts', {\n fields: 'id,name,instagram_business_account{id,username,name,profile_picture_url,followers_count,follows_count,media_count}',\n access_token: token,\n });\n\n if (!response.data || response.data.length === 0) {\n console.log(' ℹ️ No Facebook pages found');\n return [];\n }\n\n // Extract Instagram accounts from pages that have them\n const instagramAccounts: InstagramAccount[] = [];\n\n for (const page of response.data) {\n if (page.instagram_business_account) {\n instagramAccounts.push({\n id: page.instagram_business_account.id,\n username: page.instagram_business_account.username,\n name: page.instagram_business_account.name,\n profile_picture_url: page.instagram_business_account.profile_picture_url,\n followers_count: page.instagram_business_account.followers_count,\n follows_count: page.instagram_business_account.follows_count,\n media_count: page.instagram_business_account.media_count,\n });\n }\n }\n\n console.log(` ✅ Found ${instagramAccounts.length} Instagram account(s)`);\n return instagramAccounts;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram accounts: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'ACCOUNTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Instagram media\n */\n async getMedia(\n instagramAccountId: string,\n limit: number = 25\n ): Promise<InstagramMedia[]> {\n try {\n const response = await this.get<InstagramMediaResponse>(\n `/${instagramAccountId}/media`,\n {\n fields:\n 'id,media_type,media_url,thumbnail_url,permalink,caption,timestamp,like_count,comments_count',\n limit,\n }\n );\n\n return response.data;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram media: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Publish photo to Instagram (2-step process)\n */\n async publishPhoto(\n params: InstagramPublishParams\n ): Promise<InstagramPublishResponse> {\n const { instagramAccountId, imageUrl, caption } = params;\n\n if (!imageUrl) {\n throw new APIError(\n 'Image URL is required for photo posts',\n 400,\n 'INVALID_PARAMS'\n );\n }\n\n try {\n // Step 1: Create media container\n const containerResponse =\n await this.post<InstagramMediaContainerResponse>(\n `/${instagramAccountId}/media`,\n {\n image_url: imageUrl,\n caption: caption || '',\n }\n );\n\n // Step 2: Publish the container\n const publishResponse = await this.post<InstagramPublishResponse>(\n `/${instagramAccountId}/media_publish`,\n {\n creation_id: containerResponse.id,\n }\n );\n\n return publishResponse;\n } catch (error) {\n throw new APIError(\n `Failed to publish photo: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'PHOTO_PUBLISH_ERROR',\n error\n );\n }\n }\n\n /**\n * Publish video to Instagram (2-step process)\n */\n async publishVideo(\n params: InstagramPublishParams\n ): Promise<InstagramPublishResponse> {\n const { instagramAccountId, videoUrl, caption } = params;\n\n if (!videoUrl) {\n throw new APIError(\n 'Video URL is required for video posts',\n 400,\n 'INVALID_PARAMS'\n );\n }\n\n try {\n // Step 1: Create media container\n const containerResponse =\n await this.post<InstagramMediaContainerResponse>(\n `/${instagramAccountId}/media`,\n {\n media_type: 'VIDEO',\n video_url: videoUrl,\n caption: caption || '',\n }\n );\n\n // Step 2: Publish the container (may take time while video is processed)\n const publishResponse = await this.post<InstagramPublishResponse>(\n `/${instagramAccountId}/media_publish`,\n {\n creation_id: containerResponse.id,\n }\n );\n\n return publishResponse;\n } catch (error) {\n throw new APIError(\n `Failed to publish video: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'VIDEO_PUBLISH_ERROR',\n error\n );\n }\n }\n\n /**\n * Delete Instagram media\n */\n async deleteMedia(mediaId: string): Promise<boolean> {\n try {\n const response = await this.delete<{ success: boolean }>(\n `/${mediaId}`\n );\n\n return response.success === true;\n } catch (error) {\n throw new APIError(\n `Failed to delete media: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_DELETE_ERROR',\n error\n );\n }\n }\n\n /**\n * Get comments for a media item\n * @param mediaId - Media ID\n * @param limit - Max number of comments to fetch (default: 25)\n * @returns Array of comments\n */\n async getMediaComments(\n mediaId: string,\n limit: number = 25\n ): Promise<InstagramComment[]> {\n try {\n const response = await this.get<InstagramCommentsResponse>(\n `/${mediaId}/comments`,\n {\n fields: 'id,text,timestamp,username,like_count,from{id,username},replies{id,text,timestamp,username,like_count}',\n limit,\n }\n );\n\n return response.data || [];\n } catch (error) {\n throw new APIError(\n `Failed to fetch comments: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'COMMENTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get Instagram account insights\n */\n async getAccountInsights(\n instagramAccountId: string,\n params: InstagramInsightsParams\n ): Promise<InstagramInsights> {\n try {\n const { metric, period, metric_type, since, until } = params;\n\n const response = await this.get<InstagramInsights>(\n `/${instagramAccountId}/insights`,\n {\n metric: metric.join(','),\n period: period || 'day',\n metric_type: metric_type || 'total_value',\n ...(since && { since }),\n ...(until && { until }),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'INSIGHTS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get specific media insights\n */\n async getMediaInsights(mediaId: string, metrics: string[]): Promise<InstagramInsights> {\n try {\n const response = await this.get<InstagramInsights>(\n `/${mediaId}/insights`,\n {\n metric: metrics.join(','),\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch media insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_INSIGHTS_ERROR',\n error\n );\n }\n }\n\n // ============= Enhanced Insights Methods =============\n\n /**\n * Get account insights with default metrics\n * Uses updated metrics (views instead of impressions)\n * @param instagramAccountId - Instagram Account ID\n * @param period - Period for metrics\n * @returns Account insights\n */\n async getAccountInsightsOverview(\n instagramAccountId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<InstagramInsights> {\n return this.getAccountInsights(instagramAccountId, {\n metric: [...METRIC_PRESETS.INSTAGRAM_OVERVIEW],\n period,\n metric_type: 'total_value',\n });\n }\n\n /**\n * Get account summary with parsed values\n * @param instagramAccountId - Instagram Account ID\n * @param period - Period for metrics\n * @returns Parsed account summary\n */\n async getAccountSummary(\n instagramAccountId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<InstagramAccountSummary> {\n try {\n // Get account basic info\n const account = await this.get<InstagramAccount>(`/${instagramAccountId}`, {\n fields: 'id,username,followers_count',\n });\n\n // Get insights\n const insights = await this.getAccountInsightsOverview(instagramAccountId, period);\n\n const summary: InstagramAccountSummary = {\n id: account.id,\n username: account.username,\n followers_count: account.followers_count || 0,\n };\n\n for (const item of insights.data) {\n const value = item.total_value?.value ?? item.values?.[0]?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'views':\n summary.views = value;\n break;\n case 'reach':\n summary.reach = value;\n break;\n case 'accounts_engaged':\n summary.accounts_engaged = value;\n break;\n case 'total_interactions':\n summary.total_interactions = value;\n break;\n }\n }\n\n return summary;\n } catch (error) {\n throw new APIError(\n `Failed to fetch account summary: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'ACCOUNT_SUMMARY_ERROR',\n error\n );\n }\n }\n\n /**\n * Get media insights based on media type\n * Automatically selects appropriate metrics\n * @param mediaId - Media ID\n * @param mediaType - Type of media\n * @returns Media insights\n */\n async getMediaInsightsByType(\n mediaId: string,\n mediaType: 'IMAGE' | 'VIDEO' | 'CAROUSEL_ALBUM' | 'REELS'\n ): Promise<InstagramInsights> {\n let metrics: readonly string[];\n\n switch (mediaType) {\n case 'REELS':\n metrics = INSTAGRAM_REELS_METRICS;\n break;\n case 'VIDEO':\n metrics = [...INSTAGRAM_MEDIA_METRICS_COMMON, 'plays'];\n break;\n default:\n metrics = INSTAGRAM_MEDIA_METRICS_COMMON;\n }\n\n return this.getMediaInsights(mediaId, [...metrics]);\n }\n\n /**\n * Get media insights with parsed values\n * @param mediaId - Media ID\n * @param mediaType - Type of media\n * @returns Parsed media insights\n */\n async getMediaInsightsParsed(\n mediaId: string,\n mediaType: 'IMAGE' | 'VIDEO' | 'CAROUSEL_ALBUM' | 'REELS' = 'IMAGE'\n ): Promise<InstagramMediaInsights> {\n try {\n const response = await this.getMediaInsightsByType(mediaId, mediaType);\n\n const insights: InstagramMediaInsights = {\n id: mediaId,\n media_type: mediaType,\n };\n\n for (const item of response.data) {\n const value = item.total_value?.value ?? item.values?.[0]?.value;\n if (typeof value !== 'number') continue;\n\n switch (item.name) {\n case 'views':\n insights.views = value;\n break;\n case 'reach':\n insights.reach = value;\n break;\n case 'likes':\n insights.likes = value;\n break;\n case 'comments':\n insights.comments = value;\n break;\n case 'shares':\n insights.shares = value;\n break;\n case 'saved':\n insights.saves = value;\n break;\n case 'plays':\n insights.plays = value;\n break;\n case 'total_interactions':\n insights.total_interactions = value;\n break;\n }\n }\n\n return insights;\n } catch (error) {\n throw new APIError(\n `Failed to fetch parsed media insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MEDIA_INSIGHTS_PARSED_ERROR',\n error\n );\n }\n }\n\n /**\n * Get story insights\n * @param storyId - Story media ID\n * @returns Story insights\n */\n async getStoryInsights(storyId: string): Promise<InstagramInsights> {\n return this.getMediaInsights(storyId, [...INSTAGRAM_STORIES_METRICS]);\n }\n\n /**\n * Get reels insights\n * @param reelId - Reel media ID\n * @returns Reel insights\n */\n async getReelInsights(reelId: string): Promise<InstagramInsights> {\n return this.getMediaInsights(reelId, [...INSTAGRAM_REELS_METRICS]);\n }\n\n /**\n * Get engagement metrics for account\n * @param instagramAccountId - Instagram Account ID\n * @param period - Period for metrics\n * @returns Engagement insights\n */\n async getEngagementInsights(\n instagramAccountId: string,\n period: 'day' | 'week' | 'days_28' = 'days_28'\n ): Promise<InstagramInsights> {\n return this.getAccountInsights(instagramAccountId, {\n metric: [...METRIC_PRESETS.INSTAGRAM_ENGAGEMENT],\n period,\n metric_type: 'total_value',\n });\n }\n\n /**\n * Get demographics insights for account\n * @param instagramAccountId - Instagram Account ID\n * @param breakdown - Demographic breakdown type\n * @returns Demographics insights\n */\n async getDemographicsInsights(\n instagramAccountId: string,\n breakdown: 'city' | 'country' | 'age' | 'gender' = 'country'\n ): Promise<InstagramInsights> {\n try {\n const response = await this.get<InstagramInsights>(\n `/${instagramAccountId}/insights`,\n {\n metric: 'follower_demographics',\n period: 'lifetime',\n metric_type: 'total_value',\n breakdown,\n }\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch demographics insights: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'DEMOGRAPHICS_ERROR',\n error\n );\n }\n }\n\n /**\n * Get current API version (read-only)\n */\n getApiVersion(): string {\n return FACEBOOK_GRAPH_API_VERSION;\n }\n\n // ============= Messaging Methods =============\n\n /**\n * Get conversations (inbox) for an Instagram Professional account\n * Requires `instagram_manage_messages` permission\n * \n * @param instagramAccountId - Instagram Business/Creator Account ID\n * @param options - Pagination and field options\n * @returns Paginated list of conversations\n */\n async getConversations(\n instagramAccountId: string,\n options: {\n limit?: number;\n after?: string;\n fields?: string[];\n } = {}\n ): Promise<{\n data: Array<{\n id: string;\n participants: { data: Array<{ id: string; username: string }> };\n updated_time: string;\n messages?: { data: Array<{ id: string; message: string; from: { id: string; username: string }; created_time: string }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }> {\n try {\n const defaultFields = [\n 'id',\n 'participants',\n 'updated_time',\n 'messages.limit(1){id,message,from,created_time}'\n ];\n\n const params: Record<string, any> = {\n fields: (options.fields || defaultFields).join(','),\n limit: options.limit || 25,\n };\n\n if (options.after) {\n params.after = options.after;\n }\n\n const response = await this.get<{\n data: Array<{\n id: string;\n participants: { data: Array<{ id: string; username: string }> };\n updated_time: string;\n messages?: { data: Array<{ id: string; message: string; from: { id: string; username: string }; created_time: string }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }>(`/${instagramAccountId}/conversations`, params);\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram conversations: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'CONVERSATIONS_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Get messages from a specific Instagram conversation\n * \n * @param conversationId - Conversation ID\n * @param options - Pagination options\n * @returns Paginated list of messages\n */\n async getConversationMessages(\n conversationId: string,\n options: {\n limit?: number;\n after?: string;\n fields?: string[];\n } = {}\n ): Promise<{\n data: Array<{\n id: string;\n message: string;\n from: { id: string; username: string };\n to: { data: Array<{ id: string; username: string }> };\n created_time: string;\n attachments?: { data: Array<{ id: string; mime_type: string; file_url?: string; image_data?: { url: string } }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }> {\n try {\n const defaultFields = [\n 'id',\n 'message',\n 'from',\n 'to',\n 'created_time',\n 'attachments'\n ];\n\n const params: Record<string, any> = {\n fields: (options.fields || defaultFields).join(','),\n limit: options.limit || 25,\n };\n\n if (options.after) {\n params.after = options.after;\n }\n\n const response = await this.get<{\n data: Array<{\n id: string;\n message: string;\n from: { id: string; username: string };\n to: { data: Array<{ id: string; username: string }> };\n created_time: string;\n attachments?: { data: Array<{ id: string; mime_type: string; file_url?: string; image_data?: { url: string } }> };\n }>;\n paging?: { cursors?: { before?: string; after?: string }; next?: string };\n }>(`/${conversationId}/messages`, params);\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to fetch Instagram messages: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MESSAGES_FETCH_ERROR',\n error\n );\n }\n }\n\n /**\n * Send a message to an Instagram user\n * Uses the Instagram Send API\n * \n * @param instagramAccountId - Instagram Business/Creator Account ID\n * @param recipientId - Instagram-scoped ID of the recipient\n * @param message - Message text to send\n * @returns Message send response\n */\n async sendMessage(\n instagramAccountId: string,\n recipientId: string,\n message: string\n ): Promise<{ recipient_id: string; message_id: string }> {\n try {\n const body = {\n recipient: { id: recipientId },\n message: { text: message },\n };\n\n const response = await this.post<{ recipient_id: string; message_id: string }>(\n `/${instagramAccountId}/messages`,\n body\n );\n\n return response;\n } catch (error) {\n throw new APIError(\n `Failed to send Instagram message: ${error instanceof Error ? error.message : 'Unknown error'}`,\n undefined,\n 'MESSAGE_SEND_ERROR',\n error\n );\n }\n }\n}\n\n\n","/**\n * Instagram Provider - Main Instagram provider\n */\n\nimport { InstagramAuth } from './auth';\nimport { InstagramAPI } from './api';\nimport { InstagramConfig } from './types';\n\n/**\n * Instagram provider that encapsulates Auth and API\n */\nexport class InstagramProvider {\n public readonly name = 'instagram' as const;\n public auth: InstagramAuth;\n public api: InstagramAPI;\n public config: InstagramConfig;\n\n constructor(config: InstagramConfig) {\n this.config = config;\n this.auth = new InstagramAuth(config);\n this.api = new InstagramAPI(config);\n }\n\n /**\n * Create new API instance with access token\n */\n createAPIClient(accessToken: string): InstagramAPI {\n return new InstagramAPI(this.config, accessToken);\n }\n\n /**\n * Update access token of existing API client\n */\n setAccessToken(accessToken: string) {\n this.api.setAccessToken(accessToken);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.api.getAccessToken();\n }\n}\n\n\n","/**\n * Instagram Types - Instagram-specific types\n */\n\nimport { UserProfile } from '../../../core/types';\n\n/**\n * Instagram provider configuration\n * Note: Instagram uses Facebook Graph API, version is fixed to v24.0 to ensure API compatibility\n */\nexport interface InstagramConfig {\n appId: string; // Facebook App ID (Instagram uses Facebook Graph API)\n appSecret?: string;\n redirectUri?: string;\n}\n\n/**\n * Instagram Scopes\n */\nexport enum InstagramScopes {\n BASIC = 'instagram_basic',\n CONTENT_PUBLISH = 'instagram_content_publish',\n MANAGE_COMMENTS = 'instagram_manage_comments',\n MANAGE_INSIGHTS = 'instagram_manage_insights',\n MANAGE_MESSAGES = 'instagram_manage_messages',\n SHOPPING_TAG_PRODUCTS = 'instagram_shopping_tag_products',\n}\n\n/**\n * Instagram Profile\n */\nexport interface InstagramProfile extends UserProfile {\n id: string;\n username: string;\n name?: string;\n account_type?: 'BUSINESS' | 'MEDIA_CREATOR' | 'PERSONAL';\n profile_picture_url?: string;\n followers_count?: number;\n follows_count?: number;\n media_count?: number;\n}\n\n/**\n * Instagram Business/Creator Account\n */\nexport interface InstagramAccount {\n id: string;\n username: string;\n name?: string;\n profile_picture_url?: string;\n followers_count?: number;\n follows_count?: number;\n media_count?: number;\n}\n\n/**\n * Instagram media types\n */\nexport type InstagramMediaType = 'IMAGE' | 'VIDEO' | 'CAROUSEL_ALBUM' | 'REELS';\n\n/**\n * Instagram Media\n */\nexport interface InstagramMedia {\n id: string;\n media_type: InstagramMediaType;\n media_url: string;\n thumbnail_url?: string;\n permalink: string;\n caption?: string;\n timestamp: string;\n like_count?: number;\n comments_count?: number;\n}\n\n/**\n * Parameters for publishing to Instagram\n */\nexport interface InstagramPublishParams {\n instagramAccountId: string;\n imageUrl?: string;\n videoUrl?: string;\n caption?: string;\n location_id?: string;\n user_tags?: Array<{ username: string; x: number; y: number }>;\n is_carousel?: boolean;\n children?: string[]; // Media IDs for carousel\n}\n\n/**\n * Media container creation response\n */\nexport interface InstagramMediaContainerResponse {\n id: string;\n}\n\n/**\n * Instagram publish response\n */\nexport interface InstagramPublishResponse {\n id: string;\n}\n\n/**\n * Media list response\n */\nexport interface InstagramMediaResponse {\n data: InstagramMedia[];\n paging?: {\n cursors: {\n before: string;\n after: string;\n };\n next?: string;\n previous?: string;\n };\n}\n\n/**\n * Instagram Insights\n */\nexport interface InstagramInsights {\n data: Array<{\n name: string;\n period: string;\n values?: Array<{\n value: number;\n end_time?: string;\n }>;\n total_value?: {\n value: number;\n breakdowns?: Array<{\n dimension_keys: string[];\n results: Array<{\n dimension_values: string[];\n value: number;\n end_time?: string;\n }>;\n }>;\n };\n title?: string;\n description?: string;\n }>;\n}\n\n/**\n * Parameters for getting insights\n */\nexport interface InstagramInsightsParams {\n metric: string[];\n period?: 'day' | 'week' | 'days_28' | 'lifetime';\n metric_type?: 'time_series' | 'total_value';\n since?: number;\n until?: number;\n}\n\n/**\n * Instagram Comment\n */\nexport interface InstagramComment {\n id: string;\n text: string;\n timestamp: string;\n username: string;\n like_count?: number;\n from?: {\n id: string;\n username: string;\n };\n replies?: {\n data: InstagramComment[];\n };\n}\n\n/**\n * Instagram Comments Response\n */\nexport interface InstagramCommentsResponse {\n data: InstagramComment[];\n paging?: {\n cursors: {\n before: string;\n after: string;\n };\n next?: string;\n previous?: string;\n };\n}\n\n","/**\n * TikTok API Constants\n */\n\n/**\n * TikTok API Version\n * @see https://developers.tiktok.com/doc/about-tiktok-api-versions\n */\nexport const TIKTOK_API_VERSION = 'v2' as const;\n\n/**\n * TikTok API Base URL\n */\nexport const TIKTOK_API_BASE_URL = `https://open.tiktokapis.com/${TIKTOK_API_VERSION}` as const;\n\n/**\n * TikTok OAuth URLs\n */\nexport const TIKTOK_OAUTH_AUTHORIZATION_URL = 'https://www.tiktok.com/v2/auth/authorize/' as const;\nexport const TIKTOK_OAUTH_TOKEN_URL = 'https://open.tiktokapis.com/v2/oauth/token/' as const;\nexport const TIKTOK_OAUTH_REVOKE_URL = 'https://open.tiktokapis.com/v2/oauth/revoke/' as const;\n\n/**\n * TikTok OAuth Scopes\n * @see https://developers.tiktok.com/doc/tiktok-api-scopes\n */\nexport const TikTokScopes = {\n // User info scopes\n USER_INFO_BASIC: 'user.info.basic',\n USER_INFO_PROFILE: 'user.info.profile',\n USER_INFO_STATS: 'user.info.stats',\n \n // Video scopes\n VIDEO_LIST: 'video.list',\n VIDEO_PUBLISH: 'video.publish',\n VIDEO_UPLOAD: 'video.upload',\n} as const;\n\nexport type TikTokScope = typeof TikTokScopes[keyof typeof TikTokScopes];\n\n/**\n * Default scopes for TikTok connection\n */\nexport const TIKTOK_DEFAULT_SCOPES: TikTokScope[] = [\n TikTokScopes.USER_INFO_BASIC,\n TikTokScopes.USER_INFO_PROFILE,\n TikTokScopes.USER_INFO_STATS,\n TikTokScopes.VIDEO_LIST,\n TikTokScopes.VIDEO_PUBLISH,\n TikTokScopes.VIDEO_UPLOAD,\n];\n","/**\n * TikTok API - API client for TikTok endpoints\n */\n\nimport { TIKTOK_API_BASE_URL } from '../constants';\nimport {\n TikTokAccountInsights,\n TikTokAPIResponse,\n TikTokConfig,\n TikTokInsights,\n TikTokInsightsParams,\n TikTokPublishStatusResponse,\n TikTokUploadInitResponse,\n TikTokUserInfo,\n TikTokVideoInsights,\n TikTokVideoListResponse,\n} from '../types';\n\n/**\n * TikTok API client\n */\nexport class TikTokAPI {\n private _config: TikTokConfig;\n private accessToken?: string;\n\n constructor(config: TikTokConfig, accessToken?: string) {\n this._config = config;\n this.accessToken = accessToken;\n }\n\n /**\n * Set access token\n */\n setAccessToken(accessToken: string) {\n this.accessToken = accessToken;\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.accessToken;\n }\n\n /**\n * Make authenticated API request\n */\n private async request<T>(\n endpoint: string,\n options: RequestInit = {}\n ): Promise<TikTokAPIResponse<T>> {\n if (!this.accessToken) {\n throw new Error('Access token is required');\n }\n\n const url = `${TIKTOK_API_BASE_URL}${endpoint}`;\n\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Authorization': `Bearer ${this.accessToken}`,\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n const data = await response.json();\n\n if (data.error && data.error.code !== 'ok') {\n throw new Error(data.error.message || 'TikTok API error');\n }\n\n return data;\n }\n\n /**\n * Get user info\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-get-user-info\n */\n async getUserInfo(fields?: string[]): Promise<TikTokUserInfo> {\n const defaultFields = [\n 'open_id',\n 'union_id',\n 'avatar_url',\n 'avatar_url_100',\n 'avatar_large_url',\n 'display_name',\n 'bio_description',\n 'profile_deep_link',\n 'is_verified',\n 'follower_count',\n 'following_count',\n 'likes_count',\n 'video_count',\n ];\n\n const params = new URLSearchParams({\n fields: (fields || defaultFields).join(','),\n });\n\n const response = await this.request<{ user: TikTokUserInfo }>(\n `/user/info/?${params.toString()}`\n );\n\n return response.data.user;\n }\n\n /**\n * Get user's videos\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-video-list\n */\n async getVideoList(options?: {\n cursor?: number;\n maxCount?: number;\n fields?: string[];\n }): Promise<TikTokVideoListResponse> {\n const defaultFields = [\n 'id',\n 'create_time',\n 'cover_image_url',\n 'share_url',\n 'video_description',\n 'duration',\n 'height',\n 'width',\n 'title',\n 'embed_html',\n 'embed_link',\n 'like_count',\n 'comment_count',\n 'share_count',\n 'view_count',\n ];\n\n const body = {\n max_count: options?.maxCount || 20,\n cursor: options?.cursor,\n fields: options?.fields || defaultFields,\n };\n\n const response = await this.request<TikTokVideoListResponse>('/video/list/', {\n method: 'POST',\n body: JSON.stringify(body),\n });\n\n return response.data;\n }\n\n /**\n * Initialize direct video upload\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-post-publish-video-init\n */\n async initVideoUpload(options: {\n sourceInfo: {\n source: 'FILE_UPLOAD' | 'PULL_FROM_URL';\n videoSize?: number;\n chunkSize?: number;\n totalChunkCount?: number;\n videoUrl?: string;\n };\n postInfo?: {\n title?: string;\n privacyLevel?: 'PUBLIC_TO_EVERYONE' | 'MUTUAL_FOLLOW_FRIENDS' | 'SELF_ONLY';\n disableDuet?: boolean;\n disableStitch?: boolean;\n disableComment?: boolean;\n videoCoverTimestampMs?: number;\n };\n }): Promise<TikTokUploadInitResponse> {\n const response = await this.request<TikTokUploadInitResponse>(\n '/post/publish/video/init/',\n {\n method: 'POST',\n body: JSON.stringify({\n source_info: options.sourceInfo,\n post_info: options.postInfo,\n }),\n }\n );\n\n return response.data;\n }\n\n /**\n * Get publish status\n * @see https://developers.tiktok.com/doc/tiktok-api-v2-post-publish-status-fetch\n */\n async getPublishStatus(publishId: string): Promise<TikTokPublishStatusResponse> {\n const response = await this.request<TikTokPublishStatusResponse>(\n '/post/publish/status/fetch/',\n {\n method: 'POST',\n body: JSON.stringify({ publish_id: publishId }),\n }\n );\n\n return response.data;\n }\n\n /**\n * Get account insights (aggregated from user info and recent videos)\n * TikTok doesn't have a dedicated insights API like Instagram/Facebook,\n * so we compute metrics from user info and video stats\n */\n async getAccountInsights(): Promise<TikTokAccountInsights> {\n // Get user info for follower/following counts\n const userInfo = await this.getUserInfo();\n\n // Get recent videos for engagement metrics\n const videoList = await this.getVideoList({ maxCount: 50 });\n\n // Calculate totals from videos\n let totalViews = 0;\n let totalLikes = 0;\n let totalComments = 0;\n let totalShares = 0;\n\n for (const video of videoList.videos) {\n totalViews += video.view_count || 0;\n totalLikes += video.like_count || 0;\n totalComments += video.comment_count || 0;\n totalShares += video.share_count || 0;\n }\n\n // Calculate average engagement rate\n // Engagement Rate = (likes + comments + shares) / views * 100\n const totalEngagements = totalLikes + totalComments + totalShares;\n const averageEngagementRate = totalViews > 0\n ? (totalEngagements / totalViews) * 100\n : 0;\n\n return {\n followerCount: userInfo.follower_count || 0,\n followingCount: userInfo.following_count || 0,\n likesCount: userInfo.likes_count || 0,\n videoCount: userInfo.video_count || 0,\n totalViews,\n totalComments,\n totalShares,\n averageEngagementRate: Math.round(averageEngagementRate * 100) / 100, // Round to 2 decimals\n };\n }\n\n /**\n * Get insights for a specific video\n */\n async getVideoInsights(videoId: string): Promise<TikTokVideoInsights | null> {\n const videoList = await this.getVideoList({ maxCount: 50 });\n\n const video = videoList.videos.find(v => v.id === videoId);\n if (!video) {\n return null;\n }\n\n const viewCount = video.view_count || 0;\n const likeCount = video.like_count || 0;\n const commentCount = video.comment_count || 0;\n const shareCount = video.share_count || 0;\n\n // Calculate engagement rate for this video\n const engagementRate = viewCount > 0\n ? ((likeCount + commentCount + shareCount) / viewCount) * 100\n : 0;\n\n return {\n videoId: video.id,\n viewCount,\n likeCount,\n commentCount,\n shareCount,\n engagementRate: Math.round(engagementRate * 100) / 100,\n createTime: video.create_time,\n };\n }\n\n /**\n * Get insights for multiple videos\n */\n async getVideosInsights(maxCount: number = 20): Promise<TikTokVideoInsights[]> {\n const videoList = await this.getVideoList({ maxCount });\n\n return videoList.videos.map(video => {\n const viewCount = video.view_count || 0;\n const likeCount = video.like_count || 0;\n const commentCount = video.comment_count || 0;\n const shareCount = video.share_count || 0;\n\n const engagementRate = viewCount > 0\n ? ((likeCount + commentCount + shareCount) / viewCount) * 100\n : 0;\n\n return {\n videoId: video.id,\n viewCount,\n likeCount,\n commentCount,\n shareCount,\n engagementRate: Math.round(engagementRate * 100) / 100,\n createTime: video.create_time,\n };\n });\n }\n\n /**\n * Get formatted insights (unified format similar to Instagram/Facebook)\n * This allows for easier aggregation across platforms\n */\n async getInsights(params: TikTokInsightsParams): Promise<TikTokInsights> {\n const accountInsights = await this.getAccountInsights();\n const now = new Date();\n const endTime = now.toISOString();\n\n const metricsMap: Record<string, number> = {\n followers: accountInsights.followerCount,\n following: accountInsights.followingCount,\n likes: accountInsights.likesCount,\n video_count: accountInsights.videoCount,\n views: accountInsights.totalViews,\n comments: accountInsights.totalComments,\n shares: accountInsights.totalShares,\n engagement_rate: accountInsights.averageEngagementRate,\n };\n\n const data = params.metric.map(metricName => ({\n name: metricName,\n period: 'lifetime',\n values: [{\n value: metricsMap[metricName] || 0,\n end_time: endTime,\n }],\n title: metricName.charAt(0).toUpperCase() + metricName.slice(1).replace(/_/g, ' '),\n }));\n\n return { data };\n }\n}\n\n","/**\n * TikTok Auth - Authentication utilities\n */\n\nimport {\n TIKTOK_DEFAULT_SCOPES,\n TIKTOK_OAUTH_AUTHORIZATION_URL,\n TIKTOK_OAUTH_REVOKE_URL,\n TIKTOK_OAUTH_TOKEN_URL,\n TikTokScope,\n} from '../constants';\nimport { TikTokConfig, TikTokTokenResponse } from '../types';\n\n/**\n * TikTok Auth class for OAuth operations\n */\nexport class TikTokAuth {\n private config: TikTokConfig;\n\n constructor(config: TikTokConfig) {\n this.config = config;\n }\n\n /**\n * Build authorization URL for OAuth flow\n */\n getAuthorizationUrl(options?: {\n redirectUri?: string;\n scopes?: TikTokScope[];\n state?: string;\n }): string {\n const params = new URLSearchParams({\n client_key: this.config.clientKey,\n redirect_uri: options?.redirectUri || this.config.redirectUri || '',\n response_type: 'code',\n scope: (options?.scopes || this.config.scopes || TIKTOK_DEFAULT_SCOPES).join(','),\n });\n\n if (options?.state) {\n params.set('state', options.state);\n }\n\n return `${TIKTOK_OAUTH_AUTHORIZATION_URL}?${params.toString()}`;\n }\n\n /**\n * Exchange authorization code for access token\n * NOTE: This should be done server-side to protect client_secret\n */\n async exchangeCodeForToken(\n code: string,\n redirectUri?: string\n ): Promise<TikTokTokenResponse> {\n if (!this.config.clientSecret) {\n throw new Error('Client secret is required for token exchange');\n }\n\n const response = await fetch(TIKTOK_OAUTH_TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_key: this.config.clientKey,\n client_secret: this.config.clientSecret,\n code,\n grant_type: 'authorization_code',\n redirect_uri: redirectUri || this.config.redirectUri || '',\n }).toString(),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error?.message || 'Failed to exchange code for token');\n }\n\n return response.json();\n }\n\n /**\n * Refresh access token using refresh token\n * NOTE: This should be done server-side to protect client_secret\n */\n async refreshToken(refreshToken: string): Promise<TikTokTokenResponse> {\n if (!this.config.clientSecret) {\n throw new Error('Client secret is required for token refresh');\n }\n\n const response = await fetch(TIKTOK_OAUTH_TOKEN_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_key: this.config.clientKey,\n client_secret: this.config.clientSecret,\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n }).toString(),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error?.message || 'Failed to refresh token');\n }\n\n return response.json();\n }\n\n /**\n * Revoke access token\n */\n async revokeToken(accessToken: string): Promise<void> {\n const response = await fetch(TIKTOK_OAUTH_REVOKE_URL, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: new URLSearchParams({\n client_key: this.config.clientKey,\n token: accessToken,\n }).toString(),\n });\n\n if (!response.ok) {\n const error = await response.json();\n throw new Error(error.error?.message || 'Failed to revoke token');\n }\n }\n}\n","/**\n * TikTok Provider - Main TikTok provider\n */\n\nimport { TikTokAPI } from './api';\nimport { TikTokAuth } from './auth';\nimport { TikTokConfig } from './types';\n\n/**\n * TikTok provider that encapsulates Auth and API\n */\nexport class TikTokProvider {\n public readonly name = 'tiktok' as const;\n public auth: TikTokAuth;\n public api: TikTokAPI;\n public config: TikTokConfig;\n\n constructor(config: TikTokConfig) {\n this.config = config;\n this.auth = new TikTokAuth(config);\n this.api = new TikTokAPI(config);\n }\n\n /**\n * Create new API instance with access token\n */\n createAPIClient(accessToken: string): TikTokAPI {\n return new TikTokAPI(this.config, accessToken);\n }\n\n /**\n * Update access token of existing API client\n */\n setAccessToken(accessToken: string) {\n this.api.setAccessToken(accessToken);\n }\n\n /**\n * Get current access token\n */\n getAccessToken(): string | undefined {\n return this.api.getAccessToken();\n }\n}\n"]}
|