tabletcommand-location 2.3.7 → 2.4.0
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/build/location.js +60 -6
- package/build/location.js.map +1 -1
- package/build/store.js +52 -5
- package/build/store.js.map +1 -1
- package/build/test/location.js +260 -0
- package/build/test/location.js.map +1 -1
- package/cspell.json +3 -0
- package/definitions/location.d.ts.map +1 -1
- package/definitions/store.d.ts.map +1 -1
- package/definitions/test/mock.d.ts +15 -0
- package/definitions/test/mock.d.ts.map +1 -1
- package/definitions/types.d.ts +5 -0
- package/definitions/types.d.ts.map +1 -1
- package/package.json +3 -3
- package/src/location.ts +64 -6
- package/src/store.ts +53 -5
- package/src/test/location.ts +253 -0
- package/src/types.ts +15 -0
- package/LICENSE +0 -21
package/build/location.js
CHANGED
|
@@ -36,7 +36,20 @@ function location(store) {
|
|
|
36
36
|
movedAtUnix = cadUnixTime;
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
// Originally always was this fake id, but now can override these values
|
|
40
|
+
// If overridden then we use the values on the record instead of the fake userId
|
|
41
|
+
let userId = `${item.radioName}-${item.vehicleId}`; // Fake user id radioName - vehicleId
|
|
42
|
+
if (lodash_1.default.isString(item.userId) && lodash_1.default.trim(item.userId) !== "") {
|
|
43
|
+
userId = item.userId;
|
|
44
|
+
}
|
|
45
|
+
let session = userId;
|
|
46
|
+
if (lodash_1.default.isString(item.session) && lodash_1.default.trim(item.session) !== "") {
|
|
47
|
+
session = item.session;
|
|
48
|
+
}
|
|
49
|
+
let username = item.radioName;
|
|
50
|
+
if (lodash_1.default.isString(item.username) && lodash_1.default.trim(item.username) !== "") {
|
|
51
|
+
username = item.username;
|
|
52
|
+
}
|
|
40
53
|
let sharingEnabled = false;
|
|
41
54
|
let opAreaName = "";
|
|
42
55
|
let opAreaCode = "";
|
|
@@ -56,7 +69,8 @@ function location(store) {
|
|
|
56
69
|
}
|
|
57
70
|
}
|
|
58
71
|
const deleteAfterDate = new Date(atDate.valueOf() + 1000 * 60 * locationStaleMinutes);
|
|
59
|
-
const personnelUUID = "";
|
|
72
|
+
const personnelUUID = lodash_1.default.isString(item.personnelUUID) ? item.personnelUUID : "";
|
|
73
|
+
const transponderUUID = lodash_1.default.isString(item.transponderUUID) ? item.transponderUUID : "";
|
|
60
74
|
const cadAVL = {
|
|
61
75
|
device_type: deviceType,
|
|
62
76
|
source: item.source,
|
|
@@ -69,10 +83,10 @@ function location(store) {
|
|
|
69
83
|
modified: atDate,
|
|
70
84
|
movedAt: new Date(movedAtUnix * 1000),
|
|
71
85
|
active: true,
|
|
72
|
-
username
|
|
86
|
+
username,
|
|
73
87
|
userId,
|
|
74
88
|
departmentId: String(department._id),
|
|
75
|
-
session
|
|
89
|
+
session,
|
|
76
90
|
version: 2,
|
|
77
91
|
shared: sharingEnabled,
|
|
78
92
|
sendToCAD: false,
|
|
@@ -81,6 +95,7 @@ function location(store) {
|
|
|
81
95
|
state: deptState,
|
|
82
96
|
visibility: [], // will be updated after .active is set
|
|
83
97
|
personnelUUID,
|
|
98
|
+
transponderUUID,
|
|
84
99
|
};
|
|
85
100
|
if (lodash_1.default.isNumber(item.speed)) {
|
|
86
101
|
const speed = item.speed;
|
|
@@ -140,12 +155,44 @@ function location(store) {
|
|
|
140
155
|
}
|
|
141
156
|
return cadItem;
|
|
142
157
|
}
|
|
158
|
+
// Returns true when the item is a person location and was fully handled here
|
|
159
|
+
// Returns false if trying to handle vehicle item
|
|
160
|
+
async function processPersonItem(decoded, item, atDate) {
|
|
161
|
+
const isPerson = decoded.cadAVL.kindType === tabletcommand_backend_models_1.LocationKindType.Person ||
|
|
162
|
+
decoded.cadAVL.locationType === tabletcommand_backend_models_1.LocationKindType.Person;
|
|
163
|
+
if (!isPerson) {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
const hasPersonnelUUID = lodash_1.default.isString(decoded.cadAVL.personnelUUID) && decoded.cadAVL.personnelUUID !== "";
|
|
167
|
+
const hasTransponderUUID = lodash_1.default.isString(decoded.cadAVL.transponderUUID) && decoded.cadAVL.transponderUUID !== "";
|
|
168
|
+
if (!hasPersonnelUUID && !hasTransponderUUID) {
|
|
169
|
+
// A person Location with neither personnelUUID nor transponderUUID
|
|
170
|
+
// would leak into the vehicle sync endpoints (they filter on
|
|
171
|
+
// personnelUUID: "") so to process person must have one or other
|
|
172
|
+
debug(`skipping person location without personnelUUID/transponderUUID: ${JSON.stringify(item)}`);
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
// Person records: no CAD vehicle, always active/visible, never shared or CAD.
|
|
176
|
+
// Stamp kindType so records classified by locationType alone still match
|
|
177
|
+
// the person feed query (kindType: "person")
|
|
178
|
+
decoded.cadAVL.kindType = tabletcommand_backend_models_1.LocationKindType.Person;
|
|
179
|
+
decoded.cadAVL.active = true;
|
|
180
|
+
decoded.cadAVL.shared = false;
|
|
181
|
+
decoded.cadAVL.sendToCAD = false;
|
|
182
|
+
decoded.cadAVL.visibility = [tabletcommand_backend_models_1.LocationVisibility.Visible];
|
|
183
|
+
await store.updateLocation(decoded.cadAVL, atDate);
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
143
186
|
async function processItems(department, items, atDate) {
|
|
144
187
|
for (const item of items) {
|
|
145
188
|
const decoded = decodeLocation(item, department, atDate, "cad");
|
|
146
189
|
debug(`processCADVehicleLocation item: ${JSON.stringify(item)} d:${JSON.stringify(department)} at: ${atDate.toISOString()}.`);
|
|
147
190
|
if (!decoded.isValid) {
|
|
148
|
-
|
|
191
|
+
// Skip only the invalid item, not the rest of the batch
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
if (await processPersonItem(decoded, item, atDate)) {
|
|
195
|
+
continue;
|
|
149
196
|
}
|
|
150
197
|
let active = true;
|
|
151
198
|
const cadItem = await processVehicle(item, department, atDate);
|
|
@@ -174,7 +221,14 @@ function location(store) {
|
|
|
174
221
|
const decoded = decodeLocation(item, department, atDate, "geotab");
|
|
175
222
|
debug(`processItemsDeviceMappingGeotab item: ${JSON.stringify(item)} d:${JSON.stringify(department)} at: ${atDate.toISOString()}.`);
|
|
176
223
|
if (!decoded.isValid) {
|
|
177
|
-
|
|
224
|
+
// Skip only the invalid item, not the rest of the batch
|
|
225
|
+
// This is actually a fix for vehicle processing as well
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
// Defensive code technically we shouldn't be getting here with person
|
|
229
|
+
// But it would still be valid to use this with a person so added the logic
|
|
230
|
+
if (await processPersonItem(decoded, item, atDate)) {
|
|
231
|
+
continue;
|
|
178
232
|
}
|
|
179
233
|
let active = true;
|
|
180
234
|
let locationToCAD = false;
|
package/build/location.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location.js","sourceRoot":"","sources":["../src/location.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"location.js","sourceRoot":"","sources":["../src/location.ts"],"names":[],"mappings":"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"}
|
package/build/store.js
CHANGED
|
@@ -5,6 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.store = store;
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const tabletcommand_backend_models_1 = require("tabletcommand-backend-models");
|
|
8
9
|
const lodash_1 = __importDefault(require("lodash"));
|
|
9
10
|
function store(departmentModel, locationModel, cadVehicleModel, deviceMappingModel) {
|
|
10
11
|
const debug = (0, debug_1.default)("tabletcommand-location:location:store");
|
|
@@ -35,14 +36,42 @@ function store(departmentModel, locationModel, cadVehicleModel, deviceMappingMod
|
|
|
35
36
|
};
|
|
36
37
|
return await cadVehicleModel.findOneAndUpdate(query, item, options);
|
|
37
38
|
}
|
|
39
|
+
function isDuplicateKeyError(error) {
|
|
40
|
+
return lodash_1.default.isObject(error) && error.code === 11000;
|
|
41
|
+
}
|
|
38
42
|
async function updateLocation(item, atDate) {
|
|
43
|
+
try {
|
|
44
|
+
await performUpdateLocation(item, atDate);
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
if (!isDuplicateKeyError(error)) {
|
|
48
|
+
throw error;
|
|
49
|
+
}
|
|
50
|
+
// A concurrent first-write hit the unique (departmentId, session, device_type)
|
|
51
|
+
// index; the record exists now so we can retry once, so this update goes through.
|
|
52
|
+
await performUpdateLocation(item, atDate);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
async function performUpdateLocation(item, atDate) {
|
|
39
56
|
// eslint-disable-next-line new-cap
|
|
40
57
|
const modelItem = new locationModel(item);
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
58
|
+
const hasPersonIdentity = (lodash_1.default.isString(modelItem.personnelUUID) && modelItem.personnelUUID !== "") ||
|
|
59
|
+
(lodash_1.default.isString(modelItem.transponderUUID) && modelItem.transponderUUID !== "");
|
|
60
|
+
const isPerson = (modelItem.kindType === tabletcommand_backend_models_1.LocationKindType.Person || modelItem.locationType === tabletcommand_backend_models_1.LocationKindType.Person) &&
|
|
61
|
+
hasPersonIdentity;
|
|
62
|
+
// Person records upsert by session (their stable identity key); username is
|
|
63
|
+
// display-only for transponder stuff, so renames must not create new records from updates
|
|
64
|
+
const query = isPerson
|
|
65
|
+
? {
|
|
66
|
+
device_type: modelItem.device_type,
|
|
67
|
+
departmentId: modelItem.departmentId,
|
|
68
|
+
session: modelItem.session
|
|
69
|
+
}
|
|
70
|
+
: {
|
|
71
|
+
device_type: modelItem.device_type,
|
|
72
|
+
departmentId: modelItem.departmentId,
|
|
73
|
+
username: modelItem.username
|
|
74
|
+
};
|
|
46
75
|
debug(`Location.findOne: ${JSON.stringify(query)}`);
|
|
47
76
|
const dbItem = await locationModel.findOne(query).lean().exec();
|
|
48
77
|
const cloneItem = { ...dbItem };
|
|
@@ -81,6 +110,24 @@ function store(departmentModel, locationModel, cadVehicleModel, deviceMappingMod
|
|
|
81
110
|
dbItem.locationGeoJSON = modelItem.locationGeoJSON;
|
|
82
111
|
dbItem.source = modelItem.source;
|
|
83
112
|
dbItem.kindType = modelItem.kindType;
|
|
113
|
+
// Carry person/category fields on the update path; only overwrite when the
|
|
114
|
+
// incoming payload actually provides a value, so sources that don't send
|
|
115
|
+
// these fields don't wipe values written by other sources.
|
|
116
|
+
if (lodash_1.default.isString(modelItem.locationType) && modelItem.locationType !== "") {
|
|
117
|
+
dbItem.locationType = modelItem.locationType;
|
|
118
|
+
}
|
|
119
|
+
if (lodash_1.default.isString(modelItem.kind) && modelItem.kind !== "") {
|
|
120
|
+
dbItem.kind = modelItem.kind;
|
|
121
|
+
}
|
|
122
|
+
if (lodash_1.default.isString(modelItem.type) && modelItem.type !== "") {
|
|
123
|
+
dbItem.type = modelItem.type;
|
|
124
|
+
}
|
|
125
|
+
if (lodash_1.default.isString(modelItem.personnelUUID) && modelItem.personnelUUID !== "") {
|
|
126
|
+
dbItem.personnelUUID = modelItem.personnelUUID;
|
|
127
|
+
}
|
|
128
|
+
if (lodash_1.default.isString(modelItem.transponderUUID) && modelItem.transponderUUID !== "") {
|
|
129
|
+
dbItem.transponderUUID = modelItem.transponderUUID;
|
|
130
|
+
}
|
|
84
131
|
// Propagate sharedAVL items
|
|
85
132
|
dbItem.opAreaCode = modelItem.opAreaCode;
|
|
86
133
|
dbItem.opAreaName = modelItem.opAreaName;
|
package/build/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/build/test/location.js
CHANGED
|
@@ -177,6 +177,266 @@ let models;
|
|
|
177
177
|
chai_1.assert.equal((_m = locationRecord[0]) === null || _m === void 0 ? void 0 : _m.visibility.includes("shared"), true);
|
|
178
178
|
/* cSpell:enable */
|
|
179
179
|
});
|
|
180
|
+
(0, node_test_1.it)("applies person invariants on the geotab path, ignoring device mapping", async () => {
|
|
181
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
182
|
+
const department = mockDepartment;
|
|
183
|
+
// BEEDOO3 has a device mapping with mapId BOOPBEEP99 and locationToCAD:
|
|
184
|
+
// true; a person payload must not pick either of those up.
|
|
185
|
+
const items = [{
|
|
186
|
+
vehicleId: "BEEDOO3",
|
|
187
|
+
radioName: "Smokey Bear",
|
|
188
|
+
latitude: 34.35264,
|
|
189
|
+
longitude: -119.0669,
|
|
190
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
191
|
+
kindType: "person",
|
|
192
|
+
locationType: "person",
|
|
193
|
+
source: "TXRX",
|
|
194
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
195
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
196
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
197
|
+
username: "Smokey Bear",
|
|
198
|
+
visibility: [],
|
|
199
|
+
}];
|
|
200
|
+
await location.processItemsDeviceMappingGeotab(department, items, new Date());
|
|
201
|
+
const recs = await models.Location.find({});
|
|
202
|
+
chai_1.assert.equal(recs.length, 1);
|
|
203
|
+
chai_1.assert.equal((_a = recs[0]) === null || _a === void 0 ? void 0 : _a.username, "Smokey Bear");
|
|
204
|
+
chai_1.assert.equal((_b = recs[0]) === null || _b === void 0 ? void 0 : _b.session, "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
205
|
+
chai_1.assert.equal((_c = recs[0]) === null || _c === void 0 ? void 0 : _c.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
206
|
+
chai_1.assert.equal((_d = recs[0]) === null || _d === void 0 ? void 0 : _d.active, true);
|
|
207
|
+
chai_1.assert.equal((_e = recs[0]) === null || _e === void 0 ? void 0 : _e.shared, false);
|
|
208
|
+
chai_1.assert.equal((_f = recs[0]) === null || _f === void 0 ? void 0 : _f.sendToCAD, false);
|
|
209
|
+
chai_1.assert.deepEqual((_g = recs[0]) === null || _g === void 0 ? void 0 : _g.visibility, ["visible"]);
|
|
210
|
+
});
|
|
211
|
+
(0, node_test_1.it)("skips geotab person locations with neither personnelUUID nor transponderUUID", async () => {
|
|
212
|
+
const department = mockDepartment;
|
|
213
|
+
const items = [{
|
|
214
|
+
vehicleId: "BEEDOO3",
|
|
215
|
+
radioName: "Smokey Bear",
|
|
216
|
+
latitude: 34.35264,
|
|
217
|
+
longitude: -119.0669,
|
|
218
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
219
|
+
kindType: "person",
|
|
220
|
+
locationType: "person",
|
|
221
|
+
source: "TXRX",
|
|
222
|
+
visibility: [],
|
|
223
|
+
}];
|
|
224
|
+
await location.processItemsDeviceMappingGeotab(department, items, new Date());
|
|
225
|
+
const recs = await models.Location.find({});
|
|
226
|
+
chai_1.assert.equal(recs.length, 0);
|
|
227
|
+
});
|
|
228
|
+
(0, node_test_1.it)("saves person locations keyed by session with person invariants, no CAD vehicle", async () => {
|
|
229
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
|
|
230
|
+
const atDate = new Date();
|
|
231
|
+
const department = mockDepartment;
|
|
232
|
+
const items = [{
|
|
233
|
+
vehicleId: "12345",
|
|
234
|
+
radioName: "SmokeyBear",
|
|
235
|
+
latitude: 34.35264,
|
|
236
|
+
longitude: -119.0669,
|
|
237
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
238
|
+
kindType: "person",
|
|
239
|
+
locationType: "person",
|
|
240
|
+
kind: "",
|
|
241
|
+
type: "",
|
|
242
|
+
source: "TXRX",
|
|
243
|
+
personnelUUID: "11111111-2222-3333-4444-555555555555",
|
|
244
|
+
userId: "TXRX-12345",
|
|
245
|
+
session: "TXRX-12345",
|
|
246
|
+
username: "SmokeyBear",
|
|
247
|
+
visibility: [],
|
|
248
|
+
}];
|
|
249
|
+
await location.processItems(department, items, atDate);
|
|
250
|
+
const recs = await models.Location.find({});
|
|
251
|
+
chai_1.assert.equal(recs.length, 1);
|
|
252
|
+
chai_1.assert.equal((_a = recs[0]) === null || _a === void 0 ? void 0 : _a.kindType, "person");
|
|
253
|
+
chai_1.assert.equal((_b = recs[0]) === null || _b === void 0 ? void 0 : _b.locationType, "person");
|
|
254
|
+
chai_1.assert.equal((_c = recs[0]) === null || _c === void 0 ? void 0 : _c.personnelUUID, "11111111-2222-3333-4444-555555555555");
|
|
255
|
+
chai_1.assert.equal((_d = recs[0]) === null || _d === void 0 ? void 0 : _d.transponderUUID, "");
|
|
256
|
+
chai_1.assert.equal((_e = recs[0]) === null || _e === void 0 ? void 0 : _e.username, "SmokeyBear");
|
|
257
|
+
chai_1.assert.equal((_f = recs[0]) === null || _f === void 0 ? void 0 : _f.userId, "TXRX-12345");
|
|
258
|
+
chai_1.assert.equal((_g = recs[0]) === null || _g === void 0 ? void 0 : _g.session, "TXRX-12345");
|
|
259
|
+
chai_1.assert.equal((_h = recs[0]) === null || _h === void 0 ? void 0 : _h.active, true);
|
|
260
|
+
chai_1.assert.equal((_j = recs[0]) === null || _j === void 0 ? void 0 : _j.shared, false);
|
|
261
|
+
chai_1.assert.equal((_k = recs[0]) === null || _k === void 0 ? void 0 : _k.sendToCAD, false);
|
|
262
|
+
chai_1.assert.deepEqual((_l = recs[0]) === null || _l === void 0 ? void 0 : _l.visibility, ["visible"]);
|
|
263
|
+
// Person records must not create phantom CAD vehicles
|
|
264
|
+
const vehicles = await models.CADVehicle.find({});
|
|
265
|
+
chai_1.assert.equal(vehicles.length, 0);
|
|
266
|
+
});
|
|
267
|
+
(0, node_test_1.it)("stamps kindType on person locations classified by locationType alone", async () => {
|
|
268
|
+
var _a, _b, _c;
|
|
269
|
+
const atDate = new Date();
|
|
270
|
+
const department = mockDepartment;
|
|
271
|
+
const items = [{
|
|
272
|
+
vehicleId: "12345",
|
|
273
|
+
radioName: "SmokeyBear",
|
|
274
|
+
latitude: 34.35264,
|
|
275
|
+
longitude: -119.0669,
|
|
276
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
277
|
+
locationType: "person",
|
|
278
|
+
source: "TXRX",
|
|
279
|
+
personnelUUID: "11111111-2222-3333-4444-555555555555",
|
|
280
|
+
userId: "TXRX-12345",
|
|
281
|
+
session: "TXRX-12345",
|
|
282
|
+
username: "SmokeyBear",
|
|
283
|
+
visibility: [],
|
|
284
|
+
}];
|
|
285
|
+
await location.processItems(department, items, atDate);
|
|
286
|
+
const recs = await models.Location.find({});
|
|
287
|
+
chai_1.assert.equal(recs.length, 1);
|
|
288
|
+
// The person feed queries kindType: "person", so the record must not
|
|
289
|
+
// rely on the payload having set it
|
|
290
|
+
chai_1.assert.equal((_a = recs[0]) === null || _a === void 0 ? void 0 : _a.kindType, "person");
|
|
291
|
+
chai_1.assert.equal((_b = recs[0]) === null || _b === void 0 ? void 0 : _b.locationType, "person");
|
|
292
|
+
chai_1.assert.equal((_c = recs[0]) === null || _c === void 0 ? void 0 : _c.personnelUUID, "11111111-2222-3333-4444-555555555555");
|
|
293
|
+
const vehicles = await models.CADVehicle.find({});
|
|
294
|
+
chai_1.assert.equal(vehicles.length, 0);
|
|
295
|
+
});
|
|
296
|
+
(0, node_test_1.it)("accepts transponder person locations on transponderUUID alone", async () => {
|
|
297
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
298
|
+
const atDate = new Date();
|
|
299
|
+
const department = mockDepartment;
|
|
300
|
+
const items = [{
|
|
301
|
+
vehicleId: "FB:9D:2C:3E:C9:E4",
|
|
302
|
+
radioName: "Fire Hose 1",
|
|
303
|
+
latitude: 34.35264,
|
|
304
|
+
longitude: -119.0669,
|
|
305
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
306
|
+
kindType: "person",
|
|
307
|
+
locationType: "person",
|
|
308
|
+
source: "TXRX",
|
|
309
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
310
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
311
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
312
|
+
username: "Fire Hose 1",
|
|
313
|
+
visibility: [],
|
|
314
|
+
}];
|
|
315
|
+
await location.processItems(department, items, atDate);
|
|
316
|
+
const recs = await models.Location.find({});
|
|
317
|
+
chai_1.assert.equal(recs.length, 1);
|
|
318
|
+
chai_1.assert.equal((_a = recs[0]) === null || _a === void 0 ? void 0 : _a.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
319
|
+
chai_1.assert.equal((_b = recs[0]) === null || _b === void 0 ? void 0 : _b.personnelUUID, "");
|
|
320
|
+
chai_1.assert.equal((_c = recs[0]) === null || _c === void 0 ? void 0 : _c.session, "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
321
|
+
chai_1.assert.equal((_d = recs[0]) === null || _d === void 0 ? void 0 : _d.active, true);
|
|
322
|
+
chai_1.assert.equal((_e = recs[0]) === null || _e === void 0 ? void 0 : _e.shared, false);
|
|
323
|
+
chai_1.assert.equal((_f = recs[0]) === null || _f === void 0 ? void 0 : _f.sendToCAD, false);
|
|
324
|
+
chai_1.assert.deepEqual((_g = recs[0]) === null || _g === void 0 ? void 0 : _g.visibility, ["visible"]);
|
|
325
|
+
// Person records must not create phantom CAD vehicles
|
|
326
|
+
const vehicles = await models.CADVehicle.find({});
|
|
327
|
+
chai_1.assert.equal(vehicles.length, 0);
|
|
328
|
+
});
|
|
329
|
+
(0, node_test_1.it)("updates person locations in place on rename, preserving person fields", async () => {
|
|
330
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
331
|
+
const department = mockDepartment;
|
|
332
|
+
const base = {
|
|
333
|
+
vehicleId: "FB:9D:2C:3E:C9:E4",
|
|
334
|
+
radioName: "William Jones",
|
|
335
|
+
latitude: 34.35264,
|
|
336
|
+
longitude: -119.0669,
|
|
337
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
338
|
+
kindType: "person",
|
|
339
|
+
locationType: "person",
|
|
340
|
+
source: "TXRX",
|
|
341
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
342
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
343
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
344
|
+
username: "William Jones",
|
|
345
|
+
visibility: [],
|
|
346
|
+
};
|
|
347
|
+
await location.processItems(department, [base], new Date());
|
|
348
|
+
const renamed = {
|
|
349
|
+
...base,
|
|
350
|
+
radioName: "Bill Jones",
|
|
351
|
+
username: "Bill Jones",
|
|
352
|
+
latitude: 34.4,
|
|
353
|
+
};
|
|
354
|
+
await location.processItems(department, [renamed], new Date());
|
|
355
|
+
const recs = await models.Location.find({});
|
|
356
|
+
chai_1.assert.equal(recs.length, 1);
|
|
357
|
+
chai_1.assert.equal((_a = recs[0]) === null || _a === void 0 ? void 0 : _a.username, "Bill Jones");
|
|
358
|
+
chai_1.assert.equal((_b = recs[0]) === null || _b === void 0 ? void 0 : _b.session, "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
359
|
+
chai_1.assert.equal((_c = recs[0]) === null || _c === void 0 ? void 0 : _c.locationGeoJSON.coordinates[1], 34.4);
|
|
360
|
+
// Update path must preserve the person fields
|
|
361
|
+
chai_1.assert.equal((_d = recs[0]) === null || _d === void 0 ? void 0 : _d.kindType, "person");
|
|
362
|
+
chai_1.assert.equal((_e = recs[0]) === null || _e === void 0 ? void 0 : _e.locationType, "person");
|
|
363
|
+
chai_1.assert.equal((_f = recs[0]) === null || _f === void 0 ? void 0 : _f.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
364
|
+
chai_1.assert.deepEqual((_g = recs[0]) === null || _g === void 0 ? void 0 : _g.visibility, ["visible"]);
|
|
365
|
+
});
|
|
366
|
+
(0, node_test_1.it)("does not wipe transponderUUID when an update omits it", async () => {
|
|
367
|
+
var _a, _b, _c;
|
|
368
|
+
const department = mockDepartment;
|
|
369
|
+
const base = {
|
|
370
|
+
vehicleId: "FB:9D:2C:3E:C9:E4",
|
|
371
|
+
radioName: "Fire Hose 1",
|
|
372
|
+
latitude: 34.35264,
|
|
373
|
+
longitude: -119.0669,
|
|
374
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
375
|
+
kindType: "person",
|
|
376
|
+
locationType: "person",
|
|
377
|
+
source: "TXRX",
|
|
378
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
379
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
380
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
381
|
+
username: "Fire Hose 1",
|
|
382
|
+
visibility: [],
|
|
383
|
+
};
|
|
384
|
+
await location.processItems(department, [base], new Date());
|
|
385
|
+
// Same session, but this update carries only a personnelUUID
|
|
386
|
+
const update = {
|
|
387
|
+
...base,
|
|
388
|
+
transponderUUID: "",
|
|
389
|
+
personnelUUID: "11111111-2222-3333-4444-555555555555",
|
|
390
|
+
latitude: 34.4,
|
|
391
|
+
};
|
|
392
|
+
await location.processItems(department, [update], new Date());
|
|
393
|
+
const recs = await models.Location.find({});
|
|
394
|
+
chai_1.assert.equal(recs.length, 1);
|
|
395
|
+
chai_1.assert.equal((_a = recs[0]) === null || _a === void 0 ? void 0 : _a.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
396
|
+
chai_1.assert.equal((_b = recs[0]) === null || _b === void 0 ? void 0 : _b.personnelUUID, "11111111-2222-3333-4444-555555555555");
|
|
397
|
+
chai_1.assert.equal((_c = recs[0]) === null || _c === void 0 ? void 0 : _c.locationGeoJSON.coordinates[1], 34.4);
|
|
398
|
+
});
|
|
399
|
+
(0, node_test_1.it)("skips person locations with neither personnelUUID nor transponderUUID", async () => {
|
|
400
|
+
const department = mockDepartment;
|
|
401
|
+
const items = [{
|
|
402
|
+
vehicleId: "12345",
|
|
403
|
+
radioName: "William Jones",
|
|
404
|
+
latitude: 34.35264,
|
|
405
|
+
longitude: -119.0669,
|
|
406
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
407
|
+
kindType: "person",
|
|
408
|
+
locationType: "person",
|
|
409
|
+
source: "TXRX",
|
|
410
|
+
session: "TXRX-12345",
|
|
411
|
+
visibility: [],
|
|
412
|
+
}];
|
|
413
|
+
await location.processItems(department, items, new Date());
|
|
414
|
+
const recs = await models.Location.find({});
|
|
415
|
+
chai_1.assert.equal(recs.length, 0);
|
|
416
|
+
const vehicles = await models.CADVehicle.find({});
|
|
417
|
+
chai_1.assert.equal(vehicles.length, 0);
|
|
418
|
+
});
|
|
419
|
+
(0, node_test_1.it)("continues processing the batch after an invalid item", async () => {
|
|
420
|
+
var _a;
|
|
421
|
+
const department = mockDepartment;
|
|
422
|
+
const items = [{
|
|
423
|
+
vehicleId: "",
|
|
424
|
+
radioName: "",
|
|
425
|
+
latitude: 0,
|
|
426
|
+
longitude: 0,
|
|
427
|
+
avlTime: "1602563494",
|
|
428
|
+
}, {
|
|
429
|
+
vehicleId: "BEEDOO1",
|
|
430
|
+
radioName: "BEEDOO1",
|
|
431
|
+
latitude: 34.35264,
|
|
432
|
+
longitude: -119.0669,
|
|
433
|
+
avlTime: "1602563494",
|
|
434
|
+
}];
|
|
435
|
+
await location.processItems(department, items, new Date());
|
|
436
|
+
const recs = await models.Location.find({});
|
|
437
|
+
chai_1.assert.equal(recs.length, 1);
|
|
438
|
+
chai_1.assert.equal((_a = recs[0]) === null || _a === void 0 ? void 0 : _a.username, "BEEDOO1");
|
|
439
|
+
});
|
|
180
440
|
(0, node_test_1.it)("carries kind/type/locationType/kindColor onto the saved Location", async () => {
|
|
181
441
|
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
182
442
|
const atDate = new Date();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/test/location.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/test/location.ts"],"names":[],"mappings":"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"}
|
package/cspell.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../src/location.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,
|
|
1
|
+
{"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../src/location.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EAKX,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,eAAe,EAEhB,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW;2BAkJL,eAAe,cAAc,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI;;;;;;;;;;;;;;;;;;;;;;+BAmD1D,OAAO,CAAC,UAAU,CAAC,SAAS,eAAe,EAAE,UAAU,IAAI;kDAoCxC,OAAO,CAAC,UAAU,CAAC,SAAS,eAAe,EAAE,UAAU,IAAI;EA4DvH;AAED,eAAe,QAAQ,CAAC;AACxB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,QAAQ,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,QAAQ,EAER,aAAa,EACb,eAAe,EACf,UAAU,EACV,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAkB,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1D,wBAAgB,KAAK,CACnB,eAAe,EAAE,eAAe,EAChC,aAAa,EAAE,aAAa,EAC5B,eAAe,EAAE,eAAe,EAChC,kBAAkB,EAAE,kBAAkB;uBAIN,eAAe,gBAAgB,MAAM;;;;;;;;;;;;;;;;;;;;;;mCAQzB,eAAe,gBAAgB,MAAM;;;;;;;;;;;;;;;;;;;;;;;;0BAS9C,OAAO,CAAC,UAAU,CAAC,gBAAgB,MAAM;;;;;2BAiBxC,OAAO,CAAC,QAAQ,CAAC,UAAU,IAAI;EAgJpE;AACD,eAAe,KAAK,CAAC;AACrB,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC"}
|
|
@@ -56,6 +56,11 @@ export default function (modelsModule: typeof import("tabletcommand-backend-mode
|
|
|
56
56
|
}> & {
|
|
57
57
|
__v: number;
|
|
58
58
|
}, any>;
|
|
59
|
+
CADInterfaceMetaData: import("mongoose").Model<import("tabletcommand-backend-models").CADInterfaceMetaData, {}, {}, {}, import("mongoose").Document<unknown, {}, import("tabletcommand-backend-models").CADInterfaceMetaData, {}, {}> & import("tabletcommand-backend-models").CADInterfaceMetaData & Required<{
|
|
60
|
+
_id: import("mongoose").Types.ObjectId;
|
|
61
|
+
}> & {
|
|
62
|
+
__v: number;
|
|
63
|
+
}, any>;
|
|
59
64
|
CADSimulation: import("mongoose").Model<import("tabletcommand-backend-models").CADSimulation, {}, {}, {}, import("mongoose").Document<unknown, {}, import("tabletcommand-backend-models").CADSimulation, {}, {}> & import("tabletcommand-backend-models").CADSimulation & Required<{
|
|
60
65
|
_id: import("mongoose").Types.ObjectId;
|
|
61
66
|
}> & {
|
|
@@ -296,6 +301,11 @@ export default function (modelsModule: typeof import("tabletcommand-backend-mode
|
|
|
296
301
|
}> & {
|
|
297
302
|
__v: number;
|
|
298
303
|
}, any>;
|
|
304
|
+
TrackerResponder: import("mongoose").Model<import("tabletcommand-backend-models").TrackerResponder, {}, {}, {}, import("mongoose").Document<unknown, {}, import("tabletcommand-backend-models").TrackerResponder, {}, {}> & import("tabletcommand-backend-models").TrackerResponder & Required<{
|
|
305
|
+
_id: import("mongoose").Types.ObjectId;
|
|
306
|
+
}> & {
|
|
307
|
+
__v: number;
|
|
308
|
+
}, any>;
|
|
299
309
|
User: import("mongoose").Model<import("tabletcommand-backend-models").User, {}, {}, {}, import("mongoose").Document<unknown, {}, import("tabletcommand-backend-models").User, {}, {}> & import("tabletcommand-backend-models").User & Required<{
|
|
300
310
|
_id: import("mongoose").Types.ObjectId;
|
|
301
311
|
}> & {
|
|
@@ -316,6 +326,11 @@ export default function (modelsModule: typeof import("tabletcommand-backend-mode
|
|
|
316
326
|
}> & {
|
|
317
327
|
__v: number;
|
|
318
328
|
}, any>;
|
|
329
|
+
WatchDutyEvent: import("mongoose").Model<import("tabletcommand-backend-models").WatchDutyEvent, {}, {}, {}, import("mongoose").Document<unknown, {}, import("tabletcommand-backend-models").WatchDutyEvent, {}, {}> & import("tabletcommand-backend-models").WatchDutyEvent & Required<{
|
|
330
|
+
_id: import("mongoose").Types.ObjectId;
|
|
331
|
+
}> & {
|
|
332
|
+
__v: number;
|
|
333
|
+
}, any>;
|
|
319
334
|
}>;
|
|
320
335
|
beforeEach: () => Promise<void>;
|
|
321
336
|
after: () => Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/test/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,aAAa,EACb,MAAM,EACN,UAAU,EAEX,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,OAAO,WAAU,YAAY,EAAE,cAAc,8BAA8B,CAAC;;;0BAwF9C,aAAa;4BASX,aAAa
|
|
1
|
+
{"version":3,"file":"mock.d.ts","sourceRoot":"","sources":["../../src/test/mock.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,EACL,aAAa,EACb,MAAM,EACN,UAAU,EAEX,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,OAAO,WAAU,YAAY,EAAE,cAAc,8BAA8B,CAAC;;;0BAwF9C,aAAa;4BASX,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsD5B,aAAa;yBAIT,OAAO,QAAQ;EAgB1C"}
|
package/definitions/types.d.ts
CHANGED
|
@@ -19,6 +19,11 @@ export interface LocationPayload {
|
|
|
19
19
|
heading?: number;
|
|
20
20
|
vehicleId: string;
|
|
21
21
|
visibility: LocationVisibility[];
|
|
22
|
+
personnelUUID?: string;
|
|
23
|
+
transponderUUID?: string;
|
|
24
|
+
userId?: string;
|
|
25
|
+
session?: string;
|
|
26
|
+
username?: string;
|
|
22
27
|
}
|
|
23
28
|
export interface Vehicle {
|
|
24
29
|
departmentId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,SAAS,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,kBAAkB,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EACnB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,kBAAkB,GACnB,CAAC;AAEF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,gBAAgB,CAAC;IAChC,SAAS,CAAC,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,cAAc,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,kBAAkB,EAAE,CAAC;IAIjC,aAAa,CAAC,EAAE,MAAM,CAAC;IAIvB,eAAe,CAAC,EAAE,MAAM,CAAC;IAKzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,IAAI,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAA;CACjB,CAAC;AAEF,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,cAAc,GAAG;KAC1B,CAAC,IAAI,MAAM,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;CACnC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tabletcommand-location",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Tablet Command Location",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -9,12 +9,12 @@
|
|
|
9
9
|
"test": "type-coverage && tsx --test --test-concurrency=1 --test-reporter=spec src/test/*.ts"
|
|
10
10
|
},
|
|
11
11
|
"author": "Joe Goeman <joe@tabletcommand.com>",
|
|
12
|
-
"license": "
|
|
12
|
+
"license": "UNLICENSED",
|
|
13
13
|
"types": "definitions/index.d.ts",
|
|
14
14
|
"dependencies": {
|
|
15
15
|
"debug": "^4.4.3",
|
|
16
16
|
"lodash": "~4.18.1",
|
|
17
|
-
"tabletcommand-backend-models": "~7.4.
|
|
17
|
+
"tabletcommand-backend-models": "~7.4.107"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
20
|
"@eslint/eslintrc": "^3.3.5",
|
package/src/location.ts
CHANGED
|
@@ -3,6 +3,7 @@ import {
|
|
|
3
3
|
Department,
|
|
4
4
|
Location,
|
|
5
5
|
CADVehicle,
|
|
6
|
+
LocationKindType,
|
|
6
7
|
LocationVisibility,
|
|
7
8
|
} from "tabletcommand-backend-models";
|
|
8
9
|
import {
|
|
@@ -49,7 +50,20 @@ export function location(store: StoreModule) {
|
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
|
|
52
|
-
|
|
53
|
+
// Originally always was this fake id, but now can override these values
|
|
54
|
+
// If overridden then we use the values on the record instead of the fake userId
|
|
55
|
+
let userId = `${item.radioName}-${item.vehicleId}`; // Fake user id radioName - vehicleId
|
|
56
|
+
if (_.isString(item.userId) && _.trim(item.userId) !== "") {
|
|
57
|
+
userId = item.userId;
|
|
58
|
+
}
|
|
59
|
+
let session = userId;
|
|
60
|
+
if (_.isString(item.session) && _.trim(item.session) !== "") {
|
|
61
|
+
session = item.session;
|
|
62
|
+
}
|
|
63
|
+
let username = item.radioName;
|
|
64
|
+
if (_.isString(item.username) && _.trim(item.username) !== "") {
|
|
65
|
+
username = item.username;
|
|
66
|
+
}
|
|
53
67
|
|
|
54
68
|
let sharingEnabled = false;
|
|
55
69
|
let opAreaName = "";
|
|
@@ -72,7 +86,8 @@ export function location(store: StoreModule) {
|
|
|
72
86
|
}
|
|
73
87
|
}
|
|
74
88
|
const deleteAfterDate = new Date(atDate.valueOf() + 1000 * 60 * locationStaleMinutes);
|
|
75
|
-
const personnelUUID = "";
|
|
89
|
+
const personnelUUID = _.isString(item.personnelUUID) ? item.personnelUUID : "";
|
|
90
|
+
const transponderUUID = _.isString(item.transponderUUID) ? item.transponderUUID : "";
|
|
76
91
|
|
|
77
92
|
const cadAVL: Partial<Location> = {
|
|
78
93
|
device_type: deviceType,
|
|
@@ -86,10 +101,10 @@ export function location(store: StoreModule) {
|
|
|
86
101
|
modified: atDate,
|
|
87
102
|
movedAt: new Date(movedAtUnix * 1000),
|
|
88
103
|
active: true,
|
|
89
|
-
username
|
|
104
|
+
username,
|
|
90
105
|
userId,
|
|
91
106
|
departmentId: String(department._id),
|
|
92
|
-
session
|
|
107
|
+
session,
|
|
93
108
|
version: 2,
|
|
94
109
|
shared: sharingEnabled,
|
|
95
110
|
sendToCAD: false,
|
|
@@ -98,6 +113,7 @@ export function location(store: StoreModule) {
|
|
|
98
113
|
state: deptState,
|
|
99
114
|
visibility: [], // will be updated after .active is set
|
|
100
115
|
personnelUUID,
|
|
116
|
+
transponderUUID,
|
|
101
117
|
};
|
|
102
118
|
|
|
103
119
|
if (_.isNumber(item.speed)) {
|
|
@@ -165,12 +181,46 @@ export function location(store: StoreModule) {
|
|
|
165
181
|
return cadItem;
|
|
166
182
|
}
|
|
167
183
|
|
|
184
|
+
// Returns true when the item is a person location and was fully handled here
|
|
185
|
+
// Returns false if trying to handle vehicle item
|
|
186
|
+
async function processPersonItem(decoded: DecodedLocation, item: LocationPayload, atDate: Date): Promise<boolean> {
|
|
187
|
+
const isPerson = decoded.cadAVL.kindType === LocationKindType.Person ||
|
|
188
|
+
decoded.cadAVL.locationType === LocationKindType.Person;
|
|
189
|
+
if (!isPerson) {
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
const hasPersonnelUUID = _.isString(decoded.cadAVL.personnelUUID) && decoded.cadAVL.personnelUUID !== "";
|
|
193
|
+
const hasTransponderUUID = _.isString(decoded.cadAVL.transponderUUID) && decoded.cadAVL.transponderUUID !== "";
|
|
194
|
+
if (!hasPersonnelUUID && !hasTransponderUUID) {
|
|
195
|
+
// A person Location with neither personnelUUID nor transponderUUID
|
|
196
|
+
// would leak into the vehicle sync endpoints (they filter on
|
|
197
|
+
// personnelUUID: "") so to process person must have one or other
|
|
198
|
+
debug(`skipping person location without personnelUUID/transponderUUID: ${JSON.stringify(item)}`);
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
// Person records: no CAD vehicle, always active/visible, never shared or CAD.
|
|
202
|
+
// Stamp kindType so records classified by locationType alone still match
|
|
203
|
+
// the person feed query (kindType: "person")
|
|
204
|
+
decoded.cadAVL.kindType = LocationKindType.Person;
|
|
205
|
+
decoded.cadAVL.active = true;
|
|
206
|
+
decoded.cadAVL.shared = false;
|
|
207
|
+
decoded.cadAVL.sendToCAD = false;
|
|
208
|
+
decoded.cadAVL.visibility = [LocationVisibility.Visible];
|
|
209
|
+
await store.updateLocation(decoded.cadAVL, atDate);
|
|
210
|
+
return true;
|
|
211
|
+
}
|
|
212
|
+
|
|
168
213
|
async function processItems(department: Partial<Department>, items: LocationPayload[], atDate: Date) {
|
|
169
214
|
for (const item of items) {
|
|
170
215
|
const decoded = decodeLocation(item, department, atDate, "cad");
|
|
171
216
|
debug(`processCADVehicleLocation item: ${JSON.stringify(item)} d:${JSON.stringify(department)} at: ${atDate.toISOString()}.`);
|
|
172
217
|
if (!decoded.isValid) {
|
|
173
|
-
|
|
218
|
+
// Skip only the invalid item, not the rest of the batch
|
|
219
|
+
continue;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
if (await processPersonItem(decoded, item, atDate)) {
|
|
223
|
+
continue;
|
|
174
224
|
}
|
|
175
225
|
|
|
176
226
|
let active = true;
|
|
@@ -203,7 +253,15 @@ export function location(store: StoreModule) {
|
|
|
203
253
|
const decoded = decodeLocation(item, department, atDate, "geotab");
|
|
204
254
|
debug(`processItemsDeviceMappingGeotab item: ${JSON.stringify(item)} d:${JSON.stringify(department)} at: ${atDate.toISOString()}.`);
|
|
205
255
|
if (!decoded.isValid) {
|
|
206
|
-
|
|
256
|
+
// Skip only the invalid item, not the rest of the batch
|
|
257
|
+
// This is actually a fix for vehicle processing as well
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Defensive code technically we shouldn't be getting here with person
|
|
262
|
+
// But it would still be valid to use this with a person so added the logic
|
|
263
|
+
if (await processPersonItem(decoded, item, atDate)) {
|
|
264
|
+
continue;
|
|
207
265
|
}
|
|
208
266
|
|
|
209
267
|
let active = true;
|
package/src/store.ts
CHANGED
|
@@ -2,6 +2,7 @@ import debugModule from "debug";
|
|
|
2
2
|
import {
|
|
3
3
|
DepartmentModel,
|
|
4
4
|
Location,
|
|
5
|
+
LocationKindType,
|
|
5
6
|
LocationModel,
|
|
6
7
|
CADVehicleModel,
|
|
7
8
|
CADVehicle,
|
|
@@ -48,14 +49,43 @@ export function store(
|
|
|
48
49
|
return await cadVehicleModel.findOneAndUpdate(query, item, options);
|
|
49
50
|
}
|
|
50
51
|
|
|
52
|
+
function isDuplicateKeyError(error: unknown): boolean {
|
|
53
|
+
return _.isObject(error) && (error as { code?: number }).code === 11000;
|
|
54
|
+
}
|
|
55
|
+
|
|
51
56
|
async function updateLocation(item: Partial<Location>, atDate: Date) {
|
|
57
|
+
try {
|
|
58
|
+
await performUpdateLocation(item, atDate);
|
|
59
|
+
} catch (error) {
|
|
60
|
+
if (!isDuplicateKeyError(error)) {
|
|
61
|
+
throw error;
|
|
62
|
+
}
|
|
63
|
+
// A concurrent first-write hit the unique (departmentId, session, device_type)
|
|
64
|
+
// index; the record exists now so we can retry once, so this update goes through.
|
|
65
|
+
await performUpdateLocation(item, atDate);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async function performUpdateLocation(item: Partial<Location>, atDate: Date) {
|
|
52
70
|
// eslint-disable-next-line new-cap
|
|
53
71
|
const modelItem = new locationModel(item);
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
72
|
+
const hasPersonIdentity = (_.isString(modelItem.personnelUUID) && modelItem.personnelUUID !== "") ||
|
|
73
|
+
(_.isString(modelItem.transponderUUID) && modelItem.transponderUUID !== "");
|
|
74
|
+
const isPerson = (modelItem.kindType === LocationKindType.Person || modelItem.locationType === LocationKindType.Person) &&
|
|
75
|
+
hasPersonIdentity;
|
|
76
|
+
// Person records upsert by session (their stable identity key); username is
|
|
77
|
+
// display-only for transponder stuff, so renames must not create new records from updates
|
|
78
|
+
const query = isPerson
|
|
79
|
+
? {
|
|
80
|
+
device_type: modelItem.device_type,
|
|
81
|
+
departmentId: modelItem.departmentId,
|
|
82
|
+
session: modelItem.session
|
|
83
|
+
}
|
|
84
|
+
: {
|
|
85
|
+
device_type: modelItem.device_type,
|
|
86
|
+
departmentId: modelItem.departmentId,
|
|
87
|
+
username: modelItem.username
|
|
88
|
+
};
|
|
59
89
|
debug(`Location.findOne: ${JSON.stringify(query)}`);
|
|
60
90
|
const dbItem = await locationModel.findOne(query).lean().exec() as Partial<LocationObject>;
|
|
61
91
|
const cloneItem = { ...dbItem };
|
|
@@ -95,6 +125,24 @@ export function store(
|
|
|
95
125
|
dbItem.locationGeoJSON = modelItem.locationGeoJSON;
|
|
96
126
|
dbItem.source = modelItem.source;
|
|
97
127
|
dbItem.kindType = modelItem.kindType;
|
|
128
|
+
// Carry person/category fields on the update path; only overwrite when the
|
|
129
|
+
// incoming payload actually provides a value, so sources that don't send
|
|
130
|
+
// these fields don't wipe values written by other sources.
|
|
131
|
+
if (_.isString(modelItem.locationType) && modelItem.locationType !== "") {
|
|
132
|
+
dbItem.locationType = modelItem.locationType;
|
|
133
|
+
}
|
|
134
|
+
if (_.isString(modelItem.kind) && modelItem.kind !== "") {
|
|
135
|
+
dbItem.kind = modelItem.kind;
|
|
136
|
+
}
|
|
137
|
+
if (_.isString(modelItem.type) && modelItem.type !== "") {
|
|
138
|
+
dbItem.type = modelItem.type;
|
|
139
|
+
}
|
|
140
|
+
if (_.isString(modelItem.personnelUUID) && modelItem.personnelUUID !== "") {
|
|
141
|
+
dbItem.personnelUUID = modelItem.personnelUUID;
|
|
142
|
+
}
|
|
143
|
+
if (_.isString(modelItem.transponderUUID) && modelItem.transponderUUID !== "") {
|
|
144
|
+
dbItem.transponderUUID = modelItem.transponderUUID;
|
|
145
|
+
}
|
|
98
146
|
|
|
99
147
|
// Propagate sharedAVL items
|
|
100
148
|
dbItem.opAreaCode = modelItem.opAreaCode;
|
package/src/test/location.ts
CHANGED
|
@@ -150,6 +150,259 @@ describe("location", () => {
|
|
|
150
150
|
assert.equal(locationRecord[0]?.visibility.includes("shared"), true);
|
|
151
151
|
/* cSpell:enable */
|
|
152
152
|
});
|
|
153
|
+
it("applies person invariants on the geotab path, ignoring device mapping", async () => {
|
|
154
|
+
const department = mockDepartment;
|
|
155
|
+
// BEEDOO3 has a device mapping with mapId BOOPBEEP99 and locationToCAD:
|
|
156
|
+
// true; a person payload must not pick either of those up.
|
|
157
|
+
const items = [{
|
|
158
|
+
vehicleId: "BEEDOO3",
|
|
159
|
+
radioName: "Smokey Bear",
|
|
160
|
+
latitude: 34.35264,
|
|
161
|
+
longitude: -119.0669,
|
|
162
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
163
|
+
kindType: "person",
|
|
164
|
+
locationType: "person",
|
|
165
|
+
source: "TXRX",
|
|
166
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
167
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
168
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
169
|
+
username: "Smokey Bear",
|
|
170
|
+
visibility: [],
|
|
171
|
+
}] as unknown as LocationPayload[];
|
|
172
|
+
await location.processItemsDeviceMappingGeotab(department, items, new Date());
|
|
173
|
+
const recs = await models.Location.find({});
|
|
174
|
+
assert.equal(recs.length, 1);
|
|
175
|
+
assert.equal(recs[0]?.username, "Smokey Bear");
|
|
176
|
+
assert.equal(recs[0]?.session, "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
177
|
+
assert.equal(recs[0]?.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
178
|
+
assert.equal(recs[0]?.active, true);
|
|
179
|
+
assert.equal(recs[0]?.shared, false);
|
|
180
|
+
assert.equal(recs[0]?.sendToCAD, false);
|
|
181
|
+
assert.deepEqual(recs[0]?.visibility, ["visible"]);
|
|
182
|
+
});
|
|
183
|
+
it("skips geotab person locations with neither personnelUUID nor transponderUUID", async () => {
|
|
184
|
+
const department = mockDepartment;
|
|
185
|
+
const items = [{
|
|
186
|
+
vehicleId: "BEEDOO3",
|
|
187
|
+
radioName: "Smokey Bear",
|
|
188
|
+
latitude: 34.35264,
|
|
189
|
+
longitude: -119.0669,
|
|
190
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
191
|
+
kindType: "person",
|
|
192
|
+
locationType: "person",
|
|
193
|
+
source: "TXRX",
|
|
194
|
+
visibility: [],
|
|
195
|
+
}] as unknown as LocationPayload[];
|
|
196
|
+
await location.processItemsDeviceMappingGeotab(department, items, new Date());
|
|
197
|
+
const recs = await models.Location.find({});
|
|
198
|
+
assert.equal(recs.length, 0);
|
|
199
|
+
});
|
|
200
|
+
it("saves person locations keyed by session with person invariants, no CAD vehicle", async () => {
|
|
201
|
+
const atDate = new Date();
|
|
202
|
+
const department = mockDepartment;
|
|
203
|
+
const items = [{
|
|
204
|
+
vehicleId: "12345",
|
|
205
|
+
radioName: "SmokeyBear",
|
|
206
|
+
latitude: 34.35264,
|
|
207
|
+
longitude: -119.0669,
|
|
208
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
209
|
+
kindType: "person",
|
|
210
|
+
locationType: "person",
|
|
211
|
+
kind: "",
|
|
212
|
+
type: "",
|
|
213
|
+
source: "TXRX",
|
|
214
|
+
personnelUUID: "11111111-2222-3333-4444-555555555555",
|
|
215
|
+
userId: "TXRX-12345",
|
|
216
|
+
session: "TXRX-12345",
|
|
217
|
+
username: "SmokeyBear",
|
|
218
|
+
visibility: [],
|
|
219
|
+
}] as unknown as LocationPayload[];
|
|
220
|
+
await location.processItems(department, items, atDate);
|
|
221
|
+
const recs = await models.Location.find({});
|
|
222
|
+
assert.equal(recs.length, 1);
|
|
223
|
+
assert.equal(recs[0]?.kindType, "person");
|
|
224
|
+
assert.equal(recs[0]?.locationType, "person");
|
|
225
|
+
assert.equal(recs[0]?.personnelUUID, "11111111-2222-3333-4444-555555555555");
|
|
226
|
+
assert.equal(recs[0]?.transponderUUID, "");
|
|
227
|
+
assert.equal(recs[0]?.username, "SmokeyBear");
|
|
228
|
+
assert.equal(recs[0]?.userId, "TXRX-12345");
|
|
229
|
+
assert.equal(recs[0]?.session, "TXRX-12345");
|
|
230
|
+
assert.equal(recs[0]?.active, true);
|
|
231
|
+
assert.equal(recs[0]?.shared, false);
|
|
232
|
+
assert.equal(recs[0]?.sendToCAD, false);
|
|
233
|
+
assert.deepEqual(recs[0]?.visibility, ["visible"]);
|
|
234
|
+
// Person records must not create phantom CAD vehicles
|
|
235
|
+
const vehicles = await models.CADVehicle.find({});
|
|
236
|
+
assert.equal(vehicles.length, 0);
|
|
237
|
+
});
|
|
238
|
+
it("stamps kindType on person locations classified by locationType alone", async () => {
|
|
239
|
+
const atDate = new Date();
|
|
240
|
+
const department = mockDepartment;
|
|
241
|
+
const items = [{
|
|
242
|
+
vehicleId: "12345",
|
|
243
|
+
radioName: "SmokeyBear",
|
|
244
|
+
latitude: 34.35264,
|
|
245
|
+
longitude: -119.0669,
|
|
246
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
247
|
+
locationType: "person",
|
|
248
|
+
source: "TXRX",
|
|
249
|
+
personnelUUID: "11111111-2222-3333-4444-555555555555",
|
|
250
|
+
userId: "TXRX-12345",
|
|
251
|
+
session: "TXRX-12345",
|
|
252
|
+
username: "SmokeyBear",
|
|
253
|
+
visibility: [],
|
|
254
|
+
}] as unknown as LocationPayload[];
|
|
255
|
+
await location.processItems(department, items, atDate);
|
|
256
|
+
const recs = await models.Location.find({});
|
|
257
|
+
assert.equal(recs.length, 1);
|
|
258
|
+
// The person feed queries kindType: "person", so the record must not
|
|
259
|
+
// rely on the payload having set it
|
|
260
|
+
assert.equal(recs[0]?.kindType, "person");
|
|
261
|
+
assert.equal(recs[0]?.locationType, "person");
|
|
262
|
+
assert.equal(recs[0]?.personnelUUID, "11111111-2222-3333-4444-555555555555");
|
|
263
|
+
const vehicles = await models.CADVehicle.find({});
|
|
264
|
+
assert.equal(vehicles.length, 0);
|
|
265
|
+
});
|
|
266
|
+
it("accepts transponder person locations on transponderUUID alone", async () => {
|
|
267
|
+
const atDate = new Date();
|
|
268
|
+
const department = mockDepartment;
|
|
269
|
+
const items = [{
|
|
270
|
+
vehicleId: "FB:9D:2C:3E:C9:E4",
|
|
271
|
+
radioName: "Fire Hose 1",
|
|
272
|
+
latitude: 34.35264,
|
|
273
|
+
longitude: -119.0669,
|
|
274
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
275
|
+
kindType: "person",
|
|
276
|
+
locationType: "person",
|
|
277
|
+
source: "TXRX",
|
|
278
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
279
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
280
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
281
|
+
username: "Fire Hose 1",
|
|
282
|
+
visibility: [],
|
|
283
|
+
}] as unknown as LocationPayload[];
|
|
284
|
+
await location.processItems(department, items, atDate);
|
|
285
|
+
const recs = await models.Location.find({});
|
|
286
|
+
assert.equal(recs.length, 1);
|
|
287
|
+
assert.equal(recs[0]?.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
288
|
+
assert.equal(recs[0]?.personnelUUID, "");
|
|
289
|
+
assert.equal(recs[0]?.session, "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
290
|
+
assert.equal(recs[0]?.active, true);
|
|
291
|
+
assert.equal(recs[0]?.shared, false);
|
|
292
|
+
assert.equal(recs[0]?.sendToCAD, false);
|
|
293
|
+
assert.deepEqual(recs[0]?.visibility, ["visible"]);
|
|
294
|
+
// Person records must not create phantom CAD vehicles
|
|
295
|
+
const vehicles = await models.CADVehicle.find({});
|
|
296
|
+
assert.equal(vehicles.length, 0);
|
|
297
|
+
});
|
|
298
|
+
it("updates person locations in place on rename, preserving person fields", async () => {
|
|
299
|
+
const department = mockDepartment;
|
|
300
|
+
const base = {
|
|
301
|
+
vehicleId: "FB:9D:2C:3E:C9:E4",
|
|
302
|
+
radioName: "William Jones",
|
|
303
|
+
latitude: 34.35264,
|
|
304
|
+
longitude: -119.0669,
|
|
305
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
306
|
+
kindType: "person",
|
|
307
|
+
locationType: "person",
|
|
308
|
+
source: "TXRX",
|
|
309
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
310
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
311
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
312
|
+
username: "William Jones",
|
|
313
|
+
visibility: [],
|
|
314
|
+
};
|
|
315
|
+
await location.processItems(department, [base] as unknown as LocationPayload[], new Date());
|
|
316
|
+
const renamed = {
|
|
317
|
+
...base,
|
|
318
|
+
radioName: "Bill Jones",
|
|
319
|
+
username: "Bill Jones",
|
|
320
|
+
latitude: 34.4,
|
|
321
|
+
};
|
|
322
|
+
await location.processItems(department, [renamed] as unknown as LocationPayload[], new Date());
|
|
323
|
+
const recs = await models.Location.find({});
|
|
324
|
+
assert.equal(recs.length, 1);
|
|
325
|
+
assert.equal(recs[0]?.username, "Bill Jones");
|
|
326
|
+
assert.equal(recs[0]?.session, "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
327
|
+
assert.equal(recs[0]?.locationGeoJSON.coordinates[1], 34.4);
|
|
328
|
+
// Update path must preserve the person fields
|
|
329
|
+
assert.equal(recs[0]?.kindType, "person");
|
|
330
|
+
assert.equal(recs[0]?.locationType, "person");
|
|
331
|
+
assert.equal(recs[0]?.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
332
|
+
assert.deepEqual(recs[0]?.visibility, ["visible"]);
|
|
333
|
+
});
|
|
334
|
+
it("does not wipe transponderUUID when an update omits it", async () => {
|
|
335
|
+
const department = mockDepartment;
|
|
336
|
+
const base = {
|
|
337
|
+
vehicleId: "FB:9D:2C:3E:C9:E4",
|
|
338
|
+
radioName: "Fire Hose 1",
|
|
339
|
+
latitude: 34.35264,
|
|
340
|
+
longitude: -119.0669,
|
|
341
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
342
|
+
kindType: "person",
|
|
343
|
+
locationType: "person",
|
|
344
|
+
source: "TXRX",
|
|
345
|
+
transponderUUID: "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
346
|
+
userId: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
347
|
+
session: "TXRX-aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee",
|
|
348
|
+
username: "Fire Hose 1",
|
|
349
|
+
visibility: [],
|
|
350
|
+
};
|
|
351
|
+
await location.processItems(department, [base] as unknown as LocationPayload[], new Date());
|
|
352
|
+
// Same session, but this update carries only a personnelUUID
|
|
353
|
+
const update = {
|
|
354
|
+
...base,
|
|
355
|
+
transponderUUID: "",
|
|
356
|
+
personnelUUID: "11111111-2222-3333-4444-555555555555",
|
|
357
|
+
latitude: 34.4,
|
|
358
|
+
};
|
|
359
|
+
await location.processItems(department, [update] as unknown as LocationPayload[], new Date());
|
|
360
|
+
const recs = await models.Location.find({});
|
|
361
|
+
assert.equal(recs.length, 1);
|
|
362
|
+
assert.equal(recs[0]?.transponderUUID, "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
|
|
363
|
+
assert.equal(recs[0]?.personnelUUID, "11111111-2222-3333-4444-555555555555");
|
|
364
|
+
assert.equal(recs[0]?.locationGeoJSON.coordinates[1], 34.4);
|
|
365
|
+
});
|
|
366
|
+
it("skips person locations with neither personnelUUID nor transponderUUID", async () => {
|
|
367
|
+
const department = mockDepartment;
|
|
368
|
+
const items = [{
|
|
369
|
+
vehicleId: "12345",
|
|
370
|
+
radioName: "William Jones",
|
|
371
|
+
latitude: 34.35264,
|
|
372
|
+
longitude: -119.0669,
|
|
373
|
+
avlTime: "2026-07-10T15:43:36.816Z",
|
|
374
|
+
kindType: "person",
|
|
375
|
+
locationType: "person",
|
|
376
|
+
source: "TXRX",
|
|
377
|
+
session: "TXRX-12345",
|
|
378
|
+
visibility: [],
|
|
379
|
+
}] as unknown as LocationPayload[];
|
|
380
|
+
await location.processItems(department, items, new Date());
|
|
381
|
+
const recs = await models.Location.find({});
|
|
382
|
+
assert.equal(recs.length, 0);
|
|
383
|
+
const vehicles = await models.CADVehicle.find({});
|
|
384
|
+
assert.equal(vehicles.length, 0);
|
|
385
|
+
});
|
|
386
|
+
it("continues processing the batch after an invalid item", async () => {
|
|
387
|
+
const department = mockDepartment;
|
|
388
|
+
const items = [{
|
|
389
|
+
vehicleId: "",
|
|
390
|
+
radioName: "",
|
|
391
|
+
latitude: 0,
|
|
392
|
+
longitude: 0,
|
|
393
|
+
avlTime: "1602563494",
|
|
394
|
+
}, {
|
|
395
|
+
vehicleId: "BEEDOO1",
|
|
396
|
+
radioName: "BEEDOO1",
|
|
397
|
+
latitude: 34.35264,
|
|
398
|
+
longitude: -119.0669,
|
|
399
|
+
avlTime: "1602563494",
|
|
400
|
+
}] as unknown as LocationPayload[];
|
|
401
|
+
await location.processItems(department, items, new Date());
|
|
402
|
+
const recs = await models.Location.find({});
|
|
403
|
+
assert.equal(recs.length, 1);
|
|
404
|
+
assert.equal(recs[0]?.username, "BEEDOO1");
|
|
405
|
+
});
|
|
153
406
|
it("carries kind/type/locationType/kindColor onto the saved Location", async () => {
|
|
154
407
|
const atDate = new Date();
|
|
155
408
|
const department = mockDepartment;
|
package/src/types.ts
CHANGED
|
@@ -27,6 +27,21 @@ export interface LocationPayload {
|
|
|
27
27
|
heading?: number;
|
|
28
28
|
vehicleId: string;
|
|
29
29
|
visibility: LocationVisibility[];
|
|
30
|
+
// Person records: link to PersonnelKnown.uuid. A person Location needs a
|
|
31
|
+
// non-empty personnelUUID or transponderUUID with both empty it would leak
|
|
32
|
+
// into the vehicle sync endpoints (filters on personnelUUID: "").
|
|
33
|
+
personnelUUID?: string;
|
|
34
|
+
// TrackerResponder.uuid for transponder-tracked seats; who occupies the seat
|
|
35
|
+
// is resolved at read time from the responder's assignment, personnelUUID
|
|
36
|
+
// stays empty on these records.
|
|
37
|
+
transponderUUID?: string;
|
|
38
|
+
// Identity overrides. When set, these replace the derived radioName-vehicleId
|
|
39
|
+
// identity so display-name changes don't fork records (e.g. "TXRX-<uuid>").
|
|
40
|
+
// Caused because up to this point these were derived/generated and changing
|
|
41
|
+
// would then change the record and break lookups causing a new record.
|
|
42
|
+
userId?: string;
|
|
43
|
+
session?: string;
|
|
44
|
+
username?: string;
|
|
30
45
|
}
|
|
31
46
|
|
|
32
47
|
export interface Vehicle {
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2023 Tablet Command, Inc.
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|