diff --git a/.gitignore b/.gitignore index b2731d18e..77a30cb36 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ lerna-debug.log .groovylintrc.json .vscode/*.log +.vscode/launch.json **/dist **/node_modules diff --git a/modules/server/README.md b/modules/server/README.md index 18d5bf48e..4d25ba4d2 100644 --- a/modules/server/README.md +++ b/modules/server/README.md @@ -18,3 +18,9 @@ Build (required before publish): ``` npm run prepare ``` + +## Federated Search + +### Config + +[Placeholder] diff --git a/modules/server/configTemplates/network.json b/modules/server/configTemplates/network.json new file mode 100644 index 000000000..60dfdbf46 --- /dev/null +++ b/modules/server/configTemplates/network.json @@ -0,0 +1,11 @@ +{ + "network": { + "servers": [ + { + "displayName": "Toronto", + "graphqlUrl": "http://.../graphql", + "documentType": "file" + } + ] + } +} diff --git a/modules/server/src/config/types.ts b/modules/server/src/config/types.ts index 5d93185d2..7f16e3fef 100644 --- a/modules/server/src/config/types.ts +++ b/modules/server/src/config/types.ts @@ -1,10 +1,12 @@ // TODO: will gradually tighten these as we migrate to TS import { ES_TYPES } from '@/mapping/esToAggTypeMap'; +import { DOCUMENT_TYPE } from './constants'; export const ConfigOptionalProperties = { DOWNLOADS: 'downloads', MATCHBOX: 'matchbox', + NETWORK_AGGREGATION: 'network', } as const; export const ConfigRequiredProperties = { @@ -53,6 +55,12 @@ export const TableProperties = { ROW_ID_FIELD_NAME: 'rowIdFieldName', } as const; +export const NetworkAggregationProperties = { + GRAPHQL_URL: 'graphqlUrl', + DOCUMENT_TYPE: 'documentType', + DISPLAY_NAME: 'displayName', +} as const; + ////////////////////////////////// export const ConfigProperties = { @@ -143,6 +151,12 @@ export interface TableConfigsInterface { [ConfigProperties.ROW_ID_FIELD_NAME]?: string; } +export interface NetworkAggregationInterface { + [NetworkAggregationProperties.GRAPHQL_URL]: string; + [NetworkAggregationProperties.DOCUMENT_TYPE]: string; + [NetworkAggregationProperties.DISPLAY_NAME]: string; +} + export interface ConfigObject { [ConfigProperties.DOCUMENT_TYPE]: string; [ConfigProperties.DOWNLOADS]?: DownloadsConfigsInterface; @@ -151,6 +165,7 @@ export interface ConfigObject { [ConfigProperties.INDEX]: string; [ConfigProperties.MATCHBOX]: any[]; [ConfigProperties.TABLE]: TableConfigsInterface; + [ConfigProperties.NETWORK_AGGREGATION]: NetworkAggregationInterface[]; } export interface FieldFromMapping { diff --git a/modules/server/src/config/utils/getConfigFromFiles.ts b/modules/server/src/config/utils/getConfigFromFiles.ts index a72cff569..4f31fff79 100644 --- a/modules/server/src/config/utils/getConfigFromFiles.ts +++ b/modules/server/src/config/utils/getConfigFromFiles.ts @@ -56,23 +56,27 @@ const getConfigFromFiles = ( const configObj = (files as [string, any][]).reduce( (configsAcc: Partial, [fileName, fileData]) => { - const fileDataJSON = JSON.parse(fileData); + try { + const fileDataJSON = JSON.parse(fileData); - if (fileDataJSON?.[ConfigProperties.TABLE]?.[ConfigProperties.DEFAULT_SORTING]) { - return merge({}, configsAcc, fileDataJSON, { - [ConfigProperties.TABLE]: { - ...fileDataJSON[ConfigProperties.TABLE], - [ConfigProperties.DEFAULT_SORTING]: fileDataJSON[ConfigProperties.TABLE][ - ConfigProperties.DEFAULT_SORTING - ].map((sorting: SortingConfigsInterface) => ({ - ...sorting, - desc: sorting.desc || false, - })), - }, - }); - } + if (fileDataJSON?.[ConfigProperties.TABLE]?.[ConfigProperties.DEFAULT_SORTING]) { + return merge({}, configsAcc, fileDataJSON, { + [ConfigProperties.TABLE]: { + ...fileDataJSON[ConfigProperties.TABLE], + [ConfigProperties.DEFAULT_SORTING]: fileDataJSON[ConfigProperties.TABLE][ + ConfigProperties.DEFAULT_SORTING + ].map((sorting: SortingConfigsInterface) => ({ + ...sorting, + desc: sorting.desc || false, + })), + }, + }); + } - return merge({}, configsAcc, fileDataJSON); + return merge({}, configsAcc, fileDataJSON); + } catch (e) { + throw new Error('Could not parse the provided configuration files'); + } }, configsFromEnv, ); diff --git a/modules/server/src/graphqlRoutes.js b/modules/server/src/graphqlRoutes.js index a9db949b0..f0f9072c2 100644 --- a/modules/server/src/graphqlRoutes.js +++ b/modules/server/src/graphqlRoutes.js @@ -4,10 +4,11 @@ import { Router } from 'express'; import expressPlayground from 'graphql-playground-middleware-express'; import getConfigObject, { initializeSets } from './config'; -import { DEBUG_MODE, ES_USER, ES_PASS } from './config/constants'; +import { DEBUG_MODE, ENABLE_NETWORK_AGGREGATION, ES_PASS, ES_USER } from './config/constants'; import { ConfigProperties } from './config/types'; import { addMappingsToTypes, extendFields, fetchMapping } from './mapping'; import { extendColumns, extendFacets, flattenMappingToFields } from './mapping/extendMapping'; +import { createSchemaFromNetworkConfig, mergeSchemas } from './network'; import makeSchema from './schema'; const getESMapping = async (esClient, index) => { @@ -249,6 +250,8 @@ export const createSchemasFromConfigs = async ({ configsFromFiles, ); + const commonFields = { fieldsFromMapping, typesWithMappings }; + const { mockSchema, schema } = await createSchema({ enableAdmin, getServerSideFilter, @@ -256,12 +259,26 @@ export const createSchemasFromConfigs = async ({ types: typesWithMappings, }); - return { - fieldsFromMapping, - mockSchema, - schema, - typesWithMappings, - }; + if (false) { + const { networkSchema } = await createSchemaFromNetworkConfig({ + networkConfig: configsFromFiles[ConfigProperties.NETWORK_AGGREGATION], + }); + const [mergedSchema, mergedMockSchema] = mergeSchemas({ + local: { schema, mockSchema }, + network: { schema: networkSchema, mockSchema: networkMockSchema }, + }); + return { + ...commonFields, + schema: mergedSchema, + mockSchema: mergedMockSchema, + }; + } else { + return { + ...commonFields, + mockSchema, + schema, + }; + } } catch (error) { const message = error?.message || error; console.info('\n------\nError thrown while creating the GraphQL schemas.'); diff --git a/modules/server/src/network/index.ts b/modules/server/src/network/index.ts new file mode 100644 index 000000000..cba08d5b8 --- /dev/null +++ b/modules/server/src/network/index.ts @@ -0,0 +1,10 @@ +import { NetworkAggregationInterface } from '@/config/types'; + +export const createSchemaFromNetworkConfig = ({ + networkConfig, +}: { + networkConfig: NetworkAggregationInterface[]; +}) => { + console.log('network config', networkConfig); +}; +export const mergeSchemas = () => {};