@mxpicture/tesla-superchargers-api 0.1.36 → 0.1.38
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/api/ChargersApi.d.ts +49 -11
- package/dist/api/ChargersApi.d.ts.map +1 -1
- package/dist/api/ChargersApi.js +135 -49
- package/dist/api/ChargersApi.js.map +1 -1
- package/dist/api/ChargingProcessesApi.d.ts +1 -2
- package/dist/api/ChargingProcessesApi.d.ts.map +1 -1
- package/dist/api/ChargingProcessesApi.js +7 -11
- package/dist/api/ChargingProcessesApi.js.map +1 -1
- package/dist/api/index.d.ts +0 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +0 -1
- package/dist/api/index.js.map +1 -1
- package/dist/common/chargers.common.d.ts.map +1 -1
- package/dist/common/chargers.common.js +6 -4
- package/dist/common/chargers.common.js.map +1 -1
- package/dist/common/fx.common.d.ts +19 -11
- package/dist/common/fx.common.d.ts.map +1 -1
- package/dist/common/fx.common.js +49 -35
- package/dist/common/fx.common.js.map +1 -1
- package/dist/common/pricebooks.common.d.ts.map +1 -1
- package/dist/common/pricebooks.common.js +7 -4
- package/dist/common/pricebooks.common.js.map +1 -1
- package/dist/types/chargers.types.d.ts +2 -1
- package/dist/types/chargers.types.d.ts.map +1 -1
- package/dist/types/pricebooks.types.d.ts +4 -0
- package/dist/types/pricebooks.types.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/api/FxRatesApi.d.ts +0 -31
- package/dist/api/FxRatesApi.d.ts.map +0 -1
- package/dist/api/FxRatesApi.js +0 -97
- package/dist/api/FxRatesApi.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { type PicChargers, type PicChargersId, type PicSlugsId } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
2
|
import { type TeslaClientCharger } from "@mxpicture/tesla-superchargers-mate/client";
|
|
3
3
|
import type { CoordinateAny } from "@mxpicture/tesla-superchargers-mate/common";
|
|
4
|
-
import type { ChargerFavourite, ChargerFetchPricesResult } from "../types/chargers.types.js";
|
|
4
|
+
import type { ChargerCandidate, ChargerFavourite, ChargerFetchPricesResult } from "../types/chargers.types.js";
|
|
5
5
|
import { IApi } from "./IApi.js";
|
|
6
6
|
import type { SyncSummary } from "../types/sync.types.js";
|
|
7
7
|
export declare class ChargersApi extends IApi {
|
|
@@ -17,20 +17,35 @@ export declare class ChargersApi extends IApi {
|
|
|
17
17
|
getFavourite(id: PicChargersId): Promise<ChargerFavourite | null>;
|
|
18
18
|
queryFavourites(): Promise<ChargerFavourite[]>;
|
|
19
19
|
updateFavourite(id: PicChargersId, favourite: boolean): Promise<ChargerFavourite | null>;
|
|
20
|
-
fetchSingle(item: CoordinateAny, locale?: string, radiusKm?: number): Promise<PicChargers | null>;
|
|
21
20
|
/**
|
|
22
|
-
*
|
|
21
|
+
* The nearest confirmed charger at a coordinate — {@link fetchByCoordinates}
|
|
22
|
+
* with a limit of 1.
|
|
23
|
+
*/
|
|
24
|
+
fetchFirstByCoordinates(item: CoordinateAny, locale?: string, radiusKm?: number): Promise<PicChargers | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Find the Superchargers at a coordinate: try the nearby slug rows
|
|
23
27
|
* (slugs first — their location_url_slug is the canonical details slug),
|
|
24
28
|
* answer from the db when the cached charger is fresh, otherwise fetch and
|
|
25
29
|
* store it via the chargers sync. Candidates whose failure_count reached
|
|
26
30
|
* {@link FAILURE_DEPRIORITIZE_THRESHOLD} are tried last (still by
|
|
27
|
-
* distance within each bucket). Returns the
|
|
28
|
-
* failed fetch bumps the source row's failure_count
|
|
29
|
-
* cached charger is returned rather than nothing when
|
|
30
|
-
* the fetch budget (`maxFetches`, default
|
|
31
|
-
* spent.
|
|
31
|
+
* distance within each bucket). Returns the confirmed chargers, nearest
|
|
32
|
+
* first, up to `limit`; a failed fetch bumps the source row's failure_count
|
|
33
|
+
* and moves on. A stale cached charger is returned rather than nothing when
|
|
34
|
+
* its refresh fails or the fetch budget (`maxFetches`, default
|
|
35
|
+
* {@link MAX_CHARGER_FETCHES}) is spent.
|
|
32
36
|
*/
|
|
33
|
-
|
|
37
|
+
fetchByCoordinates(item: CoordinateAny, locale?: string, radiusKm?: number, limit?: number, maxFetches?: number): Promise<PicChargers[]>;
|
|
38
|
+
/** The charger for a details slug, fetched on demand when it is missing or stale. */
|
|
39
|
+
fetchBySlug(slug: string, locale?: string): Promise<PicChargers | null>;
|
|
40
|
+
/**
|
|
41
|
+
* Resolve a list of candidates to stored chargers: repeat failers
|
|
42
|
+
* ({@link FAILURE_DEPRIORITIZE_THRESHOLD}) are tried after the rest, each
|
|
43
|
+
* slug is attempted once, and a fresh stored row answers without a fetch.
|
|
44
|
+
* At most `maxFetches` (default {@link MAX_CHARGER_FETCHES}) detail fetches
|
|
45
|
+
* run per call — past that a stale stored row is returned rather than
|
|
46
|
+
* nothing. Stops at `limit` results.
|
|
47
|
+
*/
|
|
48
|
+
fetch(candidates: ChargerCandidate[], locale?: string, limit?: number, maxFetches?: number): Promise<PicChargers[]>;
|
|
34
49
|
/**
|
|
35
50
|
* The pricebook rows valid at `at` for the Supercharger at a coordinate.
|
|
36
51
|
* The charger is resolved from the stored rows first — soft-deleted
|
|
@@ -47,9 +62,32 @@ export declare class ChargersApi extends IApi {
|
|
|
47
62
|
* a fetch-on-demand stored the charger's first group), that earliest group
|
|
48
63
|
* is used as the best available estimate.
|
|
49
64
|
*/
|
|
50
|
-
|
|
65
|
+
fetchPricesByCoordinates(item: CoordinateAny, at: Date, radiusKm?: number): Promise<ChargerFetchPricesResult>;
|
|
66
|
+
/**
|
|
67
|
+
* The pricebook rows valid at `at` for the Supercharger with this details
|
|
68
|
+
* slug. Same contract as {@link fetchPricesByCoordinates}, including the
|
|
69
|
+
* soft-deleted rows: `location_url_slug` lives on the charger itself, so a
|
|
70
|
+
* site Tesla removed from the feed — `pic_slugs` row hard-deleted, link
|
|
71
|
+
* NULLed — still answers for past dates.
|
|
72
|
+
*/
|
|
73
|
+
fetchPricesBySlug(slug: string, at: Date): Promise<ChargerFetchPricesResult>;
|
|
74
|
+
/**
|
|
75
|
+
* The pricebook rows valid at `at` for a stored charger id — the resolution
|
|
76
|
+
* key that survives everything, since it is the row's own. A stale row is
|
|
77
|
+
* refreshed through the slug it was fetched by when it still has one.
|
|
78
|
+
*/
|
|
79
|
+
fetchPricesById(id: PicChargersId, at: Date): Promise<ChargerFetchPricesResult>;
|
|
51
80
|
initialLoadFile(path: string): Promise<void>;
|
|
52
|
-
|
|
81
|
+
/**
|
|
82
|
+
* Fetch one charger by its details slug and store it, or answer from what is
|
|
83
|
+
* already stored when the fetch fails: a failed refresh returns `cached`
|
|
84
|
+
* with its bumped failure_count (stale beats nothing), a failed first fetch
|
|
85
|
+
* records the failure on the slug row and returns null. Never throws — the
|
|
86
|
+
* caller gets a charger or nothing, not an error. `slugsId` is the
|
|
87
|
+
* `pic_slugs` row the candidate came from; without it the slug is resolved
|
|
88
|
+
* again from the db.
|
|
89
|
+
*/
|
|
90
|
+
fetchAndStore(slug: string, locale: string, cached?: PicChargers | null, slugsId?: PicSlugsId): Promise<PicChargers | null>;
|
|
53
91
|
/** Snapshot sync from a full-feed file dump. Does not touch pricebooks. */
|
|
54
92
|
syncFile(path: string): Promise<SyncSummary>;
|
|
55
93
|
protected syncSnapshot(docs: TeslaClientCharger[]): Promise<SyncSummary>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChargersApi.d.ts","sourceRoot":"","sources":["../../src/api/ChargersApi.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,UAAU,EAChB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAGL,KAAK,kBAAkB,EACxB,MAAM,4CAA4C,CAAC;AAOpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ChargersApi.d.ts","sourceRoot":"","sources":["../../src/api/ChargersApi.ts"],"names":[],"mappings":"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"}
|
package/dist/api/ChargersApi.js
CHANGED
|
@@ -9,6 +9,7 @@ import { IApi } from "./IApi.js";
|
|
|
9
9
|
import { pricebookCoversInstant, samePricebookGroup, } from "../common/pricebooks.common.js";
|
|
10
10
|
import { singleFlight } from "../common/concurrency.common.js";
|
|
11
11
|
import { ChargersSync } from "../sync/ChargersSync.js";
|
|
12
|
+
import { fxToEur } from "../common/fx.common.js";
|
|
12
13
|
export class ChargersApi extends IApi {
|
|
13
14
|
async get(id) {
|
|
14
15
|
if (typeof id == "string")
|
|
@@ -59,37 +60,58 @@ export class ChargersApi extends IApi {
|
|
|
59
60
|
}
|
|
60
61
|
// Coalesce concurrent fetches for the same site. A parallel runPricing pass
|
|
61
62
|
// resolves many charges to the same slug at once, before the first fetch has
|
|
62
|
-
// stored the row for the DB freshness cache to dedup them. Keyed by slug
|
|
63
|
-
//
|
|
64
|
-
//
|
|
65
|
-
//
|
|
63
|
+
// stored the row for the DB freshness cache to dedup them. Keyed by slug +
|
|
64
|
+
// locale — that pair is what the details endpoint is called with, so two
|
|
65
|
+
// pic_slugs rows sharing a location_url_slug are one fetch, not two.
|
|
66
|
+
// In-flight only (cleared on settle); freshness/staleness still drives
|
|
67
|
+
// whether a new fetch runs.
|
|
66
68
|
#fetchInFlight = singleFlight();
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
/**
|
|
70
|
+
* The nearest confirmed charger at a coordinate — {@link fetchByCoordinates}
|
|
71
|
+
* with a limit of 1.
|
|
72
|
+
*/
|
|
73
|
+
async fetchFirstByCoordinates(item, locale = "de-DE", radiusKm) {
|
|
74
|
+
const [found] = await this.fetchByCoordinates(item, locale, radiusKm, 1);
|
|
69
75
|
return found ?? null;
|
|
70
76
|
}
|
|
71
77
|
/**
|
|
72
|
-
* Find the
|
|
78
|
+
* Find the Superchargers at a coordinate: try the nearby slug rows
|
|
73
79
|
* (slugs first — their location_url_slug is the canonical details slug),
|
|
74
80
|
* answer from the db when the cached charger is fresh, otherwise fetch and
|
|
75
81
|
* store it via the chargers sync. Candidates whose failure_count reached
|
|
76
82
|
* {@link FAILURE_DEPRIORITIZE_THRESHOLD} are tried last (still by
|
|
77
|
-
* distance within each bucket). Returns the
|
|
78
|
-
* failed fetch bumps the source row's failure_count
|
|
79
|
-
* cached charger is returned rather than nothing when
|
|
80
|
-
* the fetch budget (`maxFetches`, default
|
|
81
|
-
* spent.
|
|
83
|
+
* distance within each bucket). Returns the confirmed chargers, nearest
|
|
84
|
+
* first, up to `limit`; a failed fetch bumps the source row's failure_count
|
|
85
|
+
* and moves on. A stale cached charger is returned rather than nothing when
|
|
86
|
+
* its refresh fails or the fetch budget (`maxFetches`, default
|
|
87
|
+
* {@link MAX_CHARGER_FETCHES}) is spent.
|
|
82
88
|
*/
|
|
83
|
-
async
|
|
84
|
-
const chargers = [];
|
|
89
|
+
async fetchByCoordinates(item, locale = "de-DE", radiusKm, limit, maxFetches = MAX_CHARGER_FETCHES) {
|
|
85
90
|
const founds = radiusKm
|
|
86
91
|
? await picSlugsStore().queryByRadius(item, radiusKm)
|
|
87
92
|
: await picSlugsStore().queryByCoordinate(item);
|
|
88
93
|
const candidates = founds.map((found) => ({
|
|
89
94
|
slug: found.location_url_slug,
|
|
90
|
-
slugsId: found.id,
|
|
91
95
|
failureCount: found.failure_count,
|
|
96
|
+
slugsId: found.id,
|
|
92
97
|
}));
|
|
98
|
+
return await this.fetch(candidates, locale, limit, maxFetches);
|
|
99
|
+
}
|
|
100
|
+
/** The charger for a details slug, fetched on demand when it is missing or stale. */
|
|
101
|
+
async fetchBySlug(slug, locale = "de-DE") {
|
|
102
|
+
const [found] = await this.fetch([{ slug, failureCount: 0 }], locale, 1);
|
|
103
|
+
return found ?? null;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve a list of candidates to stored chargers: repeat failers
|
|
107
|
+
* ({@link FAILURE_DEPRIORITIZE_THRESHOLD}) are tried after the rest, each
|
|
108
|
+
* slug is attempted once, and a fresh stored row answers without a fetch.
|
|
109
|
+
* At most `maxFetches` (default {@link MAX_CHARGER_FETCHES}) detail fetches
|
|
110
|
+
* run per call — past that a stale stored row is returned rather than
|
|
111
|
+
* nothing. Stops at `limit` results.
|
|
112
|
+
*/
|
|
113
|
+
async fetch(candidates, locale = "de-DE", limit, maxFetches = MAX_CHARGER_FETCHES) {
|
|
114
|
+
const chargers = [];
|
|
93
115
|
// deprioritize (not skip) repeat failers; the sort is stable, so the
|
|
94
116
|
// nearest-first order is kept within each bucket
|
|
95
117
|
candidates.sort((a, b) => Number(a.failureCount >= FAILURE_DEPRIORITIZE_THRESHOLD) -
|
|
@@ -97,12 +119,11 @@ export class ChargersApi extends IApi {
|
|
|
97
119
|
const seen = new Set();
|
|
98
120
|
let fetches = 0;
|
|
99
121
|
const chargersStore = picChargersStore();
|
|
100
|
-
const slugsStore = picSlugsStore();
|
|
101
122
|
for (const candidate of candidates) {
|
|
102
123
|
if (seen.has(candidate.slug))
|
|
103
124
|
continue;
|
|
104
125
|
seen.add(candidate.slug);
|
|
105
|
-
const cached = await chargersStore.getBySlug(candidate.
|
|
126
|
+
const cached = await chargersStore.getBySlug(candidate.slug);
|
|
106
127
|
if (cached && isFresh(cached)) {
|
|
107
128
|
chargers.push(cached);
|
|
108
129
|
if (limit && chargers.length >= limit)
|
|
@@ -118,30 +139,11 @@ export class ChargersApi extends IApi {
|
|
|
118
139
|
continue;
|
|
119
140
|
}
|
|
120
141
|
fetches++;
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
if (charger.failure_count > 0)
|
|
124
|
-
await chargersStore.resetFailed(charger.id);
|
|
125
|
-
await slugsStore.resetFailed(candidate.slugsId);
|
|
142
|
+
const charger = await this.fetchAndStore(candidate.slug, locale, cached, candidate.slugsId);
|
|
143
|
+
if (charger)
|
|
126
144
|
chargers.push(charger);
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
catch (error) {
|
|
132
|
-
console.warn(`charger fetch for slug "${candidate.slug}" failed: ` +
|
|
133
|
-
(error instanceof Error ? error.message : String(error)));
|
|
134
|
-
// record the failure where it happened: a failed refresh on the
|
|
135
|
-
// charger row, a failed first fetch on the slug row
|
|
136
|
-
if (cached) {
|
|
137
|
-
cached.failure_count = await chargersStore.incrementFailed(cached.id);
|
|
138
|
-
chargers.push(cached); // stale beats nothing
|
|
139
|
-
if (limit && chargers.length >= limit)
|
|
140
|
-
break;
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
candidate.failureCount = await slugsStore.incrementFailed(candidate.slugsId);
|
|
144
|
-
}
|
|
145
|
+
if (limit && chargers.length >= limit)
|
|
146
|
+
break;
|
|
145
147
|
}
|
|
146
148
|
return chargers;
|
|
147
149
|
}
|
|
@@ -161,7 +163,7 @@ export class ChargersApi extends IApi {
|
|
|
161
163
|
* a fetch-on-demand stored the charger's first group), that earliest group
|
|
162
164
|
* is used as the best available estimate.
|
|
163
165
|
*/
|
|
164
|
-
async
|
|
166
|
+
async fetchPricesByCoordinates(item, at, radiusKm) {
|
|
165
167
|
const result = {
|
|
166
168
|
charger: null,
|
|
167
169
|
rows: [],
|
|
@@ -171,9 +173,49 @@ export class ChargersApi extends IApi {
|
|
|
171
173
|
: await picChargersStore().getByCoordinate(item)) ?? null;
|
|
172
174
|
let charger = stored;
|
|
173
175
|
if (!stored || (at > stored.fetched_at && !isFresh(stored)))
|
|
174
|
-
charger = (await this.
|
|
176
|
+
charger = (await this.fetchFirstByCoordinates(item)) ?? stored;
|
|
175
177
|
if (!charger)
|
|
176
178
|
return result;
|
|
179
|
+
return await this.#pricesAt(charger, at);
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The pricebook rows valid at `at` for the Supercharger with this details
|
|
183
|
+
* slug. Same contract as {@link fetchPricesByCoordinates}, including the
|
|
184
|
+
* soft-deleted rows: `location_url_slug` lives on the charger itself, so a
|
|
185
|
+
* site Tesla removed from the feed — `pic_slugs` row hard-deleted, link
|
|
186
|
+
* NULLed — still answers for past dates.
|
|
187
|
+
*/
|
|
188
|
+
async fetchPricesBySlug(slug, at) {
|
|
189
|
+
const stored = await picChargersStore().getBySlug(slug, true);
|
|
190
|
+
let charger = stored;
|
|
191
|
+
if (!stored || (at > stored.fetched_at && !isFresh(stored)))
|
|
192
|
+
charger = (await this.fetchBySlug(slug)) ?? stored;
|
|
193
|
+
if (!charger)
|
|
194
|
+
return { charger: null, rows: [] };
|
|
195
|
+
return await this.#pricesAt(charger, at);
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The pricebook rows valid at `at` for a stored charger id — the resolution
|
|
199
|
+
* key that survives everything, since it is the row's own. A stale row is
|
|
200
|
+
* refreshed through the slug it was fetched by when it still has one.
|
|
201
|
+
*/
|
|
202
|
+
async fetchPricesById(id, at) {
|
|
203
|
+
const stored = await picChargersStore().getIncludingDeleted(id);
|
|
204
|
+
if (!stored)
|
|
205
|
+
return { charger: null, rows: [] };
|
|
206
|
+
let charger = stored;
|
|
207
|
+
if (at > stored.fetched_at && !isFresh(stored) && stored.location_url_slug)
|
|
208
|
+
charger = (await this.fetchBySlug(stored.location_url_slug)) ?? stored;
|
|
209
|
+
return await this.#pricesAt(charger, at);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* The pricebook group valid at `at`, filtered to the rows whose time-of-use
|
|
213
|
+
* window covers that instant in the charger's time zone. When `at` predates
|
|
214
|
+
* the first recorded group — always the case right after a fetch-on-demand
|
|
215
|
+
* stored the charger's first group — that earliest group is the best
|
|
216
|
+
* available estimate.
|
|
217
|
+
*/
|
|
218
|
+
async #pricesAt(charger, at) {
|
|
177
219
|
const pricebooksStore = picPricebooksStore();
|
|
178
220
|
const group = await pricebooksStore.getGroupAt(charger.id, at);
|
|
179
221
|
const rows = group.length > 0
|
|
@@ -189,8 +231,42 @@ export class ChargersApi extends IApi {
|
|
|
189
231
|
const meta = createMeta();
|
|
190
232
|
await this.initialInserts(picChargersStore(), teslaClientChargersSchema.parse(json), (charger) => chargerToInitializer({ charger, meta }));
|
|
191
233
|
}
|
|
192
|
-
|
|
193
|
-
|
|
234
|
+
/**
|
|
235
|
+
* Fetch one charger by its details slug and store it, or answer from what is
|
|
236
|
+
* already stored when the fetch fails: a failed refresh returns `cached`
|
|
237
|
+
* with its bumped failure_count (stale beats nothing), a failed first fetch
|
|
238
|
+
* records the failure on the slug row and returns null. Never throws — the
|
|
239
|
+
* caller gets a charger or nothing, not an error. `slugsId` is the
|
|
240
|
+
* `pic_slugs` row the candidate came from; without it the slug is resolved
|
|
241
|
+
* again from the db.
|
|
242
|
+
*/
|
|
243
|
+
async fetchAndStore(slug, locale, cached, slugsId) {
|
|
244
|
+
const chargersStore = picChargersStore();
|
|
245
|
+
const slugsStore = picSlugsStore();
|
|
246
|
+
let charger;
|
|
247
|
+
try {
|
|
248
|
+
charger = await this.#fetchInFlight(`${slug} ${locale}`, () => this.#doFetchAndStore(slug, locale, slugsId));
|
|
249
|
+
}
|
|
250
|
+
catch (error) {
|
|
251
|
+
console.warn(`charger fetch for slug "${slug}" failed: ` +
|
|
252
|
+
(error instanceof Error ? error.message : String(error)));
|
|
253
|
+
// record the failure where it happened: a failed refresh on the
|
|
254
|
+
// charger row, a failed first fetch on the slug row
|
|
255
|
+
if (cached)
|
|
256
|
+
return {
|
|
257
|
+
...cached,
|
|
258
|
+
failure_count: await chargersStore.incrementFailed(cached.id),
|
|
259
|
+
};
|
|
260
|
+
const failedId = slugsId ?? (await slugsStore.idBySlug(slug));
|
|
261
|
+
if (failedId)
|
|
262
|
+
await slugsStore.incrementFailed(failedId);
|
|
263
|
+
else
|
|
264
|
+
console.warn(`charger fetch for slug "${slug}" failed with no pic_slugs row — failure not recorded`);
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
if (charger.pic_slugs_id)
|
|
268
|
+
await slugsStore.resetFailed(charger.pic_slugs_id);
|
|
269
|
+
return charger;
|
|
194
270
|
}
|
|
195
271
|
/**
|
|
196
272
|
* Fetch one charger by its details slug and upsert it on `location_guid`,
|
|
@@ -198,9 +274,10 @@ export class ChargersApi extends IApi {
|
|
|
198
274
|
* price changed, the current group is only re-stamped with the fetch's
|
|
199
275
|
* uuid; when one did, a new group is inserted and the old rows stay as
|
|
200
276
|
* history. A successful fetch resurrects the row and resets
|
|
201
|
-
* `failure_count`; `
|
|
202
|
-
*
|
|
203
|
-
* endpoint returns no
|
|
277
|
+
* `failure_count`; `slugsId` links it to the `pic_slugs` row it was found
|
|
278
|
+
* through, resolved from the slug when the caller did not pass one, and
|
|
279
|
+
* stored alongside the slug itself. Throws when the endpoint returns no
|
|
280
|
+
* charger.
|
|
204
281
|
*/
|
|
205
282
|
async #doFetchAndStore(slug, locale, slugsId) {
|
|
206
283
|
const clientDoc = await teslaClient().fetchCharger(slug, locale);
|
|
@@ -210,16 +287,25 @@ export class ChargersApi extends IApi {
|
|
|
210
287
|
` (${clientDoc.attempts} attempts)`);
|
|
211
288
|
const charger = clientDoc.charger;
|
|
212
289
|
const meta = createMeta();
|
|
213
|
-
const
|
|
290
|
+
const slugsStore = picSlugsStore();
|
|
214
291
|
const chargersStore = picChargersStore();
|
|
215
292
|
const pricebooksStore = picPricebooksStore();
|
|
293
|
+
const linkId = slugsId ?? (await slugsStore.idBySlug(slug)) ?? undefined;
|
|
294
|
+
const init = chargerToInitializer({ charger, meta, slugsId: linkId, slug });
|
|
295
|
+
const currencyCode = charger.effectivePricebooks[0]?.currencyCode;
|
|
296
|
+
const fxRate = currencyCode ? await fxToEur(currencyCode) : null;
|
|
216
297
|
return await transaction(chargersStore.table, async (tx) => {
|
|
217
298
|
const row = await chargersStore.upsertOne(init,
|
|
218
299
|
// update only the columns present in the initializer, so omitted ids
|
|
219
300
|
// don't overwrite existing FK links with NULL
|
|
220
301
|
{ conflictColumn: "location_guid", updateColumns: Object.keys(init) }, tx);
|
|
221
302
|
const current = await pricebooksStore.getCurrentGroup(row.id, tx);
|
|
222
|
-
const next = assignSortOrder(charger.effectivePricebooks.map((pricebook) => pricebookToInitializer({
|
|
303
|
+
const next = assignSortOrder(charger.effectivePricebooks.map((pricebook) => pricebookToInitializer({
|
|
304
|
+
pricebook,
|
|
305
|
+
meta,
|
|
306
|
+
chargersId: row.id,
|
|
307
|
+
fxRate,
|
|
308
|
+
})));
|
|
223
309
|
if (next.length === 0) {
|
|
224
310
|
// an empty group cannot be represented by rows — keep the last
|
|
225
311
|
// known prices instead of pretending they vanished
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChargersApi.js","sourceRoot":"","sources":["../../src/api/ChargersApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,eAAe,GAChB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAIN,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACL,WAAW,EACX,yBAAyB,GAE1B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EACL,gBAAgB,EAChB,kBAAkB,EAClB,aAAa,EACb,WAAW,GACZ,MAAM,2CAA2C,CAAC;AAOnD,OAAO,EACL,8BAA8B,EAC9B,OAAO,EACP,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,OAAO,EACL,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,OAAO,WAAY,SAAQ,IAAI;IAC5B,KAAK,CAAC,GAAG,CACd,EAKK;QAEL,IAAI,OAAO,EAAE,IAAI,QAAQ;YAAE,OAAO,MAAM,gBAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnE,IAAI,EAAE,CAAC,QAAQ;YACb,OAAO,MAAM,gBAAgB,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC;QACrE,OAAO,MAAM,gBAAgB,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAEM,KAAK,CAAC,KAAK,CAAC,MAGlB;QACC,IAAI,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,QAAQ;YACnC,OAAO,MAAM,gBAAgB,EAAE,CAAC,aAAa,CAC3C,MAAM,EAAE,KAAK,EACb,MAAM,EAAE,QAAQ,CACjB,CAAC;QACJ,IAAI,MAAM,EAAE,KAAK;YACf,OAAO,MAAM,gBAAgB,EAAE,CAAC,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACnE,OAAO,EAAE,CAAC;IACZ,CAAC;IAEM,KAAK,CAAC,YAAY,CACvB,EAAiB;QAEjB,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,OAAO;YACL,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,QAAQ,EAAE,OAAO,CAAC,iBAAiB;YACnC,SAAS,EAAE,OAAO,CAAC,kBAAkB;YACrC,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,eAAe;QAC1B,OAAO,CAAC,MAAM,gBAAgB,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAC3C,CAAC,OAAO,EAAoB,EAAE,CAAC,CAAC;YAC9B,EAAE,EAAE,OAAO,CAAC,EAAE;YACd,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;YAC1C,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;YAC9C,QAAQ,EAAE,OAAO,CAAC,iBAAiB;YACnC,SAAS,EAAE,OAAO,CAAC,kBAAkB;YACrC,aAAa,EAAE,OAAO,CAAC,aAAa;SACrC,CAAC,CACH,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,eAAe,CAC1B,EAAiB,EACjB,SAAkB;QAElB,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1D,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,4EAA4E;IAC5E,6EAA6E;IAC7E,2EAA2E;IAC3E,2EAA2E;IAC3E,2EAA2E;IAC3E,cAAc;IACL,cAAc,GAAG,YAAY,EAAe,CAAC;IAE/C,KAAK,CAAC,WAAW,CACtB,IAAmB,EACnB,SAAiB,OAAO,EACxB,QAAiB;QAEjB,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAC5D,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAED;;;;;;;;;;;OAWG;IACI,KAAK,CAAC,KAAK,CAChB,IAAmB,EACnB,SAAiB,OAAO,EACxB,QAAiB,EACjB,KAAc,EACd,aAAqB,mBAAmB;QAExC,MAAM,QAAQ,GAAkB,EAAE,CAAC;QAEnC,MAAM,MAAM,GAAG,QAAQ;YACrB,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC;YACrD,CAAC,CAAC,MAAM,aAAa,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAElD,MAAM,UAAU,GAAuB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC5D,IAAI,EAAE,KAAK,CAAC,iBAAiB;YAC7B,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,YAAY,EAAE,KAAK,CAAC,aAAa;SAClC,CAAC,CAAC,CAAC;QACJ,qEAAqE;QACrE,iDAAiD;QACjD,UAAU,CAAC,IAAI,CACb,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,8BAA8B,CAAC;YACxD,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,8BAA8B,CAAC,CAC3D,CAAC;QAEF,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;QACzC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;QAEnC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC;gBAAE,SAAS;YACvC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAEzB,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;YAChE,IAAI,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBACtB,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;oBAAE,MAAM;gBAC7C,SAAS;YACX,CAAC;YAED,IAAI,OAAO,IAAI,UAAU,EAAE,CAAC;gBAC1B,IAAI,MAAM,EAAE,CAAC;oBACX,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB;oBAC7C,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;gBAC/C,CAAC;gBACD,SAAS;YACX,CAAC;YAED,OAAO,EAAE,CAAC;YACV,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CACtC,SAAS,CAAC,IAAI,EACd,MAAM,EACN,SAAS,CAAC,OAAO,CAClB,CAAC;gBAEF,IAAI,OAAO,CAAC,aAAa,GAAG,CAAC;oBAC3B,MAAM,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAE9C,MAAM,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;gBAEhD,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACvB,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;oBAAE,MAAM;gBAC7C,SAAS;YACX,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CACV,2BAA2B,SAAS,CAAC,IAAI,YAAY;oBACnD,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC3D,CAAC;gBACF,gEAAgE;gBAChE,oDAAoD;gBACpD,IAAI,MAAM,EAAE,CAAC;oBACX,MAAM,CAAC,aAAa,GAAG,MAAM,aAAa,CAAC,eAAe,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;oBACtE,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB;oBAC7C,IAAI,KAAK,IAAI,QAAQ,CAAC,MAAM,IAAI,KAAK;wBAAE,MAAM;oBAC7C,SAAS;gBACX,CAAC;gBAED,SAAS,CAAC,YAAY,GAAG,MAAM,UAAU,CAAC,eAAe,CACvD,SAAS,CAAC,OAAO,CAClB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;;;;;;;;;;;;;OAeG;IACI,KAAK,CAAC,WAAW,CACtB,IAAmB,EACnB,EAAQ,EACR,QAAiB;QAEjB,MAAM,MAAM,GAA6B;YACvC,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,EAAE;SACT,CAAC;QAEF,MAAM,MAAM,GACV,CAAC,QAAQ;YACP,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC;YACtD,CAAC,CAAC,MAAM,gBAAgB,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC;QAE9D,IAAI,OAAO,GAAuB,MAAM,CAAC;QACzC,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACzD,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,IAAI,MAAM,CAAC;QACrD,IAAI,CAAC,OAAO;YAAE,OAAO,MAAM,CAAC;QAE5B,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;QAE7C,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAC/D,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,GAAG,CAAC;YACd,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,MAAM,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAEzD,OAAO;YACL,OAAO;YACP,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CACxB,sBAAsB,CAAC,GAAG,EAAE,EAAE,EAAE,OAAO,CAAC,SAAS,CAAC,CACnD;SACF,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,eAAe,CAAC,IAAY;QACvC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,IAAI,CAAC,cAAc,CACvB,gBAAgB,EAAE,EAClB,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,EACrC,CAAC,OAAO,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CACrD,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,aAAa,CACxB,IAAY,EACZ,MAAc,EACd,OAAoB;QAEpB,OAAO,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,IAAI,MAAM,EAAE,EAAE,GAAG,EAAE,CACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAC7C,CAAC;IACJ,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,gBAAgB,CACpB,IAAY,EACZ,MAAc,EACd,OAAoB;QAEpB,MAAM,SAAS,GAAG,MAAM,WAAW,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,CAAC,OAAO;YACpB,MAAM,IAAI,KAAK,CACb,2BAA2B,IAAI,uBAAuB;gBACpD,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,KAAK,SAAS,CAAC,QAAQ,YAAY,CACtC,CAAC;QACJ,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC;QAClC,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,oBAAoB,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAC9D,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAC;QACzC,MAAM,eAAe,GAAG,kBAAkB,EAAE,CAAC;QAE7C,OAAO,MAAM,WAAW,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE;YACzD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,SAAS,CACvC,IAAI;YACJ,qEAAqE;YACrE,8CAA8C;YAC9C,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACrE,EAAE,CACH,CAAC;YACF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAClE,MAAM,IAAI,GAAG,eAAe,CAC1B,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAC5C,sBAAsB,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAChE,CACF,CAAC;YACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,+DAA+D;gBAC/D,mDAAmD;gBACnD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;oBACpB,OAAO,CAAC,IAAI,CACV,WAAW,GAAG,CAAC,EAAE,WAAW,IAAI,8DAA8D,CAC/F,CAAC;YACN,CAAC;iBAAM,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC;gBAC7C,oEAAoE;gBACpE,MAAM,eAAe,CAAC,oBAAoB,CACxC,GAAG,CAAC,EAAE,EACN,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,EAC1B,IAAI,CAAC,eAAe,EACpB,EAAE,CACH,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,eAAe,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAED,2EAA2E;IACpE,KAAK,CAAC,QAAQ,CAAC,IAAY;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;QACrE,OAAO,MAAM,IAAI,CAAC,YAAY,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAES,KAAK,CAAC,YAAY,CAC1B,IAA0B;QAE1B,MAAM,IAAI,GAAG,UAAU,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,YAAY,EAAE,CAAC;QAChC,OAAO,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7C,CAAC;CACF;AAED,IAAI,IAAI,GAAuB,IAAI,CAAC;AACpC,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,CAAC,IAAI,KAAK,IAAI,WAAW,EAAE,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"ChargersApi.js","sourceRoot":"","sources":["../../src/api/ChargersApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ChargingProcesses, type ChargingProcessesId, type PicChargersId
|
|
1
|
+
import { type ChargingProcesses, type ChargingProcessesId, type PicChargersId } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
2
|
import type { UnpricedChargingProcess } from "@mxpicture/tesla-superchargers-mate/types";
|
|
3
3
|
import type { PricingSummary } from "../types/charging.types.js";
|
|
4
4
|
import { IApi } from "./IApi.js";
|
|
@@ -9,7 +9,6 @@ export declare class ChargingProcessesApi extends IApi {
|
|
|
9
9
|
charging_processes_id: ChargingProcessesId;
|
|
10
10
|
cost?: number | null;
|
|
11
11
|
chargers_id?: PicChargersId | null;
|
|
12
|
-
fx_rates_id?: PicFxRatesId | null;
|
|
13
12
|
}): Promise<ChargingProcesses | null>;
|
|
14
13
|
}
|
|
15
14
|
export declare const chargingProcessesApi: () => ChargingProcessesApi;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChargingProcessesApi.d.ts","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"ChargingProcessesApi.d.ts","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EACnB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AAEzF,OAAO,KAAK,EACV,cAAc,EAEf,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,qBAAa,oBAAqB,SAAQ,IAAI;IAC/B,UAAU,IAAI,OAAO,CAAC,cAAc,CAAC;IAmErC,kBAAkB,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAIxD,WAAW,CAAC,CAAC,EAAE;QAC1B,qBAAqB,EAAE,mBAAmB,CAAC;QAC3C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,WAAW,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC;KACpC,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;CAGtC;AAGD,eAAO,MAAM,oBAAoB,4BAA8C,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { IApi } from "./IApi.js";
|
|
|
5
5
|
import { chargingRate } from "../common/pricebooks.common.js";
|
|
6
6
|
import { FAILURE_DEPRIORITIZE_THRESHOLD, PRICING_FETCH_CONCURRENCY, } from "../common/chargers.common.js";
|
|
7
7
|
import { mapWithConcurrency } from "../common/concurrency.common.js";
|
|
8
|
-
import {
|
|
8
|
+
import { BASE_CURRENCY } from "../common/fx.common.js";
|
|
9
9
|
export class ChargingProcessesApi extends IApi {
|
|
10
10
|
async runPricing() {
|
|
11
11
|
const store = chargingProcessesStore();
|
|
@@ -17,7 +17,7 @@ export class ChargingProcessesApi extends IApi {
|
|
|
17
17
|
item.topic = "failureLimitReached";
|
|
18
18
|
return item;
|
|
19
19
|
}
|
|
20
|
-
const pricebooks = await chargersApi().
|
|
20
|
+
const pricebooks = await chargersApi().fetchPricesByCoordinates({ latitude: charge.latitude, longitude: charge.longitude }, charge.start_date);
|
|
21
21
|
const rate = chargingRate(pricebooks.rows);
|
|
22
22
|
item.rate = rate;
|
|
23
23
|
if (!rate) {
|
|
@@ -32,24 +32,20 @@ export class ChargingProcessesApi extends IApi {
|
|
|
32
32
|
item.failure_count = await store.incrementFailed(item.charge.id);
|
|
33
33
|
return item;
|
|
34
34
|
}
|
|
35
|
-
// cost is written into TeslaMate's single-currency cost column, so a
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
|
|
39
|
-
const local = rate.rate * Number(energy);
|
|
40
|
-
const fx = await fxToEur(rate.currencyCode, charge.start_date);
|
|
41
|
-
if (fx === null) {
|
|
35
|
+
// cost is written into TeslaMate's single-currency cost column, so a rate
|
|
36
|
+
// that is not already in EUR — no fx rate was stored with the pricebook row —
|
|
37
|
+
// leaves the charge unpriced rather than storing a wrong-currency number.
|
|
38
|
+
if (rate.currencyCode !== BASE_CURRENCY) {
|
|
42
39
|
item.topic = "noFxRate";
|
|
43
40
|
item.failure_count = await store.incrementFailed(item.charge.id);
|
|
44
41
|
return item;
|
|
45
42
|
}
|
|
46
|
-
const cost = Number((
|
|
43
|
+
const cost = Number((rate.rate * Number(energy)).toFixed(2));
|
|
47
44
|
item.cost = cost;
|
|
48
45
|
await chargingProcessesApi().updatePrice({
|
|
49
46
|
charging_processes_id: charge.id,
|
|
50
47
|
cost,
|
|
51
48
|
chargers_id: pricebooks.charger?.id ?? null,
|
|
52
|
-
fx_rates_id: fx.id,
|
|
53
49
|
});
|
|
54
50
|
item.topic = "chargeUpdated";
|
|
55
51
|
item.failure_count = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChargingProcessesApi.js","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"ChargingProcessesApi.js","sourceRoot":"","sources":["../../src/api/ChargingProcessesApi.ts"],"names":[],"mappings":"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"}
|
package/dist/api/index.d.ts
CHANGED
package/dist/api/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AACA,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
package/dist/api/index.js
CHANGED
package/dist/api/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,kBAAkB,CAAC;AACjC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,kBAAkB,CAAC;AACjC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chargers.common.d.ts","sourceRoot":"","sources":["../../src/common/chargers.common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAEnF,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,qHAAqH;AACrH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QACc,CAAC;AAErD,eAAO,MAAM,OAAO,GAAI,KAAK,WAAW,KAAG,OAEkB,CAAC;
|
|
1
|
+
{"version":3,"file":"chargers.common.d.ts","sourceRoot":"","sources":["../../src/common/chargers.common.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AAEnF,oEAAoE;AACpE,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,wEAAwE;AACxE,eAAO,MAAM,mBAAmB,IAAI,CAAC;AAErC,qHAAqH;AACrH,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,QACc,CAAC;AAErD,eAAO,MAAM,OAAO,GAAI,KAAK,WAAW,KAAG,OAEkB,CAAC;AAW9D,eAAO,MAAM,qBAAqB,GAAI,SAAS,MAAM,EAAE,KAAG,MAAM,EACA,CAAC"}
|
|
@@ -14,10 +14,12 @@ export const PRICING_FETCH_CONCURRENCY = Number(process.env.PRICING_FETCH_CONCUR
|
|
|
14
14
|
export const isFresh = (row) => row.fetched_at.getTime() >
|
|
15
15
|
Date.now() - CHARGER_STALE_AFTER_DAYS * 24 * 60 * 60 * 1000;
|
|
16
16
|
/**
|
|
17
|
-
* Columns the Tesla feed doesn't own — the `pic_slugs_id` FK link
|
|
18
|
-
*
|
|
19
|
-
*
|
|
17
|
+
* Columns the Tesla feed doesn't own — the `pic_slugs_id` FK link, the
|
|
18
|
+
* `location_url_slug` it was fetched by (the charger-details feed carries
|
|
19
|
+
* neither; both come from the map feed) and the user-set `favourite` flag. A
|
|
20
|
+
* snapshot re-sync must not wipe them, so they are dropped from the charger
|
|
21
|
+
* sync's compare/update column lists.
|
|
20
22
|
*/
|
|
21
|
-
const NON_FEED_COLUMNS = ["pic_slugs_id", "favourite"];
|
|
23
|
+
const NON_FEED_COLUMNS = ["pic_slugs_id", "location_url_slug", "favourite"];
|
|
22
24
|
export const withoutNonFeedColumns = (columns) => columns.filter((column) => !NON_FEED_COLUMNS.includes(column));
|
|
23
25
|
//# sourceMappingURL=chargers.common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chargers.common.js","sourceRoot":"","sources":["../../src/common/chargers.common.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C,wEAAwE;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,qHAAqH;AACrH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAgB,EAAW,EAAE,CACnD,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE;IACxB,IAAI,CAAC,GAAG,EAAE,GAAG,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9D
|
|
1
|
+
{"version":3,"file":"chargers.common.js","sourceRoot":"","sources":["../../src/common/chargers.common.ts"],"names":[],"mappings":"AAEA,oEAAoE;AACpE,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAE1C,wEAAwE;AACxE,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAErC,qHAAqH;AACrH,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,yBAAyB,GACpC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,GAAgB,EAAW,EAAE,CACnD,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE;IACxB,IAAI,CAAC,GAAG,EAAE,GAAG,wBAAwB,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,gBAAgB,GAAG,CAAC,cAAc,EAAE,mBAAmB,EAAE,WAAW,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,OAAiB,EAAY,EAAE,CACnE,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -1,24 +1,32 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* FX conversion to the base currency, resolved when a charger's pricebooks are
|
|
3
|
+
* fetched: the feed publishes quote-per-EUR rates, so a foreign rate is
|
|
4
|
+
* inverted and stored next to the local one in `pic_pricebooks`. EUR is the
|
|
5
|
+
* identity and never leaves the process; foreign rates are held in-process, so
|
|
6
|
+
* one request serves every currency and every charger of a window. A rate that
|
|
7
|
+
* cannot be resolved returns null, and the caller stores the group without EUR
|
|
8
|
+
* values rather than with wrong ones.
|
|
9
|
+
*/
|
|
10
|
+
import type { FxRateRowNum, FxRatesRaw } from "@mxpicture/tesla-superchargers-mate/types";
|
|
2
11
|
/** The currency TeslaMate's `cost` column is aggregated in. */
|
|
3
12
|
export declare const BASE_CURRENCY = "EUR";
|
|
4
13
|
/** How many UTC days back the daily sync covers, today included. */
|
|
5
14
|
export declare const FX_SYNC_DAYS = 7;
|
|
6
|
-
export declare const toRateDate: (d: Date) => string;
|
|
15
|
+
export declare const toRateDate: (d: Date | string) => string;
|
|
7
16
|
/**
|
|
8
17
|
* All quote-per-EUR rates for a date, primary host then mirror; null when the
|
|
9
18
|
* date is not published yet or both hosts fail. One request serves every
|
|
10
19
|
* currency of that day.
|
|
11
20
|
*/
|
|
12
|
-
export declare const fetchEurRates: (rateDate: string) => Promise<
|
|
21
|
+
export declare const fetchEurRates: (rateDate: string) => Promise<FxRatesRaw | null>;
|
|
13
22
|
/** Invert a quote-per-EUR rate into EUR per 1 unit; null when unusable. */
|
|
14
|
-
export declare const rateToEur: (quotePerEur: number | undefined) => number | null;
|
|
23
|
+
export declare const rateToEur: (quotePerEur: number | undefined | null) => number | null;
|
|
24
|
+
/** Test seam: drop the cached rates so a case starts from a cold cache. */
|
|
25
|
+
export declare const resetFxCache: () => void;
|
|
15
26
|
/**
|
|
16
|
-
* The
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* special-cased — the feed carries `eur: 1`, so the base currency resolves to
|
|
20
|
-
* a real row like any other. A cache hit is returned directly; a miss fetches
|
|
21
|
-
* once (single-flighted) and caches the result before returning it.
|
|
27
|
+
* The current rate row for `currencyCode`, or null when it can't be resolved.
|
|
28
|
+
* The base currency is the identity and never goes to the network — with an
|
|
29
|
+
* EUR-only price history that keeps the feed out of the normal path entirely.
|
|
22
30
|
*/
|
|
23
|
-
export declare const fxToEur: (currencyCode: string
|
|
31
|
+
export declare const fxToEur: (currencyCode: string) => Promise<FxRateRowNum | null>;
|
|
24
32
|
//# sourceMappingURL=fx.common.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx.common.d.ts","sourceRoot":"","sources":["../../src/common/fx.common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fx.common.d.ts","sourceRoot":"","sources":["../../src/common/fx.common.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACX,MAAM,2CAA2C,CAAC;AAGnD,+DAA+D;AAC/D,eAAO,MAAM,aAAa,QAAQ,CAAC;AAEnC,oEAAoE;AACpE,eAAO,MAAM,YAAY,IAAI,CAAC;AAgB9B,eAAO,MAAM,UAAU,GAAI,GAAG,IAAI,GAAG,MAAM,KAAG,MACY,CAAC;AAY3D;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,UAAU,MAAM,KACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAc3B,CAAC;AAEF,2EAA2E;AAC3E,eAAO,MAAM,SAAS,GACpB,aAAa,MAAM,GAAG,SAAS,GAAG,IAAI,KACrC,MAAM,GAAG,IAMF,CAAC;AAcX,2EAA2E;AAC3E,eAAO,MAAM,YAAY,QAAO,IAE/B,CAAC;AAgBF;;;;GAIG;AACH,eAAO,MAAM,OAAO,GAClB,cAAc,MAAM,KACnB,OAAO,CAAC,YAAY,GAAG,IAAI,CAc7B,CAAC"}
|
package/dist/common/fx.common.js
CHANGED
|
@@ -1,15 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* FX conversion to the base currency for the charge-cost boundary. A charge's
|
|
3
|
-
* cost is written into TeslaMate's single-currency `charging_processes.cost`,
|
|
4
|
-
* so a foreign-currency rate must be converted to EUR first. Rates are looked
|
|
5
|
-
* up per the charge's own (UTC) date and cached write-once in `pic_fx_rates`,
|
|
6
|
-
* EUR (rate 1) included, so every priced charge can point at the rate row it
|
|
7
|
-
* was priced with. A rate that cannot be resolved returns null so the caller
|
|
8
|
-
* can leave the charge unpriced rather than store a wrong-currency cost.
|
|
9
|
-
*/
|
|
10
|
-
import { picFxRatesStore } from "@mxpicture/tesla-superchargers-mate/store";
|
|
11
1
|
import { singleFlight } from "./concurrency.common.js";
|
|
12
|
-
import { enrichFxRate } from "@mxpicture/tesla-superchargers-mate/transform";
|
|
13
2
|
/** The currency TeslaMate's `cost` column is aggregated in. */
|
|
14
3
|
export const BASE_CURRENCY = "EUR";
|
|
15
4
|
/** How many UTC days back the daily sync covers, today included. */
|
|
@@ -26,7 +15,10 @@ const fxUrls = (rateDate, quoteLower) => [
|
|
|
26
15
|
`https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@${rateDate}/v1/currencies/${quoteLower}.json`,
|
|
27
16
|
`https://${rateDate}.currency-api.pages.dev/v1/currencies/${quoteLower}.json`,
|
|
28
17
|
];
|
|
29
|
-
export const toRateDate = (d) => d.toISOString().slice(0, 10);
|
|
18
|
+
export const toRateDate = (d) => typeof d === "string" ? d : d.toISOString().slice(0, 10);
|
|
19
|
+
const extractRateToEur = (raw, quoteCurrency) => rateToEur(raw[quoteCurrency.toLowerCase()] ??
|
|
20
|
+
raw[quoteCurrency.toUpperCase()] ??
|
|
21
|
+
null);
|
|
30
22
|
/**
|
|
31
23
|
* All quote-per-EUR rates for a date, primary host then mirror; null when the
|
|
32
24
|
* date is not published yet or both hosts fail. One request serves every
|
|
@@ -51,33 +43,55 @@ export const fetchEurRates = async (rateDate) => {
|
|
|
51
43
|
return null;
|
|
52
44
|
};
|
|
53
45
|
/** Invert a quote-per-EUR rate into EUR per 1 unit; null when unusable. */
|
|
54
|
-
export const rateToEur = (quotePerEur) => quotePerEur !== undefined &&
|
|
46
|
+
export const rateToEur = (quotePerEur) => quotePerEur !== undefined &&
|
|
47
|
+
quotePerEur !== null &&
|
|
48
|
+
Number.isFinite(quotePerEur) &&
|
|
49
|
+
quotePerEur > 0
|
|
55
50
|
? 1 / quotePerEur
|
|
56
51
|
: null;
|
|
57
|
-
/**
|
|
58
|
-
const
|
|
52
|
+
/** How long a successful fetch is reused; the feed moves on a daily cadence. */
|
|
53
|
+
const FX_TTL_MS = 6 * 60 * 60 * 1000;
|
|
54
|
+
/** How long a failure is remembered, so an outage costs one request per window. */
|
|
55
|
+
const FX_RETRY_MS = 5 * 60 * 1000;
|
|
56
|
+
/** The feed's moving-target alias — pricing always wants the current rate. */
|
|
57
|
+
const LATEST = "latest";
|
|
58
|
+
let cached = null;
|
|
59
|
+
const inFlight = singleFlight();
|
|
60
|
+
/** Test seam: drop the cached rates so a case starts from a cold cache. */
|
|
61
|
+
export const resetFxCache = () => {
|
|
62
|
+
cached = null;
|
|
63
|
+
};
|
|
59
64
|
/**
|
|
60
|
-
* The
|
|
61
|
-
*
|
|
62
|
-
*
|
|
63
|
-
* special-cased — the feed carries `eur: 1`, so the base currency resolves to
|
|
64
|
-
* a real row like any other. A cache hit is returned directly; a miss fetches
|
|
65
|
-
* once (single-flighted) and caches the result before returning it.
|
|
65
|
+
* The current quote-per-EUR rates, from cache when warm. Concurrent misses share
|
|
66
|
+
* one request; a failure is cached too, so an outage does not put two 10 s
|
|
67
|
+
* requests in front of every charger fetch.
|
|
66
68
|
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return null;
|
|
75
|
-
return await fxInFlight(`${rateDate} ${quote}`, async () => {
|
|
76
|
-
const rates = await fetchEurRates(rateDate);
|
|
77
|
-
const rate = rates ? rateToEur(rates[quote.toLowerCase()]) : null;
|
|
78
|
-
if (rate === null)
|
|
79
|
-
return null;
|
|
80
|
-
return enrichFxRate(await picFxRatesStore().putRate(rateDate, quote, String(rate)));
|
|
69
|
+
const currentRates = async () => {
|
|
70
|
+
if (cached && Date.now() < cached.until)
|
|
71
|
+
return cached.rates;
|
|
72
|
+
return await inFlight(LATEST, async () => {
|
|
73
|
+
const rates = await fetchEurRates(LATEST);
|
|
74
|
+
cached = { rates, until: Date.now() + (rates ? FX_TTL_MS : FX_RETRY_MS) };
|
|
75
|
+
return rates;
|
|
81
76
|
});
|
|
82
77
|
};
|
|
78
|
+
/**
|
|
79
|
+
* The current rate row for `currencyCode`, or null when it can't be resolved.
|
|
80
|
+
* The base currency is the identity and never goes to the network — with an
|
|
81
|
+
* EUR-only price history that keeps the feed out of the normal path entirely.
|
|
82
|
+
*/
|
|
83
|
+
export const fxToEur = async (currencyCode) => {
|
|
84
|
+
const quoteCurrency = currencyCode.toUpperCase();
|
|
85
|
+
const rateToEurNum = quoteCurrency === BASE_CURRENCY
|
|
86
|
+
? 1
|
|
87
|
+
: extractRateToEur((await currentRates()) ?? {}, quoteCurrency);
|
|
88
|
+
if (!rateToEurNum)
|
|
89
|
+
return null;
|
|
90
|
+
return {
|
|
91
|
+
rateToEurNum,
|
|
92
|
+
rateDate: toRateDate(new Date()),
|
|
93
|
+
quoteCurrency,
|
|
94
|
+
rateToEur: rateToEurNum.toString(),
|
|
95
|
+
};
|
|
96
|
+
};
|
|
83
97
|
//# sourceMappingURL=fx.common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fx.common.js","sourceRoot":"","sources":["../../src/common/fx.common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fx.common.js","sourceRoot":"","sources":["../../src/common/fx.common.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricebooks.common.d.ts","sourceRoot":"","sources":["../../src/common/pricebooks.common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"pricebooks.common.d.ts","sourceRoot":"","sources":["../../src/common/pricebooks.common.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EACV,YAAY,EACZ,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AAEtC,8EAA8E;AAC9E,eAAO,MAAM,kBAAkB,SAAS,CAAC;AACzC,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,OAAO,QAAQ,CAAC;AAE7B,wEAAwE;AACxE,eAAO,MAAM,aAAa,GAAI,MAAM,IAAI,GAAG,MAAM,KAAG,MAInD,CAAC;AAEF,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,GAAG,MAAM,KAAG,MAC7B,CAAC;AAE1B,oFAAoF;AACpF,eAAO,MAAM,YAAY,GAAI,KAAK,gBAAgB,KAAG,MAcxC,CAAC;AAEd,qHAAqH;AACrH,eAAO,MAAM,YAAY,GACvB,IAAI,IAAI,EACR,UAAU,MAAM,KACf;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAkBjC,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,GACjC,KAAK,IAAI,CAAC,gBAAgB,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,CAAC,EAC/D,IAAI,IAAI,EACR,UAAU,MAAM,KACf,OASF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,GAC7B,GAAG,gBAAgB,EAAE,EACrB,GAAG,gBAAgB,EAAE,KACpB,OAKF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,YAAY,GAAI,MAAM,gBAAgB,EAAE,KAAG,YAAY,GAAG,IA2BtE,CAAC"}
|
|
@@ -9,7 +9,7 @@ export const normalizeTime = (time) => {
|
|
|
9
9
|
const [h = "0", m = "0", s = "0"] = time.split(".")[0].split(":");
|
|
10
10
|
return [h, m, s].map((part) => part.padStart(2, "0")).join(":");
|
|
11
11
|
};
|
|
12
|
-
export const normalizeRate = (rate) => Number(rate).toFixed(
|
|
12
|
+
export const normalizeRate = (rate) => Number(rate).toFixed(4);
|
|
13
13
|
/** One row's content columns as a canonical string, order-independent in `days`. */
|
|
14
14
|
export const canonicalRow = (row) => [
|
|
15
15
|
row.currency_code,
|
|
@@ -103,9 +103,12 @@ export const chargingRate = (rows) => {
|
|
|
103
103
|
const candidates = groups.get(vehicleType);
|
|
104
104
|
const row = candidates?.find((candidate) => !candidate.is_member_pricebook) ??
|
|
105
105
|
candidates?.[0];
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
106
|
+
if (!row)
|
|
107
|
+
return null;
|
|
108
|
+
return {
|
|
109
|
+
rate: Number(row.rate_base_eur ?? row.rate_base),
|
|
110
|
+
currencyCode: row.rate_base_eur ? "EUR" : row.currency_code,
|
|
111
|
+
};
|
|
109
112
|
};
|
|
110
113
|
if (groups.has(TESLA_VEHICLE_MAKE))
|
|
111
114
|
return rateFor(TESLA_VEHICLE_MAKE);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricebooks.common.js","sourceRoot":"","sources":["../../src/common/pricebooks.common.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pricebooks.common.js","sourceRoot":"","sources":["../../src/common/pricebooks.common.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,9 @@ import type { PicChargers, PicChargersId, PicPricebooks, PicSlugsId } from "@mxp
|
|
|
2
2
|
export interface ChargerCandidate {
|
|
3
3
|
/** slug for the details endpoint (location_url_slug) */
|
|
4
4
|
slug: string;
|
|
5
|
-
slugsId: PicSlugsId;
|
|
6
5
|
failureCount: number;
|
|
6
|
+
/** the pic_slugs row it came from, when the caller already resolved one */
|
|
7
|
+
slugsId?: PicSlugsId;
|
|
7
8
|
}
|
|
8
9
|
export interface ChargerFavourite {
|
|
9
10
|
id: PicChargersId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chargers.types.d.ts","sourceRoot":"","sources":["../../src/types/chargers.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACX,MAAM,iDAAiD,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,
|
|
1
|
+
{"version":3,"file":"chargers.types.d.ts","sourceRoot":"","sources":["../../src/types/chargers.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,aAAa,EACb,aAAa,EACb,UAAU,EACX,MAAM,iDAAiD,CAAC;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,aAAa,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,aAAa,EAAE,CAAC;CACvB"}
|
|
@@ -20,6 +20,10 @@ export interface PricebookContent {
|
|
|
20
20
|
rate_base: string | number;
|
|
21
21
|
rate_tier_1: string | number;
|
|
22
22
|
rate_tier_2: string | number;
|
|
23
|
+
fx_rate_to_eur?: string | number | null;
|
|
24
|
+
rate_base_eur?: string | number | null;
|
|
25
|
+
rate_tier_1_eur?: string | number | null;
|
|
26
|
+
rate_tier_2_eur?: string | number | null;
|
|
23
27
|
}
|
|
24
28
|
export interface ChargingRate {
|
|
25
29
|
rate: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pricebooks.types.d.ts","sourceRoot":"","sources":["../../src/types/pricebooks.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"pricebooks.types.d.ts","sourceRoot":"","sources":["../../src/types/pricebooks.types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,EAAE,IAAI,GAAG,MAAM,CAAC;IAC1B,QAAQ,EAAE,IAAI,GAAG,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,WAAW,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC1C;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mxpicture/tesla-superchargers-api",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.38",
|
|
4
4
|
"description": "Fetch + store Tesla Supercharger locations and pricing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "MXPicture",
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"access": "public"
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@mxpicture/tesla-superchargers-
|
|
48
|
-
"@mxpicture/tesla-superchargers-
|
|
49
|
-
"@mxpicture/tesla-superchargers-
|
|
47
|
+
"@mxpicture/tesla-superchargers-cloud-store": "^0.1.38",
|
|
48
|
+
"@mxpicture/tesla-superchargers-generated": "^0.1.38",
|
|
49
|
+
"@mxpicture/tesla-superchargers-mate": "^0.1.38",
|
|
50
50
|
"csv-parse": "^7.0.1",
|
|
51
51
|
"json5": "^2.2.3",
|
|
52
52
|
"zod": "^4.4.3"
|
package/dist/api/FxRatesApi.d.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { IApi } from "./IApi.js";
|
|
2
|
-
import type { FxSyncSummary } from "../types/fx.types.js";
|
|
3
|
-
import type { FxRateRow } from "@mxpicture/tesla-superchargers-mate/types";
|
|
4
|
-
export declare class FxRatesApi extends IApi {
|
|
5
|
-
/**
|
|
6
|
-
* Every quote currency the feed publishes for one date, as storable rows.
|
|
7
|
-
* `quote_currency` is uppercase throughout the schema, so the feed's
|
|
8
|
-
* lowercase keys are normalized here — a lowercase row would never be found
|
|
9
|
-
* by {@link fxToEur}, which looks up the uppercased code.
|
|
10
|
-
*/
|
|
11
|
-
syncDate(rateDate: string): Promise<FxRateRow[]>;
|
|
12
|
-
/**
|
|
13
|
-
* Fill the window's missing rates and prune what fell out of it. A date the
|
|
14
|
-
* feed has not published yet is reported in `missingDates` and retried by
|
|
15
|
-
* the next run, never a failure.
|
|
16
|
-
*
|
|
17
|
-
* A date counts as covered only when every currency pricing can ask for is
|
|
18
|
-
* present — the ones `pic_pricebooks` uses, plus the base currency. Coverage
|
|
19
|
-
* cannot be judged per date alone: `fxToEur`'s lazy fallback stores a single
|
|
20
|
-
* currency, and that one row would otherwise mark the whole date done and
|
|
21
|
-
* keep the sync from ever filling the rest of it.
|
|
22
|
-
*
|
|
23
|
-
* A pricebook currency the feed does not publish can never become covered,
|
|
24
|
-
* so it is reported in `unknownCurrencies` and dropped from the needed set
|
|
25
|
-
* for the rest of the run — otherwise it would re-fetch the whole window on
|
|
26
|
-
* every run. The cost of one is a single request per run instead of none.
|
|
27
|
-
*/
|
|
28
|
-
sync(): Promise<FxSyncSummary>;
|
|
29
|
-
}
|
|
30
|
-
export declare const fxRatesApi: () => FxRatesApi;
|
|
31
|
-
//# sourceMappingURL=FxRatesApi.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FxRatesApi.d.ts","sourceRoot":"","sources":["../../src/api/FxRatesApi.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAQjC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2CAA2C,CAAC;AAY3E,qBAAa,UAAW,SAAQ,IAAI;IAClC;;;;;OAKG;IACU,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAkB7D;;;;;;;;;;;;;;;OAeG;IACU,IAAI,IAAI,OAAO,CAAC,aAAa,CAAC;CAkD5C;AAGD,eAAO,MAAM,UAAU,kBAAoC,CAAC"}
|
package/dist/api/FxRatesApi.js
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Daily FX rate sync: the primary filler of `pic_fx_rates`. One request per
|
|
3
|
-
* UTC date against the base-EUR feed covers every currency the price history
|
|
4
|
-
* uses, so a window of `FX_SYNC_DAYS` days costs at most that many requests —
|
|
5
|
-
* and none at all once the window is fully cached. `fxToEur` keeps its lazy
|
|
6
|
-
* per-charge fetch as the fallback for what the window does not cover.
|
|
7
|
-
*/
|
|
8
|
-
import { picFxRatesStore, picPricebooksStore, } from "@mxpicture/tesla-superchargers-mate/store";
|
|
9
|
-
import { IApi } from "./IApi.js";
|
|
10
|
-
import { BASE_CURRENCY, FX_SYNC_DAYS, fetchEurRates, rateToEur, toRateDate, } from "../common/fx.common.js";
|
|
11
|
-
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
12
|
-
/** The last `days` UTC calendar days as `YYYY-MM-DD`, oldest first, today last. */
|
|
13
|
-
const utcDates = (days) => {
|
|
14
|
-
const today = Date.now();
|
|
15
|
-
return Array.from({ length: days }, (_, i) => toRateDate(new Date(today - (days - 1 - i) * DAY_MS)));
|
|
16
|
-
};
|
|
17
|
-
export class FxRatesApi extends IApi {
|
|
18
|
-
/**
|
|
19
|
-
* Every quote currency the feed publishes for one date, as storable rows.
|
|
20
|
-
* `quote_currency` is uppercase throughout the schema, so the feed's
|
|
21
|
-
* lowercase keys are normalized here — a lowercase row would never be found
|
|
22
|
-
* by {@link fxToEur}, which looks up the uppercased code.
|
|
23
|
-
*/
|
|
24
|
-
async syncDate(rateDate) {
|
|
25
|
-
const rows = [];
|
|
26
|
-
const rates = await fetchEurRates(rateDate);
|
|
27
|
-
if (!rates)
|
|
28
|
-
return rows;
|
|
29
|
-
for (const [quoteCurrency, quotePerEur] of Object.entries(rates)) {
|
|
30
|
-
const rate = rateToEur(quotePerEur);
|
|
31
|
-
if (rate !== null)
|
|
32
|
-
rows.push({
|
|
33
|
-
rateDate,
|
|
34
|
-
quoteCurrency: quoteCurrency.toUpperCase(),
|
|
35
|
-
rateToEur: String(rate),
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
return rows;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Fill the window's missing rates and prune what fell out of it. A date the
|
|
42
|
-
* feed has not published yet is reported in `missingDates` and retried by
|
|
43
|
-
* the next run, never a failure.
|
|
44
|
-
*
|
|
45
|
-
* A date counts as covered only when every currency pricing can ask for is
|
|
46
|
-
* present — the ones `pic_pricebooks` uses, plus the base currency. Coverage
|
|
47
|
-
* cannot be judged per date alone: `fxToEur`'s lazy fallback stores a single
|
|
48
|
-
* currency, and that one row would otherwise mark the whole date done and
|
|
49
|
-
* keep the sync from ever filling the rest of it.
|
|
50
|
-
*
|
|
51
|
-
* A pricebook currency the feed does not publish can never become covered,
|
|
52
|
-
* so it is reported in `unknownCurrencies` and dropped from the needed set
|
|
53
|
-
* for the rest of the run — otherwise it would re-fetch the whole window on
|
|
54
|
-
* every run. The cost of one is a single request per run instead of none.
|
|
55
|
-
*/
|
|
56
|
-
async sync() {
|
|
57
|
-
let needed = [
|
|
58
|
-
BASE_CURRENCY,
|
|
59
|
-
...(await picPricebooksStore().getDistinctCurrencies()).filter((c) => c !== BASE_CURRENCY),
|
|
60
|
-
];
|
|
61
|
-
const dates = utcDates(FX_SYNC_DAYS);
|
|
62
|
-
const fromDate = dates[0];
|
|
63
|
-
const fetchedDates = [];
|
|
64
|
-
const missingDates = [];
|
|
65
|
-
const unknownCurrencies = new Set();
|
|
66
|
-
const rows = [];
|
|
67
|
-
const coverage = new Set((await picFxRatesStore().getCoverage(fromDate)).map((row) => `${toRateDate(row.rate_date)} ${row.quote_currency.toUpperCase()}`));
|
|
68
|
-
for (const rateDate of dates) {
|
|
69
|
-
if (needed.every((c) => coverage.has(`${rateDate} ${c}`)))
|
|
70
|
-
continue;
|
|
71
|
-
const dateRows = await this.syncDate(rateDate);
|
|
72
|
-
if (!dateRows.length) {
|
|
73
|
-
missingDates.push(rateDate);
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
const published = new Set(dateRows.map((row) => row.quoteCurrency));
|
|
77
|
-
const unknown = needed.filter((c) => !published.has(c));
|
|
78
|
-
for (const currency of unknown)
|
|
79
|
-
unknownCurrencies.add(currency);
|
|
80
|
-
needed = needed.filter((c) => published.has(c));
|
|
81
|
-
fetchedDates.push(rateDate);
|
|
82
|
-
rows.push(...dateRows);
|
|
83
|
-
}
|
|
84
|
-
return {
|
|
85
|
-
days: FX_SYNC_DAYS,
|
|
86
|
-
fromDate,
|
|
87
|
-
fetchedDates,
|
|
88
|
-
missingDates,
|
|
89
|
-
unknownCurrencies: [...unknownCurrencies],
|
|
90
|
-
inserted: await picFxRatesStore().putRates(rows),
|
|
91
|
-
deleted: await picFxRatesStore().deleteStale(fromDate),
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
let _api = null;
|
|
96
|
-
export const fxRatesApi = () => (_api ??= new FxRatesApi());
|
|
97
|
-
//# sourceMappingURL=FxRatesApi.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"FxRatesApi.js","sourceRoot":"","sources":["../../src/api/FxRatesApi.ts"],"names":[],"mappings":"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"}
|