@mxpicture/tesla-superchargers-mate 0.1.1
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/client/TeslaClient.d.ts +49 -0
- package/dist/client/TeslaClient.d.ts.map +1 -0
- package/dist/client/TeslaClient.js +81 -0
- package/dist/client/TeslaClient.js.map +1 -0
- package/dist/client/chargers.clients.d.ts +188 -0
- package/dist/client/chargers.clients.d.ts.map +1 -0
- package/dist/client/chargers.clients.js +114 -0
- package/dist/client/chargers.clients.js.map +1 -0
- package/dist/client/common.clients.d.ts +34 -0
- package/dist/client/common.clients.d.ts.map +1 -0
- package/dist/client/common.clients.js +129 -0
- package/dist/client/common.clients.js.map +1 -0
- package/dist/client/index.d.ts +5 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +6 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/slugs.clients.d.ts +48 -0
- package/dist/client/slugs.clients.d.ts.map +1 -0
- package/dist/client/slugs.clients.js +57 -0
- package/dist/client/slugs.clients.js.map +1 -0
- package/dist/common/coordinates.d.ts +31 -0
- package/dist/common/coordinates.d.ts.map +1 -0
- package/dist/common/coordinates.js +44 -0
- package/dist/common/coordinates.js.map +1 -0
- package/dist/common/index.d.ts +2 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +3 -0
- package/dist/common/index.js.map +1 -0
- package/dist/store/ChargingProcessesStore.d.ts +34 -0
- package/dist/store/ChargingProcessesStore.d.ts.map +1 -0
- package/dist/store/ChargingProcessesStore.js +90 -0
- package/dist/store/ChargingProcessesStore.js.map +1 -0
- package/dist/store/GeofencesStore.d.ts +20 -0
- package/dist/store/GeofencesStore.d.ts.map +1 -0
- package/dist/store/GeofencesStore.js +28 -0
- package/dist/store/GeofencesStore.js.map +1 -0
- package/dist/store/IFailableStore.d.ts +29 -0
- package/dist/store/IFailableStore.d.ts.map +1 -0
- package/dist/store/IFailableStore.js +47 -0
- package/dist/store/IFailableStore.js.map +1 -0
- package/dist/store/IMateStore.d.ts +66 -0
- package/dist/store/IMateStore.d.ts.map +1 -0
- package/dist/store/IMateStore.js +132 -0
- package/dist/store/IMateStore.js.map +1 -0
- package/dist/store/PicChargersStore.d.ts +17 -0
- package/dist/store/PicChargersStore.d.ts.map +1 -0
- package/dist/store/PicChargersStore.js +34 -0
- package/dist/store/PicChargersStore.js.map +1 -0
- package/dist/store/PicPricebooksStore.d.ts +27 -0
- package/dist/store/PicPricebooksStore.d.ts.map +1 -0
- package/dist/store/PicPricebooksStore.js +57 -0
- package/dist/store/PicPricebooksStore.js.map +1 -0
- package/dist/store/PicSlugsStore.d.ts +18 -0
- package/dist/store/PicSlugsStore.d.ts.map +1 -0
- package/dist/store/PicSlugsStore.js +34 -0
- package/dist/store/PicSlugsStore.js.map +1 -0
- package/dist/store/db.d.ts +15 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +26 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/index.d.ts +10 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +11 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/statements.d.ts +14 -0
- package/dist/store/statements.d.ts.map +1 -0
- package/dist/store/statements.js +30 -0
- package/dist/store/statements.js.map +1 -0
- package/dist/transform/chargers.transform.d.ts +9 -0
- package/dist/transform/chargers.transform.d.ts.map +1 -0
- package/dist/transform/chargers.transform.js +42 -0
- package/dist/transform/chargers.transform.js.map +1 -0
- package/dist/transform/common.transform.d.ts +19 -0
- package/dist/transform/common.transform.d.ts.map +1 -0
- package/dist/transform/common.transform.js +72 -0
- package/dist/transform/common.transform.js.map +1 -0
- package/dist/transform/index.d.ts +5 -0
- package/dist/transform/index.d.ts.map +1 -0
- package/dist/transform/index.js +6 -0
- package/dist/transform/index.js.map +1 -0
- package/dist/transform/pricebooks.transform.d.ts +9 -0
- package/dist/transform/pricebooks.transform.d.ts.map +1 -0
- package/dist/transform/pricebooks.transform.js +24 -0
- package/dist/transform/pricebooks.transform.js.map +1 -0
- package/dist/transform/slugs.transform.d.ts +9 -0
- package/dist/transform/slugs.transform.d.ts.map +1 -0
- package/dist/transform/slugs.transform.js +29 -0
- package/dist/transform/slugs.transform.js.map +1 -0
- package/dist/types/charger.types.d.ts +5 -0
- package/dist/types/charger.types.d.ts.map +1 -0
- package/dist/types/charger.types.js +2 -0
- package/dist/types/charger.types.js.map +1 -0
- package/dist/types/chargingProcess.types.d.ts +21 -0
- package/dist/types/chargingProcess.types.d.ts.map +1 -0
- package/dist/types/chargingProcess.types.js +2 -0
- package/dist/types/chargingProcess.types.js.map +1 -0
- package/dist/types/client.types.d.ts +14 -0
- package/dist/types/client.types.d.ts.map +1 -0
- package/dist/types/client.types.js +2 -0
- package/dist/types/client.types.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/slug.types.d.ts +5 -0
- package/dist/types/slug.types.d.ts.map +1 -0
- package/dist/types/slug.types.js +2 -0
- package/dist/types/slug.types.js.map +1 -0
- package/package.json +61 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { sql } from "./db.js";
|
|
2
|
+
/** Rows per statement; keeps row-count × column-count under the 65535-parameter limit. */
|
|
3
|
+
const CHUNK_SIZE = 1000;
|
|
4
|
+
const chunked = (rows, size) => {
|
|
5
|
+
const result = [];
|
|
6
|
+
for (let i = 0; i < rows.length; i += size)
|
|
7
|
+
result.push(rows.slice(i, i + size));
|
|
8
|
+
return result;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Run `fn` inside one transaction, serialized per `lockKey` via a Postgres
|
|
12
|
+
* advisory lock — concurrent runs on the same key wait instead of interleaving.
|
|
13
|
+
*/
|
|
14
|
+
export const transaction = async (lockKey, fn) => (await sql().begin(async (tx) => {
|
|
15
|
+
await tx `SELECT pg_advisory_xact_lock(hashtext(${lockKey}))`;
|
|
16
|
+
return await fn(tx);
|
|
17
|
+
}));
|
|
18
|
+
export class IMateStore {
|
|
19
|
+
table;
|
|
20
|
+
initializer;
|
|
21
|
+
mutator;
|
|
22
|
+
view;
|
|
23
|
+
constructor(table, initializer, mutator, view = null) {
|
|
24
|
+
this.table = table;
|
|
25
|
+
this.initializer = initializer;
|
|
26
|
+
this.mutator = mutator;
|
|
27
|
+
this.view = view;
|
|
28
|
+
}
|
|
29
|
+
async createTable(tx = sql()) {
|
|
30
|
+
void tx;
|
|
31
|
+
throw new Error(`create table for "${this.table}" not implemented`);
|
|
32
|
+
}
|
|
33
|
+
async get(id, tx = sql()) {
|
|
34
|
+
const rows = await tx `SELECT * FROM ${tx(this.view ?? this.table)} WHERE id = ${id}`;
|
|
35
|
+
return rows[0] ?? null;
|
|
36
|
+
}
|
|
37
|
+
async query(filters, tx = sql()) {
|
|
38
|
+
const where = () => filters
|
|
39
|
+
? tx ` WHERE ${Object.entries(filters).map(([column, filter], i) => tx `${i ? tx `AND ` : tx ``} ${tx(column)} = ${filter}`)}`
|
|
40
|
+
: tx ``;
|
|
41
|
+
return await tx `SELECT * FROM ${tx(this.view ?? this.table)}${where()}`;
|
|
42
|
+
}
|
|
43
|
+
async delete(id, tx = sql()) {
|
|
44
|
+
await tx `DELETE FROM ${tx(this.table)} WHERE id = ${id}`;
|
|
45
|
+
}
|
|
46
|
+
async deleteAll(tx = sql()) {
|
|
47
|
+
await tx `DELETE FROM ${tx(this.table)}`;
|
|
48
|
+
}
|
|
49
|
+
async insert(data, tx = sql()) {
|
|
50
|
+
const parsed = this.initializer.parse(data);
|
|
51
|
+
const rows = await tx `INSERT INTO ${tx(this.table)} ${tx(parsed)} RETURNING *`;
|
|
52
|
+
return rows[0];
|
|
53
|
+
}
|
|
54
|
+
async insertMany(data, tx = sql()) {
|
|
55
|
+
const parsed = data.map((row) => this.initializer.parse(row));
|
|
56
|
+
let count = 0;
|
|
57
|
+
for (const chunk of chunked(parsed, CHUNK_SIZE)) {
|
|
58
|
+
const result = await tx `INSERT INTO ${tx(this.table)} ${tx(chunk)}`;
|
|
59
|
+
count += result.count;
|
|
60
|
+
}
|
|
61
|
+
return count;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Single-row `INSERT … ON CONFLICT (conflictColumn) DO UPDATE … RETURNING *`.
|
|
65
|
+
* Unlike `upsertMany` the update is unconditional, so the meta columns
|
|
66
|
+
* (`fetched_at`, `last_fetch_uuid`) advance even when the content is
|
|
67
|
+
* unchanged — callers rely on that for staleness tracking.
|
|
68
|
+
*/
|
|
69
|
+
async upsertOne(data, opts, tx = sql()) {
|
|
70
|
+
const parsed = this.initializer.parse(data);
|
|
71
|
+
const setList = opts.updateColumns
|
|
72
|
+
.map((c) => tx `${tx(c)} = EXCLUDED.${tx(c)}`)
|
|
73
|
+
.reduce((acc, fragment) => tx `${acc}, ${fragment}`);
|
|
74
|
+
const rows = await tx `INSERT INTO ${tx(this.table)} ${tx(parsed)}
|
|
75
|
+
ON CONFLICT (${tx(opts.conflictColumn)}) DO UPDATE SET ${setList}
|
|
76
|
+
RETURNING *`;
|
|
77
|
+
return rows[0];
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Chunked `INSERT … ON CONFLICT (conflictColumn) DO UPDATE`. A conflicting
|
|
81
|
+
* row is only written when its `compareColumns` differ by value
|
|
82
|
+
* (`IS DISTINCT FROM`) from the incoming row; untouched rows are not part
|
|
83
|
+
* of the returned count.
|
|
84
|
+
*/
|
|
85
|
+
async upsertMany(data, opts, tx = sql()) {
|
|
86
|
+
if (data.length === 0)
|
|
87
|
+
return 0;
|
|
88
|
+
const parsed = data.map((row) => this.initializer.parse(row));
|
|
89
|
+
const joinComma = (fragments) => fragments.reduce((acc, fragment) => tx `${acc}, ${fragment}`);
|
|
90
|
+
const setList = joinComma(opts.updateColumns.map((c) => tx `${tx(c)} = EXCLUDED.${tx(c)}`));
|
|
91
|
+
// no table alias: postgres.js infers the row helper's builder from the
|
|
92
|
+
// keyword right before it, and "AS t" would make it build SELECT columns
|
|
93
|
+
const targetTuple = joinComma(opts.compareColumns.map((c) => tx `${tx(this.table)}.${tx(c)}`));
|
|
94
|
+
const excludedTuple = joinComma(opts.compareColumns.map((c) => tx `EXCLUDED.${tx(c)}`));
|
|
95
|
+
let count = 0;
|
|
96
|
+
for (const chunk of chunked(parsed, CHUNK_SIZE)) {
|
|
97
|
+
const result = await tx `INSERT INTO ${tx(this.table)} ${tx(chunk)}
|
|
98
|
+
ON CONFLICT (${tx(opts.conflictColumn)}) DO UPDATE SET ${setList}
|
|
99
|
+
WHERE (${targetTuple}) IS DISTINCT FROM (${excludedTuple})`;
|
|
100
|
+
count += result.count;
|
|
101
|
+
}
|
|
102
|
+
return count;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Soft-delete every not-yet-deleted row whose id is NOT in `ids` — i.e. the
|
|
106
|
+
* rows absent from the current snapshot. Assumes the table's meta columns
|
|
107
|
+
* (`deleted_at`, `fetched_at`, `last_fetch_uuid`) and a bigint/int identity id.
|
|
108
|
+
*/
|
|
109
|
+
async softDeleteWhereIdNotIn(ids, meta, tx = sql()) {
|
|
110
|
+
const result = await tx `UPDATE ${tx(this.table)} SET
|
|
111
|
+
deleted_at = ${meta.fetched_at},
|
|
112
|
+
fetched_at = ${meta.fetched_at},
|
|
113
|
+
last_fetch_uuid = ${meta.last_fetch_uuid}
|
|
114
|
+
WHERE deleted_at IS NULL AND NOT (id = ANY(${ids}::bigint[]))`;
|
|
115
|
+
return result.count;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Hard-delete every row whose id is NOT in `ids` — for tables that mirror
|
|
119
|
+
* their feed instead of soft-deleting absent rows.
|
|
120
|
+
*/
|
|
121
|
+
async deleteWhereIdNotIn(ids, tx = sql()) {
|
|
122
|
+
const result = await tx `DELETE FROM ${tx(this.table)}
|
|
123
|
+
WHERE NOT (id = ANY(${ids}::bigint[]))`;
|
|
124
|
+
return result.count;
|
|
125
|
+
}
|
|
126
|
+
async update(id, data, tx = sql()) {
|
|
127
|
+
const parsed = this.mutator.parse(data);
|
|
128
|
+
const rows = await tx `UPDATE ${tx(this.table)} SET ${tx(parsed)} WHERE id = ${id} RETURNING *`;
|
|
129
|
+
return rows[0];
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=IMateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IMateStore.js","sourceRoot":"","sources":["../../src/store/IMateStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type PicChargersId, type PicChargers, type PicChargersInitializer, type PicChargersMutator, type PicSlugsId } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
|
+
import { type CoordinateAny } from "../common/coordinates.js";
|
|
3
|
+
import type { PicChargersDistance } from "../types/charger.types.js";
|
|
4
|
+
import { IFailableStore } from "./IFailableStore.js";
|
|
5
|
+
export declare class PicChargersStore extends IFailableStore<PicChargersId, PicChargers, PicChargersInitializer, PicChargersMutator> {
|
|
6
|
+
constructor();
|
|
7
|
+
protected parseFailure(failure_count: number): PicChargersMutator;
|
|
8
|
+
getBySlug(slugsId: PicSlugsId): Promise<PicChargers | null>;
|
|
9
|
+
/**
|
|
10
|
+
* The stored chargers near a coordinate (by centroid), nearest first.
|
|
11
|
+
* Queries the table, not the view, on purpose: a soft-deleted charger's
|
|
12
|
+
* pricebook history is still valid for past dates.
|
|
13
|
+
*/
|
|
14
|
+
findByCoordinate(item: CoordinateAny): Promise<PicChargersDistance[]>;
|
|
15
|
+
}
|
|
16
|
+
export declare const picChargersStore: () => PicChargersStore;
|
|
17
|
+
//# sourceMappingURL=PicChargersStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PicChargersStore.d.ts","sourceRoot":"","sources":["../../src/store/PicChargersStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,WAAW,EAChB,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAGhB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,gBAAiB,SAAQ,cAAc,CAClD,aAAa,EACb,WAAW,EACX,sBAAsB,EACtB,kBAAkB,CACnB;;cAUoB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,kBAAkB;IAI7D,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAOxE;;;;OAIG;IACU,gBAAgB,CAC3B,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,mBAAmB,EAAE,CAAC;CASlC;AAGD,eAAO,MAAM,gBAAgB,wBAA4C,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { picChargersInitializer, picChargersMutator, } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
|
+
import { sql } from "./db.js";
|
|
3
|
+
import { COVERED_RADIUS_KM, COVERED_MARGIN, } from "../common/coordinates.js";
|
|
4
|
+
import { queryRadius } from "./statements.js";
|
|
5
|
+
import { IFailableStore } from "./IFailableStore.js";
|
|
6
|
+
export class PicChargersStore extends IFailableStore {
|
|
7
|
+
constructor() {
|
|
8
|
+
super("pic_chargers", picChargersInitializer, picChargersMutator, "pic_chargers_v");
|
|
9
|
+
}
|
|
10
|
+
parseFailure(failure_count) {
|
|
11
|
+
return { failure_count };
|
|
12
|
+
}
|
|
13
|
+
async getBySlug(slugsId) {
|
|
14
|
+
const rows = await sql() `SELECT * FROM ${sql()(this.view ?? this.table)} WHERE pic_slugs_id = ${slugsId}`;
|
|
15
|
+
return rows[0] ?? null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The stored chargers near a coordinate (by centroid), nearest first.
|
|
19
|
+
* Queries the table, not the view, on purpose: a soft-deleted charger's
|
|
20
|
+
* pricebook history is still valid for past dates.
|
|
21
|
+
*/
|
|
22
|
+
async findByCoordinate(item) {
|
|
23
|
+
return await queryRadius({
|
|
24
|
+
item,
|
|
25
|
+
radiusKm: COVERED_RADIUS_KM * COVERED_MARGIN,
|
|
26
|
+
tableName: this.table,
|
|
27
|
+
latitudeName: "centroid_latitude",
|
|
28
|
+
longitudeName: "centroid_longitude",
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
let _store = null;
|
|
33
|
+
export const picChargersStore = () => (_store ??= new PicChargersStore());
|
|
34
|
+
//# sourceMappingURL=PicChargersStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PicChargersStore.js","sourceRoot":"","sources":["../../src/store/PicChargersStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,sBAAsB,EACtB,kBAAkB,GACnB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,cAAc,GAEf,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,OAAO,gBAAiB,SAAQ,cAKrC;IACC;QACE,KAAK,CACH,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAClB,gBAAgB,CACjB,CAAC;IACJ,CAAC;IAEkB,YAAY,CAAC,aAAqB;QACnD,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3B,CAAC;IAEM,KAAK,CAAC,SAAS,CAAC,OAAmB;QACxC,MAAM,IAAI,GAAG,MAAM,GAAG,EAAE,CAEvB,iBAAiB,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,yBAAyB,OAAO,EAAE,CAAC;QACnF,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,gBAAgB,CAC3B,IAAmB;QAEnB,OAAO,MAAM,WAAW,CAAC;YACvB,IAAI;YACJ,QAAQ,EAAE,iBAAiB,GAAG,cAAc;YAC5C,SAAS,EAAE,IAAI,CAAC,KAAK;YACrB,YAAY,EAAE,mBAAmB;YACjC,aAAa,EAAE,oBAAoB;SACpC,CAAC,CAAC;IACL,CAAC;CACF;AAED,IAAI,MAAM,GAA4B,IAAI,CAAC;AAC3C,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,gBAAgB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type PicPricebooksId, type PicPricebooks, type PicPricebooksInitializer, type PicPricebooksMutator, type PicChargersId } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
|
+
import { IMateStore } from "./IMateStore.js";
|
|
3
|
+
import { type SqlTx } from "./db.js";
|
|
4
|
+
/**
|
|
5
|
+
* Pricebooks are a history: one snapshot ("group") = all rows sharing
|
|
6
|
+
* `(pic_chargers_id, last_fetch_uuid)`. `fetched_at` is the group's creation
|
|
7
|
+
* time and never changes; an unchanged re-fetch only bumps `last_fetch_uuid`.
|
|
8
|
+
* The current group is the one with the max `fetched_at` — do NOT resolve it
|
|
9
|
+
* via `pic_chargers.last_fetch_uuid` (the full-feed sync bumps that without
|
|
10
|
+
* touching pricebooks).
|
|
11
|
+
*/
|
|
12
|
+
export declare class PicPricebooksStore extends IMateStore<PicPricebooksId, PicPricebooks, PicPricebooksInitializer, PicPricebooksMutator> {
|
|
13
|
+
constructor();
|
|
14
|
+
/** The charger's newest group; empty array when it has no pricebooks yet. */
|
|
15
|
+
getCurrentGroup(chargersId: PicChargersId, tx?: SqlTx): Promise<PicPricebooks[]>;
|
|
16
|
+
/** Confirm an unchanged group: move it to the fetch's new uuid. */
|
|
17
|
+
updateGroupFetchUuid(chargersId: PicChargersId, fromUuid: string, toUuid: string, tx?: SqlTx): Promise<number>;
|
|
18
|
+
/** The charger's oldest group; empty array when it has no pricebooks yet. */
|
|
19
|
+
getEarliestGroup(chargersId: PicChargersId, tx?: SqlTx): Promise<PicPricebooks[]>;
|
|
20
|
+
/**
|
|
21
|
+
* The group valid at `at`: the one with the max `fetched_at <= at`.
|
|
22
|
+
* Empty array when `at` predates the first group (prices unknown).
|
|
23
|
+
*/
|
|
24
|
+
getGroupAt(chargersId: PicChargersId, at: Date, tx?: SqlTx): Promise<PicPricebooks[]>;
|
|
25
|
+
}
|
|
26
|
+
export declare const picPricebooksStore: () => PicPricebooksStore;
|
|
27
|
+
//# sourceMappingURL=PicPricebooksStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PicPricebooksStore.d.ts","sourceRoot":"","sources":["../../src/store/PicPricebooksStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,aAAa,EAGnB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAO,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;GAOG;AACH,qBAAa,kBAAmB,SAAQ,UAAU,CAChD,eAAe,EACf,aAAa,EACb,wBAAwB,EACxB,oBAAoB,CACrB;;IAKC,6EAA6E;IAChE,eAAe,CAC1B,UAAU,EAAE,aAAa,EACzB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC;IAS3B,mEAAmE;IACtD,oBAAoB,CAC/B,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,MAAM,CAAC;IAQlB,6EAA6E;IAChE,gBAAgB,CAC3B,UAAU,EAAE,aAAa,EACzB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC;IAS3B;;;OAGG;IACU,UAAU,CACrB,UAAU,EAAE,aAAa,EACzB,EAAE,EAAE,IAAI,EACR,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC;CAQ5B;AAGD,eAAO,MAAM,kBAAkB,0BAA8C,CAAC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { picPricebooksInitializer, picPricebooksMutator, } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
|
+
import { IMateStore } from "./IMateStore.js";
|
|
3
|
+
import { sql } from "./db.js";
|
|
4
|
+
/**
|
|
5
|
+
* Pricebooks are a history: one snapshot ("group") = all rows sharing
|
|
6
|
+
* `(pic_chargers_id, last_fetch_uuid)`. `fetched_at` is the group's creation
|
|
7
|
+
* time and never changes; an unchanged re-fetch only bumps `last_fetch_uuid`.
|
|
8
|
+
* The current group is the one with the max `fetched_at` — do NOT resolve it
|
|
9
|
+
* via `pic_chargers.last_fetch_uuid` (the full-feed sync bumps that without
|
|
10
|
+
* touching pricebooks).
|
|
11
|
+
*/
|
|
12
|
+
export class PicPricebooksStore extends IMateStore {
|
|
13
|
+
constructor() {
|
|
14
|
+
super("pic_pricebooks", picPricebooksInitializer, picPricebooksMutator);
|
|
15
|
+
}
|
|
16
|
+
/** The charger's newest group; empty array when it has no pricebooks yet. */
|
|
17
|
+
async getCurrentGroup(chargersId, tx = sql()) {
|
|
18
|
+
return await tx `
|
|
19
|
+
SELECT * FROM ${tx(this.table)}
|
|
20
|
+
WHERE pic_chargers_id = ${chargersId}
|
|
21
|
+
AND fetched_at = (
|
|
22
|
+
SELECT max(fetched_at) FROM ${tx(this.table)}
|
|
23
|
+
WHERE pic_chargers_id = ${chargersId})`;
|
|
24
|
+
}
|
|
25
|
+
/** Confirm an unchanged group: move it to the fetch's new uuid. */
|
|
26
|
+
async updateGroupFetchUuid(chargersId, fromUuid, toUuid, tx = sql()) {
|
|
27
|
+
const result = await tx `UPDATE ${tx(this.table)}
|
|
28
|
+
SET last_fetch_uuid = ${toUuid}
|
|
29
|
+
WHERE pic_chargers_id = ${chargersId}
|
|
30
|
+
AND last_fetch_uuid = ${fromUuid}`;
|
|
31
|
+
return result.count;
|
|
32
|
+
}
|
|
33
|
+
/** The charger's oldest group; empty array when it has no pricebooks yet. */
|
|
34
|
+
async getEarliestGroup(chargersId, tx = sql()) {
|
|
35
|
+
return await tx `
|
|
36
|
+
SELECT * FROM ${tx(this.table)}
|
|
37
|
+
WHERE pic_chargers_id = ${chargersId}
|
|
38
|
+
AND fetched_at = (
|
|
39
|
+
SELECT min(fetched_at) FROM ${tx(this.table)}
|
|
40
|
+
WHERE pic_chargers_id = ${chargersId})`;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The group valid at `at`: the one with the max `fetched_at <= at`.
|
|
44
|
+
* Empty array when `at` predates the first group (prices unknown).
|
|
45
|
+
*/
|
|
46
|
+
async getGroupAt(chargersId, at, tx = sql()) {
|
|
47
|
+
return await tx `
|
|
48
|
+
SELECT * FROM ${tx(this.table)}
|
|
49
|
+
WHERE pic_chargers_id = ${chargersId}
|
|
50
|
+
AND fetched_at = (
|
|
51
|
+
SELECT max(fetched_at) FROM ${tx(this.table)}
|
|
52
|
+
WHERE pic_chargers_id = ${chargersId} AND fetched_at <= ${at})`;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
let _store = null;
|
|
56
|
+
export const picPricebooksStore = () => (_store ??= new PicPricebooksStore());
|
|
57
|
+
//# sourceMappingURL=PicPricebooksStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PicPricebooksStore.js","sourceRoot":"","sources":["../../src/store/PicPricebooksStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAML,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,GAAG,EAAc,MAAM,SAAS,CAAC;AAE1C;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAmB,SAAQ,UAKvC;IACC;QACE,KAAK,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,oBAAoB,CAAC,CAAC;IAC1E,CAAC;IAED,6EAA6E;IACtE,KAAK,CAAC,eAAe,CAC1B,UAAyB,EACzB,KAAY,GAAG,EAAE;QAEjB,OAAO,MAAM,EAAE,CAAiB;sBACd,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;kCACF,UAAU;;0CAEF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;wCAChB,UAAU,GAAG,CAAC;IACpD,CAAC;IAED,mEAAmE;IAC5D,KAAK,CAAC,oBAAoB,CAC/B,UAAyB,EACzB,QAAgB,EAChB,MAAc,EACd,KAAY,GAAG,EAAE;QAEjB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAA,UAAU,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;8BACrB,MAAM;gCACJ,UAAU;gCACV,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAED,6EAA6E;IACtE,KAAK,CAAC,gBAAgB,CAC3B,UAAyB,EACzB,KAAY,GAAG,EAAE;QAEjB,OAAO,MAAM,EAAE,CAAiB;sBACd,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;kCACF,UAAU;;0CAEF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;wCAChB,UAAU,GAAG,CAAC;IACpD,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,UAAU,CACrB,UAAyB,EACzB,EAAQ,EACR,KAAY,GAAG,EAAE;QAEjB,OAAO,MAAM,EAAE,CAAiB;sBACd,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;kCACF,UAAU;;0CAEF,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;wCAChB,UAAU,sBAAsB,EAAE,GAAG,CAAC;IAC5E,CAAC;CACF;AAED,IAAI,MAAM,GAA8B,IAAI,CAAC;AAC7C,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,kBAAkB,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type PicSlugsId, type PicSlugs, type PicSlugsInitializer, type PicSlugsMutator } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
|
+
import { type CoordinateAny } from "../common/coordinates.js";
|
|
3
|
+
import type { PicSlugsDistance } from "../types/slug.types.js";
|
|
4
|
+
import { type SqlTx } from "./db.js";
|
|
5
|
+
import { IFailableStore } from "./IFailableStore.js";
|
|
6
|
+
export declare class PicSlugsStore extends IFailableStore<PicSlugsId, PicSlugs, PicSlugsInitializer, PicSlugsMutator> {
|
|
7
|
+
constructor();
|
|
8
|
+
protected parseFailure(failure_count: number): PicSlugsMutator;
|
|
9
|
+
/**
|
|
10
|
+
* The charger-typed slugs near a coordinate, nearest first: a cheap
|
|
11
|
+
* coordinate-box prefilter in SQL, then the exact `< COVERED_CHARGER_KM`
|
|
12
|
+
* distance check. Matches every {@link CHARGER_MAP_TYPES} entry — German
|
|
13
|
+
* Superchargers, for example, appear in the feed as `party`.
|
|
14
|
+
*/
|
|
15
|
+
findByCoordinate(item: CoordinateAny, tx?: SqlTx): Promise<PicSlugsDistance[]>;
|
|
16
|
+
}
|
|
17
|
+
export declare const picSlugsStore: () => PicSlugsStore;
|
|
18
|
+
//# sourceMappingURL=PicSlugsStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PicSlugsStore.d.ts","sourceRoot":"","sources":["../../src/store/PicSlugsStore.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,mBAAmB,EACxB,KAAK,eAAe,EAGrB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAO,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,aAAc,SAAQ,cAAc,CAC/C,UAAU,EACV,QAAQ,EACR,mBAAmB,EACnB,eAAe,CAChB;;cAKoB,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,eAAe;IAIvE;;;;;OAKG;IACU,gBAAgB,CAC3B,IAAI,EAAE,aAAa,EACnB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,gBAAgB,EAAE,CAAC;CAY/B;AAGD,eAAO,MAAM,aAAa,qBAAyC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { picSlugsInitializer, picSlugsMutator, } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
|
+
import { CHARGER_MAP_TYPES } from "../client/common.clients.js";
|
|
3
|
+
import { COVERED_MARGIN, COVERED_RADIUS_KM, } from "../common/coordinates.js";
|
|
4
|
+
import { queryRadius } from "./statements.js";
|
|
5
|
+
import { sql } from "./db.js";
|
|
6
|
+
import { IFailableStore } from "./IFailableStore.js";
|
|
7
|
+
export class PicSlugsStore extends IFailableStore {
|
|
8
|
+
constructor() {
|
|
9
|
+
super("pic_slugs", picSlugsInitializer, picSlugsMutator);
|
|
10
|
+
}
|
|
11
|
+
parseFailure(failure_count) {
|
|
12
|
+
return { failure_count };
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* The charger-typed slugs near a coordinate, nearest first: a cheap
|
|
16
|
+
* coordinate-box prefilter in SQL, then the exact `< COVERED_CHARGER_KM`
|
|
17
|
+
* distance check. Matches every {@link CHARGER_MAP_TYPES} entry — German
|
|
18
|
+
* Superchargers, for example, appear in the feed as `party`.
|
|
19
|
+
*/
|
|
20
|
+
async findByCoordinate(item, tx = sql()) {
|
|
21
|
+
return await queryRadius({
|
|
22
|
+
item,
|
|
23
|
+
radiusKm: COVERED_RADIUS_KM * COVERED_MARGIN,
|
|
24
|
+
tableName: this.table,
|
|
25
|
+
latitudeName: "latitude",
|
|
26
|
+
longitudeName: "longitude",
|
|
27
|
+
tx,
|
|
28
|
+
where: (tx) => tx `AND location_types && ${[...CHARGER_MAP_TYPES]}::text[]`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
let _store = null;
|
|
33
|
+
export const picSlugsStore = () => (_store ??= new PicSlugsStore());
|
|
34
|
+
//# sourceMappingURL=PicSlugsStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PicSlugsStore.js","sourceRoot":"","sources":["../../src/store/PicSlugsStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,mBAAmB,EACnB,eAAe,GAChB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACL,cAAc,EACd,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE9C,OAAO,EAAE,GAAG,EAAc,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,OAAO,aAAc,SAAQ,cAKlC;IACC;QACE,KAAK,CAAC,WAAW,EAAE,mBAAmB,EAAE,eAAe,CAAC,CAAC;IAC3D,CAAC;IAEkB,YAAY,CAAC,aAAqB;QACnD,OAAO,EAAE,aAAa,EAAE,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,gBAAgB,CAC3B,IAAmB,EACnB,KAAY,GAAG,EAAE;QAEjB,OAAO,MAAM,WAAW,CAAC;YACvB,IAAI;YACJ,QAAQ,EAAE,iBAAiB,GAAG,cAAc;YAC5C,SAAS,EAAE,IAAI,CAAC,KAAK;YACrB,YAAY,EAAE,UAAU;YACxB,aAAa,EAAE,WAAW;YAC1B,EAAE;YACF,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,CACZ,EAAE,CAAA,yBAAyB,CAAC,GAAG,iBAAiB,CAAC,UAAU;SAC9D,CAAC,CAAC;IACL,CAAC;CACF;AAED,IAAI,MAAM,GAAyB,IAAI,CAAC;AACxC,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import postgres from "postgres";
|
|
2
|
+
export type Sql = ReturnType<typeof postgres>;
|
|
3
|
+
/** Query interface common to the root `sql` and `sql.begin` transaction handles. */
|
|
4
|
+
export type SqlTx = postgres.ISql;
|
|
5
|
+
/**
|
|
6
|
+
* The shared pool, created lazily on first use so importing the store package
|
|
7
|
+
* has no side effects. Connection settings come from the standard `PG*`
|
|
8
|
+
* environment variables (`PGHOST`, `PGPORT`, `PGDATABASE`, `PGUSER`,
|
|
9
|
+
* `PGPASSWORD`) — the process environment is used as-is, nothing loads a
|
|
10
|
+
* `.env` file.
|
|
11
|
+
*/
|
|
12
|
+
export declare const sql: () => Sql;
|
|
13
|
+
/** Close the pool if it was ever created, so the process can exit promptly. */
|
|
14
|
+
export declare const endSql: () => Promise<void>;
|
|
15
|
+
//# sourceMappingURL=db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC;AAE9C,oFAAoF;AACpF,MAAM,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;AAIlC;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,QAAO,GAUlB,CAAC;AAEN,+EAA+E;AAC/E,eAAO,MAAM,MAAM,QAAa,OAAO,CAAC,IAAI,CAG3C,CAAC"}
|
package/dist/store/db.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import postgres from "postgres";
|
|
2
|
+
let _sql = null;
|
|
3
|
+
/**
|
|
4
|
+
* The shared pool, created lazily on first use so importing the store package
|
|
5
|
+
* has no side effects. Connection settings come from the standard `PG*`
|
|
6
|
+
* environment variables (`PGHOST`, `PGPORT`, `PGDATABASE`, `PGUSER`,
|
|
7
|
+
* `PGPASSWORD`) — the process environment is used as-is, nothing loads a
|
|
8
|
+
* `.env` file.
|
|
9
|
+
*/
|
|
10
|
+
export const sql = () => (_sql ??= postgres({
|
|
11
|
+
host: process.env.PGHOST,
|
|
12
|
+
port: Number(process.env.PGPORT) || 5432,
|
|
13
|
+
database: process.env.PGDATABASE,
|
|
14
|
+
username: process.env.PGUSER,
|
|
15
|
+
password: process.env.PGPASSWORD,
|
|
16
|
+
max: 10, // pool size
|
|
17
|
+
idle_timeout: 20,
|
|
18
|
+
connect_timeout: 10,
|
|
19
|
+
}));
|
|
20
|
+
/** Close the pool if it was ever created, so the process can exit promptly. */
|
|
21
|
+
export const endSql = async () => {
|
|
22
|
+
if (_sql)
|
|
23
|
+
await _sql.end();
|
|
24
|
+
_sql = null;
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAOhC,IAAI,IAAI,GAAe,IAAI,CAAC;AAE5B;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,GAAQ,EAAE,CAC3B,CAAC,IAAI,KAAK,QAAQ,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM;IACxB,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI;IACxC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;IAChC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM;IAC5B,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU;IAChC,GAAG,EAAE,EAAE,EAAE,YAAY;IACrB,YAAY,EAAE,EAAE;IAChB,eAAe,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAEN,+EAA+E;AAC/E,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;IAC9C,IAAI,IAAI;QAAE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC;IAC3B,IAAI,GAAG,IAAI,CAAC;AACd,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export * from "./ChargingProcessesStore.js";
|
|
2
|
+
export * from "./GeofencesStore.js";
|
|
3
|
+
export * from "./IFailableStore.js";
|
|
4
|
+
export * from "./IMateStore.js";
|
|
5
|
+
export * from "./PicChargersStore.js";
|
|
6
|
+
export * from "./PicPricebooksStore.js";
|
|
7
|
+
export * from "./PicSlugsStore.js";
|
|
8
|
+
export * from "./db.js";
|
|
9
|
+
export * from "./statements.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AACA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
// This file is auto-generated by build-cli. Do not edit manually.
|
|
2
|
+
export * from "./ChargingProcessesStore.js";
|
|
3
|
+
export * from "./GeofencesStore.js";
|
|
4
|
+
export * from "./IFailableStore.js";
|
|
5
|
+
export * from "./IMateStore.js";
|
|
6
|
+
export * from "./PicChargersStore.js";
|
|
7
|
+
export * from "./PicPricebooksStore.js";
|
|
8
|
+
export * from "./PicSlugsStore.js";
|
|
9
|
+
export * from "./db.js";
|
|
10
|
+
export * from "./statements.js";
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,cAAc,6BAA6B,CAAC;AAC5C,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { PendingQuery, Row } from "postgres";
|
|
2
|
+
import { type CoordinateAny } from "../common/coordinates.js";
|
|
3
|
+
import { type SqlTx } from "./db.js";
|
|
4
|
+
export declare const queryRadius: <T extends object>(p: {
|
|
5
|
+
item: CoordinateAny;
|
|
6
|
+
radiusKm: number;
|
|
7
|
+
tableName: string;
|
|
8
|
+
latitudeName: string;
|
|
9
|
+
longitudeName: string;
|
|
10
|
+
distanceName?: string | null;
|
|
11
|
+
where?: (tx: SqlTx) => PendingQuery<Row[]>;
|
|
12
|
+
tx?: SqlTx | null;
|
|
13
|
+
}) => Promise<T[]>;
|
|
14
|
+
//# sourceMappingURL=statements.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.d.ts","sourceRoot":"","sources":["../../src/store/statements.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAGL,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAO,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAE1C,eAAO,MAAM,WAAW,GAAU,CAAC,SAAS,MAAM,EAAE,GAAG;IACrD,IAAI,EAAE,aAAa,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,KAAK,KAAK,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC;CACnB,KAAG,OAAO,CAAC,CAAC,EAAE,CA6Bd,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { boundingBoxDeg, toCoordinate, } from "../common/coordinates.js";
|
|
2
|
+
import { sql } from "./db.js";
|
|
3
|
+
export const queryRadius = async (p) => {
|
|
4
|
+
const distanceName = p.distanceName ?? "distance_km";
|
|
5
|
+
const tx = p.tx ?? sql();
|
|
6
|
+
const coord = toCoordinate(p.item);
|
|
7
|
+
const { latDeg, lonDeg } = boundingBoxDeg(coord, p.radiusKm);
|
|
8
|
+
const latitude = () => tx(p.latitudeName);
|
|
9
|
+
const longitude = () => tx(p.longitudeName);
|
|
10
|
+
const table = () => tx(p.tableName);
|
|
11
|
+
const distance = () => tx(distanceName);
|
|
12
|
+
const where = () => (p.where ? p.where(tx) : tx ``);
|
|
13
|
+
return await sql() `
|
|
14
|
+
WITH boxed AS (
|
|
15
|
+
SELECT *,
|
|
16
|
+
2 * 6371 * asin(sqrt(
|
|
17
|
+
pow(sin(radians(${latitude()} - ${coord.latitude}) / 2), 2)
|
|
18
|
+
+ cos(radians(${coord.latitude})) * cos(radians(${latitude()}))
|
|
19
|
+
* pow(sin(radians(${longitude()} - ${coord.longitude}) / 2), 2)
|
|
20
|
+
)) AS ${distance()}
|
|
21
|
+
FROM ${table()}
|
|
22
|
+
WHERE ${latitude()} BETWEEN ${coord.latitude - latDeg} AND ${coord.latitude + latDeg}
|
|
23
|
+
AND ${longitude()} BETWEEN ${coord.longitude - lonDeg} AND ${coord.longitude + lonDeg}
|
|
24
|
+
)
|
|
25
|
+
SELECT *
|
|
26
|
+
FROM boxed
|
|
27
|
+
WHERE ${distance()} < ${p.radiusKm} ${where()}
|
|
28
|
+
ORDER BY ${distance()};`;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=statements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statements.js","sourceRoot":"","sources":["../../src/store/statements.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,YAAY,GAEb,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,GAAG,EAAc,MAAM,SAAS,CAAC;AAE1C,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAoB,CASnD,EAAgB,EAAE;IACjB,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,IAAI,aAAa,CAAC;IACrD,MAAM,EAAE,GAAU,CAAC,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC;IAEhC,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE7D,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA,EAAE,CAAC,CAAC;IAEnD,OAAO,MAAM,GAAG,EAAE,CAAK;;;;gCAIO,QAAQ,EAAE,MAAM,KAAK,CAAC,QAAQ;8BAChC,KAAK,CAAC,QAAQ,oBAAoB,QAAQ,EAAE;kCACxC,SAAS,EAAE,MAAM,KAAK,CAAC,SAAS;oBAC9C,QAAQ,EAAE;aACjB,KAAK,EAAE;cACN,QAAQ,EAAE,aAAa,KAAK,CAAC,QAAQ,GAAG,MAAM,QAAQ,KAAK,CAAC,QAAQ,GAAG,MAAM;cAC7E,SAAS,EAAE,YAAY,KAAK,CAAC,SAAS,GAAG,MAAM,QAAQ,KAAK,CAAC,SAAS,GAAG,MAAM;;;;YAIjF,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,IAAI,KAAK,EAAE;eAClC,QAAQ,EAAE,GAAG,CAAC;AAC7B,CAAC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { PicChargersInitializer, PicSlugsId } from "@mxpicture/tesla-superchargers-generated/public";
|
|
2
|
+
import type { TeslaClientCharger } from "../client/chargers.clients.js";
|
|
3
|
+
import type { Meta } from "../types/client.types.js";
|
|
4
|
+
export declare const chargerToInitializer: (p: {
|
|
5
|
+
charger: TeslaClientCharger;
|
|
6
|
+
meta?: Meta;
|
|
7
|
+
slugsId?: PicSlugsId;
|
|
8
|
+
}) => PicChargersInitializer;
|
|
9
|
+
//# sourceMappingURL=chargers.transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chargers.transform.d.ts","sourceRoot":"","sources":["../../src/transform/chargers.transform.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EAEtB,UAAU,EACX,MAAM,iDAAiD,CAAC;AAEzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,eAAO,MAAM,oBAAoB,GAAI,GAAG;IACtC,OAAO,EAAE,kBAAkB,CAAC;IAC5B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,OAAO,CAAC,EAAE,UAAU,CAAC;CACtB,KAAG,sBAuCH,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { createMeta, removeUndefined } from "./common.transform.js";
|
|
2
|
+
export const chargerToInitializer = (p) => {
|
|
3
|
+
const meta = createMeta(p.meta);
|
|
4
|
+
const result = {
|
|
5
|
+
fetched_at: meta.fetched_at,
|
|
6
|
+
last_fetch_uuid: meta.last_fetch_uuid,
|
|
7
|
+
deleted_at: null,
|
|
8
|
+
failure_count: 0,
|
|
9
|
+
pic_slugs_id: p.slugsId,
|
|
10
|
+
access_type: p.charger.accessType,
|
|
11
|
+
location_guid: p.charger.locationGUID,
|
|
12
|
+
max_power_kw: p.charger.maxPowerKw,
|
|
13
|
+
name: p.charger.name,
|
|
14
|
+
public_stall_count: p.charger.publicStallCount,
|
|
15
|
+
time_zone: p.charger.timeZone,
|
|
16
|
+
entry_point_latitude: p.charger.entryPoint.latitude,
|
|
17
|
+
entry_point_longitude: p.charger.entryPoint.longitude,
|
|
18
|
+
centroid_latitude: p.charger.centroid.latitude,
|
|
19
|
+
centroid_longitude: p.charger.centroid.longitude,
|
|
20
|
+
brand_name: p.charger.brandName,
|
|
21
|
+
common_site_name: p.charger.commonSiteName,
|
|
22
|
+
city: p.charger.address.city,
|
|
23
|
+
country: p.charger.address.country,
|
|
24
|
+
country_code: p.charger.address.countryCode,
|
|
25
|
+
district: p.charger.address.district,
|
|
26
|
+
nav_region: p.charger.address.navRegion,
|
|
27
|
+
nearest_entrance: p.charger.address.nearestEntrance,
|
|
28
|
+
postal_code: p.charger.address.postalCode,
|
|
29
|
+
postal_ext: p.charger.address.postalExt,
|
|
30
|
+
state: p.charger.address.state,
|
|
31
|
+
street: p.charger.address.street,
|
|
32
|
+
street_number: p.charger.address.streetNumber,
|
|
33
|
+
site_id: p.charger.availabilityProfile.siteId?.id ?? 0,
|
|
34
|
+
site_type: p.charger.availabilityProfile.siteId?.siteType ?? "",
|
|
35
|
+
trt_id: p.charger.availabilityProfile.trtId?.id ?? 0,
|
|
36
|
+
trt_type: p.charger.availabilityProfile.trtId?.siteType ?? "",
|
|
37
|
+
utc_offset: p.charger.availabilityProfile.utcOffset,
|
|
38
|
+
failure_notified_at: null,
|
|
39
|
+
};
|
|
40
|
+
return removeUndefined(result);
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=chargers.transform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chargers.transform.js","sourceRoot":"","sources":["../../src/transform/chargers.transform.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAIpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAIpC,EAA0B,EAAE;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAiC;QAC3C,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,eAAe,EAAE,IAAI,CAAC,eAAe;QACrC,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC,CAAC,OAAO;QACvB,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU;QACjC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY;QACrC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU;QAClC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI;QACpB,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,gBAAgB;QAC9C,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ;QAC7B,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ;QACnD,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS;QACrD,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ;QAC9C,kBAAkB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS;QAChD,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS;QAC/B,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc;QAC1C,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;QAC5B,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO;QAClC,YAAY,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW;QAC3C,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ;QACpC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS;QACvC,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe;QACnD,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU;QACzC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS;QACvC,KAAK,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK;QAC9B,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM;QAChC,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,YAAY;QAC7C,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC;QACtD,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE;QAC/D,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC;QACpD,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,EAAE,QAAQ,IAAI,EAAE;QAC7D,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,SAAS;QACnD,mBAAmB,EAAE,IAAI;KAC1B,CAAC;IACF,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Meta } from "../types/client.types.js";
|
|
2
|
+
export declare const createMeta: (f?: Partial<Meta>) => Meta;
|
|
3
|
+
export declare const removeUndefined: <T>(obj: T) => T;
|
|
4
|
+
export declare const daysStringToNums: (days: string) => number[];
|
|
5
|
+
export declare const timeStringToDateFallback: (time: string | {
|
|
6
|
+
hours: number;
|
|
7
|
+
minutes?: number;
|
|
8
|
+
seconds?: number;
|
|
9
|
+
}, fallback: string | {
|
|
10
|
+
hours: number;
|
|
11
|
+
minutes?: number;
|
|
12
|
+
seconds?: number;
|
|
13
|
+
}) => Date;
|
|
14
|
+
export declare const timeStringToDate: (time: string | {
|
|
15
|
+
hours: number;
|
|
16
|
+
minutes?: number;
|
|
17
|
+
seconds?: number;
|
|
18
|
+
}) => Date;
|
|
19
|
+
//# sourceMappingURL=common.transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.transform.d.ts","sourceRoot":"","sources":["../../src/transform/common.transform.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAC;AAErD,eAAO,MAAM,UAAU,GAAI,IAAI,OAAO,CAAC,IAAI,CAAC,KAAG,IAG7C,CAAC;AAEH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,KAAK,CAAC,KAAG,CAO3C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,aASX,CAAC;AAEnC,eAAO,MAAM,wBAAwB,GACnC,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,EACpE,UAAU,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KACvE,IAMF,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,KACnE,IAqCF,CAAC"}
|