diff --git a/backend/plugins/frontline_api/src/modules/inbox/graphql/resolvers/customResolvers/integration.ts b/backend/plugins/frontline_api/src/modules/inbox/graphql/resolvers/customResolvers/integration.ts index 95e7e0eae1..4ef353256d 100644 --- a/backend/plugins/frontline_api/src/modules/inbox/graphql/resolvers/customResolvers/integration.ts +++ b/backend/plugins/frontline_api/src/modules/inbox/graphql/resolvers/customResolvers/integration.ts @@ -1,6 +1,9 @@ import { IIntegrationDocument } from '@/inbox/@types/integrations'; import { IContext } from '~/connectionResolvers'; import { facebookStatus } from '@/integrations/facebook/messageBroker'; +import { graphRequest } from '@/integrations/facebook/utils'; +import { IFacebookPageResponse } from '@/integrations/facebook/@types/integrations'; + export const integrationStatus = async ( serviceName: string, subdomain: string, @@ -131,4 +134,60 @@ export default { } return serviceName; }, + + async facebookPage( + integration: IIntegrationDocument, + _args, + { models }: IContext, + ) { + const serviceName = integration.kind.includes('facebook') + ? 'facebook' + : integration.kind; + + if (serviceName !== 'facebook') { + return null; + } + + try { + const facebookIntegration = await models.FacebookIntegrations.findOne({ + erxesApiId: integration._id, + }); + + if ( + !facebookIntegration || + !Array.isArray(facebookIntegration.facebookPageIds) + ) { + console.warn('No facebookIntegration or no facebookPageIds found'); + return null; + } + + const results: ({ pageId: string } & IFacebookPageResponse)[] = []; + + for (const pageId of facebookIntegration.facebookPageIds) { + const token = facebookIntegration.facebookPageTokensMap?.[pageId]; + + if (!token) { + console.warn(`Token not found for pageId: ${pageId}`); + continue; + } + + try { + const response = (await graphRequest.get( + `/${pageId}?fields=id,name`, + token, + )) as IFacebookPageResponse; + + if (response) { + results.push({ pageId, ...response }); + } + } catch (err) { + console.error(`Failed to fetch page ${pageId}:`, err); + } + } + + return results.length > 0 ? results : null; + } catch (error) { + throw error; + } + }, }; diff --git a/backend/plugins/frontline_api/src/modules/inbox/graphql/schemas/integration.ts b/backend/plugins/frontline_api/src/modules/inbox/graphql/schemas/integration.ts index e9ae1802d3..bbdb1c3801 100644 --- a/backend/plugins/frontline_api/src/modules/inbox/graphql/schemas/integration.ts +++ b/backend/plugins/frontline_api/src/modules/inbox/graphql/schemas/integration.ts @@ -47,7 +47,7 @@ export const types = ` webhookData: JSON brand: Brand - + facebookPage: JSON channels: [Channel] diff --git a/backend/plugins/frontline_api/src/modules/integrations/facebook/@types/integrations.ts b/backend/plugins/frontline_api/src/modules/integrations/facebook/@types/integrations.ts index 6914049d4c..86d148de0a 100644 --- a/backend/plugins/frontline_api/src/modules/integrations/facebook/@types/integrations.ts +++ b/backend/plugins/frontline_api/src/modules/integrations/facebook/@types/integrations.ts @@ -16,3 +16,8 @@ export interface IFacebookIntegrationDocument Document { _id: string; } + +export interface IFacebookPageResponse { + id: string; + name: string; +} diff --git a/frontend/plugins/frontline_ui/src/modules/integrations/erxes-messenger/graphql/queries/integrationDetailQuery.ts b/frontend/plugins/frontline_ui/src/modules/integrations/erxes-messenger/graphql/queries/integrationDetailQuery.ts index 1c5bf5b8d7..6567c52e08 100644 --- a/frontend/plugins/frontline_ui/src/modules/integrations/erxes-messenger/graphql/queries/integrationDetailQuery.ts +++ b/frontend/plugins/frontline_ui/src/modules/integrations/erxes-messenger/graphql/queries/integrationDetailQuery.ts @@ -9,6 +9,7 @@ export const EM_INTEGRATION_DETAIL_QUERY = gql` languageCode channels { _id + name } messengerData callData { diff --git a/frontend/plugins/frontline_ui/src/modules/integrations/facebook/components/FacebookIntegrationDetail.tsx b/frontend/plugins/frontline_ui/src/modules/integrations/facebook/components/FacebookIntegrationDetail.tsx index 3cbd7948a6..e22e13ea7a 100644 --- a/frontend/plugins/frontline_ui/src/modules/integrations/facebook/components/FacebookIntegrationDetail.tsx +++ b/frontend/plugins/frontline_ui/src/modules/integrations/facebook/components/FacebookIntegrationDetail.tsx @@ -93,7 +93,6 @@ export const FacebookIntegrationEditForm = ({ }; if (loading) return ; - return ( <> @@ -109,6 +108,25 @@ export const FacebookIntegrationEditForm = ({ })} >
+ { + const facebookPageName = field.value?.[0] ?? null; + return ( + + Page Name + + + + + ); + }} + /> ( @@ -134,18 +152,20 @@ export const FacebookIntegrationEditForm = ({ )} /> ( - - Channels - - - - )} + name="channels" + render={({ field }) => { + return ( + + Channels + + + + ); + }} />
diff --git a/frontend/plugins/frontline_ui/src/modules/integrations/graphql/queries/getIntegrationDetail.ts b/frontend/plugins/frontline_ui/src/modules/integrations/graphql/queries/getIntegrationDetail.ts index 55fbaa0b92..76b6a64f32 100644 --- a/frontend/plugins/frontline_ui/src/modules/integrations/graphql/queries/getIntegrationDetail.ts +++ b/frontend/plugins/frontline_ui/src/modules/integrations/graphql/queries/getIntegrationDetail.ts @@ -17,9 +17,11 @@ export const GET_INTEGRATION_DETAIL = gql` isConnected channels { _id + name } departmentIds details + facebookPage callData { secondPageHeader secondPageDescription