mirror of
https://github.com/logto-io/logto.git
synced 2025-02-03 21:48:55 -05:00
refactor(core): make getConnectorInstances access DB only once (#429)
* refactor(core): make getConnectorInstances access DB only once * test(core): make getConnectorInstances access DB only once * refactor(core): getConnectorInstanceByType merge .filter into .find for running in one loop
This commit is contained in:
parent
28625f6894
commit
2ee88d19ee
2 changed files with 40 additions and 11 deletions
|
@ -58,6 +58,7 @@ const connectors = [
|
|||
];
|
||||
const connectorMap = new Map(connectors.map((connector) => [connector.id, connector]));
|
||||
|
||||
const findAllConnectors = jest.fn(async () => connectors);
|
||||
const findConnectorById = jest.fn(async (id: string) => {
|
||||
const connector = connectorMap.get(id);
|
||||
|
||||
|
@ -72,7 +73,7 @@ const insertConnector = jest.fn(async (connector: Connector) => connector);
|
|||
|
||||
jest.mock('@/queries/connector', () => ({
|
||||
...jest.requireActual('@/queries/connector'),
|
||||
findConnectorsByIds: async () => connectors,
|
||||
findAllConnectors: async () => findAllConnectors(),
|
||||
findConnectorById: async (id: string) => findConnectorById(id),
|
||||
hasConnector: async () => hasConnector(),
|
||||
insertConnector: async (connector: Connector) => insertConnector(connector),
|
||||
|
@ -89,6 +90,23 @@ describe('getConnectorInstances', () => {
|
|||
expect(connectorInstances[4]).toHaveProperty('connector', googleConnector);
|
||||
expect(connectorInstances[5]).toHaveProperty('connector', wechatConnector);
|
||||
});
|
||||
|
||||
test('should throw if any required connector does not exist in DB', async () => {
|
||||
const id = 'aliyun-dm';
|
||||
findAllConnectors.mockImplementationOnce(async () => []);
|
||||
await expect(getConnectorInstances()).rejects.toMatchError(
|
||||
new RequestError({ code: 'entity.not_found', id, status: 404 })
|
||||
);
|
||||
});
|
||||
|
||||
test('should access DB only once and should not throw', async () => {
|
||||
await expect(getConnectorInstances()).resolves.not.toThrow();
|
||||
expect(findAllConnectors).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
findAllConnectors.mockClear();
|
||||
});
|
||||
});
|
||||
|
||||
describe('getConnectorInstanceById', () => {
|
||||
|
|
|
@ -1,5 +1,10 @@
|
|||
import RequestError from '@/errors/RequestError';
|
||||
import { findConnectorById, hasConnector, insertConnector } from '@/queries/connector';
|
||||
import {
|
||||
findAllConnectors,
|
||||
findConnectorById,
|
||||
hasConnector,
|
||||
insertConnector,
|
||||
} from '@/queries/connector';
|
||||
|
||||
import * as AliyunDM from './aliyun-dm';
|
||||
import * as AliyunSMS from './aliyun-sms';
|
||||
|
@ -12,13 +17,19 @@ import * as WeChat from './wechat';
|
|||
const allConnectors: IConnector[] = [AliyunDM, AliyunSMS, Facebook, GitHub, Google, WeChat];
|
||||
|
||||
export const getConnectorInstances = async (): Promise<ConnectorInstance[]> => {
|
||||
return Promise.all(
|
||||
allConnectors.map(async (element) => {
|
||||
const connector = await findConnectorById(element.metadata.id);
|
||||
const connectors = await findAllConnectors();
|
||||
const connectorMap = new Map(connectors.map((connector) => [connector.id, connector]));
|
||||
|
||||
return { connector, ...element };
|
||||
})
|
||||
);
|
||||
return allConnectors.map((element) => {
|
||||
const { id } = element.metadata;
|
||||
const connector = connectorMap.get(id);
|
||||
|
||||
if (!connector) {
|
||||
throw new RequestError({ code: 'entity.not_found', id, status: 404 });
|
||||
}
|
||||
|
||||
return { connector, ...element };
|
||||
});
|
||||
};
|
||||
|
||||
export const getConnectorInstanceById = async (id: string): Promise<ConnectorInstance> => {
|
||||
|
@ -76,9 +87,9 @@ export const getConnectorInstanceByType = async <T extends ConnectorInstance>(
|
|||
type: ConnectorType
|
||||
): Promise<T> => {
|
||||
const connectors = await getConnectorInstances();
|
||||
const connector = connectors
|
||||
.filter((connector) => connector.connector.enabled)
|
||||
.find<T>((connector): connector is T => connector.metadata.type === type);
|
||||
const connector = connectors.find<T>(
|
||||
(connector): connector is T => connector.connector.enabled && connector.metadata.type === type
|
||||
);
|
||||
|
||||
if (!connector) {
|
||||
throw new RequestError('connector.not_found', { type });
|
||||
|
|
Loading…
Add table
Reference in a new issue