Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 22 additions & 9 deletions config/default.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,29 @@
},
"db": {
"elastic": {
"node": "http://localhost:9200",
"auth": {
"username": "elastic",
"password": "changeme"
"searchy": {
"node": "http://localhost:9200",
"auth": {
"username": "elastic",
"password": "changeme"
},
"requestTimeout": 60000,
"properties": {
"index": "control_gil_v5",
"size": 3
}
},
"requestTimeout": 60000,
"properties": {
"controlIndex": "control_gil_v5",
"nlpIndex": "nlp_gil_v5",
"size": 3
"nlp": {
"node": "http://localhost:9200",
"auth": {
"username": "elastic",
"password": "changeme"
},
"requestTimeout": 60000,
"properties": {
"index": "nlp_gil_v5",
"size": 3
}
}
},
"postgresql": {
Expand Down
31 changes: 22 additions & 9 deletions config/test.json
Original file line number Diff line number Diff line change
@@ -1,16 +1,29 @@
{
"db": {
"elastic": {
"node": "http://localhost:9200",
"auth": {
"username": "elastic",
"password": "changeme"
"searchy": {
"node": "http://localhost:9200",
"auth": {
"username": "elastic",
"password": "changeme"
},
"requestTimeout": 60000,
"properties": {
"index": "control_gil_v5",
"size": 3
}
},
"requestTimeout": 60000,
"properties": {
"controlIndex": "geocoder_control_tests",
"nlpIndex": "geocoder_control_tests",
"size": 3
"nlp": {
"node": "http://localhost:9200",
"auth": {
"username": "elastic",
"password": "changeme"
},
"requestTimeout": 60000,
"properties": {
"index": "nlp_gil_v5",
"size": 3
}
}
},
"postgresql": {
Expand Down
6 changes: 3 additions & 3 deletions devScripts/importDataToElastic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ import config from '../config/test.json';
import data from './elasticsearchData.json';

const main = async (): Promise<void> => {
const client = new Client({ node: config.db.elastic.node as string });
const client = new Client({ node: config.db.elastic.searchy.node as string });

for (const item of data) {
await client.index({
index: config.db.elastic.properties.controlIndex as string,
id: item._id as string,
index: config.db.elastic.searchy.properties.index as string,
id: item._id,
body: item._source,
});
}
Expand Down
8 changes: 7 additions & 1 deletion src/common/interfaces.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ClientOptions } from '@elastic/elasticsearch';
import { Client, ClientOptions } from '@elastic/elasticsearch';
import { DataSourceOptions } from 'typeorm';
import { Feature, FeatureCollection as GeoJSONFeatureCollection } from 'geojson';

Expand All @@ -14,13 +14,19 @@ export interface OpenApiConfig {
uiPath: string;
}

export type ElasticDbClientsConfig = {
[key in 'searchy' | 'nlp']: ElasticDbConfig;
};

export type ElasticDbConfig = ClientOptions;

export type PostgresDbConfig = {
enableSslAuth: boolean;
sslPaths: { ca: string; cert: string; key: string };
} & DataSourceOptions;

export type ElasticClients = Record<keyof ElasticDbClientsConfig, Client>;

export interface GeoContext {
bbox?: number[];
radius?: number;
Expand Down
8 changes: 6 additions & 2 deletions src/common/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { Tile } from '../tile/models/tile';
import { Route } from '../route/models/route';
import { FIELDS } from './constants';
import { utmProjection, wgs84Projection } from './projections';
import { FeatureCollection, WGS84Coordinate } from './interfaces';
import { ElasticClients, FeatureCollection, WGS84Coordinate } from './interfaces';

export const formatResponse = <T extends Item | Tile | Route>(elasticResponse: estypes.SearchResponse<T>): FeatureCollection<T> => ({
type: 'FeatureCollection',
Expand All @@ -29,7 +29,7 @@ export const formatResponse = <T extends Item | Tile | Route>(elasticResponse: e
/* eslint-disable @typescript-eslint/naming-convention */
export const additionalSearchProperties = (size: number): { size: number; index: string; _source: string[] } => ({
size,
index: config.get<string>('db.elastic.properties.controlIndex'),
index: config.get<string>('db.elastic.searchy.properties.index'),
_source: FIELDS,
});
/* eslint-enable @typescript-eslint/naming-convention */
Expand Down Expand Up @@ -96,3 +96,7 @@ export const validateTile = (tile: { tileName: string; subTileNumber: number[] }
}
return true;
};

export const getElasticClientQuerySize = (key: keyof ElasticClients): number => {
return config.get<number>(`db.elastic.${key}.properties.size`);
};
11 changes: 7 additions & 4 deletions src/containerConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import { SERVICES, SERVICE_NAME } from './common/constants';
import { tracing } from './common/tracing';
import { InjectionObject, registerDependencies } from './common/dependencyRegistration';
import { elasticClientSymbol, initElasticsearchClient } from './common/elastic';
import { ElasticDbConfig, PostgresDbConfig } from './common/interfaces';
import { ElasticClients, ElasticDbClientsConfig, ElasticDbConfig, PostgresDbConfig } from './common/interfaces';
import { TILE_REPOSITORY_SYMBOL, tileRepositoryFactory } from './tile/DAL/tileRepository';
import { TILE_ROUTER_SYMBOL, tileRouterFactory } from './tile/routes/tileRouter';
import { ITEM_REPOSITORY_SYMBOL, itemRepositoryFactory } from './item/DAL/itemRepository';
Expand Down Expand Up @@ -38,17 +38,20 @@ export const registerExternalValues = async (options?: RegisterOptions): Promise
tracing.start();
const tracer = trace.getTracer(SERVICE_NAME);

const elasticDataSourceOptions = config.get<ElasticDbConfig>('db.elastic');
const elasticClientsConfig = config.get<ElasticDbClientsConfig>('db.elastic');
const postgresqlDataSourceOptions = config.get<PostgresDbConfig>('db.postgresql');
const elasticClient = await initElasticsearchClient(elasticDataSourceOptions);
const elasticClients = {} as ElasticClients;
for (const [key, value] of Object.entries(elasticClientsConfig)) {
elasticClients[key as keyof ElasticDbClientsConfig] = await initElasticsearchClient(value as ElasticDbConfig);
}
const postgresqlConnection = await initDataSource(postgresqlDataSourceOptions);

const dependencies: InjectionObject<unknown>[] = [
{ token: SERVICES.CONFIG, provider: { useValue: config } },
{ token: SERVICES.LOGGER, provider: { useValue: logger } },
{ token: SERVICES.TRACER, provider: { useValue: tracer } },
{ token: SERVICES.METER, provider: { useValue: OtelMetrics.getMeterProvider().getMeter(SERVICE_NAME) } },
{ token: elasticClientSymbol, provider: { useValue: elasticClient } },
{ token: elasticClientSymbol, provider: { useValue: elasticClients } },
{ token: DataSource, provider: { useValue: postgresqlConnection } },
{ token: TILE_REPOSITORY_SYMBOL, provider: { useFactory: tileRepositoryFactory } },
{ token: TILE_ROUTER_SYMBOL, provider: { useFactory: tileRouterFactory } },
Expand Down
3 changes: 2 additions & 1 deletion src/item/DAL/itemRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { FactoryFunction } from 'tsyringe';
import { elasticClientSymbol } from '../../common/elastic';
import { Item } from '../models/item';
import { additionalSearchProperties } from '../../common/utils';
import { ElasticClients } from '../../common/interfaces';
import { ItemQueryParams, queryForItems } from './queries';

/* eslint-enable @typescript-eslint/naming-convention */
Expand All @@ -25,7 +26,7 @@ const createItemRepository = (client: Client) => {
export type ItemRepository = ReturnType<typeof createItemRepository>;

export const itemRepositoryFactory: FactoryFunction<ItemRepository> = (depContainer) => {
return createItemRepository(depContainer.resolve<Client>(elasticClientSymbol));
return createItemRepository(depContainer.resolve<ElasticClients>(elasticClientSymbol).searchy);
};

export const ITEM_REPOSITORY_SYMBOL = Symbol('ITEM_REPOSITORY_SYMBOL');
2 changes: 1 addition & 1 deletion src/item/models/itemManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export class ItemManager {

public async getItems(itemQueryParams: ItemQueryParams, reduceFuzzyMatch = false, size?: number): Promise<FeatureCollection<Item>> {
let elasticResponse: estypes.SearchResponse<Item> | undefined = undefined;
elasticResponse = await this.itemRepository.getItems(itemQueryParams, size ?? this.config.get<number>('db.elastic.properties.size'));
elasticResponse = await this.itemRepository.getItems(itemQueryParams, size ?? this.config.get<number>('db.elastic.searchy.properties.size'));

const formattedResponse = formatResponse(elasticResponse);

Expand Down
6 changes: 3 additions & 3 deletions src/query/DAL/queryRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { cleanQuery, fetchNLPService } from '../utils';
import { PlaceType, TextSearchParams, TokenResponse } from '../interfaces';
import { TextSearchHit } from '../models/textSearchHit';
import { BadRequestError } from '../../common/errors';
import { ElasticClients } from '../../common/interfaces';
import { esQuery } from './queries';

/* eslint-enable @typescript-eslint/naming-convention */
Expand All @@ -29,7 +30,6 @@ const createQueryRepository = (client: Client) => {
},

async getPlaceType(endpoint: string, query: string): Promise<PlaceType> {
// const endpoint = config.get<string>('services.placeTypeUrl');
const response = await fetchNLPService<PlaceType>(endpoint, {
text: query,
start: 0,
Expand All @@ -42,7 +42,7 @@ const createQueryRepository = (client: Client) => {
},

async queryElastic(params: TextSearchParams): Promise<estypes.SearchResponse<TextSearchHit>> {
const index = config.get<string>('db.elastic.properties.nlpIndex');
const index = config.get<string>('db.elastic.nlp.properties.index');

const response = await client.search<TextSearchHit>({
index,
Expand All @@ -57,7 +57,7 @@ const createQueryRepository = (client: Client) => {
export type QueryRepository = ReturnType<typeof createQueryRepository>;

export const queryRepositoryFactory: FactoryFunction<QueryRepository> = (depContainer) => {
return createQueryRepository(depContainer.resolve<Client>(elasticClientSymbol));
return createQueryRepository(depContainer.resolve<ElasticClients>(elasticClientSymbol).nlp);
};

export const QUERY_REPOSITORY_SYMBOL = Symbol('QUERY_REPOSITORY_SYMBOL');
3 changes: 2 additions & 1 deletion src/route/DAL/routeRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { FactoryFunction } from 'tsyringe';
import { elasticClientSymbol } from '../../common/elastic';
import { Route } from '../models/route';
import { additionalSearchProperties } from '../../common/utils';
import { ElasticClients } from '../../common/interfaces';
import { RouteQueryParams, queryForControlPointInRoute, queryForRoute } from './queries';

// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
Expand Down Expand Up @@ -34,7 +35,7 @@ const createRouteRepository = (client: Client) => {
export type RouteRepository = ReturnType<typeof createRouteRepository>;

export const routeRepositoryFactory: FactoryFunction<RouteRepository> = (depContainer) => {
return createRouteRepository(depContainer.resolve<Client>(elasticClientSymbol));
return createRouteRepository(depContainer.resolve<ElasticClients>(elasticClientSymbol).searchy);
};

export const ROUTE_REPOSITORY_SYMBOL = Symbol('ROUTE_REPOSITORY_SYMBOL');
6 changes: 3 additions & 3 deletions src/route/models/routeManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { estypes } from '@elastic/elasticsearch';
import { SERVICES } from '../../common/constants';
import { ROUTE_REPOSITORY_SYMBOL, RouteRepository } from '../DAL/routeRepository';
import { RouteQueryParams } from '../DAL/queries';
import { formatResponse } from '../../common/utils';
import { formatResponse, getElasticClientQuerySize } from '../../common/utils';
import { FeatureCollection } from '../../common/interfaces';
import { Route } from './route';

Expand All @@ -22,10 +22,10 @@ export class RouteManager {
if (routeQueryParams.controlPoint ?? 0) {
elasticResponse = await this.routeRepository.getControlPointInRoute(
routeQueryParams as RouteQueryParams & Required<Pick<RouteQueryParams, 'controlPoint'>>,
size ?? this.config.get<number>('db.elastic.properties.size')
size ?? getElasticClientQuerySize('searchy')
);
} else {
elasticResponse = await this.routeRepository.getRoutes(routeQueryParams, size ?? this.config.get<number>('db.elastic.properties.size'));
elasticResponse = await this.routeRepository.getRoutes(routeQueryParams, size ?? getElasticClientQuerySize('searchy'));
}

const formattedResponse = formatResponse(elasticResponse);
Expand Down
3 changes: 2 additions & 1 deletion src/tile/DAL/tileRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { FactoryFunction } from 'tsyringe';
import { elasticClientSymbol } from '../../common/elastic';
import { Tile } from '../models/tile';
import { additionalSearchProperties } from '../../common/utils';
import { ElasticClients } from '../../common/interfaces';
import { queryForTiles, queryForSubTiles, TileQueryParams } from './queries';

// eslint-disable-next-line @typescript-eslint/explicit-function-return-type
Expand Down Expand Up @@ -32,7 +33,7 @@ const createTileRepository = (client: Client) => {
export type TileRepository = ReturnType<typeof createTileRepository>;

export const tileRepositoryFactory: FactoryFunction<TileRepository> = (depContainer) => {
return createTileRepository(depContainer.resolve<Client>(elasticClientSymbol));
return createTileRepository(depContainer.resolve<ElasticClients>(elasticClientSymbol).searchy);
};

export const TILE_REPOSITORY_SYMBOL = Symbol('TILE_REPOSITORY_SYMBOL');
4 changes: 2 additions & 2 deletions src/tile/models/tileManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { inject, injectable } from 'tsyringe';
import { estypes } from '@elastic/elasticsearch';
import { SERVICES } from '../../common/constants';
import { TILE_REPOSITORY_SYMBOL, TileRepository } from '../DAL/tileRepository';
import { formatResponse } from '../../common/utils';
import { formatResponse, getElasticClientQuerySize } from '../../common/utils';
import { TileQueryParams } from '../DAL/queries';
import { FeatureCollection } from '../../common/interfaces';
import { Tile } from './tile';
Expand All @@ -19,7 +19,7 @@ export class TileManager {

public async getTiles(tileQueryParams: TileQueryParams, reduceFuzzyMatch = false, size?: number): Promise<FeatureCollection<Tile>> {
let elasticResponse: estypes.SearchResponse<Tile> | undefined = undefined;
const numberOfResults = size ?? this.config.get<number>('db.elastic.properties.size');
const numberOfResults = size ?? getElasticClientQuerySize('searchy');
if (tileQueryParams.subTile ?? 0) {
elasticResponse = await this.tileRepository.getSubTiles(tileQueryParams as Required<TileQueryParams>, numberOfResults);
} else {
Expand Down
3 changes: 2 additions & 1 deletion tests/unit/common/utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ describe('utils', () => {
it('should return additional search properties', () => {
const size = 10;
const result = additionalSearchProperties(size);
expect(result).toMatchObject({ size, index: config.db.elastic.properties.controlIndex, _source: FIELDS });
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
expect(result).toMatchObject({ size, index: config.db.elastic.searchy.properties.index as string, _source: FIELDS });
});

it('should convert UTM to WGS84', () => {
Expand Down