tabletcommand-location 2.4.1 → 2.4.3

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.
Files changed (65) hide show
  1. package/.claude/worktrees/sc-36275/.buildkite/pipeline.yml +5 -0
  2. package/.claude/worktrees/sc-36275/README.md +3 -0
  3. package/.claude/worktrees/sc-36275/build/audience.js +38 -0
  4. package/.claude/worktrees/sc-36275/build/audience.js.map +1 -0
  5. package/.claude/worktrees/sc-36275/build/index.js +95 -0
  6. package/.claude/worktrees/sc-36275/build/index.js.map +1 -0
  7. package/.claude/worktrees/sc-36275/build/location.js +278 -0
  8. package/.claude/worktrees/sc-36275/build/location.js.map +1 -0
  9. package/.claude/worktrees/sc-36275/build/query.js +378 -0
  10. package/.claude/worktrees/sc-36275/build/query.js.map +1 -0
  11. package/.claude/worktrees/sc-36275/build/store.js +182 -0
  12. package/.claude/worktrees/sc-36275/build/store.js.map +1 -0
  13. package/.claude/worktrees/sc-36275/build/test/location.js +522 -0
  14. package/.claude/worktrees/sc-36275/build/test/location.js.map +1 -0
  15. package/.claude/worktrees/sc-36275/build/test/mock.js +165 -0
  16. package/.claude/worktrees/sc-36275/build/test/mock.js.map +1 -0
  17. package/.claude/worktrees/sc-36275/build/test/query.js +174 -0
  18. package/.claude/worktrees/sc-36275/build/test/query.js.map +1 -0
  19. package/.claude/worktrees/sc-36275/build/types.js +8 -0
  20. package/.claude/worktrees/sc-36275/build/types.js.map +1 -0
  21. package/.claude/worktrees/sc-36275/cspell.json +64 -0
  22. package/.claude/worktrees/sc-36275/definitions/audience.d.ts +18 -0
  23. package/.claude/worktrees/sc-36275/definitions/audience.d.ts.map +1 -0
  24. package/.claude/worktrees/sc-36275/definitions/index.d.ts +11 -0
  25. package/.claude/worktrees/sc-36275/definitions/index.d.ts.map +1 -0
  26. package/.claude/worktrees/sc-36275/definitions/location.d.ts +32 -0
  27. package/.claude/worktrees/sc-36275/definitions/location.d.ts.map +1 -0
  28. package/.claude/worktrees/sc-36275/definitions/query.d.ts +36 -0
  29. package/.claude/worktrees/sc-36275/definitions/query.d.ts.map +1 -0
  30. package/.claude/worktrees/sc-36275/definitions/store.d.ts +64 -0
  31. package/.claude/worktrees/sc-36275/definitions/store.d.ts.map +1 -0
  32. package/.claude/worktrees/sc-36275/definitions/test/location.d.ts +2 -0
  33. package/.claude/worktrees/sc-36275/definitions/test/location.d.ts.map +1 -0
  34. package/.claude/worktrees/sc-36275/definitions/test/mock.d.ts +346 -0
  35. package/.claude/worktrees/sc-36275/definitions/test/mock.d.ts.map +1 -0
  36. package/.claude/worktrees/sc-36275/definitions/test/query.d.ts +2 -0
  37. package/.claude/worktrees/sc-36275/definitions/test/query.d.ts.map +1 -0
  38. package/.claude/worktrees/sc-36275/definitions/types.d.ts +53 -0
  39. package/.claude/worktrees/sc-36275/definitions/types.d.ts.map +1 -0
  40. package/.claude/worktrees/sc-36275/eslint.config.mjs +95 -0
  41. package/.claude/worktrees/sc-36275/gulpfile.js +23 -0
  42. package/.claude/worktrees/sc-36275/package-lock.json +9404 -0
  43. package/.claude/worktrees/sc-36275/package.json +54 -0
  44. package/.claude/worktrees/sc-36275/src/audience.ts +54 -0
  45. package/.claude/worktrees/sc-36275/src/index.ts +81 -0
  46. package/.claude/worktrees/sc-36275/src/location.ts +315 -0
  47. package/.claude/worktrees/sc-36275/src/query.ts +497 -0
  48. package/.claude/worktrees/sc-36275/src/store.ts +204 -0
  49. package/.claude/worktrees/sc-36275/src/test/location.ts +485 -0
  50. package/.claude/worktrees/sc-36275/src/test/mock.ts +186 -0
  51. package/.claude/worktrees/sc-36275/src/test/query.ts +209 -0
  52. package/.claude/worktrees/sc-36275/src/tsconfig.json +30 -0
  53. package/.claude/worktrees/sc-36275/src/types.ts +74 -0
  54. package/.claude/worktrees/sc-36275/test.sh +32 -0
  55. package/build/query.js +6 -1
  56. package/build/query.js.map +1 -1
  57. package/build/test/query.js +2 -2
  58. package/build/test/query.js.map +1 -1
  59. package/cspell.json +1 -0
  60. package/definitions/query.d.ts.map +1 -1
  61. package/definitions/test/mock.d.ts +5 -0
  62. package/definitions/test/mock.d.ts.map +1 -1
  63. package/package.json +7 -7
  64. package/src/query.ts +6 -1
  65. package/src/test/query.ts +2 -2
@@ -0,0 +1,5 @@
1
+ steps:
2
+ - command: "bash test.sh"
3
+ label: ":hammer: Test"
4
+ env:
5
+ NODE_TEST_DATABASE: "massive-test-location"
@@ -0,0 +1,3 @@
1
+ # tabletcommand-location
2
+
3
+ Extract computing location records to a separate package.
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AVL_AUDIENCE_MATRIX = void 0;
4
+ const tabletcommand_backend_models_1 = require("tabletcommand-backend-models");
5
+ const ALWAYS = { kind: "always" };
6
+ // eslint-ignore-next-line
7
+ // const GEO: AvlAudienceEntry = { kind: "geo" };
8
+ const DENY = null;
9
+ const NEAR = { kind: "near", area: { radiusMeters: 5000 } }; // 5km ~ 3.1mi
10
+ exports.AVL_AUDIENCE_MATRIX = {
11
+ // owner => reader
12
+ [tabletcommand_backend_models_1.AccountIndustry.Fire]: {
13
+ [tabletcommand_backend_models_1.AccountIndustry.Fire]: ALWAYS,
14
+ [tabletcommand_backend_models_1.AccountIndustry.Law]: ALWAYS,
15
+ [tabletcommand_backend_models_1.AccountIndustry.Campus]: DENY,
16
+ [tabletcommand_backend_models_1.AccountIndustry.Utility]: NEAR,
17
+ },
18
+ [tabletcommand_backend_models_1.AccountIndustry.Law]: {
19
+ [tabletcommand_backend_models_1.AccountIndustry.Fire]: NEAR,
20
+ [tabletcommand_backend_models_1.AccountIndustry.Law]: ALWAYS,
21
+ [tabletcommand_backend_models_1.AccountIndustry.Campus]: DENY,
22
+ [tabletcommand_backend_models_1.AccountIndustry.Utility]: DENY,
23
+ },
24
+ [tabletcommand_backend_models_1.AccountIndustry.Campus]: {
25
+ [tabletcommand_backend_models_1.AccountIndustry.Fire]: ALWAYS,
26
+ [tabletcommand_backend_models_1.AccountIndustry.Law]: ALWAYS,
27
+ [tabletcommand_backend_models_1.AccountIndustry.Campus]: DENY, // deliberate — see above
28
+ [tabletcommand_backend_models_1.AccountIndustry.Utility]: DENY,
29
+ },
30
+ [tabletcommand_backend_models_1.AccountIndustry.Utility]: {
31
+ [tabletcommand_backend_models_1.AccountIndustry.Fire]: NEAR,
32
+ [tabletcommand_backend_models_1.AccountIndustry.Law]: DENY,
33
+ [tabletcommand_backend_models_1.AccountIndustry.Campus]: DENY,
34
+ [tabletcommand_backend_models_1.AccountIndustry.Utility]: ALWAYS,
35
+ },
36
+ };
37
+ // Unused/Incomplete
38
+ //# sourceMappingURL=audience.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audience.js","sourceRoot":"","sources":["../src/audience.ts"],"names":[],"mappings":";;;AAAA,+EAEsC;AAiBtC,MAAM,MAAM,GAAqB,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AACpD,0BAA0B;AAC1B,iDAAiD;AACjD,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,MAAM,IAAI,GAAqB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,cAAc;AAEhF,QAAA,mBAAmB,GAAsB;IACpD,mBAAmB;IACnB,CAAC,8CAAe,CAAC,IAAI,CAAC,EAAE;QACtB,CAAC,8CAAe,CAAC,IAAI,CAAC,EAAE,MAAM;QAC9B,CAAC,8CAAe,CAAC,GAAG,CAAC,EAAE,MAAM;QAC7B,CAAC,8CAAe,CAAC,MAAM,CAAC,EAAE,IAAI;QAC9B,CAAC,8CAAe,CAAC,OAAO,CAAC,EAAE,IAAI;KAChC;IACD,CAAC,8CAAe,CAAC,GAAG,CAAC,EAAE;QACrB,CAAC,8CAAe,CAAC,IAAI,CAAC,EAAE,IAAI;QAC5B,CAAC,8CAAe,CAAC,GAAG,CAAC,EAAE,MAAM;QAC7B,CAAC,8CAAe,CAAC,MAAM,CAAC,EAAE,IAAI;QAC9B,CAAC,8CAAe,CAAC,OAAO,CAAC,EAAE,IAAI;KAChC;IACD,CAAC,8CAAe,CAAC,MAAM,CAAC,EAAE;QACxB,CAAC,8CAAe,CAAC,IAAI,CAAC,EAAE,MAAM;QAC9B,CAAC,8CAAe,CAAC,GAAG,CAAC,EAAE,MAAM;QAC7B,CAAC,8CAAe,CAAC,MAAM,CAAC,EAAE,IAAI,EAAI,yBAAyB;QAC3D,CAAC,8CAAe,CAAC,OAAO,CAAC,EAAE,IAAI;KAChC;IACD,CAAC,8CAAe,CAAC,OAAO,CAAC,EAAE;QACzB,CAAC,8CAAe,CAAC,IAAI,CAAC,EAAE,IAAI;QAC5B,CAAC,8CAAe,CAAC,GAAG,CAAC,EAAE,IAAI;QAC3B,CAAC,8CAAe,CAAC,MAAM,CAAC,EAAE,IAAI;QAC9B,CAAC,8CAAe,CAAC,OAAO,CAAC,EAAE,MAAM;KAClC;CACF,CAAC;AAEF,oBAAoB"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.query = exports.LocationVisibility = exports.LocationSource = exports.LocationKindType = void 0;
40
+ exports.lib = lib;
41
+ const location_1 = __importDefault(require("./location"));
42
+ const store_1 = __importDefault(require("./store"));
43
+ const lodash_1 = __importDefault(require("lodash"));
44
+ const types_1 = require("./types");
45
+ Object.defineProperty(exports, "LocationKindType", { enumerable: true, get: function () { return types_1.LocationKindType; } });
46
+ Object.defineProperty(exports, "LocationSource", { enumerable: true, get: function () { return types_1.LocationSource; } });
47
+ Object.defineProperty(exports, "LocationVisibility", { enumerable: true, get: function () { return types_1.LocationVisibility; } });
48
+ // When used externally
49
+ // import { query } from "tabletcommand-location";
50
+ // query.adminListLocations({ departmentId, movedAt });
51
+ exports.query = __importStar(require("./query"));
52
+ function lib(departmentModel, locationModel, cadVehicleModel, deviceMappingModel) {
53
+ const store = (0, store_1.default)(departmentModel, locationModel, cadVehicleModel, deviceMappingModel);
54
+ const location = (0, location_1.default)(store);
55
+ async function processLocations(department, items) {
56
+ const atDate = new Date();
57
+ try {
58
+ if (lodash_1.default.isUndefined(items) || lodash_1.default.isNull(items)) {
59
+ return [];
60
+ }
61
+ if (lodash_1.default.isObject(items) && !lodash_1.default.isArray(items)) {
62
+ items = [items];
63
+ }
64
+ const result = await location.processItems(department, items, atDate);
65
+ return result;
66
+ }
67
+ catch (err) {
68
+ console.log("err processLocations: ", err);
69
+ throw err;
70
+ }
71
+ }
72
+ async function processLocationsDeviceMapping(department, items) {
73
+ const atDate = new Date();
74
+ try {
75
+ if (lodash_1.default.isUndefined(items) || lodash_1.default.isNull(items)) {
76
+ return [];
77
+ }
78
+ if (lodash_1.default.isObject(items) && !lodash_1.default.isArray(items)) {
79
+ items = [items];
80
+ }
81
+ const result = await location.processItemsDeviceMappingGeotab(department, items, atDate);
82
+ return result;
83
+ }
84
+ catch (err) {
85
+ console.log("err processLocations: ", err);
86
+ throw err;
87
+ }
88
+ }
89
+ return {
90
+ processLocations,
91
+ processLocationsDeviceMapping,
92
+ };
93
+ }
94
+ exports.default = lib;
95
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,kBA+CC;AA7ED,0DAAwC;AACxC,oDAAkC;AAQlC,oDAAuB;AACvB,mCAKiB;AAIf,iGARA,wBAAgB,OAQA;AAEhB,+FARA,sBAAc,OAQA;AACd,mGARA,0BAAkB,OAQA;AAGpB,uBAAuB;AACvB,kDAAkD;AAClD,uDAAuD;AACvD,iDAAiC;AAEjC,SAAgB,GAAG,CACjB,eAAgC,EAChC,aAA4B,EAC5B,eAAgC,EAChC,kBAAsC;IAEtC,MAAM,KAAK,GAAG,IAAA,eAAW,EAAC,eAAe,EAAE,aAAa,EAAE,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,IAAA,kBAAc,EAAC,KAAK,CAAC,CAAC;IAEvC,KAAK,UAAU,gBAAgB,CAAC,UAA+B,EAAE,KAA2C;QAC1G,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,gBAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,gBAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,IAAI,gBAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,UAAU,6BAA6B,CAAC,UAA+B,EAAE,KAA2C;QACvH,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,IAAI,gBAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,gBAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5C,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,IAAI,gBAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,+BAA+B,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACzF,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;YAC3C,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,OAAO;QACL,gBAAgB;QAChB,6BAA6B;KAC9B,CAAC;AACJ,CAAC;AAED,kBAAe,GAAG,CAAC"}
@@ -0,0 +1,278 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.location = location;
7
+ const lodash_1 = __importDefault(require("lodash"));
8
+ const tabletcommand_backend_models_1 = require("tabletcommand-backend-models");
9
+ const debug_1 = __importDefault(require("debug"));
10
+ function location(store) {
11
+ const debug = (0, debug_1.default)("tabletcommand-location:location");
12
+ function decodeLocation(item, department, atDate, deviceType) {
13
+ var _a;
14
+ let latitude = 0;
15
+ let longitude = 0;
16
+ if (lodash_1.default.isFinite(parseFloat(item.latitude.toString()))) {
17
+ latitude = parseFloat(item.latitude.toString());
18
+ }
19
+ if (lodash_1.default.isFinite(parseFloat(item.longitude.toString()))) {
20
+ longitude = parseFloat(item.longitude.toString());
21
+ }
22
+ if (!lodash_1.default.isString(item.radioName)) {
23
+ item.radioName = "";
24
+ }
25
+ if (!lodash_1.default.isString(item.vehicleId)) {
26
+ item.vehicleId = "";
27
+ }
28
+ const now = atDate.valueOf() / 1000.0;
29
+ // Don't save provided AVL time if it's more than 30s in the future
30
+ const futureTimeLimit = now + 30;
31
+ // If present, replace the modified unix date with the one provided by the CAD
32
+ let movedAtUnix = now;
33
+ if (lodash_1.default.isString(item.avlTime) && lodash_1.default.trim(item.avlTime) !== "") {
34
+ const checkISODate = (new Date(item.avlTime).valueOf()) / 1000.0;
35
+ const cadUnixTime = lodash_1.default.isNaN(checkISODate) && lodash_1.default.isString(item.avlTime) ? parseFloat(item.avlTime) : checkISODate;
36
+ if (lodash_1.default.isFinite(cadUnixTime) && cadUnixTime <= futureTimeLimit) {
37
+ movedAtUnix = cadUnixTime;
38
+ }
39
+ }
40
+ // Originally always was this fake id, but now can override these values
41
+ // If overridden then we use the values on the record instead of the fake userId
42
+ let userId = `${item.radioName}-${item.vehicleId}`; // Fake user id radioName - vehicleId
43
+ if (lodash_1.default.isString(item.userId) && lodash_1.default.trim(item.userId) !== "") {
44
+ userId = item.userId;
45
+ }
46
+ let session = userId;
47
+ if (lodash_1.default.isString(item.session) && lodash_1.default.trim(item.session) !== "") {
48
+ session = item.session;
49
+ }
50
+ let username = item.radioName;
51
+ if (lodash_1.default.isString(item.username) && lodash_1.default.trim(item.username) !== "") {
52
+ username = item.username;
53
+ }
54
+ let sharingEnabled = false;
55
+ let opAreaName = "";
56
+ let opAreaCode = "";
57
+ let deptState = "";
58
+ let locationStaleMinutes = 31 * 24 * 60; // 31d
59
+ if (lodash_1.default.isObject(department) && lodash_1.default.isObject(department.shareAVL)) {
60
+ sharingEnabled = department.shareAVL.enabled && department.accountType === "production";
61
+ opAreaName = department.shareAVL.opAreaName || "";
62
+ opAreaCode = department.shareAVL.opAreaCode || "";
63
+ }
64
+ if (lodash_1.default.isObject(department)) {
65
+ if (lodash_1.default.isObject(department.addressDetails) && lodash_1.default.isString(department.addressDetails.state)) {
66
+ deptState = department.addressDetails.state || "";
67
+ }
68
+ if (lodash_1.default.isNumber(department.locationStaleMinutes) && lodash_1.default.isFinite(department.locationStaleMinutes) && department.locationStaleMinutes > 0) {
69
+ locationStaleMinutes = department.locationStaleMinutes;
70
+ }
71
+ }
72
+ const deleteAfterDate = new Date(atDate.valueOf() + 1000 * 60 * locationStaleMinutes);
73
+ const personnelUUID = lodash_1.default.isString(item.personnelUUID) ? item.personnelUUID : "";
74
+ const transponderUUID = lodash_1.default.isString(item.transponderUUID) ? item.transponderUUID : "";
75
+ const industry = (_a = department === null || department === void 0 ? void 0 : department.industry) !== null && _a !== void 0 ? _a : tabletcommand_backend_models_1.AccountIndustry.Fire; // If not set, fallback to fire
76
+ const cadAVL = {
77
+ device_type: deviceType,
78
+ source: item.source,
79
+ kindType: item.kindType,
80
+ locationGeoJSON: {
81
+ type: "Point",
82
+ coordinates: [longitude, latitude]
83
+ },
84
+ deleteAfterDate,
85
+ modified: atDate,
86
+ movedAt: new Date(movedAtUnix * 1000),
87
+ active: true,
88
+ username,
89
+ userId,
90
+ departmentId: String(department._id),
91
+ session,
92
+ version: 2,
93
+ shared: sharingEnabled,
94
+ sendToCAD: false,
95
+ opAreaName,
96
+ opAreaCode,
97
+ state: deptState,
98
+ visibility: [], // will be updated after .active is set
99
+ personnelUUID,
100
+ transponderUUID,
101
+ industry,
102
+ };
103
+ if (lodash_1.default.isNumber(item.speed)) {
104
+ const speed = item.speed;
105
+ cadAVL.speed = speed;
106
+ }
107
+ if (lodash_1.default.isNumber(item.heading) && item.heading >= 0 && item.heading <= 360) {
108
+ const heading = item.heading;
109
+ cadAVL.heading = heading;
110
+ }
111
+ if (lodash_1.default.isNumber(item.altitude)) {
112
+ const altitude = item.altitude;
113
+ cadAVL.altitude = altitude;
114
+ }
115
+ if (lodash_1.default.isString(item.kind)) {
116
+ cadAVL.kind = item.kind;
117
+ }
118
+ if (lodash_1.default.isString(item.type)) {
119
+ cadAVL.type = item.type;
120
+ }
121
+ if (lodash_1.default.isString(item.locationType)) {
122
+ cadAVL.locationType = item.locationType;
123
+ }
124
+ if (lodash_1.default.isObject(item.kindColor) &&
125
+ lodash_1.default.isString(item.kindColor.background) && item.kindColor.background !== "" &&
126
+ lodash_1.default.isString(item.kindColor.text) && item.kindColor.text !== "") {
127
+ cadAVL.kindColor = item.kindColor;
128
+ cadAVL.kindColorChangedAt = atDate;
129
+ }
130
+ const hasCoordinate = Math.abs(latitude) > 0.01 || Math.abs(longitude) > 0.01;
131
+ const validCoordinate = Math.abs(latitude) < 90 && Math.abs(longitude) < 180;
132
+ const hasVehicle = lodash_1.default.isString(item.vehicleId) && lodash_1.default.trim(item.vehicleId).length > 0;
133
+ const hasRadioName = lodash_1.default.isString(item.radioName) && lodash_1.default.trim(item.radioName).length > 0;
134
+ const isValid = hasCoordinate && validCoordinate && (hasVehicle || hasRadioName);
135
+ return {
136
+ cadAVL,
137
+ isValid,
138
+ };
139
+ }
140
+ async function processVehicle(item, department, atDate) {
141
+ const departmentId = String(department._id);
142
+ // need function to validate the item (As concerns vehicleId and radioName)
143
+ const isBidirectionalException = department.cadBidirectionalException || false;
144
+ // Determine if vehicle is active or not
145
+ const cadItem = await store.getVehicle(item, departmentId);
146
+ if (!lodash_1.default.isObject(cadItem) &&
147
+ department.cadOneWayVehiclesEnabled &&
148
+ (department.cadBidirectionalEnabled !== true || isBidirectionalException)) {
149
+ const vehicleItem = {
150
+ departmentId,
151
+ modifiedDate: atDate.valueOf() / 1000.0,
152
+ modified: atDate,
153
+ radioName: item.radioName,
154
+ vehicleId: item.vehicleId,
155
+ source: item.source,
156
+ };
157
+ await store.updateVehicle(vehicleItem, departmentId);
158
+ }
159
+ return cadItem;
160
+ }
161
+ // Returns true when the item is a person location and was fully handled here
162
+ // Returns false if trying to handle vehicle item
163
+ async function processPersonItem(decoded, item, atDate) {
164
+ const isPerson = decoded.cadAVL.kindType === tabletcommand_backend_models_1.LocationKindType.Person ||
165
+ decoded.cadAVL.locationType === tabletcommand_backend_models_1.LocationKindType.Person;
166
+ if (!isPerson) {
167
+ return false;
168
+ }
169
+ const hasPersonnelUUID = lodash_1.default.isString(decoded.cadAVL.personnelUUID) && decoded.cadAVL.personnelUUID !== "";
170
+ const hasTransponderUUID = lodash_1.default.isString(decoded.cadAVL.transponderUUID) && decoded.cadAVL.transponderUUID !== "";
171
+ if (!hasPersonnelUUID && !hasTransponderUUID) {
172
+ // A person Location with neither personnelUUID nor transponderUUID
173
+ // would leak into the vehicle sync endpoints (they filter on
174
+ // personnelUUID: "") so to process person must have one or other
175
+ debug(`skipping person location without personnelUUID/transponderUUID: ${JSON.stringify(item)}`);
176
+ return true;
177
+ }
178
+ // Person records: no CAD vehicle, always active/visible, never shared or CAD.
179
+ // Stamp kindType so records classified by locationType alone still match
180
+ // the person feed query (kindType: "person")
181
+ decoded.cadAVL.kindType = tabletcommand_backend_models_1.LocationKindType.Person;
182
+ decoded.cadAVL.active = true;
183
+ decoded.cadAVL.shared = false;
184
+ decoded.cadAVL.sendToCAD = false;
185
+ decoded.cadAVL.visibility = [tabletcommand_backend_models_1.LocationVisibility.Visible];
186
+ await store.updateLocation(decoded.cadAVL, atDate);
187
+ return true;
188
+ }
189
+ async function processItems(department, items, atDate) {
190
+ for (const item of items) {
191
+ const decoded = decodeLocation(item, department, atDate, "cad");
192
+ debug(`processCADVehicleLocation item: ${JSON.stringify(item)} d:${JSON.stringify(department)} at: ${atDate.toISOString()}.`);
193
+ if (!decoded.isValid) {
194
+ // Skip only the invalid item, not the rest of the batch
195
+ continue;
196
+ }
197
+ if (await processPersonItem(decoded, item, atDate)) {
198
+ continue;
199
+ }
200
+ let active = true;
201
+ const cadItem = await processVehicle(item, department, atDate);
202
+ if (lodash_1.default.isObject(cadItem)) {
203
+ if (lodash_1.default.isBoolean(cadItem.mapHidden)) {
204
+ active = !cadItem.mapHidden;
205
+ }
206
+ }
207
+ // TODO: add support for location .kindType
208
+ decoded.cadAVL.active = active;
209
+ // Calculate .visibility after .active is set
210
+ const visibility = [
211
+ active ? tabletcommand_backend_models_1.LocationVisibility.Visible : tabletcommand_backend_models_1.LocationVisibility.Hidden,
212
+ ];
213
+ if (decoded.cadAVL.shared) {
214
+ visibility.push(tabletcommand_backend_models_1.LocationVisibility.Shared);
215
+ }
216
+ decoded.cadAVL.visibility = visibility;
217
+ await store.updateLocation(decoded.cadAVL, atDate);
218
+ }
219
+ }
220
+ async function processItemsDeviceMappingGeotab(department, items, atDate) {
221
+ const departmentId = String(department._id);
222
+ for (const item of items) {
223
+ // TODO: may need to break decodeLocation out separately for device mapping, but works right now
224
+ const decoded = decodeLocation(item, department, atDate, "geotab");
225
+ debug(`processItemsDeviceMappingGeotab item: ${JSON.stringify(item)} d:${JSON.stringify(department)} at: ${atDate.toISOString()}.`);
226
+ if (!decoded.isValid) {
227
+ // Skip only the invalid item, not the rest of the batch
228
+ // This is actually a fix for vehicle processing as well
229
+ continue;
230
+ }
231
+ // Defensive code technically we shouldn't be getting here with person
232
+ // But it would still be valid to use this with a person so added the logic
233
+ if (await processPersonItem(decoded, item, atDate)) {
234
+ continue;
235
+ }
236
+ let active = true;
237
+ let locationToCAD = false;
238
+ const deviceMapping = await store.getDeviceMappingGeotab(item, departmentId);
239
+ if (lodash_1.default.isObject(deviceMapping)) {
240
+ if (lodash_1.default.isBoolean(deviceMapping.mapHidden)) {
241
+ active = !deviceMapping.mapHidden;
242
+ }
243
+ if (lodash_1.default.isBoolean(deviceMapping.locationToCAD)) {
244
+ locationToCAD = true;
245
+ }
246
+ if (lodash_1.default.isString(deviceMapping.mapId) && deviceMapping.mapId.trim() !== "") {
247
+ const radioName = deviceMapping.mapId;
248
+ const userId = `${radioName}-${item.vehicleId}`; // Fake user id radioName - vehicleId
249
+ decoded.cadAVL.username = radioName;
250
+ decoded.cadAVL.userId = userId;
251
+ decoded.cadAVL.session = userId;
252
+ }
253
+ }
254
+ // TODO: add support for location .kindType
255
+ decoded.cadAVL.active = active;
256
+ // Calculate .visibility after .active is set
257
+ const visibility = [
258
+ active ? tabletcommand_backend_models_1.LocationVisibility.Visible : tabletcommand_backend_models_1.LocationVisibility.Hidden,
259
+ ];
260
+ if (decoded.cadAVL.shared) {
261
+ visibility.push(tabletcommand_backend_models_1.LocationVisibility.Shared);
262
+ }
263
+ if (locationToCAD) {
264
+ decoded.cadAVL.sendToCAD = true;
265
+ visibility.push(tabletcommand_backend_models_1.LocationVisibility.CAD);
266
+ }
267
+ decoded.cadAVL.visibility = visibility;
268
+ await store.updateLocation(decoded.cadAVL, atDate);
269
+ }
270
+ }
271
+ return {
272
+ processVehicle,
273
+ processItems,
274
+ processItemsDeviceMappingGeotab,
275
+ };
276
+ }
277
+ exports.default = location;
278
+ //# sourceMappingURL=location.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"location.js","sourceRoot":"","sources":["../src/location.ts"],"names":[],"mappings":"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"}