@lyxa.ai/core 1.4.92 → 1.4.95

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/libraries/map/interfaces/IMapService.d.ts +2 -6
  2. package/dist/libraries/map/interfaces/IMapService.js.map +1 -1
  3. package/dist/libraries/map/mapService.d.ts +0 -1
  4. package/dist/libraries/map/mapService.js +2 -2
  5. package/dist/libraries/map/mapService.js.map +1 -1
  6. package/dist/libraries/map/providers/google-maps.d.ts +3 -3
  7. package/dist/libraries/map/providers/google-maps.js +38 -12
  8. package/dist/libraries/map/providers/google-maps.js.map +1 -1
  9. package/dist/libraries/map/providers/osrm.d.ts +3 -3
  10. package/dist/libraries/map/providers/osrm.js +2 -2
  11. package/dist/libraries/map/providers/osrm.js.map +1 -1
  12. package/dist/libraries/mongo/models/google-maps-usage.model.d.ts +0 -2
  13. package/dist/libraries/mongo/models/google-maps-usage.model.js +0 -10
  14. package/dist/libraries/mongo/models/google-maps-usage.model.js.map +1 -1
  15. package/dist/libraries/mongo/models/index.d.ts +9 -0
  16. package/dist/libraries/mongo/models/index.js +12 -3
  17. package/dist/libraries/mongo/models/index.js.map +1 -1
  18. package/dist/libraries/mongo/models/limited-time-offer-campaign.model.d.ts +12 -0
  19. package/dist/libraries/mongo/models/limited-time-offer-campaign.model.js +66 -0
  20. package/dist/libraries/mongo/models/limited-time-offer-campaign.model.js.map +1 -0
  21. package/dist/libraries/mongo/models/limited-time-offer-config.d.ts +6 -0
  22. package/dist/libraries/mongo/models/limited-time-offer-config.js +36 -0
  23. package/dist/libraries/mongo/models/limited-time-offer-config.js.map +1 -0
  24. package/dist/libraries/mongo/models/limited-time-offer-participant.model.d.ts +17 -0
  25. package/dist/libraries/mongo/models/limited-time-offer-participant.model.js +76 -0
  26. package/dist/libraries/mongo/models/limited-time-offer-participant.model.js.map +1 -0
  27. package/dist/libraries/mongo/models/notification.model.d.ts +6 -0
  28. package/dist/libraries/mongo/models/notification.model.js +18 -0
  29. package/dist/libraries/mongo/models/notification.model.js.map +1 -1
  30. package/dist/types/README.md +1 -1
  31. package/dist/types/package.json +1 -1
  32. package/dist/types/utilities/enum.d.ts +10 -3
  33. package/dist/types/utilities/enum.js +12 -4
  34. package/dist/types/utilities/enum.js.map +1 -1
  35. package/dist/utilities/enum.d.ts +10 -3
  36. package/dist/utilities/enum.js +12 -4
  37. package/dist/utilities/enum.js.map +1 -1
  38. package/package.json +1 -1
@@ -32,13 +32,9 @@ export interface IRouteMatrixDTO {
32
32
  originIndex: number;
33
33
  destinationIndex: number;
34
34
  }
35
- export interface IMapCallOptions {
36
- provider?: string;
37
- functionName?: string;
38
- }
39
35
  export interface IMapService {
40
- getDistanceInfo(origin: ICoordinate, destination: ICoordinate, options?: IMapCallOptions): Promise<IDistanceInfo>;
41
- getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: Array<ICoordinate>, options?: IMapCallOptions): Promise<IWaypointDistanceInfo>;
36
+ getDistanceInfo(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo>;
37
+ getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: Array<ICoordinate>): Promise<IWaypointDistanceInfo>;
42
38
  getDistanceMatrix(origins: Array<ICoordinate>, destinations: Array<ICoordinate>): Promise<IRouteMatrixDTO[]>;
43
39
  }
44
40
  export declare enum MapProvider {
@@ -1 +1 @@
1
- {"version":3,"file":"IMapService.js","sourceRoot":"/","sources":["libraries/map/interfaces/IMapService.ts"],"names":[],"mappings":";;;AA8DA,IAAY,WAGX;AAHD,WAAY,WAAW;IACtB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;AACd,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB","sourcesContent":["export interface ICoordinate {\n\tlongitude: number;\n\tlatitude: number;\n}\n\nexport interface IDistance {\n\tvalue: number;\n\ttext: string;\n}\n\nexport interface IDuration {\n\tvalue: number;\n\ttext: string;\n}\n\nexport interface ILeg {\n\tdistance: IDistance;\n\tduration: IDuration;\n\toverviewPolyline: Array<[number, number]>;\n}\n\nexport interface IDistanceInfo {\n\tdistance: IDistance;\n\tduration: IDuration;\n}\n\nexport interface IWaypointDistanceInfo {\n\tdistance: IDistance;\n\tduration: IDuration;\n\tlegs: Array<ILeg>;\n\toverviewPolyline: Array<[number, number]>;\n}\n\nexport interface IRouteMatrixDTO {\n\tdistance: IDistance;\n\tduration: IDuration;\n\tcondition: string;\n\toriginIndex: number;\n\tdestinationIndex: number;\n}\n\nexport interface IMapCallOptions {\n\tprovider?: string;\n\tfunctionName?: string;\n}\n\nexport interface IMapService {\n\tgetDistanceInfo(origin: ICoordinate, destination: ICoordinate, options?: IMapCallOptions): Promise<IDistanceInfo>;\n\n\tgetWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>,\n\t\toptions?: IMapCallOptions\n\t): Promise<IWaypointDistanceInfo>;\n\n\tgetDistanceMatrix(\n\t\torigins: Array<ICoordinate>,\n\t\tdestinations: Array<ICoordinate>\n\t): Promise<IRouteMatrixDTO[]>;\n}\n\nexport enum MapProvider {\n\tGOOGLE = 'google',\n\tOSRM = 'osrm',\n}\n"]}
1
+ {"version":3,"file":"IMapService.js","sourceRoot":"/","sources":["libraries/map/interfaces/IMapService.ts"],"names":[],"mappings":";;;AAwDA,IAAY,WAGX;AAHD,WAAY,WAAW;IACtB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;AACd,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB","sourcesContent":["export interface ICoordinate {\n\tlongitude: number;\n\tlatitude: number;\n}\n\nexport interface IDistance {\n\tvalue: number;\n\ttext: string;\n}\n\nexport interface IDuration {\n\tvalue: number;\n\ttext: string;\n}\n\nexport interface ILeg {\n\tdistance: IDistance;\n\tduration: IDuration;\n\toverviewPolyline: Array<[number, number]>;\n}\n\nexport interface IDistanceInfo {\n\tdistance: IDistance;\n\tduration: IDuration;\n}\n\nexport interface IWaypointDistanceInfo {\n\tdistance: IDistance;\n\tduration: IDuration;\n\tlegs: Array<ILeg>;\n\toverviewPolyline: Array<[number, number]>;\n}\n\nexport interface IRouteMatrixDTO {\n\tdistance: IDistance;\n\tduration: IDuration;\n\tcondition: string;\n\toriginIndex: number;\n\tdestinationIndex: number;\n}\n\nexport interface IMapService {\n\tgetDistanceInfo(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo>;\n\n\tgetWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>\n\t): Promise<IWaypointDistanceInfo>;\n\n\tgetDistanceMatrix(\n\t\torigins: Array<ICoordinate>,\n\t\tdestinations: Array<ICoordinate>\n\t): Promise<IRouteMatrixDTO[]>;\n}\n\nexport enum MapProvider {\n\tGOOGLE = 'google',\n\tOSRM = 'osrm',\n}\n"]}
@@ -7,7 +7,6 @@ export declare enum MapProvider {
7
7
  }
8
8
  export interface MapOptions {
9
9
  provider: MapProvider;
10
- functionName: string;
11
10
  }
12
11
  export declare class MapService {
13
12
  private google;
@@ -44,10 +44,10 @@ class MapService {
44
44
  return this.calculateHaversineDistance(coord1, coord2);
45
45
  }
46
46
  async getDistanceInfo(origin, destination, options) {
47
- return await this.getProvider(options).getDistanceInfo(origin, destination, options);
47
+ return await this.getProvider(options).getDistanceInfo(origin, destination);
48
48
  }
49
49
  async getWaypointsDistanceInfo(origin, destination, waypoints, options) {
50
- return await this.getProvider(options).getWaypointsDistanceInfo(origin, destination, waypoints, options);
50
+ return await this.getProvider(options).getWaypointsDistanceInfo(origin, destination, waypoints);
51
51
  }
52
52
  async getDistanceMatrix(origins, destinations, options) {
53
53
  return await this.getProvider(options).getDistanceMatrix(origins, destinations);
@@ -1 +1 @@
1
- {"version":3,"file":"mapService.js","sourceRoot":"/","sources":["libraries/map/mapService.ts"],"names":[],"mappings":";;;AASA,8DAAoE;AAEpE,IAAY,WAGX;AAHD,WAAY,WAAW;IACtB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;AACd,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB;AAQD,MAAa,UAAU;IACd,MAAM,CAAoB;IAC1B,IAAI,CAAiB;IAE7B,YAAY,MAAyB,EAAE,IAAoB;QAC1D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAQM,0BAA0B,CAAC,MAAwB,EAAE,MAAwB;QACnF,OAAO,IAAA,4BAAiB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CAAC,OAAoB;QAEvC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC;QAEvD,QAAQ,QAAQ,EAAE,CAAC;YAClB,KAAK,WAAW,CAAC,MAAM;gBACtB,OAAO,IAAI,CAAC,MAAM,CAAC;YACpB,KAAK,WAAW,CAAC,IAAI;gBACpB,OAAO,IAAI,CAAC,IAAI,CAAC;YAClB;gBACC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAC/C,MAAwB,EACxB,MAAwB,EACxB,OAAoB;QAEpB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QAC5B,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QAE5B,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,eAAe,CACnE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EACnC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CACnC,CAAC;YACF,IAAI,YAAY,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAC3C,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;YAC3C,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CACpB,MAAmB,EACnB,WAAwB,EACxB,OAAoB;QAEpB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC7B,MAAmB,EACnB,WAAwB,EACxB,SAA6B,EAC7B,OAAoB;QAEpB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAC1G,CAAC;IAED,KAAK,CAAC,iBAAiB,CACtB,OAA2B,EAC3B,YAAgC,EAChC,OAAoB;QAEpB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjF,CAAC;CACD;AAhFD,gCAgFC","sourcesContent":["import { GoogleMapsService } from './providers/google-maps';\nimport { OsrmMapService } from './providers/osrm';\nimport {\n\tICoordinate,\n\tIDistanceInfo,\n\tIMapService,\n\tIRouteMatrixDTO,\n\tIWaypointDistanceInfo,\n} from './interfaces/IMapService';\nimport { haversineDistance } from '../../utilities/shared/distance';\n\nexport enum MapProvider {\n\tGOOGLE = 'google',\n\tOSRM = 'osrm',\n}\n\nexport interface MapOptions {\n\tprovider: MapProvider;\n\tfunctionName: string;\n\t// Add other options if needed\n}\n\nexport class MapService {\n\tprivate google: GoogleMapsService;\n\tprivate osrm: OsrmMapService;\n\n\tconstructor(google: GoogleMapsService, osrm: OsrmMapService) {\n\t\tthis.google = google;\n\t\tthis.osrm = osrm;\n\t}\n\n\t/**\n\t *\n\t * @param coord1 [latitude, longitude]\n\t * @param coord2 [latitude, longitude]\n\t * @returns straight line distance in KM\n\t */\n\tpublic calculateHaversineDistance(coord1: [number, number], coord2: [number, number]): number {\n\t\treturn haversineDistance(coord1, coord2);\n\t}\n\n\tprivate getProvider(options?: MapOptions): IMapService {\n\t\t// Default to OSRM if options not provided\n\t\tconst provider = options?.provider ?? MapProvider.OSRM;\n\n\t\tswitch (provider) {\n\t\t\tcase MapProvider.GOOGLE:\n\t\t\t\treturn this.google;\n\t\t\tcase MapProvider.OSRM:\n\t\t\t\treturn this.osrm;\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Unknown map provider');\n\t\t}\n\t}\n\n\tpublic async calculateDistanceBetweenCoordinates(\n\t\tcoord1: [number, number],\n\t\tcoord2: [number, number],\n\t\toptions?: MapOptions // optional\n\t): Promise<number> {\n\t\tconst [lon1, lat1] = coord1;\n\t\tconst [lon2, lat2] = coord2;\n\n\t\ttry {\n\t\t\tconst distanceInfo = await this.getProvider(options).getDistanceInfo(\n\t\t\t\t{ latitude: lat1, longitude: lon1 },\n\t\t\t\t{ latitude: lat2, longitude: lon2 }\n\t\t\t);\n\t\t\tif (distanceInfo && distanceInfo.distance) {\n\t\t\t\treturn distanceInfo.distance.value / 1000;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error fetching distance info: ${error}`);\n\t\t}\n\t\tconsole.log('Maps API failed. Falling back to Haversine calculation.');\n\t\treturn this.calculateHaversineDistance(coord1, coord2);\n\t}\n\n\tasync getDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\toptions?: MapOptions\n\t): Promise<IDistanceInfo> {\n\t\treturn await this.getProvider(options).getDistanceInfo(origin, destination, options);\n\t}\n\n\tasync getWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>,\n\t\toptions?: MapOptions\n\t): Promise<IWaypointDistanceInfo> {\n\t\treturn await this.getProvider(options).getWaypointsDistanceInfo(origin, destination, waypoints, options);\n\t}\n\n\tasync getDistanceMatrix(\n\t\torigins: Array<ICoordinate>,\n\t\tdestinations: Array<ICoordinate>,\n\t\toptions?: MapOptions\n\t): Promise<IRouteMatrixDTO[]> {\n\t\treturn await this.getProvider(options).getDistanceMatrix(origins, destinations);\n\t}\n}\n"]}
1
+ {"version":3,"file":"mapService.js","sourceRoot":"/","sources":["libraries/map/mapService.ts"],"names":[],"mappings":";;;AASA,8DAAoE;AAEpE,IAAY,WAGX;AAHD,WAAY,WAAW;IACtB,gCAAiB,CAAA;IACjB,4BAAa,CAAA;AACd,CAAC,EAHW,WAAW,2BAAX,WAAW,QAGtB;AAOD,MAAa,UAAU;IACd,MAAM,CAAoB;IAC1B,IAAI,CAAiB;IAE7B,YAAY,MAAyB,EAAE,IAAoB;QAC1D,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,CAAC;IAQM,0BAA0B,CAAC,MAAwB,EAAE,MAAwB;QACnF,OAAO,IAAA,4BAAiB,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAEO,WAAW,CAAC,OAAoB;QAEvC,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,WAAW,CAAC,IAAI,CAAC;QAEvD,QAAQ,QAAQ,EAAE,CAAC;YAClB,KAAK,WAAW,CAAC,MAAM;gBACtB,OAAO,IAAI,CAAC,MAAM,CAAC;YACpB,KAAK,WAAW,CAAC,IAAI;gBACpB,OAAO,IAAI,CAAC,IAAI,CAAC;YAClB;gBACC,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC1C,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,mCAAmC,CAC/C,MAAwB,EACxB,MAAwB,EACxB,OAAoB;QAEpB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QAC5B,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;QAE5B,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,eAAe,CACnE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,EACnC,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CACnC,CAAC;YACF,IAAI,YAAY,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC;gBAC3C,OAAO,YAAY,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC;YAC3C,CAAC;QACF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,iCAAiC,KAAK,EAAE,CAAC,CAAC;QACzD,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,IAAI,CAAC,0BAA0B,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,eAAe,CACpB,MAAmB,EACnB,WAAwB,EACxB,OAAoB;QAEpB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC7E,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC7B,MAAmB,EACnB,WAAwB,EACxB,SAA6B,EAC7B,OAAoB;QAEpB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,wBAAwB,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;IACjG,CAAC;IAED,KAAK,CAAC,iBAAiB,CACtB,OAA2B,EAC3B,YAAgC,EAChC,OAAoB;QAEpB,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,iBAAiB,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjF,CAAC;CACD;AAhFD,gCAgFC","sourcesContent":["import { GoogleMapsService } from './providers/google-maps';\nimport { OsrmMapService } from './providers/osrm';\nimport {\n\tICoordinate,\n\tIDistanceInfo,\n\tIMapService,\n\tIRouteMatrixDTO,\n\tIWaypointDistanceInfo,\n} from './interfaces/IMapService';\nimport { haversineDistance } from '../../utilities/shared/distance';\n\nexport enum MapProvider {\n\tGOOGLE = 'google',\n\tOSRM = 'osrm',\n}\n\nexport interface MapOptions {\n\tprovider: MapProvider;\n\t// Add other options if needed\n}\n\nexport class MapService {\n\tprivate google: GoogleMapsService;\n\tprivate osrm: OsrmMapService;\n\n\tconstructor(google: GoogleMapsService, osrm: OsrmMapService) {\n\t\tthis.google = google;\n\t\tthis.osrm = osrm;\n\t}\n\n\t/**\n\t *\n\t * @param coord1 [latitude, longitude]\n\t * @param coord2 [latitude, longitude]\n\t * @returns straight line distance in KM\n\t */\n\tpublic calculateHaversineDistance(coord1: [number, number], coord2: [number, number]): number {\n\t\treturn haversineDistance(coord1, coord2);\n\t}\n\t\n\tprivate getProvider(options?: MapOptions): IMapService {\n\t\t// Default to OSRM if options not provided\n\t\tconst provider = options?.provider ?? MapProvider.OSRM;\n\n\t\tswitch (provider) {\n\t\t\tcase MapProvider.GOOGLE:\n\t\t\t\treturn this.google;\n\t\t\tcase MapProvider.OSRM:\n\t\t\t\treturn this.osrm;\n\t\t\tdefault:\n\t\t\t\tthrow new Error('Unknown map provider');\n\t\t}\n\t}\n\n\tpublic async calculateDistanceBetweenCoordinates(\n\t\tcoord1: [number, number],\n\t\tcoord2: [number, number],\n\t\toptions?: MapOptions // optional\n\t): Promise<number> {\n\t\tconst [lon1, lat1] = coord1;\n\t\tconst [lon2, lat2] = coord2;\n\n\t\ttry {\n\t\t\tconst distanceInfo = await this.getProvider(options).getDistanceInfo(\n\t\t\t\t{ latitude: lat1, longitude: lon1 },\n\t\t\t\t{ latitude: lat2, longitude: lon2 }\n\t\t\t);\n\t\t\tif (distanceInfo && distanceInfo.distance) {\n\t\t\t\treturn distanceInfo.distance.value / 1000;\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error fetching distance info: ${error}`);\n\t\t}\n\t\tconsole.log('Maps API failed. Falling back to Haversine calculation.');\n\t\treturn this.calculateHaversineDistance(coord1, coord2);\n\t}\n\n\tasync getDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\toptions?: MapOptions\n\t): Promise<IDistanceInfo> {\n\t\treturn await this.getProvider(options).getDistanceInfo(origin, destination);\n\t}\n\n\tasync getWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>,\n\t\toptions?: MapOptions\n\t): Promise<IWaypointDistanceInfo> {\n\t\treturn await this.getProvider(options).getWaypointsDistanceInfo(origin, destination, waypoints);\n\t}\n\n\tasync getDistanceMatrix(\n\t\torigins: Array<ICoordinate>,\n\t\tdestinations: Array<ICoordinate>,\n\t\toptions?: MapOptions\n\t): Promise<IRouteMatrixDTO[]> {\n\t\treturn await this.getProvider(options).getDistanceMatrix(origins, destinations);\n\t}\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { IMapService, IMapCallOptions, ICoordinate, IDistanceInfo, IWaypointDistanceInfo, IRouteMatrixDTO } from '../interfaces/IMapService';
1
+ import { IMapService, ICoordinate, IDistanceInfo, IWaypointDistanceInfo, IRouteMatrixDTO } from '../interfaces/IMapService';
2
2
  import { RedisService } from '../../redis';
3
3
  export declare class GoogleMapsService implements IMapService {
4
4
  private redisService;
@@ -13,9 +13,9 @@ export declare class GoogleMapsService implements IMapService {
13
13
  private logApiUsage;
14
14
  private clearRouteCache;
15
15
  private getCacheStats;
16
- getDistanceInfo(origin: ICoordinate, destination: ICoordinate, options?: IMapCallOptions): Promise<IDistanceInfo>;
16
+ getDistanceInfo(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo>;
17
17
  private getDistanceInfoFromGoogle_DEPRECATED;
18
- getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: Array<ICoordinate>, options?: IMapCallOptions): Promise<IWaypointDistanceInfo>;
18
+ getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: Array<ICoordinate>): Promise<IWaypointDistanceInfo>;
19
19
  private getWaypointsDistanceInfoFromGoogle_DEPRECATED;
20
20
  getDistanceMatrix(origins: Array<ICoordinate>, destinations: Array<ICoordinate>): Promise<IRouteMatrixDTO[]>;
21
21
  private getDistanceInfoFromGoogle;
@@ -105,8 +105,6 @@ let GoogleMapsService = class GoogleMapsService {
105
105
  waypoints: metadata.waypoints || null,
106
106
  ipAddress: metadata.ipAddress || null,
107
107
  userAgent: metadata.userAgent || null,
108
- functionName: metadata.functionName || null,
109
- provider: metadata.provider || null,
110
108
  },
111
109
  });
112
110
  }
@@ -127,7 +125,7 @@ let GoogleMapsService = class GoogleMapsService {
127
125
  cacheKeys: keys,
128
126
  };
129
127
  };
130
- async getDistanceInfo(origin, destination, options) {
128
+ async getDistanceInfo(origin, destination) {
131
129
  const startTime = Date.now();
132
130
  const cacheKey = `distance:${this.createCacheKey(origin, destination)}`;
133
131
  const cacheTTL = 3600;
@@ -135,7 +133,10 @@ let GoogleMapsService = class GoogleMapsService {
135
133
  const cachedData = await this.redisService.getCachedObject(cacheKey);
136
134
  if (cachedData) {
137
135
  const responseTime = Date.now() - startTime;
138
- await this.logApiUsage('DistanceInfoGoogle', true, { origin, destination, ...options }, responseTime);
136
+ await this.logApiUsage('DistanceInfoGoogle', true, {
137
+ origin,
138
+ destination,
139
+ }, responseTime);
139
140
  return cachedData;
140
141
  }
141
142
  const lock = await this.acquireDistributedLock(cacheKey);
@@ -143,13 +144,19 @@ let GoogleMapsService = class GoogleMapsService {
143
144
  const cachedDataAfterLock = await this.redisService.getCachedObject(cacheKey);
144
145
  if (cachedDataAfterLock) {
145
146
  const responseTime = Date.now() - startTime;
146
- await this.logApiUsage('DistanceInfoGoogle', true, { origin, destination, ...options }, responseTime);
147
+ await this.logApiUsage('DistanceInfoGoogle', true, {
148
+ origin,
149
+ destination,
150
+ }, responseTime);
147
151
  return cachedDataAfterLock;
148
152
  }
149
153
  const result = await this.getDistanceInfoFromGoogle(origin, destination);
150
154
  await this.redisService.cacheObject(cacheKey, result, cacheTTL);
151
155
  const responseTime = Date.now() - startTime;
152
- await this.logApiUsage('DistanceInfoGoogle', false, { origin, destination, ...options }, responseTime);
156
+ await this.logApiUsage('DistanceInfoGoogle', false, {
157
+ origin,
158
+ destination,
159
+ }, responseTime);
153
160
  return result;
154
161
  }
155
162
  finally {
@@ -160,7 +167,10 @@ let GoogleMapsService = class GoogleMapsService {
160
167
  }
161
168
  catch (error) {
162
169
  const responseTime = Date.now() - startTime;
163
- await this.logApiUsage('DistanceInfoGoogle', false, { origin, destination, ...options }, responseTime, error);
170
+ await this.logApiUsage('DistanceInfoGoogle', false, {
171
+ origin,
172
+ destination,
173
+ }, responseTime, error);
164
174
  throw new server_1.TRPCError({
165
175
  code: 'INTERNAL_SERVER_ERROR',
166
176
  message: 'Failed to fetch distance information from Maps API.',
@@ -190,7 +200,7 @@ let GoogleMapsService = class GoogleMapsService {
190
200
  });
191
201
  }
192
202
  }
193
- async getWaypointsDistanceInfo(origin, destination, waypoints, options) {
203
+ async getWaypointsDistanceInfo(origin, destination, waypoints) {
194
204
  const startTime = Date.now();
195
205
  const cacheKey = `distance_waypoints:${this.createCacheKey(origin, destination, waypoints)}`;
196
206
  const cacheTTL = 3600;
@@ -198,7 +208,11 @@ let GoogleMapsService = class GoogleMapsService {
198
208
  const cachedData = await this.redisService.getCachedObject(cacheKey);
199
209
  if (cachedData) {
200
210
  const responseTime = Date.now() - startTime;
201
- await this.logApiUsage('DistanceInfoGoogleWithWayPoints', true, { origin, destination, waypoints, ...options }, responseTime);
211
+ await this.logApiUsage('DistanceInfoGoogleWithWayPoints', true, {
212
+ origin,
213
+ destination,
214
+ waypoints,
215
+ }, responseTime);
202
216
  return cachedData;
203
217
  }
204
218
  const lock = await this.acquireDistributedLock(cacheKey);
@@ -206,13 +220,21 @@ let GoogleMapsService = class GoogleMapsService {
206
220
  const cachedDataAfterLock = await this.redisService.getCachedObject(cacheKey);
207
221
  if (cachedDataAfterLock) {
208
222
  const responseTime = Date.now() - startTime;
209
- await this.logApiUsage('DistanceInfoGoogleWithWayPoints', true, { origin, destination, waypoints, ...options }, responseTime);
223
+ await this.logApiUsage('DistanceInfoGoogleWithWayPoints', true, {
224
+ origin,
225
+ destination,
226
+ waypoints,
227
+ }, responseTime);
210
228
  return cachedDataAfterLock;
211
229
  }
212
230
  const result = await this.getWaypointsDistanceInfoFromGoogle(origin, destination, waypoints);
213
231
  await this.redisService.cacheObject(cacheKey, result, cacheTTL);
214
232
  const responseTime = Date.now() - startTime;
215
- await this.logApiUsage('DistanceInfoGoogleWithWayPoints', false, { origin, destination, waypoints, ...options }, responseTime);
233
+ await this.logApiUsage('DistanceInfoGoogleWithWayPoints', false, {
234
+ origin,
235
+ destination,
236
+ waypoints,
237
+ }, responseTime);
216
238
  return result;
217
239
  }
218
240
  finally {
@@ -223,7 +245,11 @@ let GoogleMapsService = class GoogleMapsService {
223
245
  }
224
246
  catch (error) {
225
247
  const responseTime = Date.now() - startTime;
226
- await this.logApiUsage('DistanceInfoGoogleWithWayPoints', false, { origin, destination, waypoints, ...options }, responseTime, error);
248
+ await this.logApiUsage('DistanceInfoGoogleWithWayPoints', false, {
249
+ origin,
250
+ destination,
251
+ waypoints,
252
+ }, responseTime, error);
227
253
  throw new server_1.TRPCError({
228
254
  code: 'INTERNAL_SERVER_ERROR',
229
255
  message: 'Failed to fetch waypoint distance information from Maps API.',
@@ -1 +1 @@
1
- {"version":3,"file":"google-maps.js","sourceRoot":"/","sources":["libraries/map/providers/google-maps.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA0B;AAY1B,2DAA6C;AAC7C,yCAAyC;AACzC,uCAA2C;AAC3C,mCAAiD;AACjD,mCAAgC;AAChC,+CAA0D;AAU1D,IAAa,iBAAiB,GAA9B,MAAa,iBAAiB;IAOQ;IAN7B,OAAO,CAAqB;IAC5B,QAAQ,CAA8B;IACtC,SAAS,GAAW,2DAA2D,CAAC;IAChF,eAAe,GAAW,oEAAoE,CAAC;IAEvG,YACqC,YAA0B,EAC9D,MAAc;QADsB,iBAAY,GAAZ,YAAY,CAAc;QAG9D,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,QAAQ,GAAG,6BAAmD,CAAC;IACrE,CAAC;IAEO,cAAc,CAAC,MAAmB,EAAE,WAAwB,EAAE,YAA2B,EAAE;QAClG,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAC3D,MAAM,cAAc,GAAG,GAAG,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;QAE1E,IAAI,OAAO,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,EAAc,EAAE,CAAC;QAE5F,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,OAAO,CAAC,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3F,CAAC;QAED,OAAO,IAAA,mBAAU,EAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxE,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,GAAW,EAAE,GAAG,GAAG,EAAE;QACzD,MAAM,KAAK,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,GAAG,EAAE,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACxF,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3C,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAAC,OAAe,EAAE,KAAa;QAClE,MAAM,GAAG,GAAG;;;;;;KAMT,CAAC;QACJ,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,WAAW,CACxB,QAAgB,EAChB,QAAQ,GAAG,KAAK,EAChB,WAQI,EAAE,EACN,YAAoB,EACpB,KAAa;QAEb,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC1B,QAAQ;gBACR,QAAQ;gBACR,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;gBACnC,YAAY,EAAE,YAAY;gBAC1B,QAAQ,EAAE;oBACT,MAAM,EAAE,QAAQ,CAAC,MAAM,IAAI,IAAI;oBAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,IAAI;oBACzC,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;oBACrC,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;oBACrC,SAAS,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;oBACrC,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI,IAAI;oBAC3C,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,IAAI;iBACnC;aACD,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,QAAQ,EAAE,CAAC;YACnB,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAEO,eAAe,GAAG,KAAK,EAAE,MAAmB,EAAE,WAAwB,EAAE,SAAS,GAAG,EAAE,EAAE,EAAE;QACjG,MAAM,QAAQ,GAAG,SAAS;YACzB,CAAC,CAAC,sBAAsB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE;YAC7E,CAAC,CAAC,YAAY,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;QAE1D,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEM,aAAa,GAAG,KAAK,IAAI,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnE,OAAO;YACN,iBAAiB,EAAE,IAAI,CAAC,MAAM;YAC9B,SAAS,EAAE,IAAI;SACf,CAAC;IACH,CAAC,CAAC;IAEK,KAAK,CAAC,eAAe,CAAC,MAAmB,EAAE,WAAwB,EAAE,OAAyB;QACpG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;QACxE,MAAM,QAAQ,GAAG,IAAI,CAAC;QAEtB,IAAI,CAAC;YACJ,MAAM,UAAU,GAA8B,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAChG,IAAI,UAAU,EAAE,CAAC;gBAChB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,oBAAoB,EACpB,IAAI,EACJ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,EACnC,YAAY,CACZ,CAAC;gBACF,OAAO,UAAU,CAAC;YACnB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAEzD,IAAI,CAAC;gBACJ,MAAM,mBAAmB,GACxB,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,mBAAmB,EAAE,CAAC;oBACzB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,oBAAoB,EACpB,IAAI,EACJ,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,EACnC,YAAY,CACZ,CAAC;oBACF,OAAO,mBAAmB,CAAC;gBAC5B,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;gBAEzE,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAEhE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,oBAAoB,EACpB,KAAK,EACL,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,EACnC,YAAY,CACZ,CAAC;gBAEF,OAAO,MAAM,CAAC;YACf,CAAC;oBAAS,CAAC;gBACV,IAAI,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7D,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,oBAAoB,EACpB,KAAK,EACL,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,EAAE,EACnC,YAAY,EACZ,KAAK,CACL,CAAC;YACF,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,qDAAqD;aAC9D,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,oCAAoC,CACjD,MAAmB,EACnB,WAAwB;QAExB,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,+DAA+D,MAAM,CAAC,QAAQ,KAAK,MAAM,CAAC,SAAS,gBAAgB,WAAW,CAAC,QAAQ,KAAK,WAAW,CAAC,SAAS,QAAQ,IAAI,CAAC,OAAO,eAAe,CAAC;YAEjN,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtC,MAAM,IAAI,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAEtC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC;YAChC,MAAM,QAAQ,GAAG,IAAI,EAAE,QAAQ,CAAC;YAEhC,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,kBAAS,CAAC;oBACnB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,4CAA4C;iBACrD,CAAC,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;YACpD,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,4DAA4D;aACrE,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,wBAAwB,CACpC,MAAmB,EACnB,WAAwB,EACxB,SAA6B,EAC7B,OAAyB;QAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,sBAAsB,IAAI,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,EAAE,CAAC;QAC7F,MAAM,QAAQ,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC;YACJ,MAAM,UAAU,GAAsC,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YACxG,IAAI,UAAU,EAAE,CAAC;gBAChB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,iCAAiC,EACjC,IAAI,EACJ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,EAC9C,YAAY,CACZ,CAAC;gBACF,OAAO,UAAU,CAAC;YACnB,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;YAEzD,IAAI,CAAC;gBACJ,MAAM,mBAAmB,GACxB,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;gBACnD,IAAI,mBAAmB,EAAE,CAAC;oBACzB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;oBAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,iCAAiC,EACjC,IAAI,EACJ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,EAC9C,YAAY,CACZ,CAAC;oBACF,OAAO,mBAAmB,CAAC;gBAC5B,CAAC;gBAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kCAAkC,CAAC,MAAM,EAAE,WAAW,EAAE,SAAS,CAAC,CAAC;gBAE7F,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;gBAEhE,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,iCAAiC,EACjC,KAAK,EACL,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,EAC9C,YAAY,CACZ,CAAC;gBAEF,OAAO,MAAM,CAAC;YACf,CAAC;oBAAS,CAAC;gBACV,IAAI,IAAI,EAAE,CAAC;oBACV,MAAM,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC7D,CAAC;YACF,CAAC;QACF,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACrB,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC5C,MAAM,IAAI,CAAC,WAAW,CACrB,iCAAiC,EACjC,KAAK,EACL,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,EAC9C,YAAY,EACZ,KAAK,CACL,CAAC;YACF,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,8DAA8D;aACvE,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,6CAA6C,CAC1D,MAAmB,EACnB,WAAwB,EACxB,SAA6B;QAE7B,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAE9F,MAAM,GAAG,GAAG,+DAA+D,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,SAAS,gBAAgB,WAAW,CAAC,QAAQ,IAAI,WAAW,CAAC,SAAS,cAAc,YAAY,QAAQ,IAAI,CAAC,OAAO,eAAe,CAAC;YAEzO,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAEtC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;YAE/B,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAE5E,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAmD,EAAE,EAAE;gBAC7F,MAAM,gBAAgB,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;gBAE9F,OAAO;oBACN,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,QAAQ,EAAE,GAAG,CAAC,QAAQ;oBACtB,gBAAgB;iBAChB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,MAAM,aAAa,GAAG,IAAI,EAAE,MAAM,CACjC,CAAC,GAAQ,EAAE,IAAkC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAC3E,CAAC,CACD,CAAC;YACF,MAAM,QAAQ,GAAG;gBAChB,IAAI,EAAE,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;gBAC/C,KAAK,EAAE,aAAa;aACpB,CAAC;YAEF,MAAM,aAAa,GAAG,IAAI,EAAE,MAAM,CACjC,CAAC,GAAQ,EAAE,IAAkC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,KAAK,EAC3E,CAAC,CACD,CAAC;YACF,MAAM,QAAQ,GAAG;gBAChB,IAAI,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,EAAE,CAAC,OAAO;gBAC9C,KAAK,EAAE,aAAa;aACpB,CAAC;YAEF,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC5B,MAAM,IAAI,kBAAS,CAAC;oBACnB,IAAI,EAAE,uBAAuB;oBAC7B,OAAO,EAAE,4CAA4C;iBACrD,CAAC,CAAC;YACJ,CAAC;YAED,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,gBAAgB,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,sCAAsC,KAAK,EAAE,CAAC,CAAC;YAC7D,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,qEAAqE;aAC9E,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,iBAAiB,CAC7B,OAA2B,EAC3B,YAAgC;QAEhC,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG;gBACZ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;gBACrC,YAAY,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC/C,UAAU,EAAE,OAAO;gBACnB,iBAAiB,EAAE,eAAe;aAClC,CAAC;YAEF,MAAM,SAAS,GAAG,gEAAgE,CAAC;YAEnF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,EAAE;gBAC7D,OAAO,EAAE;oBACR,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB,EAAE,IAAI,CAAC,OAAO;oBAC9B,kBAAkB,EAAE,SAAS;iBAC7B;aACD,CAAC,CAAC;YAGH,MAAM,OAAO,GAAsB,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAqB,EAAE,EAAE;gBAC9E,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC;gBAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,CAAC;gBAE3D,OAAO;oBACN,QAAQ;oBACR,QAAQ;oBACR,SAAS,EAAE,IAAI,CAAC,SAAS;oBACzB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;iBACvC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,OAAO,EAAE,CAAC;IACX,CAAC;IAEO,KAAK,CAAC,yBAAyB,CAAC,MAAmB,EAAE,WAAwB;QACpF,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG;gBACZ,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/B,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;gBACzC,UAAU,EAAE,OAAO;gBACnB,iBAAiB,EAAE,eAAe;gBAClC,wBAAwB,EAAE,KAAK;gBAC/B,cAAc,EAAE;oBACf,UAAU,EAAE,KAAK;oBACjB,aAAa,EAAE,KAAK;oBACpB,YAAY,EAAE,KAAK;iBACnB;gBACD,YAAY,EAAE,OAAO;gBACrB,KAAK,EAAE,QAAQ;aACf,CAAC;YAEF,MAAM,SAAS,GAAG,uCAAuC,CAAC;YAE1D,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;gBACvD,OAAO,EAAE;oBACR,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB,EAAE,IAAI,CAAC,OAAO;oBAC9B,kBAAkB,EAAE,SAAS;iBAC7B;aACD,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAEpD,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;QAC/B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,4DAA4D;aACrE,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAEO,KAAK,CAAC,kCAAkC,CAC/C,MAAmB,EACnB,WAAwB,EACxB,SAA6B;QAE7B,IAAI,CAAC;YACJ,MAAM,IAAI,GAAG;gBACZ,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBAC/B,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;gBACzC,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC7C,UAAU,EAAE,OAAO;gBACnB,iBAAiB,EAAE,eAAe;gBAClC,wBAAwB,EAAE,KAAK;gBAC/B,cAAc,EAAE;oBACf,UAAU,EAAE,KAAK;oBACjB,aAAa,EAAE,KAAK;oBACpB,YAAY,EAAE,KAAK;iBACnB;gBACD,YAAY,EAAE,OAAO;gBACrB,KAAK,EAAE,QAAQ;aACf,CAAC;YAEF,MAAM,SAAS,GAAG,QAAQ,CAAC;YAE3B,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE;gBACvD,OAAO,EAAE;oBACR,cAAc,EAAE,kBAAkB;oBAClC,gBAAgB,EAAE,IAAI,CAAC,OAAO;oBAC9B,kBAAkB,EAAE,SAAS;iBAC7B;aACD,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACpD,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;YAEzE,MAAM,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CACnC,CAAC,GAAwF,EAAE,EAAE;gBAC5F,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAEvE,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;gBAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAErD,OAAO;oBACN,QAAQ,EAAE,WAAW;oBACrB,QAAQ,EAAE,WAAW;oBACrB,gBAAgB;iBAChB,CAAC;YACH,CAAC,CACD,CAAC;YAEF,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC;QACvD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,wCAAwC,KAAK,EAAE,CAAC,CAAC;YAC/D,MAAM,IAAI,kBAAS,CAAC;gBACnB,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,qEAAqE;aAC9E,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAOO,UAAU,CAAC,KAAkB;QACpC,OAAO,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,CAAC;IAC3F,CAAC;IAOO,UAAU,CAAC,KAAkB;QACpC,OAAO,EAAE,QAAQ,EAAE,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,CAAC;IACzG,CAAC;IAOO,aAAa,CAAC,QAAgB;QACrC,MAAM,eAAe,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;QAE5D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;QACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAEzD,MAAM,YAAY,GAAG,eAAe;YACnC,CAAC,CAAC,eAAe,GAAG,EAAE;gBACrB,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,eAAe,GAAG,IAAI;oBACvB,CAAC,CAAC,OAAO,KAAK,CAAC;wBACd,CAAC,CAAC,OAAO;wBACT,CAAC,CAAC,GAAG,OAAO,OAAO;oBACpB,CAAC,CAAC,KAAK,KAAK,CAAC;wBACZ,CAAC,CAAC,OAAO,KAAK,CAAC;4BACd,CAAC,CAAC,QAAQ;4BACV,CAAC,CAAC,OAAO,KAAK,CAAC;gCACd,CAAC,CAAC,cAAc;gCAChB,CAAC,CAAC,UAAU,OAAO,OAAO;wBAC5B,CAAC,CAAC,OAAO,KAAK,CAAC;4BACd,CAAC,CAAC,GAAG,KAAK,QAAQ;4BAClB,CAAC,CAAC,OAAO,KAAK,CAAC;gCACd,CAAC,CAAC,GAAG,KAAK,cAAc;gCACxB,CAAC,CAAC,GAAG,KAAK,UAAU,OAAO,OAAO;YACvC,CAAC,CAAC,OAAO,CAAC;QAEX,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACvD,CAAC;IAOO,aAAa,CAAC,cAAsB;QAC3C,MAAM,aAAa,GAAG,cAAc,IAAI,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,GAAG,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;QAE/D,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACrD,CAAC;CACD,CAAA;AA9hBY,8CAAiB;4BAAjB,iBAAiB;IAO3B,WAAA,IAAA,eAAM,EAAC,GAAG,EAAE,CAAC,oBAAY,CAAC,CAAA;qCAAuB,oBAAY;GAPnD,iBAAiB,CA8hB7B","sourcesContent":["import axios from 'axios';\nimport {\n\tIMapService,\n\tIMapCallOptions,\n\tICoordinate,\n\tIDistance,\n\tIDuration,\n\tILeg,\n\tIDistanceInfo,\n\tIWaypointDistanceInfo,\n\tIRouteMatrixDTO,\n} from '../interfaces/IMapService';\nimport * as polyline from '@mapbox/polyline';\nimport { TRPCError } from '@trpc/server';\nimport { RedisService } from '../../redis';\nimport { createHash, randomBytes } from 'crypto';\nimport { Inject } from 'typedi';\nimport { GoogleMapsUsageModel } from '../../mongo/models';\n\ninterface RouteMatrixItem {\n\toriginIndex: number;\n\tdestinationIndex: number;\n\tdistanceMeters?: number;\n\tduration?: string;\n\tcondition: string;\n}\n\nexport class GoogleMapsService implements IMapService {\n\tprivate _apiKey: string | undefined;\n\tprivate logModel: typeof GoogleMapsUsageModel;\n\tprivate _routeURL: string = 'https://routes.googleapis.com/directions/v2:computeRoutes';\n\tprivate _routeMatrixURL: string = 'https://routes.googleapis.com/distanceMatrix/v2:computeRouteMatrix';\n\n\tconstructor(\n\t\t@Inject(() => RedisService) private redisService: RedisService,\n\t\tapiKey: string\n\t) {\n\t\tthis._apiKey = apiKey;\n\t\tthis.logModel = GoogleMapsUsageModel as typeof GoogleMapsUsageModel;\n\t}\n\n\tprivate createCacheKey(origin: ICoordinate, destination: ICoordinate, waypoints: ICoordinate[] = []) {\n\t\tconst originKey = `${origin.latitude},${origin.longitude}`;\n\t\tconst destinationKey = `${destination.latitude},${destination.longitude}`;\n\n\t\tlet keyData = { origin: originKey, destination: destinationKey, waypoints: [] as string[] };\n\n\t\tif (waypoints && waypoints.length > 0) {\n\t\t\tkeyData.waypoints = waypoints.map(point => `${point.latitude},${point.longitude}`).sort();\n\t\t}\n\n\t\treturn createHash('md5').update(JSON.stringify(keyData)).digest('hex');\n\t}\n\n\tprivate async acquireDistributedLock(key: string, ttl = 10) {\n\t\tconst token = randomBytes(16).toString('hex');\n\t\tconst lockKey = `lock:${key}`;\n\n\t\tconst result = await this.redisService.redisClient.set(lockKey, token, 'EX', ttl, 'NX');\n\t\treturn result ? { token, lockKey } : null;\n\t}\n\n\tprivate async releaseDistributedLock(lockKey: string, token: string) {\n\t\tconst lua = `\n if redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"del\", KEYS[1])\n else\n return 0\n end\n `;\n\t\treturn this.redisService.redisClient.eval(lua, 1, lockKey, token);\n\t}\n\n\tprivate async logApiUsage(\n\t\tendpoint: string,\n\t\tcacheHit = false,\n\t\tmetadata: {\n\t\t\torigin?: ICoordinate;\n\t\t\tdestination?: ICoordinate;\n\t\t\twaypoints?: ICoordinate[];\n\t\t\tipAddress?: string;\n\t\t\tuserAgent?: string;\n\t\t\tfunctionName?: string;\n\t\t\tprovider?: string;\n\t\t} = {},\n\t\tresponseTime: number,\n\t\terror?: Error\n\t) {\n\t\ttry {\n\t\t\tawait this.logModel.create({\n\t\t\t\tendpoint,\n\t\t\t\tcacheHit,\n\t\t\t\terror: error ? error.message : null,\n\t\t\t\tresponseTime: responseTime,\n\t\t\t\tmetadata: {\n\t\t\t\t\torigin: metadata.origin || null,\n\t\t\t\t\tdestination: metadata.destination || null,\n\t\t\t\t\twaypoints: metadata.waypoints || null,\n\t\t\t\t\tipAddress: metadata.ipAddress || null,\n\t\t\t\t\tuserAgent: metadata.userAgent || null,\n\t\t\t\t\tfunctionName: metadata.functionName || null,\n\t\t\t\t\tprovider: metadata.provider || null,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (logError) {\n\t\t\tconsole.error('Failed to log API usage:', logError);\n\t\t}\n\t}\n\n\tprivate clearRouteCache = async (origin: ICoordinate, destination: ICoordinate, waypoints = []) => {\n\t\tconst cacheKey = waypoints\n\t\t\t? `distance_waypoints:${this.createCacheKey(origin, destination, waypoints)}`\n\t\t\t: `distance:${this.createCacheKey(origin, destination)}`;\n\n\t\treturn await this.redisService.deleteCachedObject(cacheKey);\n\t};\n\n\tprivate getCacheStats = async () => {\n\t\tconst keys = await this.redisService.redisClient.keys('distance*');\n\t\treturn {\n\t\t\ttotalCachedRoutes: keys.length,\n\t\t\tcacheKeys: keys,\n\t\t};\n\t};\n\n\tpublic async getDistanceInfo(origin: ICoordinate, destination: ICoordinate, options?: IMapCallOptions): Promise<IDistanceInfo> {\n\t\tconst startTime = Date.now();\n\t\tconst cacheKey = `distance:${this.createCacheKey(origin, destination)}`;\n\t\tconst cacheTTL = 3600;\n\n\t\ttry {\n\t\t\tconst cachedData: IDistanceInfo | undefined = await this.redisService.getCachedObject(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\t\ttrue,\n\t\t\t\t\t{ origin, destination, ...options },\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\t\t\t\treturn cachedData;\n\t\t\t}\n\n\t\t\tconst lock = await this.acquireDistributedLock(cacheKey);\n\n\t\t\ttry {\n\t\t\t\tconst cachedDataAfterLock: IDistanceInfo | undefined =\n\t\t\t\t\tawait this.redisService.getCachedObject(cacheKey);\n\t\t\t\tif (cachedDataAfterLock) {\n\t\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{ origin, destination, ...options },\n\t\t\t\t\t\tresponseTime\n\t\t\t\t\t);\n\t\t\t\t\treturn cachedDataAfterLock;\n\t\t\t\t}\n\n\t\t\t\tconst result = await this.getDistanceInfoFromGoogle(origin, destination);\n\n\t\t\t\tawait this.redisService.cacheObject(cacheKey, result, cacheTTL);\n\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\t\tfalse,\n\t\t\t\t\t{ origin, destination, ...options },\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\n\t\t\t\treturn result;\n\t\t\t} finally {\n\t\t\t\tif (lock) {\n\t\t\t\t\tawait this.releaseDistributedLock(lock.lockKey, lock.token);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\tawait this.logApiUsage(\n\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\tfalse,\n\t\t\t\t{ origin, destination, ...options },\n\t\t\t\tresponseTime,\n\t\t\t\terror\n\t\t\t);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch distance information from Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getDistanceInfoFromGoogle_DEPRECATED(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate\n\t): Promise<IDistanceInfo> {\n\t\ttry {\n\t\t\tconst url = `https://maps.googleapis.com/maps/api/directions/json?origin=${origin.latitude}, ${origin.longitude}&destination=${destination.latitude}, ${destination.longitude}&key=${this._apiKey}&mode=DRIVING`;\n\n\t\t\tconst { data } = await axios.get(url);\n\n\t\t\tconst legs = data?.routes[0]?.legs[0];\n\n\t\t\tconst distance = legs?.distance;\n\t\t\tconst duration = legs?.duration;\n\n\t\t\tif (!distance || !duration) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\tmessage: 'No path exists from origin to destination.',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { distance, duration };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getDistanceInfo: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic async getWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>,\n\t\toptions?: IMapCallOptions\n\t): Promise<IWaypointDistanceInfo> {\n\t\tconst startTime = Date.now();\n\t\tconst cacheKey = `distance_waypoints:${this.createCacheKey(origin, destination, waypoints)}`;\n\t\tconst cacheTTL = 3600;\n\t\ttry {\n\t\t\tconst cachedData: IWaypointDistanceInfo | undefined = await this.redisService.getCachedObject(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\t\ttrue,\n\t\t\t\t\t{ origin, destination, waypoints, ...options },\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\t\t\t\treturn cachedData;\n\t\t\t}\n\n\t\t\tconst lock = await this.acquireDistributedLock(cacheKey);\n\n\t\t\ttry {\n\t\t\t\tconst cachedDataAfterLock: IWaypointDistanceInfo | undefined =\n\t\t\t\t\tawait this.redisService.getCachedObject(cacheKey);\n\t\t\t\tif (cachedDataAfterLock) {\n\t\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{ origin, destination, waypoints, ...options },\n\t\t\t\t\t\tresponseTime\n\t\t\t\t\t);\n\t\t\t\t\treturn cachedDataAfterLock;\n\t\t\t\t}\n\n\t\t\t\tconst result = await this.getWaypointsDistanceInfoFromGoogle(origin, destination, waypoints);\n\n\t\t\t\tawait this.redisService.cacheObject(cacheKey, result, cacheTTL);\n\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\t\tfalse,\n\t\t\t\t\t{ origin, destination, waypoints, ...options },\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\n\t\t\t\treturn result;\n\t\t\t} finally {\n\t\t\t\tif (lock) {\n\t\t\t\t\tawait this.releaseDistributedLock(lock.lockKey, lock.token);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\tawait this.logApiUsage(\n\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\tfalse,\n\t\t\t\t{ origin, destination, waypoints, ...options },\n\t\t\t\tresponseTime,\n\t\t\t\terror\n\t\t\t);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch waypoint distance information from Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getWaypointsDistanceInfoFromGoogle_DEPRECATED(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>\n\t): Promise<IWaypointDistanceInfo> {\n\t\ttry {\n\t\t\tconst waypointsStr = waypoints.map(point => `${point.latitude},${point.longitude}`).join('|');\n\n\t\t\tconst url = `https://maps.googleapis.com/maps/api/directions/json?origin=${origin.latitude},${origin.longitude}&destination=${destination.latitude},${destination.longitude}&waypoints=${waypointsStr}&key=${this._apiKey}&mode=DRIVING`;\n\n\t\t\tconst { data } = await axios.get(url);\n\n\t\t\tconst routes = data?.routes[0];\n\n\t\t\tconst overviewPolyline = polyline.decode(routes?.overview_polyline?.points);\n\n\t\t\tconst legs = (routes?.legs ?? []).map((leg: { steps: any[]; distance: any; duration: any }) => {\n\t\t\t\tconst overviewPolyline = leg?.steps?.flatMap(step => polyline.decode(step?.polyline?.points));\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: leg.distance,\n\t\t\t\t\tduration: leg.duration,\n\t\t\t\t\toverviewPolyline,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tconst totalDistance = legs?.reduce(\n\t\t\t\t(acc: any, curr: { distance: { value: any } }) => acc + curr.distance.value,\n\t\t\t\t0\n\t\t\t);\n\t\t\tconst distance = {\n\t\t\t\ttext: `${(totalDistance / 1000).toFixed(2)} km`,\n\t\t\t\tvalue: totalDistance,\n\t\t\t};\n\n\t\t\tconst totalDuration = legs?.reduce(\n\t\t\t\t(acc: any, curr: { duration: { value: any } }) => acc + curr.duration.value,\n\t\t\t\t0\n\t\t\t);\n\t\t\tconst duration = {\n\t\t\t\ttext: `${Math.round(totalDuration / 60)} mins`,\n\t\t\t\tvalue: totalDuration,\n\t\t\t};\n\n\t\t\tif (!distance || !duration) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\tmessage: 'No path exists from origin to destination.',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { distance, duration, legs, overviewPolyline };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getWaypointsDistanceInfo: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch waypoint distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic async getDistanceMatrix(\n\t\torigins: Array<ICoordinate>,\n\t\tdestinations: Array<ICoordinate>\n\t): Promise<IRouteMatrixDTO[]> {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\torigins: origins.map(this.toWaypoint),\n\t\t\t\tdestinations: destinations.map(this.toWaypoint),\n\t\t\t\ttravelMode: 'DRIVE',\n\t\t\t\troutingPreference: 'TRAFFIC_AWARE',\n\t\t\t};\n\n\t\t\tconst fieldMask = 'originIndex,destinationIndex,duration,distanceMeters,condition';\n\n\t\t\tconst response = await axios.post(this._routeMatrixURL, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-Goog-Api-Key': this._apiKey,\n\t\t\t\t\t'X-Goog-FieldMask': fieldMask,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// The API returns an array of route elements\n\t\t\tconst results: IRouteMatrixDTO[] = response.data.map((item: RouteMatrixItem) => {\n\t\t\t\tconst distance = this.toDistanceDTO(item.distanceMeters ?? 0);\n\t\t\t\tconst duration = this.toDurationDTO(item.duration ?? '0s');\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance,\n\t\t\t\t\tduration,\n\t\t\t\t\tcondition: item.condition,\n\t\t\t\t\toriginIndex: item.originIndex,\n\t\t\t\t\tdestinationIndex: item.destinationIndex,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\treturn results;\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getDistanceMatrix: ${error}`);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tprivate async getDistanceInfoFromGoogle(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo> {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\torigin: this.toLocation(origin),\n\t\t\t\tdestination: this.toLocation(destination),\n\t\t\t\ttravelMode: 'DRIVE',\n\t\t\t\troutingPreference: 'TRAFFIC_AWARE',\n\t\t\t\tcomputeAlternativeRoutes: false,\n\t\t\t\trouteModifiers: {\n\t\t\t\t\tavoidTolls: false,\n\t\t\t\t\tavoidHighways: false,\n\t\t\t\t\tavoidFerries: false,\n\t\t\t\t},\n\t\t\t\tlanguageCode: 'en-US',\n\t\t\t\tunits: 'METRIC',\n\t\t\t};\n\n\t\t\tconst fieldMask = 'routes.duration,routes.distanceMeters';\n\n\t\t\tconst response = await axios.post(this._routeURL, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-Goog-Api-Key': this._apiKey,\n\t\t\t\t\t'X-Goog-FieldMask': fieldMask,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst route = response.data.routes[0];\n\n\t\t\tconst distance = this.toDistanceDTO(route.distanceMeters);\n\t\t\tconst duration = this.toDurationDTO(route.duration);\n\n\t\t\treturn { distance, duration };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getDistanceInfo V2: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getWaypointsDistanceInfoFromGoogle(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>\n\t): Promise<IWaypointDistanceInfo> {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\torigin: this.toLocation(origin),\n\t\t\t\tdestination: this.toLocation(destination),\n\t\t\t\tintermediates: waypoints.map(this.toLocation),\n\t\t\t\ttravelMode: 'DRIVE',\n\t\t\t\troutingPreference: 'TRAFFIC_AWARE',\n\t\t\t\tcomputeAlternativeRoutes: false,\n\t\t\t\trouteModifiers: {\n\t\t\t\t\tavoidTolls: false,\n\t\t\t\t\tavoidHighways: false,\n\t\t\t\t\tavoidFerries: false,\n\t\t\t\t},\n\t\t\t\tlanguageCode: 'en-US',\n\t\t\t\tunits: 'METRIC',\n\t\t\t};\n\n\t\t\tconst fieldMask = 'routes';\n\n\t\t\tconst response = await axios.post(this._routeURL, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-Goog-Api-Key': this._apiKey,\n\t\t\t\t\t'X-Goog-FieldMask': fieldMask,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst route = response.data.routes[0];\n\n\t\t\tconst distance = this.toDistanceDTO(route.distanceMeters);\n\t\t\tconst duration = this.toDurationDTO(route.duration);\n\t\t\tconst overviewPolyline = polyline.decode(route.polyline.encodedPolyline);\n\n\t\t\tconst legs = (route?.legs ?? []).map(\n\t\t\t\t(leg: { polyline: { encodedPolyline: string }; distanceMeters: number; duration: string }) => {\n\t\t\t\t\tconst overviewPolyline = polyline.decode(leg.polyline.encodedPolyline);\n\n\t\t\t\t\tconst legDistance = this.toDistanceDTO(leg.distanceMeters);\n\t\t\t\t\tconst legDuration = this.toDurationDTO(leg.duration);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdistance: legDistance,\n\t\t\t\t\t\tduration: legDuration,\n\t\t\t\t\t\toverviewPolyline,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn { distance, duration, overviewPolyline, legs };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getWaypointDistanceInfo V2: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch waypoint distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Converts an ICoordinate to a location object for Google Maps API\n\t * @param coord - ICoordinate object\n\t * @returns Location object for Google Maps API\n\t */\n\tprivate toLocation(coord: ICoordinate) {\n\t\treturn { location: { latLng: { latitude: coord.latitude, longitude: coord.longitude } } };\n\t}\n\n\t/**\n\t * Converts an ICoordinate to a waypoint object for Google Maps API\n\t * @param coord - ICoordinate object\n\t * @returns Waypoint object for Google Maps API\n\t */\n\tprivate toWaypoint(coord: ICoordinate) {\n\t\treturn { waypoint: { location: { latLng: { latitude: coord.latitude, longitude: coord.longitude } } } };\n\t}\n\n\t/**\n\t * Converts a duration string from Google Maps API to an IDuration object\n\t * @param duration in format \"Xs\" where X is number of seconds\n\t * @returns IDuration object\n\t */\n\tprivate toDurationDTO(duration: string): IDuration {\n\t\tconst durationSeconds = parseInt(duration.replace('s', ''));\n\n\t\tconst hours = Math.floor(durationSeconds / 3600);\n\t\tconst minutes = Math.ceil((durationSeconds % 3600) / 60);\n\n\t\tconst durationText = durationSeconds\n\t\t\t? durationSeconds < 60\n\t\t\t\t? `1 min`\n\t\t\t\t: durationSeconds < 3600\n\t\t\t\t\t? minutes === 1\n\t\t\t\t\t\t? '1 min'\n\t\t\t\t\t\t: `${minutes} mins`\n\t\t\t\t\t: hours === 1\n\t\t\t\t\t\t? minutes === 0\n\t\t\t\t\t\t\t? '1 hour'\n\t\t\t\t\t\t\t: minutes === 1\n\t\t\t\t\t\t\t\t? '1 hour 1 min'\n\t\t\t\t\t\t\t\t: `1 hour ${minutes} mins`\n\t\t\t\t\t\t: minutes === 0\n\t\t\t\t\t\t\t? `${hours} hours`\n\t\t\t\t\t\t\t: minutes === 1\n\t\t\t\t\t\t\t\t? `${hours} hours 1 min`\n\t\t\t\t\t\t\t\t: `${hours} hours ${minutes} mins`\n\t\t\t: '1 min';\n\n\t\treturn { value: durationSeconds, text: durationText };\n\t}\n\n\t/**\n\t * Converts a distance in meters from Google Maps API to an IDistance object\n\t * @param distanceMeters distance in meters\n\t * @returns IDistance object\n\t */\n\tprivate toDistanceDTO(distanceMeters: number): IDistance {\n\t\tconst distanceValue = distanceMeters ?? 0;\n\t\tconst distanceText = `${(distanceValue / 1000).toFixed(1)} km`;\n\n\t\treturn { value: distanceValue, text: distanceText };\n\t}\n}\n"]}
1
+ {"version":3,"file":"google-maps.js","sourceRoot":"/","sources":["libraries/map/providers/google-maps.ts"],"names":[],"mappings":"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","sourcesContent":["import axios from 'axios';\nimport {\n\tIMapService,\n\tICoordinate,\n\tIDistance,\n\tIDuration,\n\tILeg,\n\tIDistanceInfo,\n\tIWaypointDistanceInfo,\n\tIRouteMatrixDTO,\n} from '../interfaces/IMapService';\nimport * as polyline from '@mapbox/polyline';\nimport { TRPCError } from '@trpc/server';\nimport { RedisService } from '../../redis';\nimport { createHash, randomBytes } from 'crypto';\nimport { Inject } from 'typedi';\nimport { GoogleMapsUsageModel } from '../../mongo/models';\n\ninterface RouteMatrixItem {\n\toriginIndex: number;\n\tdestinationIndex: number;\n\tdistanceMeters?: number;\n\tduration?: string;\n\tcondition: string;\n}\n\nexport class GoogleMapsService implements IMapService {\n\tprivate _apiKey: string | undefined;\n\tprivate logModel: typeof GoogleMapsUsageModel;\n\tprivate _routeURL: string = 'https://routes.googleapis.com/directions/v2:computeRoutes';\n\tprivate _routeMatrixURL: string = 'https://routes.googleapis.com/distanceMatrix/v2:computeRouteMatrix';\n\n\tconstructor(\n\t\t@Inject(() => RedisService) private redisService: RedisService,\n\t\tapiKey: string\n\t) {\n\t\tthis._apiKey = apiKey;\n\t\tthis.logModel = GoogleMapsUsageModel as typeof GoogleMapsUsageModel;\n\t}\n\n\tprivate createCacheKey(origin: ICoordinate, destination: ICoordinate, waypoints: ICoordinate[] = []) {\n\t\tconst originKey = `${origin.latitude},${origin.longitude}`;\n\t\tconst destinationKey = `${destination.latitude},${destination.longitude}`;\n\n\t\tlet keyData = { origin: originKey, destination: destinationKey, waypoints: [] as string[] };\n\n\t\tif (waypoints && waypoints.length > 0) {\n\t\t\tkeyData.waypoints = waypoints.map(point => `${point.latitude},${point.longitude}`).sort();\n\t\t}\n\n\t\treturn createHash('md5').update(JSON.stringify(keyData)).digest('hex');\n\t}\n\n\tprivate async acquireDistributedLock(key: string, ttl = 10) {\n\t\tconst token = randomBytes(16).toString('hex');\n\t\tconst lockKey = `lock:${key}`;\n\n\t\tconst result = await this.redisService.redisClient.set(lockKey, token, 'EX', ttl, 'NX');\n\t\treturn result ? { token, lockKey } : null;\n\t}\n\n\tprivate async releaseDistributedLock(lockKey: string, token: string) {\n\t\tconst lua = `\n if redis.call(\"get\", KEYS[1]) == ARGV[1] then\n return redis.call(\"del\", KEYS[1])\n else\n return 0\n end\n `;\n\t\treturn this.redisService.redisClient.eval(lua, 1, lockKey, token);\n\t}\n\n\tprivate async logApiUsage(\n\t\tendpoint: string,\n\t\tcacheHit = false,\n\t\tmetadata: {\n\t\t\torigin?: ICoordinate;\n\t\t\tdestination?: ICoordinate;\n\t\t\twaypoints?: ICoordinate[];\n\t\t\tipAddress?: string;\n\t\t\tuserAgent?: string;\n\t\t} = {},\n\t\tresponseTime: number,\n\t\terror?: Error\n\t) {\n\t\ttry {\n\t\t\tawait this.logModel.create({\n\t\t\t\tendpoint,\n\t\t\t\tcacheHit,\n\t\t\t\terror: error ? error.message : null,\n\t\t\t\tresponseTime: responseTime,\n\t\t\t\tmetadata: {\n\t\t\t\t\torigin: metadata.origin || null,\n\t\t\t\t\tdestination: metadata.destination || null,\n\t\t\t\t\twaypoints: metadata.waypoints || null,\n\t\t\t\t\tipAddress: metadata.ipAddress || null,\n\t\t\t\t\tuserAgent: metadata.userAgent || null,\n\t\t\t\t},\n\t\t\t});\n\t\t} catch (logError) {\n\t\t\tconsole.error('Failed to log API usage:', logError);\n\t\t}\n\t}\n\n\tprivate clearRouteCache = async (origin: ICoordinate, destination: ICoordinate, waypoints = []) => {\n\t\tconst cacheKey = waypoints\n\t\t\t? `distance_waypoints:${this.createCacheKey(origin, destination, waypoints)}`\n\t\t\t: `distance:${this.createCacheKey(origin, destination)}`;\n\n\t\treturn await this.redisService.deleteCachedObject(cacheKey);\n\t};\n\n\tprivate getCacheStats = async () => {\n\t\tconst keys = await this.redisService.redisClient.keys('distance*');\n\t\treturn {\n\t\t\ttotalCachedRoutes: keys.length,\n\t\t\tcacheKeys: keys,\n\t\t};\n\t};\n\n\tpublic async getDistanceInfo(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo> {\n\t\tconst startTime = Date.now();\n\t\tconst cacheKey = `distance:${this.createCacheKey(origin, destination)}`;\n\t\tconst cacheTTL = 3600;\n\n\t\ttry {\n\t\t\tconst cachedData: IDistanceInfo | undefined = await this.redisService.getCachedObject(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\t\ttrue,\n\t\t\t\t\t{\n\t\t\t\t\t\torigin,\n\t\t\t\t\t\tdestination,\n\t\t\t\t\t},\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\t\t\t\treturn cachedData;\n\t\t\t}\n\n\t\t\tconst lock = await this.acquireDistributedLock(cacheKey);\n\n\t\t\ttry {\n\t\t\t\tconst cachedDataAfterLock: IDistanceInfo | undefined =\n\t\t\t\t\tawait this.redisService.getCachedObject(cacheKey);\n\t\t\t\tif (cachedDataAfterLock) {\n\t\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\torigin,\n\t\t\t\t\t\t\tdestination,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tresponseTime\n\t\t\t\t\t);\n\t\t\t\t\treturn cachedDataAfterLock;\n\t\t\t\t}\n\n\t\t\t\tconst result = await this.getDistanceInfoFromGoogle(origin, destination);\n\n\t\t\t\tawait this.redisService.cacheObject(cacheKey, result, cacheTTL);\n\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\t\tfalse,\n\t\t\t\t\t{\n\t\t\t\t\t\torigin,\n\t\t\t\t\t\tdestination,\n\t\t\t\t\t},\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\n\t\t\t\treturn result;\n\t\t\t} finally {\n\t\t\t\tif (lock) {\n\t\t\t\t\tawait this.releaseDistributedLock(lock.lockKey, lock.token);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\tawait this.logApiUsage(\n\t\t\t\t'DistanceInfoGoogle',\n\t\t\t\tfalse,\n\t\t\t\t{\n\t\t\t\t\torigin,\n\t\t\t\t\tdestination,\n\t\t\t\t},\n\t\t\t\tresponseTime,\n\t\t\t\terror\n\t\t\t);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch distance information from Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getDistanceInfoFromGoogle_DEPRECATED(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate\n\t): Promise<IDistanceInfo> {\n\t\ttry {\n\t\t\tconst url = `https://maps.googleapis.com/maps/api/directions/json?origin=${origin.latitude}, ${origin.longitude}&destination=${destination.latitude}, ${destination.longitude}&key=${this._apiKey}&mode=DRIVING`;\n\n\t\t\tconst { data } = await axios.get(url);\n\n\t\t\tconst legs = data?.routes[0]?.legs[0];\n\n\t\t\tconst distance = legs?.distance;\n\t\t\tconst duration = legs?.duration;\n\n\t\t\tif (!distance || !duration) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\tmessage: 'No path exists from origin to destination.',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { distance, duration };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getDistanceInfo: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic async getWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>\n\t): Promise<IWaypointDistanceInfo> {\n\t\tconst startTime = Date.now();\n\t\tconst cacheKey = `distance_waypoints:${this.createCacheKey(origin, destination, waypoints)}`;\n\t\tconst cacheTTL = 3600;\n\t\ttry {\n\t\t\tconst cachedData: IWaypointDistanceInfo | undefined = await this.redisService.getCachedObject(cacheKey);\n\t\t\tif (cachedData) {\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\t\ttrue,\n\t\t\t\t\t{\n\t\t\t\t\t\torigin,\n\t\t\t\t\t\tdestination,\n\t\t\t\t\t\twaypoints,\n\t\t\t\t\t},\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\t\t\t\treturn cachedData;\n\t\t\t}\n\n\t\t\tconst lock = await this.acquireDistributedLock(cacheKey);\n\n\t\t\ttry {\n\t\t\t\tconst cachedDataAfterLock: IWaypointDistanceInfo | undefined =\n\t\t\t\t\tawait this.redisService.getCachedObject(cacheKey);\n\t\t\t\tif (cachedDataAfterLock) {\n\t\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\torigin,\n\t\t\t\t\t\t\tdestination,\n\t\t\t\t\t\t\twaypoints,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tresponseTime\n\t\t\t\t\t);\n\t\t\t\t\treturn cachedDataAfterLock;\n\t\t\t\t}\n\n\t\t\t\tconst result = await this.getWaypointsDistanceInfoFromGoogle(origin, destination, waypoints);\n\n\t\t\t\tawait this.redisService.cacheObject(cacheKey, result, cacheTTL);\n\n\t\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\t\tawait this.logApiUsage(\n\t\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\t\tfalse,\n\t\t\t\t\t{\n\t\t\t\t\t\torigin,\n\t\t\t\t\t\tdestination,\n\t\t\t\t\t\twaypoints,\n\t\t\t\t\t},\n\t\t\t\t\tresponseTime\n\t\t\t\t);\n\n\t\t\t\treturn result;\n\t\t\t} finally {\n\t\t\t\tif (lock) {\n\t\t\t\t\tawait this.releaseDistributedLock(lock.lockKey, lock.token);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: any) {\n\t\t\tconst responseTime = Date.now() - startTime;\n\t\t\tawait this.logApiUsage(\n\t\t\t\t'DistanceInfoGoogleWithWayPoints',\n\t\t\t\tfalse,\n\t\t\t\t{\n\t\t\t\t\torigin,\n\t\t\t\t\tdestination,\n\t\t\t\t\twaypoints,\n\t\t\t\t},\n\t\t\t\tresponseTime,\n\t\t\t\terror\n\t\t\t);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch waypoint distance information from Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getWaypointsDistanceInfoFromGoogle_DEPRECATED(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>\n\t): Promise<IWaypointDistanceInfo> {\n\t\ttry {\n\t\t\tconst waypointsStr = waypoints.map(point => `${point.latitude},${point.longitude}`).join('|');\n\n\t\t\tconst url = `https://maps.googleapis.com/maps/api/directions/json?origin=${origin.latitude},${origin.longitude}&destination=${destination.latitude},${destination.longitude}&waypoints=${waypointsStr}&key=${this._apiKey}&mode=DRIVING`;\n\n\t\t\tconst { data } = await axios.get(url);\n\n\t\t\tconst routes = data?.routes[0];\n\n\t\t\tconst overviewPolyline = polyline.decode(routes?.overview_polyline?.points);\n\n\t\t\tconst legs = (routes?.legs ?? []).map((leg: { steps: any[]; distance: any; duration: any }) => {\n\t\t\t\tconst overviewPolyline = leg?.steps?.flatMap(step => polyline.decode(step?.polyline?.points));\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance: leg.distance,\n\t\t\t\t\tduration: leg.duration,\n\t\t\t\t\toverviewPolyline,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\tconst totalDistance = legs?.reduce(\n\t\t\t\t(acc: any, curr: { distance: { value: any } }) => acc + curr.distance.value,\n\t\t\t\t0\n\t\t\t);\n\t\t\tconst distance = {\n\t\t\t\ttext: `${(totalDistance / 1000).toFixed(2)} km`,\n\t\t\t\tvalue: totalDistance,\n\t\t\t};\n\n\t\t\tconst totalDuration = legs?.reduce(\n\t\t\t\t(acc: any, curr: { duration: { value: any } }) => acc + curr.duration.value,\n\t\t\t\t0\n\t\t\t);\n\t\t\tconst duration = {\n\t\t\t\ttext: `${Math.round(totalDuration / 60)} mins`,\n\t\t\t\tvalue: totalDuration,\n\t\t\t};\n\n\t\t\tif (!distance || !duration) {\n\t\t\t\tthrow new TRPCError({\n\t\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\t\tmessage: 'No path exists from origin to destination.',\n\t\t\t\t});\n\t\t\t}\n\n\t\t\treturn { distance, duration, legs, overviewPolyline };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getWaypointsDistanceInfo: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch waypoint distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tpublic async getDistanceMatrix(\n\t\torigins: Array<ICoordinate>,\n\t\tdestinations: Array<ICoordinate>\n\t): Promise<IRouteMatrixDTO[]> {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\torigins: origins.map(this.toWaypoint),\n\t\t\t\tdestinations: destinations.map(this.toWaypoint),\n\t\t\t\ttravelMode: 'DRIVE',\n\t\t\t\troutingPreference: 'TRAFFIC_AWARE',\n\t\t\t};\n\n\t\t\tconst fieldMask = 'originIndex,destinationIndex,duration,distanceMeters,condition';\n\n\t\t\tconst response = await axios.post(this._routeMatrixURL, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-Goog-Api-Key': this._apiKey,\n\t\t\t\t\t'X-Goog-FieldMask': fieldMask,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// The API returns an array of route elements\n\t\t\tconst results: IRouteMatrixDTO[] = response.data.map((item: RouteMatrixItem) => {\n\t\t\t\tconst distance = this.toDistanceDTO(item.distanceMeters ?? 0);\n\t\t\t\tconst duration = this.toDurationDTO(item.duration ?? '0s');\n\n\t\t\t\treturn {\n\t\t\t\t\tdistance,\n\t\t\t\t\tduration,\n\t\t\t\t\tcondition: item.condition,\n\t\t\t\t\toriginIndex: item.originIndex,\n\t\t\t\t\tdestinationIndex: item.destinationIndex,\n\t\t\t\t};\n\t\t\t});\n\n\t\t\treturn results;\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getDistanceMatrix: ${error}`);\n\t\t}\n\n\t\treturn [];\n\t}\n\n\tprivate async getDistanceInfoFromGoogle(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo> {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\torigin: this.toLocation(origin),\n\t\t\t\tdestination: this.toLocation(destination),\n\t\t\t\ttravelMode: 'DRIVE',\n\t\t\t\troutingPreference: 'TRAFFIC_AWARE',\n\t\t\t\tcomputeAlternativeRoutes: false,\n\t\t\t\trouteModifiers: {\n\t\t\t\t\tavoidTolls: false,\n\t\t\t\t\tavoidHighways: false,\n\t\t\t\t\tavoidFerries: false,\n\t\t\t\t},\n\t\t\t\tlanguageCode: 'en-US',\n\t\t\t\tunits: 'METRIC',\n\t\t\t};\n\n\t\t\tconst fieldMask = 'routes.duration,routes.distanceMeters';\n\n\t\t\tconst response = await axios.post(this._routeURL, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-Goog-Api-Key': this._apiKey,\n\t\t\t\t\t'X-Goog-FieldMask': fieldMask,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst route = response.data.routes[0];\n\n\t\t\tconst distance = this.toDistanceDTO(route.distanceMeters);\n\t\t\tconst duration = this.toDurationDTO(route.duration);\n\n\t\t\treturn { distance, duration };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getDistanceInfo V2: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\tprivate async getWaypointsDistanceInfoFromGoogle(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: Array<ICoordinate>\n\t): Promise<IWaypointDistanceInfo> {\n\t\ttry {\n\t\t\tconst body = {\n\t\t\t\torigin: this.toLocation(origin),\n\t\t\t\tdestination: this.toLocation(destination),\n\t\t\t\tintermediates: waypoints.map(this.toLocation),\n\t\t\t\ttravelMode: 'DRIVE',\n\t\t\t\troutingPreference: 'TRAFFIC_AWARE',\n\t\t\t\tcomputeAlternativeRoutes: false,\n\t\t\t\trouteModifiers: {\n\t\t\t\t\tavoidTolls: false,\n\t\t\t\t\tavoidHighways: false,\n\t\t\t\t\tavoidFerries: false,\n\t\t\t\t},\n\t\t\t\tlanguageCode: 'en-US',\n\t\t\t\tunits: 'METRIC',\n\t\t\t};\n\n\t\t\tconst fieldMask = 'routes';\n\n\t\t\tconst response = await axios.post(this._routeURL, body, {\n\t\t\t\theaders: {\n\t\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t\t'X-Goog-Api-Key': this._apiKey,\n\t\t\t\t\t'X-Goog-FieldMask': fieldMask,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst route = response.data.routes[0];\n\n\t\t\tconst distance = this.toDistanceDTO(route.distanceMeters);\n\t\t\tconst duration = this.toDurationDTO(route.duration);\n\t\t\tconst overviewPolyline = polyline.decode(route.polyline.encodedPolyline);\n\n\t\t\tconst legs = (route?.legs ?? []).map(\n\t\t\t\t(leg: { polyline: { encodedPolyline: string }; distanceMeters: number; duration: string }) => {\n\t\t\t\t\tconst overviewPolyline = polyline.decode(leg.polyline.encodedPolyline);\n\n\t\t\t\t\tconst legDistance = this.toDistanceDTO(leg.distanceMeters);\n\t\t\t\t\tconst legDuration = this.toDurationDTO(leg.duration);\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdistance: legDistance,\n\t\t\t\t\t\tduration: legDuration,\n\t\t\t\t\t\toverviewPolyline,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t);\n\n\t\t\treturn { distance, duration, overviewPolyline, legs };\n\t\t} catch (error) {\n\t\t\tconsole.error(`Error in getWaypointDistanceInfo V2: ${error}`);\n\t\t\tthrow new TRPCError({\n\t\t\t\tcode: 'INTERNAL_SERVER_ERROR',\n\t\t\t\tmessage: 'Failed to fetch waypoint distance information from Google Maps API.',\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Converts an ICoordinate to a location object for Google Maps API\n\t * @param coord - ICoordinate object\n\t * @returns Location object for Google Maps API\n\t */\n\tprivate toLocation(coord: ICoordinate) {\n\t\treturn { location: { latLng: { latitude: coord.latitude, longitude: coord.longitude } } };\n\t}\n\n\t/**\n\t * Converts an ICoordinate to a waypoint object for Google Maps API\n\t * @param coord - ICoordinate object\n\t * @returns Waypoint object for Google Maps API\n\t */\n\tprivate toWaypoint(coord: ICoordinate) {\n\t\treturn { waypoint: { location: { latLng: { latitude: coord.latitude, longitude: coord.longitude } } } };\n\t}\n\n\t/**\n\t * Converts a duration string from Google Maps API to an IDuration object\n\t * @param duration in format \"Xs\" where X is number of seconds\n\t * @returns IDuration object\n\t */\n\tprivate toDurationDTO(duration: string): IDuration {\n\t\tconst durationSeconds = parseInt(duration.replace('s', ''));\n\n\t\tconst hours = Math.floor(durationSeconds / 3600);\n\t\tconst minutes = Math.ceil((durationSeconds % 3600) / 60);\n\n\t\tconst durationText = durationSeconds\n\t\t\t? durationSeconds < 60\n\t\t\t\t? `1 min`\n\t\t\t\t: durationSeconds < 3600\n\t\t\t\t\t? minutes === 1\n\t\t\t\t\t\t? '1 min'\n\t\t\t\t\t\t: `${minutes} mins`\n\t\t\t\t\t: hours === 1\n\t\t\t\t\t\t? minutes === 0\n\t\t\t\t\t\t\t? '1 hour'\n\t\t\t\t\t\t\t: minutes === 1\n\t\t\t\t\t\t\t\t? '1 hour 1 min'\n\t\t\t\t\t\t\t\t: `1 hour ${minutes} mins`\n\t\t\t\t\t\t: minutes === 0\n\t\t\t\t\t\t\t? `${hours} hours`\n\t\t\t\t\t\t\t: minutes === 1\n\t\t\t\t\t\t\t\t? `${hours} hours 1 min`\n\t\t\t\t\t\t\t\t: `${hours} hours ${minutes} mins`\n\t\t\t: '1 min';\n\n\t\treturn { value: durationSeconds, text: durationText };\n\t}\n\n\t/**\n\t * Converts a distance in meters from Google Maps API to an IDistance object\n\t * @param distanceMeters distance in meters\n\t * @returns IDistance object\n\t */\n\tprivate toDistanceDTO(distanceMeters: number): IDistance {\n\t\tconst distanceValue = distanceMeters ?? 0;\n\t\tconst distanceText = `${(distanceValue / 1000).toFixed(1)} km`;\n\n\t\treturn { value: distanceValue, text: distanceText };\n\t}\n}\n"]}
@@ -1,13 +1,13 @@
1
- import { ICoordinate, IDistanceInfo, IMapCallOptions, IMapService, IRouteMatrixDTO, IWaypointDistanceInfo } from '../interfaces/IMapService';
1
+ import { ICoordinate, IDistanceInfo, IMapService, IRouteMatrixDTO, IWaypointDistanceInfo } from '../interfaces/IMapService';
2
2
  export declare class OsrmMapService implements IMapService {
3
3
  private zoneModel;
4
4
  private zoneExtraTimeModel;
5
5
  private readonly DEFAULT_EXTRA_TIME;
6
6
  private readonly _url;
7
7
  constructor();
8
- getDistanceInfo(origin: ICoordinate, destination: ICoordinate, _options?: IMapCallOptions): Promise<IDistanceInfo>;
8
+ getDistanceInfo(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo>;
9
9
  getDistanceMatrix(origins: ICoordinate[], destinations: ICoordinate[]): Promise<IRouteMatrixDTO[]>;
10
- getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: ICoordinate[], _options?: IMapCallOptions): Promise<IWaypointDistanceInfo>;
10
+ getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: ICoordinate[]): Promise<IWaypointDistanceInfo>;
11
11
  private getExtraTimeForZones;
12
12
  private findZonesByPoints;
13
13
  }
@@ -15,7 +15,7 @@ class OsrmMapService {
15
15
  this.zoneModel = models_1.ZoneModel;
16
16
  this.zoneExtraTimeModel = models_1.ZoneExtraTimeModel;
17
17
  }
18
- async getDistanceInfo(origin, destination, _options) {
18
+ async getDistanceInfo(origin, destination) {
19
19
  const profile = 'driving';
20
20
  const originStr = `${origin.longitude},${origin.latitude}`;
21
21
  const destinationStr = `${destination.longitude},${destination.latitude}`;
@@ -65,7 +65,7 @@ class OsrmMapService {
65
65
  });
66
66
  return result;
67
67
  }
68
- async getWaypointsDistanceInfo(origin, destination, waypoints, _options) {
68
+ async getWaypointsDistanceInfo(origin, destination, waypoints) {
69
69
  const profile = 'driving';
70
70
  const coordsArr = [origin, ...waypoints, destination];
71
71
  const coordsStr = coordsArr.map(({ longitude, latitude }) => `${longitude},${latitude}`).join(';');
@@ -1 +1 @@
1
- {"version":3,"file":"osrm.js","sourceRoot":"/","sources":["libraries/map/providers/osrm.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tICoordinate,\n\tIDistanceInfo,\n\tIMapCallOptions,\n\tIMapService,\n\tIRouteMatrixDTO,\n\tIWaypointDistanceInfo,\n} from '../interfaces/IMapService';\nimport { Zone, ZoneExtraTimeModel, ZoneModel } from '../../mongo/models';\nimport { SoftDeleteModel } from '../../mongo/plugins/soft-delete-plugin';\nimport dayjs from 'dayjs';\nimport { WeekDay } from '../../../utilities/enum';\nimport { DocumentType } from '@typegoose/typegoose';\n\nexport class OsrmMapService implements IMapService {\n\tprivate zoneModel: typeof ZoneModel & SoftDeleteModel<Zone>;\n\tprivate zoneExtraTimeModel: typeof ZoneExtraTimeModel;\n\tprivate readonly DEFAULT_EXTRA_TIME = 0;\n\tprivate readonly _url = 'https://api-v2-development.lyxa.ai/distance';\n\n\tconstructor() {\n\t\tthis.zoneModel = ZoneModel as typeof ZoneModel & SoftDeleteModel<Zone>;\n\t\tthis.zoneExtraTimeModel = ZoneExtraTimeModel as typeof ZoneExtraTimeModel;\n\t}\n\n\tasync getDistanceInfo(origin: ICoordinate, destination: ICoordinate, _options?: IMapCallOptions): Promise<IDistanceInfo> {\n\t\tconst profile = 'driving';\n\t\tconst originStr = `${origin.longitude},${origin.latitude}`;\n\t\tconst destinationStr = `${destination.longitude},${destination.latitude}`;\n\t\tconst url = `${this._url}/route/v1/${profile}/${originStr};${destinationStr}?overview=false`;\n\n\t\tconst resp = await fetch(url);\n\t\tif (!resp.ok) throw new Error(`OSRM request failed with status ${resp.status}`);\n\n\t\tconst data = await resp.json();\n\t\tif (data.code !== 'Ok' || !data.routes || !data.routes.length) {\n\t\t\tthrow new Error('OSRM route request failed');\n\t\t}\n\n\t\tconst route = data.routes[0];\n\t\treturn {\n\t\t\tdistance: { value: route.distance, text: `${(route.distance / 1000).toFixed(2)} km` },\n\t\t\tduration: { value: route.duration, text: `${Math.ceil(route.duration / 60)} mins` },\n\t\t};\n\t}\n\n\tasync getDistanceMatrix(origins: ICoordinate[], destinations: ICoordinate[]): Promise<IRouteMatrixDTO[]> {\n\t\tconst allCoords = [...origins, ...destinations];\n\t\tconst coordString = allCoords.map(({ longitude, latitude }) => `${longitude},${latitude}`).join(';');\n\t\tconst originIndices = origins.map((_, idx) => idx).join(';');\n\t\tconst destIndices = destinations.map((_, idx) => origins.length + idx).join(';');\n\n\t\tconst url = `${this._url}/table/v1/bike/${coordString}?sources=${originIndices}&destinations=${destIndices}&annotations=distance,duration`;\n\n\t\tconst resp = await fetch(url);\n\t\tif (!resp.ok) throw new Error(`OSRM table request failed with status ${resp.status}`);\n\n\t\tconst data = await resp.json();\n\t\tif (data.code !== 'Ok' || !data.durations) throw new Error('OSRM table request failed');\n\n\t\tconst durations: number[][] = data.durations;\n\t\tconst distances: number[][] = data.distances;\n\n\t\tconst zones = await this.findZonesByPoints(origins);\n\t\tconst extraTimes = await this.getExtraTimeForZones(zones);\n\n\t\tconst result: IRouteMatrixDTO[] = [];\n\n\t\torigins.forEach((_, i) => {\n\t\t\tdestinations.forEach((_, j) => {\n\t\t\t\tconst dur = durations[i][j] + (extraTimes[j] || this.DEFAULT_EXTRA_TIME);\n\t\t\t\tconst dist = distances.length ? distances[i][j] : 0;\n\n\t\t\t\tresult.push({\n\t\t\t\t\tdistance: { value: dist, text: distances.length ? `${(dist / 1000).toFixed(2)} km` : 'N/A' },\n\t\t\t\t\tduration: { value: dur, text: `${Math.ceil(dur / 60)} mins` },\n\t\t\t\t\tcondition: 'OK',\n\t\t\t\t\toriginIndex: i,\n\t\t\t\t\tdestinationIndex: j,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tasync getWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: ICoordinate[],\n\t\t_options?: IMapCallOptions\n\t): Promise<IWaypointDistanceInfo> {\n\t\tconst profile = 'driving';\n\t\tconst coordsArr = [origin, ...waypoints, destination];\n\t\tconst coordsStr = coordsArr.map(({ longitude, latitude }) => `${longitude},${latitude}`).join(';');\n\t\tconst url = `${this._url}/route/v1/${profile}/${coordsStr}?overview=full&steps=true&geometries=geojson`;\n\n\t\tconst resp = await fetch(url);\n\t\tif (!resp.ok) throw new Error(`OSRM request failed with status ${resp.status}`);\n\n\t\tconst data = await resp.json();\n\t\tif (data.code !== 'Ok' || !data.routes || !data.routes.length) {\n\t\t\tthrow new Error('OSRM route request failed');\n\t\t}\n\n\t\tconst route = data.routes[0];\n\t\tconst overviewPolyline = route.geometry?.coordinates || [];\n\t\tconst legs = (route.legs ?? []).map((leg: any) => ({\n\t\t\tdistance: { value: leg.distance, text: `${(leg.distance / 1000).toFixed(2)} km` },\n\t\t\tduration: { value: leg.duration, text: `${Math.ceil(leg.duration / 60)} mins` },\n\t\t\toverviewPolyline: leg.steps?.flatMap((step: any) => step.geometry?.coordinates || []) || [],\n\t\t}));\n\n\t\treturn {\n\t\t\tdistance: { value: route.distance, text: `${(route.distance / 1000).toFixed(2)} km` },\n\t\t\tduration: { value: route.duration, text: `${Math.ceil(route.duration / 60)} mins` },\n\t\t\toverviewPolyline,\n\t\t\tlegs,\n\t\t};\n\t}\n\n\tprivate async getExtraTimeForZones(zones: Array<DocumentType<Zone> | null>): Promise<number[]> {\n\t\tconst now = new Date();\n\t\tconst today = dayjs(now).day() as WeekDay;\n\t\tconst currentTime = dayjs(now).format('HH:mm');\n\n\t\tconst validZones = zones.filter((z): z is DocumentType<Zone> => z !== null);\n\t\tconst zoneIds = validZones.map(zone => zone._id);\n\n\t\tif (zoneIds.length === 0) return zones.map(_ => this.DEFAULT_EXTRA_TIME);\n\n\t\tconst applicableSlots = await this.zoneExtraTimeModel\n\t\t\t.find({\n\t\t\t\tzone: { $in: zoneIds },\n\t\t\t\tday: today,\n\t\t\t\tisActive: true,\n\t\t\t\tstart: { $lte: currentTime },\n\t\t\t\tend: { $gte: currentTime },\n\t\t\t})\n\t\t\t.lean()\n\t\t\t.exec();\n\n\t\tconst extraTimeMap = new Map<string, number>();\n\t\tfor (const slot of applicableSlots) {\n\t\t\textraTimeMap.set(slot.zone.toString(), slot.extraTimeInSeconds);\n\t\t}\n\n\t\treturn zones.map(zone => {\n\t\t\tif (!zone) return this.DEFAULT_EXTRA_TIME;\n\t\t\treturn extraTimeMap.get(zone._id.toString()) ?? this.DEFAULT_EXTRA_TIME;\n\t\t});\n\t}\n\tprivate async findZonesByPoints(points: ICoordinate[]): Promise<(DocumentType<Zone> | null)[]> {\n\t\tif (!points.length) return [];\n\t\treturn Promise.all(\n\t\t\tpoints.map(point =>\n\t\t\t\tthis.zoneModel\n\t\t\t\t\t.findOne({\n\t\t\t\t\t\tgeometry: {\n\t\t\t\t\t\t\t$geoIntersects: {\n\t\t\t\t\t\t\t\t$geometry: { type: 'Point', coordinates: [point.longitude, point.latitude] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.exec()\n\t\t\t)\n\t\t);\n\t}\n}\n"]}
1
+ {"version":3,"file":"osrm.js","sourceRoot":"/","sources":["libraries/map/providers/osrm.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\tICoordinate,\n\tIDistanceInfo,\n\tIMapService,\n\tIRouteMatrixDTO,\n\tIWaypointDistanceInfo,\n} from '../interfaces/IMapService';\nimport { Zone, ZoneExtraTimeModel, ZoneModel } from '../../mongo/models';\nimport { SoftDeleteModel } from '../../mongo/plugins/soft-delete-plugin';\nimport dayjs from 'dayjs';\nimport { WeekDay } from '../../../utilities/enum';\nimport { DocumentType } from '@typegoose/typegoose';\n\nexport class OsrmMapService implements IMapService {\n\tprivate zoneModel: typeof ZoneModel & SoftDeleteModel<Zone>;\n\tprivate zoneExtraTimeModel: typeof ZoneExtraTimeModel;\n\tprivate readonly DEFAULT_EXTRA_TIME = 0;\n\tprivate readonly _url = 'https://api-v2-development.lyxa.ai/distance';\n\n\tconstructor() {\n\t\tthis.zoneModel = ZoneModel as typeof ZoneModel & SoftDeleteModel<Zone>;\n\t\tthis.zoneExtraTimeModel = ZoneExtraTimeModel as typeof ZoneExtraTimeModel;\n\t}\n\n\tasync getDistanceInfo(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo> {\n\t\tconst profile = 'driving';\n\t\tconst originStr = `${origin.longitude},${origin.latitude}`;\n\t\tconst destinationStr = `${destination.longitude},${destination.latitude}`;\n\t\tconst url = `${this._url}/route/v1/${profile}/${originStr};${destinationStr}?overview=false`;\n\n\t\tconst resp = await fetch(url);\n\t\tif (!resp.ok) throw new Error(`OSRM request failed with status ${resp.status}`);\n\n\t\tconst data = await resp.json();\n\t\tif (data.code !== 'Ok' || !data.routes || !data.routes.length) {\n\t\t\tthrow new Error('OSRM route request failed');\n\t\t}\n\n\t\tconst route = data.routes[0];\n\t\treturn {\n\t\t\tdistance: { value: route.distance, text: `${(route.distance / 1000).toFixed(2)} km` },\n\t\t\tduration: { value: route.duration, text: `${Math.ceil(route.duration / 60)} mins` },\n\t\t};\n\t}\n\n\tasync getDistanceMatrix(origins: ICoordinate[], destinations: ICoordinate[]): Promise<IRouteMatrixDTO[]> {\n\t\tconst allCoords = [...origins, ...destinations];\n\t\tconst coordString = allCoords.map(({ longitude, latitude }) => `${longitude},${latitude}`).join(';');\n\t\tconst originIndices = origins.map((_, idx) => idx).join(';');\n\t\tconst destIndices = destinations.map((_, idx) => origins.length + idx).join(';');\n\n\t\tconst url = `${this._url}/table/v1/bike/${coordString}?sources=${originIndices}&destinations=${destIndices}&annotations=distance,duration`;\n\n\t\tconst resp = await fetch(url);\n\t\tif (!resp.ok) throw new Error(`OSRM table request failed with status ${resp.status}`);\n\n\t\tconst data = await resp.json();\n\t\tif (data.code !== 'Ok' || !data.durations) throw new Error('OSRM table request failed');\n\n\t\tconst durations: number[][] = data.durations;\n\t\tconst distances: number[][] = data.distances;\n\n\t\tconst zones = await this.findZonesByPoints(origins);\n\t\tconst extraTimes = await this.getExtraTimeForZones(zones);\n\n\t\tconst result: IRouteMatrixDTO[] = [];\n\n\t\torigins.forEach((_, i) => {\n\t\t\tdestinations.forEach((_, j) => {\n\t\t\t\tconst dur = durations[i][j] + (extraTimes[j] || this.DEFAULT_EXTRA_TIME);\n\t\t\t\tconst dist = distances.length ? distances[i][j] : 0;\n\n\t\t\t\tresult.push({\n\t\t\t\t\tdistance: { value: dist, text: distances.length ? `${(dist / 1000).toFixed(2)} km` : 'N/A' },\n\t\t\t\t\tduration: { value: dur, text: `${Math.ceil(dur / 60)} mins` },\n\t\t\t\t\tcondition: 'OK',\n\t\t\t\t\toriginIndex: i,\n\t\t\t\t\tdestinationIndex: j,\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tasync getWaypointsDistanceInfo(\n\t\torigin: ICoordinate,\n\t\tdestination: ICoordinate,\n\t\twaypoints: ICoordinate[]\n\t): Promise<IWaypointDistanceInfo> {\n\t\tconst profile = 'driving';\n\t\tconst coordsArr = [origin, ...waypoints, destination];\n\t\tconst coordsStr = coordsArr.map(({ longitude, latitude }) => `${longitude},${latitude}`).join(';');\n\t\tconst url = `${this._url}/route/v1/${profile}/${coordsStr}?overview=full&steps=true&geometries=geojson`;\n\n\t\tconst resp = await fetch(url);\n\t\tif (!resp.ok) throw new Error(`OSRM request failed with status ${resp.status}`);\n\n\t\tconst data = await resp.json();\n\t\tif (data.code !== 'Ok' || !data.routes || !data.routes.length) {\n\t\t\tthrow new Error('OSRM route request failed');\n\t\t}\n\n\t\tconst route = data.routes[0];\n\t\tconst overviewPolyline = route.geometry?.coordinates || [];\n\t\tconst legs = (route.legs ?? []).map((leg: any) => ({\n\t\t\tdistance: { value: leg.distance, text: `${(leg.distance / 1000).toFixed(2)} km` },\n\t\t\tduration: { value: leg.duration, text: `${Math.ceil(leg.duration / 60)} mins` },\n\t\t\toverviewPolyline: leg.steps?.flatMap((step: any) => step.geometry?.coordinates || []) || [],\n\t\t}));\n\n\t\treturn {\n\t\t\tdistance: { value: route.distance, text: `${(route.distance / 1000).toFixed(2)} km` },\n\t\t\tduration: { value: route.duration, text: `${Math.ceil(route.duration / 60)} mins` },\n\t\t\toverviewPolyline,\n\t\t\tlegs,\n\t\t};\n\t}\n\n\tprivate async getExtraTimeForZones(zones: Array<DocumentType<Zone> | null>): Promise<number[]> {\n\t\tconst now = new Date();\n\t\tconst today = dayjs(now).day() as WeekDay;\n\t\tconst currentTime = dayjs(now).format('HH:mm');\n\n\t\tconst validZones = zones.filter((z): z is DocumentType<Zone> => z !== null);\n\t\tconst zoneIds = validZones.map(zone => zone._id);\n\n\t\tif (zoneIds.length === 0) return zones.map(_ => this.DEFAULT_EXTRA_TIME);\n\n\t\tconst applicableSlots = await this.zoneExtraTimeModel\n\t\t\t.find({\n\t\t\t\tzone: { $in: zoneIds },\n\t\t\t\tday: today,\n\t\t\t\tisActive: true,\n\t\t\t\tstart: { $lte: currentTime },\n\t\t\t\tend: { $gte: currentTime },\n\t\t\t})\n\t\t\t.lean()\n\t\t\t.exec();\n\n\t\tconst extraTimeMap = new Map<string, number>();\n\t\tfor (const slot of applicableSlots) {\n\t\t\textraTimeMap.set(slot.zone.toString(), slot.extraTimeInSeconds);\n\t\t}\n\n\t\treturn zones.map(zone => {\n\t\t\tif (!zone) return this.DEFAULT_EXTRA_TIME;\n\t\t\treturn extraTimeMap.get(zone._id.toString()) ?? this.DEFAULT_EXTRA_TIME;\n\t\t});\n\t}\n\tprivate async findZonesByPoints(points: ICoordinate[]): Promise<(DocumentType<Zone> | null)[]> {\n\t\tif (!points.length) return [];\n\t\treturn Promise.all(\n\t\t\tpoints.map(point =>\n\t\t\t\tthis.zoneModel\n\t\t\t\t\t.findOne({\n\t\t\t\t\t\tgeometry: {\n\t\t\t\t\t\t\t$geoIntersects: {\n\t\t\t\t\t\t\t\t$geometry: { type: 'Point', coordinates: [point.longitude, point.latitude] },\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\t.exec()\n\t\t\t)\n\t\t);\n\t}\n}\n"]}
@@ -9,8 +9,6 @@ declare class Metadata {
9
9
  waypoints?: Coordinate[];
10
10
  ipAddress?: string;
11
11
  userAgent?: string;
12
- functionName?: string;
13
- provider?: string;
14
12
  }
15
13
  export declare class GoogleMapsUsage extends TimeStamps {
16
14
  endpoint: string;
@@ -30,8 +30,6 @@ class Metadata {
30
30
  waypoints;
31
31
  ipAddress;
32
32
  userAgent;
33
- functionName;
34
- provider;
35
33
  }
36
34
  __decorate([
37
35
  (0, typegoose_1.prop)({ _id: false }),
@@ -53,14 +51,6 @@ __decorate([
53
51
  (0, typegoose_1.prop)(),
54
52
  __metadata("design:type", String)
55
53
  ], Metadata.prototype, "userAgent", void 0);
56
- __decorate([
57
- (0, typegoose_1.prop)(),
58
- __metadata("design:type", String)
59
- ], Metadata.prototype, "functionName", void 0);
60
- __decorate([
61
- (0, typegoose_1.prop)(),
62
- __metadata("design:type", String)
63
- ], Metadata.prototype, "provider", void 0);
64
54
  let GoogleMapsUsage = class GoogleMapsUsage extends defaultClasses_1.TimeStamps {
65
55
  endpoint;
66
56
  cacheHit;
@@ -1 +1 @@
1
- {"version":3,"file":"google-maps-usage.model.js","sourceRoot":"/","sources":["libraries/mongo/models/google-maps-usage.model.ts"],"names":[],"mappings":"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","sourcesContent":["import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose';\nimport { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';\n\nclass Coordinate {\n\t@prop({ required: true })\n\tlatitude!: number;\n\n\t@prop({ required: true })\n\tlongitude!: number;\n}\n\nclass Metadata {\n\t@prop({ _id: false })\n\torigin?: Coordinate;\n\n\t@prop({ _id: false })\n\tdestination?: Coordinate;\n\n\t@prop({ type: () => [Coordinate], _id: false })\n\twaypoints?: Coordinate[];\n\n\t@prop()\n\tipAddress?: string;\n\n\t@prop()\n\tuserAgent?: string;\n\n\t@prop()\n\tfunctionName?: string;\n\n\t@prop()\n\tprovider?: string;\n}\n\n@modelOptions({ schemaOptions: { collection: 'google_maps_usages' } })\n@index({ createdAt: 1 }, { expireAfterSeconds: 90 * 24 * 60 * 60 })\nexport class GoogleMapsUsage extends TimeStamps {\n\t@prop({\n\t\trequired: true,\n\t\ttype: String,\n\t\tenum: ['DistanceInfoGoogle', 'DistanceInfoGoogleWithWayPoints'],\n\t\tindex: true,\n\t})\n\tpublic endpoint!: string;\n\n\t@prop({\n\t\ttype: Boolean,\n\t\trequired: true,\n\t\tdefault: false,\n\t\tindex: true,\n\t})\n\tpublic cacheHit!: boolean;\n\n\t@prop({ type: String, default: null })\n\tpublic error?: string;\n\n\t@prop({ type: Number, default: null })\n\tpublic responseTime?: number;\n\n\t@prop({ type: () => Metadata, _id: false })\n\tpublic metadata?: Metadata;\n}\n\nconst GoogleMapsUsageModel = getModelForClass(GoogleMapsUsage);\n\nGoogleMapsUsageModel.schema.statics.getUsageStats = function (startDate?: Date, endDate?: Date) {\n\treturn this.aggregate([\n\t\t{\n\t\t\t$match: {\n\t\t\t\ttimestamp: {\n\t\t\t\t\t$gte: startDate || new Date(Date.now() - 24 * 60 * 60 * 1000),\n\t\t\t\t\t$lte: endDate || new Date(),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\tendpoint: '$endpoint',\n\t\t\t\t\tcacheHit: '$cacheHit',\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: { format: '%Y-%m-%d', date: '$createdAt' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcount: { $sum: 1 },\n\t\t\t\terrors: { $sum: { $cond: [{ $ne: ['$error', null] }, 1, 0] } },\n\t\t\t\tavgResponseTime: { $avg: '$responseTime' },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\tendpoint: '$_id.endpoint',\n\t\t\t\t\tdate: '$_id.date',\n\t\t\t\t},\n\t\t\t\ttotalRequests: { $sum: '$count' },\n\t\t\t\tcacheHits: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', true] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t\tapiCalls: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', false] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t\ttotalErrors: { $sum: '$errors' },\n\t\t\t\tavgResponseTime: { $avg: '$avgResponseTime' },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$project: {\n\t\t\t\tendpoint: '$_id.endpoint',\n\t\t\t\tdate: '$_id.date',\n\t\t\t\ttotalRequests: 1,\n\t\t\t\tcacheHits: 1,\n\t\t\t\tapiCalls: 1,\n\t\t\t\ttotalErrors: 1,\n\t\t\t\tavgResponseTime: 1,\n\t\t\t\tcacheHitRate: {\n\t\t\t\t\t$cond: [\n\t\t\t\t\t\t{ $eq: ['$totalRequests', 0] },\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ $multiply: [{ $divide: ['$cacheHits', '$totalRequests'] }, 100] },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\terrorRate: {\n\t\t\t\t\t$cond: [\n\t\t\t\t\t\t{ $eq: ['$totalRequests', 0] },\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ $multiply: [{ $divide: ['$totalErrors', '$totalRequests'] }, 100] },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$sort: { date: -1, endpoint: 1 },\n\t\t},\n\t]);\n};\n\nGoogleMapsUsageModel.schema.statics.getDailyCosts = function (\n\tstartDate?: Date,\n\tendDate?: Date,\n\tcostPerRequest = 0.005\n) {\n\treturn this.aggregate([\n\t\t{\n\t\t\t$match: {\n\t\t\t\tcreatedAt: {\n\t\t\t\t\t$gte: startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n\t\t\t\t\t$lte: endDate || new Date(),\n\t\t\t\t},\n\t\t\t\tcacheHit: false,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: { format: '%Y-%m-%d', date: '$createdAt' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tapiCallCount: { $sum: 1 },\n\t\t\t\tcost: { $sum: costPerRequest },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$project: {\n\t\t\t\tdate: '$_id.date',\n\t\t\t\tapiCallCount: 1,\n\t\t\t\tcost: { $round: ['$cost', 4] },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$sort: { date: -1 },\n\t\t},\n\t]);\n};\n\nGoogleMapsUsageModel.schema.statics.getHourlyUsage = function (date = new Date()) {\n\tconst startOfDay = new Date(date);\n\tstartOfDay.setHours(0, 0, 0, 0);\n\n\tconst endOfDay = new Date(date);\n\tendOfDay.setHours(23, 59, 59, 999);\n\n\treturn this.aggregate([\n\t\t{\n\t\t\t$match: {\n\t\t\t\tcreatedAt: { $gte: startOfDay, $lte: endOfDay },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\thour: { $hour: '$createdAt' },\n\t\t\t\t\tcacheHit: '$cacheHit',\n\t\t\t\t},\n\t\t\t\tcount: { $sum: 1 },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: '$_id.hour',\n\t\t\t\ttotalRequests: { $sum: '$count' },\n\t\t\t\tcacheHits: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', true] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t\tapiCalls: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', false] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$project: {\n\t\t\t\thour: '$_id',\n\t\t\t\ttotalRequests: 1,\n\t\t\t\tcacheHits: 1,\n\t\t\t\tapiCalls: 1,\n\t\t\t\tcacheHitRate: {\n\t\t\t\t\t$cond: [\n\t\t\t\t\t\t{ $eq: ['$totalRequests', 0] },\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ $multiply: [{ $divide: ['$cacheHits', '$totalRequests'] }, 100] },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$sort: { hour: 1 },\n\t\t},\n\t]);\n};\n\nexport { GoogleMapsUsageModel };\n"]}
1
+ {"version":3,"file":"google-maps-usage.model.js","sourceRoot":"/","sources":["libraries/mongo/models/google-maps-usage.model.ts"],"names":[],"mappings":"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","sourcesContent":["import { getModelForClass, index, modelOptions, prop } from '@typegoose/typegoose';\nimport { TimeStamps } from '@typegoose/typegoose/lib/defaultClasses';\n\nclass Coordinate {\n\t@prop({ required: true })\n\tlatitude!: number;\n\n\t@prop({ required: true })\n\tlongitude!: number;\n}\n\nclass Metadata {\n\t@prop({ _id: false })\n\torigin?: Coordinate;\n\n\t@prop({ _id: false })\n\tdestination?: Coordinate;\n\n\t@prop({ type: () => [Coordinate], _id: false })\n\twaypoints?: Coordinate[];\n\n\t@prop()\n\tipAddress?: string;\n\n\t@prop()\n\tuserAgent?: string;\n}\n\n@modelOptions({ schemaOptions: { collection: 'google_maps_usages' } })\n@index({ createdAt: 1 }, { expireAfterSeconds: 90 * 24 * 60 * 60 })\nexport class GoogleMapsUsage extends TimeStamps {\n\t@prop({\n\t\trequired: true,\n\t\ttype: String,\n\t\tenum: ['DistanceInfoGoogle', 'DistanceInfoGoogleWithWayPoints'],\n\t\tindex: true,\n\t})\n\tpublic endpoint!: string;\n\n\t@prop({\n\t\ttype: Boolean,\n\t\trequired: true,\n\t\tdefault: false,\n\t\tindex: true,\n\t})\n\tpublic cacheHit!: boolean;\n\n\t@prop({ type: String, default: null })\n\tpublic error?: string;\n\n\t@prop({ type: Number, default: null })\n\tpublic responseTime?: number;\n\n\t@prop({ type: () => Metadata, _id: false })\n\tpublic metadata?: Metadata;\n}\n\nconst GoogleMapsUsageModel = getModelForClass(GoogleMapsUsage);\n\nGoogleMapsUsageModel.schema.statics.getUsageStats = function (startDate?: Date, endDate?: Date) {\n\treturn this.aggregate([\n\t\t{\n\t\t\t$match: {\n\t\t\t\ttimestamp: {\n\t\t\t\t\t$gte: startDate || new Date(Date.now() - 24 * 60 * 60 * 1000),\n\t\t\t\t\t$lte: endDate || new Date(),\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\tendpoint: '$endpoint',\n\t\t\t\t\tcacheHit: '$cacheHit',\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: { format: '%Y-%m-%d', date: '$createdAt' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tcount: { $sum: 1 },\n\t\t\t\terrors: { $sum: { $cond: [{ $ne: ['$error', null] }, 1, 0] } },\n\t\t\t\tavgResponseTime: { $avg: '$responseTime' },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\tendpoint: '$_id.endpoint',\n\t\t\t\t\tdate: '$_id.date',\n\t\t\t\t},\n\t\t\t\ttotalRequests: { $sum: '$count' },\n\t\t\t\tcacheHits: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', true] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t\tapiCalls: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', false] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t\ttotalErrors: { $sum: '$errors' },\n\t\t\t\tavgResponseTime: { $avg: '$avgResponseTime' },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$project: {\n\t\t\t\tendpoint: '$_id.endpoint',\n\t\t\t\tdate: '$_id.date',\n\t\t\t\ttotalRequests: 1,\n\t\t\t\tcacheHits: 1,\n\t\t\t\tapiCalls: 1,\n\t\t\t\ttotalErrors: 1,\n\t\t\t\tavgResponseTime: 1,\n\t\t\t\tcacheHitRate: {\n\t\t\t\t\t$cond: [\n\t\t\t\t\t\t{ $eq: ['$totalRequests', 0] },\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ $multiply: [{ $divide: ['$cacheHits', '$totalRequests'] }, 100] },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t\terrorRate: {\n\t\t\t\t\t$cond: [\n\t\t\t\t\t\t{ $eq: ['$totalRequests', 0] },\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ $multiply: [{ $divide: ['$totalErrors', '$totalRequests'] }, 100] },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$sort: { date: -1, endpoint: 1 },\n\t\t},\n\t]);\n};\n\nGoogleMapsUsageModel.schema.statics.getDailyCosts = function (\n\tstartDate?: Date,\n\tendDate?: Date,\n\tcostPerRequest = 0.005\n) {\n\treturn this.aggregate([\n\t\t{\n\t\t\t$match: {\n\t\t\t\tcreatedAt: {\n\t\t\t\t\t$gte: startDate || new Date(Date.now() - 30 * 24 * 60 * 60 * 1000),\n\t\t\t\t\t$lte: endDate || new Date(),\n\t\t\t\t},\n\t\t\t\tcacheHit: false,\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\tdate: {\n\t\t\t\t\t\t$dateToString: { format: '%Y-%m-%d', date: '$createdAt' },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tapiCallCount: { $sum: 1 },\n\t\t\t\tcost: { $sum: costPerRequest },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$project: {\n\t\t\t\tdate: '$_id.date',\n\t\t\t\tapiCallCount: 1,\n\t\t\t\tcost: { $round: ['$cost', 4] },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$sort: { date: -1 },\n\t\t},\n\t]);\n};\n\nGoogleMapsUsageModel.schema.statics.getHourlyUsage = function (date = new Date()) {\n\tconst startOfDay = new Date(date);\n\tstartOfDay.setHours(0, 0, 0, 0);\n\n\tconst endOfDay = new Date(date);\n\tendOfDay.setHours(23, 59, 59, 999);\n\n\treturn this.aggregate([\n\t\t{\n\t\t\t$match: {\n\t\t\t\tcreatedAt: { $gte: startOfDay, $lte: endOfDay },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: {\n\t\t\t\t\thour: { $hour: '$createdAt' },\n\t\t\t\t\tcacheHit: '$cacheHit',\n\t\t\t\t},\n\t\t\t\tcount: { $sum: 1 },\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$group: {\n\t\t\t\t_id: '$_id.hour',\n\t\t\t\ttotalRequests: { $sum: '$count' },\n\t\t\t\tcacheHits: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', true] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t\tapiCalls: {\n\t\t\t\t\t$sum: { $cond: [{ $eq: ['$_id.cacheHit', false] }, '$count', 0] },\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$project: {\n\t\t\t\thour: '$_id',\n\t\t\t\ttotalRequests: 1,\n\t\t\t\tcacheHits: 1,\n\t\t\t\tapiCalls: 1,\n\t\t\t\tcacheHitRate: {\n\t\t\t\t\t$cond: [\n\t\t\t\t\t\t{ $eq: ['$totalRequests', 0] },\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t{ $multiply: [{ $divide: ['$cacheHits', '$totalRequests'] }, 100] },\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\t$sort: { hour: 1 },\n\t\t},\n\t]);\n};\n\nexport { GoogleMapsUsageModel };\n"]}
@@ -18,6 +18,9 @@ import { Dish } from './dish.model';
18
18
  import { Favourite } from './favourite.model';
19
19
  import { FeaturedSetting } from './featured-setting.model';
20
20
  import { FilterContainer } from './filter-container.model';
21
+ import { LimitedTimeOfferCampaign } from './limited-time-offer-campaign.model';
22
+ import { LimitedTimeOfferConfig } from './limited-time-offer-config';
23
+ import { LimitedTimeOfferParticipant } from './limited-time-offer-participant.model';
21
24
  import { ListContainer } from './list-container.model';
22
25
  import { Marketing } from './marketing.model';
23
26
  import { MealPlan } from './meal-plan.model';
@@ -176,6 +179,12 @@ export * from './providers/referral-code-coupon.model';
176
179
  export * from './providers/referral-reward-coupon.model';
177
180
  export declare const DealSettingModel: ReturnModelType<typeof DealSetting>;
178
181
  export * from './deal-setting.model';
182
+ export declare const LimitedTimeOfferCampaignModel: ReturnModelType<typeof LimitedTimeOfferCampaign>;
183
+ export * from './limited-time-offer-campaign.model';
184
+ export declare const LimitedTimeOfferConfigModel: ReturnModelType<typeof LimitedTimeOfferConfig>;
185
+ export * from './limited-time-offer-config';
186
+ export declare const LimitedTimeOfferParticipantModel: ReturnModelType<typeof LimitedTimeOfferParticipant>;
187
+ export * from './limited-time-offer-participant.model';
179
188
  export declare const DishModel: ReturnModelType<typeof Dish>;
180
189
  export * from './dish.model';
181
190
  export declare const FavouriteModel: ReturnModelType<typeof Favourite>;