From d579d13e8a8897fef1c1c5568ce83a4df309a0e9 Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 16:59:20 +0300 Subject: [PATCH 01/12] feat(common/interfaces): created WGS84Coordinate interface --- src/common/interfaces.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/common/interfaces.ts b/src/common/interfaces.ts index 7d98367f..ca49a24a 100644 --- a/src/common/interfaces.ts +++ b/src/common/interfaces.ts @@ -36,3 +36,8 @@ export interface Geometry { export interface FeatureCollection extends GeoJSONFeatureCollection { features: T[]; } + +export interface WGS84Coordinate { + lat: number; + lon: number; +} From fce39637b4ae29633643694c20c09d56177d7d1a Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:00:11 +0300 Subject: [PATCH 02/12] fix: use WGS84Coordinate interface instead of implicitly writing { lon: number; lat: number } --- src/common/elastic/utils.ts | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/common/elastic/utils.ts b/src/common/elastic/utils.ts index 5a7d4ce1..eb82cd3e 100644 --- a/src/common/elastic/utils.ts +++ b/src/common/elastic/utils.ts @@ -1,17 +1,13 @@ +import { WGS84Coordinate } from '../interfaces'; + /* eslint-disable @typescript-eslint/naming-convention */ export const boundingBox = ( bbox: number[] ): { geo_bounding_box: { geometry: { - top_left: { - lon: number; - lat: number; - }; - bottom_right: { - lon: number; - lat: number; - }; + top_left: WGS84Coordinate; + bottom_right: WGS84Coordinate; }; }; } => ({ @@ -29,17 +25,12 @@ export const boundingBox = ( }, }); -export const geoDistance = (params: { - radius: number; - lon: number; - lat: number; -}): { +export const geoDistance = ( + params: WGS84Coordinate & { radius: number } +): { geo_distance: { distance: string; - geometry: { - lon: number; - lat: number; - }; + geometry: WGS84Coordinate; }; } => ({ geo_distance: { From 05c61bc6cdbf3acddf0444dc5c67d8d1f2490b39 Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:00:26 +0300 Subject: [PATCH 03/12] fix: use WGS84Coordinate interface instead of implicitly writing { lon: number; lat: number } --- src/common/utils.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/src/common/utils.ts b/src/common/utils.ts index e618aa7c..2354277a 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -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 } from './interfaces'; +import { FeatureCollection, WGS84Coordinate } from './interfaces'; export const formatResponse = (elasticResponse: estypes.SearchResponse): FeatureCollection => ({ type: 'FeatureCollection', @@ -78,16 +78,9 @@ export const convertWgs84ToUTM = ( }; /* eslint-enable @typescript-eslint/naming-convention */ -export const convertUTMToWgs84 = ( - x: number, - y: number, - zone: number -): { - lat: number; - lng: number; -} => { +export const convertUTMToWgs84 = (x: number, y: number, zone: number): WGS84Coordinate => { const [longitude, latitude] = proj4(utmProjection(zone), wgs84Projection, [x, y]); - return { lat: latitude, lng: longitude }; + return { lat: latitude, lon: longitude }; }; export const validateTile = (tile: { tileName: string; subTileNumber: number[] }): boolean => { From cad1af101cc2cef06e314b546b375da053e17d6e Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:00:44 +0300 Subject: [PATCH 04/12] fix: use WGS84Coordinate interface instead of implicitly writing { lon: number; lat: number } --- src/latLon/controllers/latLonController.ts | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/src/latLon/controllers/latLonController.ts b/src/latLon/controllers/latLonController.ts index ae1ca70f..00633d6a 100644 --- a/src/latLon/controllers/latLonController.ts +++ b/src/latLon/controllers/latLonController.ts @@ -7,7 +7,7 @@ import { injectable, inject } from 'tsyringe'; import { SERVICES } from '../../common/constants'; import { LatLonManager } from '../models/latLonManager'; import { Tile } from '../../tile/models/tile'; -import { FeatureCollection } from '../../common/interfaces'; +import { FeatureCollection, WGS84Coordinate } from '../../common/interfaces'; type GetLatLonToTileHandler = RequestHandler< undefined, @@ -23,29 +23,16 @@ type GetTileToLatLonHandler = RequestHandler, type GetLatLonToMgrsHandler = RequestHandler; -type GetMgrsToLatLonHandler = RequestHandler< - undefined, - { - lat: number; - lon: number; - }, - undefined, - GetMgrsToLatLonQueryParams ->; +type GetMgrsToLatLonHandler = RequestHandler; -export interface GetLatLonToTileQueryParams { - lat: number; - lon: number; -} +export interface GetLatLonToTileQueryParams extends WGS84Coordinate {} export interface GetTileToLatLonQueryParams { tile: string; sub_tile_number: number[]; } -export interface GetLatLonToMgrsQueryParams { - lat: number; - lon: number; +export interface GetLatLonToMgrsQueryParams extends WGS84Coordinate { accuracy?: number; } export interface GetMgrsToLatLonQueryParams { From f58bd25260bad8505ce598951cdbe5ccb9b9fb68 Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:01:10 +0300 Subject: [PATCH 05/12] chore: added eslint-disable for repository returned type --- src/latLon/DAL/latLonRepository.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/latLon/DAL/latLonRepository.ts b/src/latLon/DAL/latLonRepository.ts index 1e884426..e173010c 100644 --- a/src/latLon/DAL/latLonRepository.ts +++ b/src/latLon/DAL/latLonRepository.ts @@ -3,6 +3,7 @@ import { DataSource } from 'typeorm'; import { FactoryFunction } from 'tsyringe'; import { LatLon as LatLonDb } from './latLon'; +// eslint-disable-next-line @typescript-eslint/explicit-function-return-type const createLatLonRepository = (dataSource: DataSource) => { return dataSource.getRepository(LatLonDb).extend({ async latLonToTile({ x, y, zone }: { x: number; y: number; zone: number }): Promise { From 003e7947d7af3ebfa4b41e9052cd9e7d2402e0d5 Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:01:21 +0300 Subject: [PATCH 06/12] fix: use WGS84Coordinate interface instead of implicitly writing { lon: number; lat: number } --- src/latLon/models/latLonManager.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/latLon/models/latLonManager.ts b/src/latLon/models/latLonManager.ts index cbe322e5..df0214bc 100644 --- a/src/latLon/models/latLonManager.ts +++ b/src/latLon/models/latLonManager.ts @@ -8,7 +8,7 @@ import { convertWgs84ToUTM, validateTile, validateWGS84Coordinate } from '../../ import { convertTilesToUTM, getSubTileByBottomLeftUtmCoor, validateResult } from '../utlis'; import { BadRequestError } from '../../common/errors'; import { Tile } from '../../tile/models/tile'; -import { FeatureCollection } from '../../common/interfaces'; +import { FeatureCollection, WGS84Coordinate } from '../../common/interfaces'; @injectable() export class LatLonManager { @@ -22,7 +22,7 @@ export class LatLonManager { this.dbSchema = this.config.get('db.postgresql.schema'); } - public async latLonToTile({ lat, lon }: { lat: number; lon: number }): Promise<{ + public async latLonToTile({ lat, lon }: WGS84Coordinate): Promise<{ tileName: string; subTileNumber: number[]; }> { From 06fe4bb27bd08a3920c583dfc988a0c008506caf Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:01:55 +0300 Subject: [PATCH 07/12] chore: added types to test.each --- tests/unit/common/utils.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/unit/common/utils.spec.ts b/tests/unit/common/utils.spec.ts index 62076f0b..df63e54c 100644 --- a/tests/unit/common/utils.spec.ts +++ b/tests/unit/common/utils.spec.ts @@ -10,6 +10,7 @@ import { } from '../../../src/common/utils'; import config from '../../../config/test.json'; import { FIELDS } from '../../../src/common/constants'; +import { WGS84Coordinate } from '../../../src/common/interfaces'; import { itemElasticResponse, itemExpectedFormattedResponse, @@ -40,7 +41,7 @@ describe('utils', () => { it('should convert UTM to WGS84', () => { const result = convertUTMToWgs84(630048, 4330433, 29); - expect(result).toMatchObject({ lat: 39.11335578352079, lng: -7.495780486809503 }); + expect(result).toMatchObject({ lat: 39.11335578352079, lon: -7.495780486809503 }); }); it('should convert WGS84 to UTM', () => { @@ -60,7 +61,7 @@ describe('utils', () => { expect(validateTile(tile as never)).toBe(expected); }); - test.each([ + test.each<[WGS84Coordinate, boolean]>([ [{ lon: 50, lat: 50 }, true], [{ lon: 190, lat: 50 }, false], [{ lon: 50, lat: 190 }, false], From 918b9026076ae20ceeef4f19d3b7abfd67119b5f Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:02:36 +0300 Subject: [PATCH 08/12] fixed type name and changed returned type to from custom to correct one --- src/tile/controllers/tileController.ts | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/tile/controllers/tileController.ts b/src/tile/controllers/tileController.ts index 27992fda..3e86c335 100644 --- a/src/tile/controllers/tileController.ts +++ b/src/tile/controllers/tileController.ts @@ -5,16 +5,13 @@ import { RequestHandler } from 'express'; import httpStatus from 'http-status-codes'; import { injectable, inject } from 'tsyringe'; import { SERVICES } from '../../common/constants'; - import { TileManager } from '../models/tileManager'; import { Tile } from '../models/tile'; +import { FeatureCollection } from '../../common/interfaces'; -type GetResourceHandler = RequestHandler< +type GetTilesHandler = RequestHandler< undefined, - | { - type: string; - features: (Tile | undefined)[]; - } + | FeatureCollection | { type: string; message: string; @@ -42,7 +39,7 @@ export class TileController { this.createdResourceCounter = meter.createCounter('created_resource'); } - public getTiles: GetResourceHandler = async (req, res, next) => { + public getTiles: GetTilesHandler = async (req, res, next) => { try { const { tile, sub_tile, reduce_fuzzy_match, size } = req.query; const response = await this.manager.getTiles( From 416ffdeb2038a3398b448f52b9b234e7804069cf Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:03:12 +0300 Subject: [PATCH 09/12] fix: changed handler name to correct and added correct response type --- src/item/controllers/itemController.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/item/controllers/itemController.ts b/src/item/controllers/itemController.ts index a06d2457..1a8f5776 100644 --- a/src/item/controllers/itemController.ts +++ b/src/item/controllers/itemController.ts @@ -7,17 +7,9 @@ import { injectable, inject } from 'tsyringe'; import { SERVICES } from '../../common/constants'; import { ItemManager } from '../models/itemManager'; import { Item } from '../models/item'; -import { GeoContext } from '../../common/interfaces'; +import { FeatureCollection, GeoContext } from '../../common/interfaces'; -type GetResourceHandler = RequestHandler< - undefined, - { - type: string; - features: (Item | undefined)[]; - }, - undefined, - GetItemsQueryParams ->; +type GetItemsHandler = RequestHandler, undefined, GetItemsQueryParams>; export interface GetItemsQueryParams { command_name: string; @@ -40,7 +32,7 @@ export class ItemController { this.createdResourceCounter = meter.createCounter('created_resource'); } - public getItems: GetResourceHandler = async (req, res, next) => { + public getItems: GetItemsHandler = async (req, res, next) => { try { const { command_name: commandName, tile, sub_tile, geo_context, reduce_fuzzy_match, size } = req.query; const response = await this.manager.getItems( From 15ca7f4c244d45bd565c0962ba7cba8f6c0d29a8 Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:03:27 +0300 Subject: [PATCH 10/12] fix: use WGS84Coordinate interface instead of implicitly writing { lon: number; lat: number } --- src/route/DAL/queries.ts | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/src/route/DAL/queries.ts b/src/route/DAL/queries.ts index 628a0ef3..c07f5309 100644 --- a/src/route/DAL/queries.ts +++ b/src/route/DAL/queries.ts @@ -1,7 +1,6 @@ import { estypes } from '@elastic/elasticsearch'; import { boundingBox, geoDistance } from '../../common/elastic/utils'; -import { Route } from '../models/route'; -import { GeoContext } from '../../common/interfaces'; +import { GeoContext, WGS84Coordinate } from '../../common/interfaces'; export interface RouteQueryParams { commandName: string; @@ -61,17 +60,7 @@ export const queryForControlPointInRoute = (params: RouteQueryParams & Required< }, }, ...(params.geo?.bbox ? [boundingBox(params.geo.bbox)] : []), - ...(params.geo?.radius - ? [ - geoDistance( - params.geo as { - radius: number; - lon: number; - lat: number; - } - ), - ] - : []), + ...(params.geo?.radius ?? 0 ? [geoDistance(params.geo as WGS84Coordinate & { radius: number })] : []), ], filter: [ { From 4f93ddbe0645ce6659e9e9096706b11b1ae9b91d Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:04:12 +0300 Subject: [PATCH 11/12] fix: changed handler's name and reponse type --- src/route/controllers/routeController.ts | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/route/controllers/routeController.ts b/src/route/controllers/routeController.ts index 2232fde4..ce388fd3 100644 --- a/src/route/controllers/routeController.ts +++ b/src/route/controllers/routeController.ts @@ -5,20 +5,11 @@ import { RequestHandler } from 'express'; import httpStatus from 'http-status-codes'; import { injectable, inject } from 'tsyringe'; import { SERVICES } from '../../common/constants'; - import { RouteManager } from '../models/routeManager'; import { Route } from '../models/route'; -import { GeoContext } from '../../common/interfaces'; +import { FeatureCollection, GeoContext } from '../../common/interfaces'; -type GetResourceHandler = RequestHandler< - undefined, - { - type: string; - features: (Route | undefined)[]; - }, - undefined, - GetRoutesQueryParams ->; +type GetRoutesHandler = RequestHandler, undefined, GetRoutesQueryParams>; export interface GetRoutesQueryParams { command_name: string; @@ -40,7 +31,7 @@ export class RouteController { this.createdResourceCounter = meter.createCounter('created_resource'); } - public getRoutes: GetResourceHandler = async (req, res, next) => { + public getRoutes: GetRoutesHandler = async (req, res, next) => { try { const { command_name: commandName, control_point, geo_context, reduce_fuzzy_match, size } = req.query; const response = await this.manager.getRoutes( From a853f1866ba6b99aa4c6ca05eeb153d8ddf92f45 Mon Sep 17 00:00:00 2001 From: Niv Greenstein Date: Sun, 12 May 2024 17:04:41 +0300 Subject: [PATCH 12/12] fix: changed coordiante.lng to coordiante.lon --- src/latLon/utlis/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/latLon/utlis/index.ts b/src/latLon/utlis/index.ts index ae6e67de..aedc39ef 100644 --- a/src/latLon/utlis/index.ts +++ b/src/latLon/utlis/index.ts @@ -89,7 +89,7 @@ export const getSubTileByBottomLeftUtmCoor = ( if (typeof coordiante === 'string') { throw new Error('coordinate is string'); } - polygon.coordinates[0].push([coordiante.lng, coordiante.lat]); + polygon.coordinates[0].push([coordiante.lon, coordiante.lat]); } result.features[0].geometry = polygon;