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.
- package/.claude/worktrees/sc-36275/.buildkite/pipeline.yml +5 -0
- package/.claude/worktrees/sc-36275/README.md +3 -0
- package/.claude/worktrees/sc-36275/build/audience.js +38 -0
- package/.claude/worktrees/sc-36275/build/audience.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/index.js +95 -0
- package/.claude/worktrees/sc-36275/build/index.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/location.js +278 -0
- package/.claude/worktrees/sc-36275/build/location.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/query.js +378 -0
- package/.claude/worktrees/sc-36275/build/query.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/store.js +182 -0
- package/.claude/worktrees/sc-36275/build/store.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/test/location.js +522 -0
- package/.claude/worktrees/sc-36275/build/test/location.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/test/mock.js +165 -0
- package/.claude/worktrees/sc-36275/build/test/mock.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/test/query.js +174 -0
- package/.claude/worktrees/sc-36275/build/test/query.js.map +1 -0
- package/.claude/worktrees/sc-36275/build/types.js +8 -0
- package/.claude/worktrees/sc-36275/build/types.js.map +1 -0
- package/.claude/worktrees/sc-36275/cspell.json +64 -0
- package/.claude/worktrees/sc-36275/definitions/audience.d.ts +18 -0
- package/.claude/worktrees/sc-36275/definitions/audience.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/index.d.ts +11 -0
- package/.claude/worktrees/sc-36275/definitions/index.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/location.d.ts +32 -0
- package/.claude/worktrees/sc-36275/definitions/location.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/query.d.ts +36 -0
- package/.claude/worktrees/sc-36275/definitions/query.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/store.d.ts +64 -0
- package/.claude/worktrees/sc-36275/definitions/store.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/test/location.d.ts +2 -0
- package/.claude/worktrees/sc-36275/definitions/test/location.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/test/mock.d.ts +346 -0
- package/.claude/worktrees/sc-36275/definitions/test/mock.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/test/query.d.ts +2 -0
- package/.claude/worktrees/sc-36275/definitions/test/query.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/definitions/types.d.ts +53 -0
- package/.claude/worktrees/sc-36275/definitions/types.d.ts.map +1 -0
- package/.claude/worktrees/sc-36275/eslint.config.mjs +95 -0
- package/.claude/worktrees/sc-36275/gulpfile.js +23 -0
- package/.claude/worktrees/sc-36275/package-lock.json +9404 -0
- package/.claude/worktrees/sc-36275/package.json +54 -0
- package/.claude/worktrees/sc-36275/src/audience.ts +54 -0
- package/.claude/worktrees/sc-36275/src/index.ts +81 -0
- package/.claude/worktrees/sc-36275/src/location.ts +315 -0
- package/.claude/worktrees/sc-36275/src/query.ts +497 -0
- package/.claude/worktrees/sc-36275/src/store.ts +204 -0
- package/.claude/worktrees/sc-36275/src/test/location.ts +485 -0
- package/.claude/worktrees/sc-36275/src/test/mock.ts +186 -0
- package/.claude/worktrees/sc-36275/src/test/query.ts +209 -0
- package/.claude/worktrees/sc-36275/src/tsconfig.json +30 -0
- package/.claude/worktrees/sc-36275/src/types.ts +74 -0
- package/.claude/worktrees/sc-36275/test.sh +32 -0
- package/build/query.js +6 -1
- package/build/query.js.map +1 -1
- package/build/test/query.js +2 -2
- package/build/test/query.js.map +1 -1
- package/cspell.json +1 -0
- package/definitions/query.d.ts.map +1 -1
- package/definitions/test/mock.d.ts +5 -0
- package/definitions/test/mock.d.ts.map +1 -1
- package/package.json +7 -7
- package/src/query.ts +6 -1
- package/src/test/query.ts +2 -2
|
@@ -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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"}
|