@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.
- package/dist/libraries/map/interfaces/IMapService.d.ts +2 -6
- package/dist/libraries/map/interfaces/IMapService.js.map +1 -1
- package/dist/libraries/map/mapService.d.ts +0 -1
- package/dist/libraries/map/mapService.js +2 -2
- package/dist/libraries/map/mapService.js.map +1 -1
- package/dist/libraries/map/providers/google-maps.d.ts +3 -3
- package/dist/libraries/map/providers/google-maps.js +38 -12
- package/dist/libraries/map/providers/google-maps.js.map +1 -1
- package/dist/libraries/map/providers/osrm.d.ts +3 -3
- package/dist/libraries/map/providers/osrm.js +2 -2
- package/dist/libraries/map/providers/osrm.js.map +1 -1
- package/dist/libraries/mongo/models/google-maps-usage.model.d.ts +0 -2
- package/dist/libraries/mongo/models/google-maps-usage.model.js +0 -10
- package/dist/libraries/mongo/models/google-maps-usage.model.js.map +1 -1
- package/dist/libraries/mongo/models/index.d.ts +9 -0
- package/dist/libraries/mongo/models/index.js +12 -3
- package/dist/libraries/mongo/models/index.js.map +1 -1
- package/dist/libraries/mongo/models/limited-time-offer-campaign.model.d.ts +12 -0
- package/dist/libraries/mongo/models/limited-time-offer-campaign.model.js +66 -0
- package/dist/libraries/mongo/models/limited-time-offer-campaign.model.js.map +1 -0
- package/dist/libraries/mongo/models/limited-time-offer-config.d.ts +6 -0
- package/dist/libraries/mongo/models/limited-time-offer-config.js +36 -0
- package/dist/libraries/mongo/models/limited-time-offer-config.js.map +1 -0
- package/dist/libraries/mongo/models/limited-time-offer-participant.model.d.ts +17 -0
- package/dist/libraries/mongo/models/limited-time-offer-participant.model.js +76 -0
- package/dist/libraries/mongo/models/limited-time-offer-participant.model.js.map +1 -0
- package/dist/libraries/mongo/models/notification.model.d.ts +6 -0
- package/dist/libraries/mongo/models/notification.model.js +18 -0
- package/dist/libraries/mongo/models/notification.model.js.map +1 -1
- package/dist/types/README.md +1 -1
- package/dist/types/package.json +1 -1
- package/dist/types/utilities/enum.d.ts +10 -3
- package/dist/types/utilities/enum.js +12 -4
- package/dist/types/utilities/enum.js.map +1 -1
- package/dist/utilities/enum.d.ts +10 -3
- package/dist/utilities/enum.js +12 -4
- package/dist/utilities/enum.js.map +1 -1
- 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
|
|
41
|
-
getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: Array<ICoordinate
|
|
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":";;;
|
|
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"]}
|
|
@@ -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
|
|
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
|
|
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;
|
|
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,
|
|
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
|
|
16
|
+
getDistanceInfo(origin: ICoordinate, destination: ICoordinate): Promise<IDistanceInfo>;
|
|
17
17
|
private getDistanceInfoFromGoogle_DEPRECATED;
|
|
18
|
-
getWaypointsDistanceInfo(origin: ICoordinate, destination: ICoordinate, waypoints: Array<ICoordinate
|
|
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
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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, {
|
|
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,
|
|
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
|
|
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[]
|
|
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
|
|
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
|
|
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":";;;;;;AAQA,+CAAyE;AAEzE,kDAA0B;AAI1B,MAAa,cAAc;IAClB,SAAS,CAA2C;IACpD,kBAAkB,CAA4B;IACrC,kBAAkB,GAAG,CAAC,CAAC;IACvB,IAAI,GAAG,6CAA6C,CAAC;IAEtE;QACC,IAAI,CAAC,SAAS,GAAG,kBAAqD,CAAC;QACvE,IAAI,CAAC,kBAAkB,GAAG,2BAA+C,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAmB,EAAE,WAAwB,EAAE,QAA0B;QAC9F,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC3D,MAAM,cAAc,GAAG,GAAG,WAAW,CAAC,SAAS,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1E,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,aAAa,OAAO,IAAI,SAAS,IAAI,cAAc,iBAAiB,CAAC;QAE7F,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO;YACN,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;YACrF,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,OAAO,EAAE;SACnF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,OAAsB,EAAE,YAA2B;QAC1E,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,EAAE,GAAG,YAAY,CAAC,CAAC;QAChD,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrG,MAAM,aAAa,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjF,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,kBAAkB,WAAW,YAAY,aAAa,iBAAiB,WAAW,gCAAgC,CAAC;QAE3I,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAEtF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAExF,MAAM,SAAS,GAAe,IAAI,CAAC,SAAS,CAAC;QAC7C,MAAM,SAAS,GAAe,IAAI,CAAC,SAAS,CAAC;QAE7C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,MAAM,GAAsB,EAAE,CAAC;QAErC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC7B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,CAAC;gBACzE,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAEpD,MAAM,CAAC,IAAI,CAAC;oBACX,QAAQ,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,EAAE;oBAC5F,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,OAAO,EAAE;oBAC7D,SAAS,EAAE,IAAI;oBACf,WAAW,EAAE,CAAC;oBACd,gBAAgB,EAAE,CAAC;iBACnB,CAAC,CAAC;YACJ,CAAC,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IACf,CAAC;IAED,KAAK,CAAC,wBAAwB,CAC7B,MAAmB,EACnB,WAAwB,EACxB,SAAwB,EACxB,QAA0B;QAE1B,MAAM,OAAO,GAAG,SAAS,CAAC;QAC1B,MAAM,SAAS,GAAG,CAAC,MAAM,EAAE,GAAG,SAAS,EAAE,WAAW,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnG,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,IAAI,aAAa,OAAO,IAAI,SAAS,8CAA8C,CAAC;QAExG,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC9C,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,gBAAgB,GAAG,KAAK,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC;QAC3D,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,CAAC;YAClD,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;YACjF,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,EAAE,CAAC,OAAO,EAAE;YAC/E,gBAAgB,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,IAAS,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,IAAI,EAAE,CAAC,IAAI,EAAE;SAC3F,CAAC,CAAC,CAAC;QAEJ,OAAO;YACN,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE;YACrF,QAAQ,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,OAAO,EAAE;YACnF,gBAAgB;YAChB,IAAI;SACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAAC,KAAuC;QACzE,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,GAAG,EAAa,CAAC;QAC1C,MAAM,WAAW,GAAG,IAAA,eAAK,EAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE/C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAA2B,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;QAC5E,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEjD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEzE,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,kBAAkB;aACnD,IAAI,CAAC;YACL,IAAI,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;YACtB,GAAG,EAAE,KAAK;YACV,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;YAC5B,GAAG,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE;SAC1B,CAAC;aACD,IAAI,EAAE;aACN,IAAI,EAAE,CAAC;QAET,MAAM,YAAY,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC/C,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;YACpC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjE,CAAC;QAED,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACvB,IAAI,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAC,kBAAkB,CAAC;YAC1C,OAAO,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC;QACzE,CAAC,CAAC,CAAC;IACJ,CAAC;IACO,KAAK,CAAC,iBAAiB,CAAC,MAAqB;QACpD,IAAI,CAAC,MAAM,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAC9B,OAAO,OAAO,CAAC,GAAG,CACjB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAClB,IAAI,CAAC,SAAS;aACZ,OAAO,CAAC;YACR,QAAQ,EAAE;gBACT,cAAc,EAAE;oBACf,SAAS,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE;iBAC5E;aACD;SACD,CAAC;aACD,IAAI,EAAE,CACR,CACD,CAAC;IACH,CAAC;CACD;AA1JD,wCA0JC","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"]}
|
|
@@ -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>;
|