tabletcommand-location 2.3.8 → 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 CHANGED
@@ -36,7 +36,20 @@ function location(store) {
36
36
  movedAtUnix = cadUnixTime;
37
37
  }
38
38
  }
39
- const userId = `${item.radioName}-${item.vehicleId}`; // Fake user id radioName - vehicleId
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: item.radioName,
86
+ username,
73
87
  userId,
74
88
  departmentId: String(department._id),
75
- session: userId,
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
- return;
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
- return;
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;
@@ -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 query = {
42
- device_type: modelItem.device_type,
43
- departmentId: modelItem.departmentId,
44
- username: modelItem.username
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;
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -12,6 +12,8 @@
12
12
  "apikey",
13
13
  "backend",
14
14
  "bamse",
15
+ "BEEDOO",
16
+ "BOOPBEEP",
15
17
  "devops",
16
18
  "dmon",
17
19
  "expireat",
@@ -31,6 +33,7 @@
31
33
  "Somewear",
32
34
  "stacktraces",
33
35
  "tabletcommand",
36
+ "TXRX",
34
37
  "tyrion",
35
38
  "unixtime",
36
39
  "Ursache",
@@ -1 +1 @@
1
- {"version":3,"file":"location.d.ts","sourceRoot":"","sources":["../src/location.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EAIX,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;2BAmIL,eAAe,cAAc,OAAO,CAAC,UAAU,CAAC,UAAU,IAAI;;;;;;;;;;;;;;;;;;;;;;+BAsB1D,OAAO,CAAC,UAAU,CAAC,SAAS,eAAe,EAAE,UAAU,IAAI;kDA+BxC,OAAO,CAAC,UAAU,CAAC,SAAS,eAAe,EAAE,UAAU,IAAI;EAoDvH;AAED,eAAe,QAAQ,CAAC;AACxB,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,QAAQ,CAAC,CAAC"}
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,EACR,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;;;;;2BAaxC,OAAO,CAAC,QAAQ,CAAC,UAAU,IAAI;EAqGpE;AACD,eAAe,KAAK,CAAC;AACrB,MAAM,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,KAAK,CAAC,CAAC"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAsD5B,aAAa;yBAIT,OAAO,QAAQ;EAgB1C"}
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"}
@@ -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;CAClC;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"}
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.8",
3
+ "version": "2.4.0",
4
4
  "description": "Tablet Command Location",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -14,7 +14,7 @@
14
14
  "dependencies": {
15
15
  "debug": "^4.4.3",
16
16
  "lodash": "~4.18.1",
17
- "tabletcommand-backend-models": "~7.4.95"
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
- const userId = `${item.radioName}-${item.vehicleId}`; // Fake user id radioName - vehicleId
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: item.radioName,
104
+ username,
90
105
  userId,
91
106
  departmentId: String(department._id),
92
- session: userId,
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
- return;
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
- return;
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 query = {
55
- device_type: modelItem.device_type,
56
- departmentId: modelItem.departmentId,
57
- username: modelItem.username
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;
@@ -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 {