0
Fork 0
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:
IceHe.xyz 2022-03-25 14:45:34 +08:00 committed by GitHub
parent 28625f6894
commit 2ee88d19ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 40 additions and 11 deletions

View file

@ -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', () => {

View file

@ -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 });