diff --git a/packages/core/src/connectors/index.test.ts b/packages/core/src/connectors/index.test.ts index f13f46ae7..97fcd9e58 100644 --- a/packages/core/src/connectors/index.test.ts +++ b/packages/core/src/connectors/index.test.ts @@ -5,6 +5,7 @@ import { getConnectorInstanceById, getConnectorInstanceByType, getConnectorInstances, + getEnabledSocialConnectorIds, getSocialConnectorInstanceById, initConnectors, } from '@/connectors/index'; @@ -118,6 +119,13 @@ describe('getSocialConnectorInstanceById', () => { }); }); +describe('getEnabledSocialConnectorIds', () => { + test('should return the enabled social connectors existing in DB', async () => { + const enabledSocialConnectorIds = await getEnabledSocialConnectorIds(); + expect(enabledSocialConnectorIds).toEqual(['facebook', 'github']); + }); +}); + describe('getConnectorInstanceByType', () => { test('should return the enabled connector existing in DB', async () => { const dmEnabledConnectorInstance = await getConnectorInstanceByType(ConnectorType.Email); diff --git a/packages/core/src/connectors/index.ts b/packages/core/src/connectors/index.ts index d49979be9..329a6098d 100644 --- a/packages/core/src/connectors/index.ts +++ b/packages/core/src/connectors/index.ts @@ -59,6 +59,19 @@ export const getSocialConnectorInstanceById = async ( return connector; }; +export const getEnabledSocialConnectorIds = async (): Promise< + string[] +> => { + const connectorInstances = await getConnectorInstances(); + + return connectorInstances + .filter( + (instance): instance is T => + instance.connector.enabled && instance.metadata.type === ConnectorType.Social + ) + .map((instance) => instance.metadata.id); +}; + export const getConnectorInstanceByType = async ( type: ConnectorType ): Promise => { diff --git a/packages/core/src/routes/sign-in-experience.test.ts b/packages/core/src/routes/sign-in-experience.test.ts index 655d0c299..7043c93f5 100644 --- a/packages/core/src/routes/sign-in-experience.test.ts +++ b/packages/core/src/routes/sign-in-experience.test.ts @@ -5,6 +5,11 @@ import { createRequester } from '@/utils/test-utils'; import signInExperiencesRoutes from './sign-in-experience'; +jest.mock('@/connectors', () => ({ + ...jest.requireActual('@/connectors'), + getEnabledSocialConnectorIds: jest.fn(async () => ['facebook', 'github']), +})); + jest.mock('@/queries/sign-in-experience', () => ({ findDefaultSignInExperience: jest.fn(async (): Promise => mockSignInExperience), updateSignInExperienceById: jest.fn( diff --git a/packages/core/src/routes/sign-in-experience.ts b/packages/core/src/routes/sign-in-experience.ts index 7744b80c7..bd50da15b 100644 --- a/packages/core/src/routes/sign-in-experience.ts +++ b/packages/core/src/routes/sign-in-experience.ts @@ -1,6 +1,7 @@ import { SignInExperiences } from '@logto/schemas'; import { object, string } from 'zod'; +import { getEnabledSocialConnectorIds } from '@/connectors'; import koaGuard from '@/middleware/koa-guard'; import { findDefaultSignInExperience, @@ -15,8 +16,22 @@ export default function signInExperiencesRoutes(router: * always return the default settings in DB for the /sign-in-exp get method */ router.get('/sign-in-exp', async (ctx, next) => { - const signInExperience = await findDefaultSignInExperience(); - ctx.body = signInExperience; + const [signInExperience, enabledSocialConnectorIds] = await Promise.all([ + findDefaultSignInExperience(), + getEnabledSocialConnectorIds(), + ]); + + const { socialSignInConnectorIds: selectedSocialSignInConnectorIds } = signInExperience; + const enabledSocialConnectorIdSet = new Set(enabledSocialConnectorIds); + + const socialSignInConnectorIds = selectedSocialSignInConnectorIds.filter((id) => + enabledSocialConnectorIdSet.has(id) + ); + + ctx.body = { + ...signInExperience, + socialSignInConnectorIds, + }; return next(); }); diff --git a/packages/core/src/utils/mock.ts b/packages/core/src/utils/mock.ts index 8854786fc..e87ca89be 100644 --- a/packages/core/src/utils/mock.ts +++ b/packages/core/src/utils/mock.ts @@ -181,7 +181,7 @@ export const mockSignInExperience: SignInExperience = { sms: SignInMethodState.disabled, social: SignInMethodState.secondary, }, - socialSignInConnectorIds: ['foo', 'bar'], + socialSignInConnectorIds: ['github', 'facebook'], }; export const mockConnectorList: Connector[] = [