tabletcommand-location 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +41 -0
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/build/index.js +54 -0
- package/build/index.js.map +1 -0
- package/build/location.js +133 -0
- package/build/location.js.map +1 -0
- package/build/store.js +116 -0
- package/build/store.js.map +1 -0
- package/build/test/location.js +87 -0
- package/build/test/location.js.map +1 -0
- package/build/test/mock.js +135 -0
- package/build/test/mock.js.map +1 -0
- package/build/types.js +4 -0
- package/build/types.js.map +1 -0
- package/cspell.json +57 -0
- package/definitions/index.d.ts +8 -0
- package/definitions/index.d.ts.map +1 -0
- package/definitions/location.d.ts +10 -0
- package/definitions/location.d.ts.map +1 -0
- package/definitions/store.d.ts +10 -0
- package/definitions/store.d.ts.map +1 -0
- package/definitions/test/location.d.ts +2 -0
- package/definitions/test/location.d.ts.map +1 -0
- package/definitions/test/mock.d.ts +63 -0
- package/definitions/test/mock.d.ts.map +1 -0
- package/definitions/types.d.ts +33 -0
- package/definitions/types.d.ts.map +1 -0
- package/gulpfile.js +20 -0
- package/package.json +56 -0
- package/src/index.ts +65 -0
- package/src/location.ts +161 -0
- package/src/store.ts +133 -0
- package/src/test/location.ts +72 -0
- package/src/test/mock.ts +156 -0
- package/src/tsconfig.json +30 -0
- package/src/types.ts +37 -0
- package/tsconfig.json +109 -0
package/.eslintrc.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module.exports = {
|
|
2
|
+
env: {
|
|
3
|
+
es6: true,
|
|
4
|
+
node: true,
|
|
5
|
+
mocha: true
|
|
6
|
+
},
|
|
7
|
+
extends: [
|
|
8
|
+
"eslint:recommended",
|
|
9
|
+
"plugin:@typescript-eslint/recommended",
|
|
10
|
+
"plugin:@typescript-eslint/recommended-requiring-type-checking"
|
|
11
|
+
],
|
|
12
|
+
ignorePatterns: [
|
|
13
|
+
".eslintrc.js",
|
|
14
|
+
"gulpfile.js",
|
|
15
|
+
],
|
|
16
|
+
plugins: [
|
|
17
|
+
"@typescript-eslint",
|
|
18
|
+
"promise",
|
|
19
|
+
"security"
|
|
20
|
+
],
|
|
21
|
+
parser: "@typescript-eslint/parser",
|
|
22
|
+
parserOptions: {
|
|
23
|
+
project: "./src/tsconfig.json",
|
|
24
|
+
tsconfigRootDir: __dirname,
|
|
25
|
+
},
|
|
26
|
+
rules: {
|
|
27
|
+
quotes: [2, "double"],
|
|
28
|
+
semi: [2, "always"],
|
|
29
|
+
"space-before-function-paren": [0],
|
|
30
|
+
"@typescript-eslint/explicit-module-boundary-types": 0,
|
|
31
|
+
"@typescript-eslint/no-empty-interface": 0,
|
|
32
|
+
"@typescript-eslint/require-await": 0,
|
|
33
|
+
"@typescript-eslint/restrict-template-expressions": 0,
|
|
34
|
+
"@typescript-eslint/no-misused-promises": [
|
|
35
|
+
"error",
|
|
36
|
+
{
|
|
37
|
+
"checksVoidReturn": false
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
};
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Tablet Command, Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
package/build/index.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
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.lib = void 0;
|
|
7
|
+
const location_1 = __importDefault(require("./location"));
|
|
8
|
+
const store_1 = __importDefault(require("./store"));
|
|
9
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
10
|
+
function lib(departmentModel, locationModel, cadVehicleModel) {
|
|
11
|
+
const store = (0, store_1.default)(departmentModel, locationModel, cadVehicleModel);
|
|
12
|
+
const location = (0, location_1.default)(store);
|
|
13
|
+
// async function processVehicle(department: Partial<Department>, item: Partial<CADVehicle>) {
|
|
14
|
+
// // await location.processVehicle()
|
|
15
|
+
// }
|
|
16
|
+
async function processLocations(department, items) {
|
|
17
|
+
const atDate = new Date();
|
|
18
|
+
try {
|
|
19
|
+
if (lodash_1.default.isUndefined(items) || lodash_1.default.isNull(items)) {
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
if (lodash_1.default.isObject(items) && !lodash_1.default.isArray(items)) {
|
|
23
|
+
items = [items];
|
|
24
|
+
}
|
|
25
|
+
const result = await location.processItems(department, items, atDate);
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// async function processLocationsOnly(department: Partial<Department>, items: Partial<Location>[] | null | undefined, agency: Partial<Agency>) {
|
|
33
|
+
// try {
|
|
34
|
+
// if (_.isUndefined(items) || _.isNull(items)) {
|
|
35
|
+
// return [];
|
|
36
|
+
// }
|
|
37
|
+
// if (_.isObject(items) && !_.isArray(items)) {
|
|
38
|
+
// items = [items];
|
|
39
|
+
// }
|
|
40
|
+
// const result = await location.processItemsNoVehicle(department, items, agency);
|
|
41
|
+
// return result;
|
|
42
|
+
// } catch (err) {
|
|
43
|
+
// throw err;
|
|
44
|
+
// }
|
|
45
|
+
// }
|
|
46
|
+
return {
|
|
47
|
+
// processVehicle,
|
|
48
|
+
processLocations,
|
|
49
|
+
// processLocationsOnly,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
exports.lib = lib;
|
|
53
|
+
exports.default = lib;
|
|
54
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,0DAAwC;AACxC,oDAAkC;AAWlC,oDAAuB;AAEvB,SAAgB,GAAG,CACjB,eAAgC,EAChC,aAA4B,EAC5B,eAAgC;IAEhC,MAAM,KAAK,GAAG,IAAA,eAAW,EAAC,eAAe,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,IAAA,kBAAc,EAAC,KAAK,CAAC,CAAC;IACvC,8FAA8F;IAC9F,uCAAuC;IACvC,IAAI;IAEJ,KAAK,UAAU,gBAAgB,CAAC,UAA+B,EAAE,KAA2C;QAC1G,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,IAAI;YACF,IAAI,gBAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,gBAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC3C,OAAO,EAAE,CAAC;aACX;YACD,IAAI,gBAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAC,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;gBAC1C,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC;aACjB;YACD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;YACtE,OAAO,MAAM,CAAC;SACf;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,GAAG,CAAC;SACX;IACH,CAAC;IAED,iJAAiJ;IACjJ,UAAU;IACV,qDAAqD;IACrD,mBAAmB;IACnB,QAAQ;IACR,oDAAoD;IACpD,yBAAyB;IACzB,QAAQ;IACR,sFAAsF;IACtF,qBAAqB;IACrB,oBAAoB;IACpB,iBAAiB;IACjB,MAAM;IACN,IAAI;IAEJ,OAAO;QACL,kBAAkB;QAClB,gBAAgB;QAChB,wBAAwB;KACzB,CAAC;AACJ,CAAC;AA/CD,kBA+CC;AAED,kBAAe,GAAG,CAAC"}
|
|
@@ -0,0 +1,133 @@
|
|
|
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 = void 0;
|
|
7
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
8
|
+
const debug_1 = __importDefault(require("debug"));
|
|
9
|
+
function location(store) {
|
|
10
|
+
const debug = (0, debug_1.default)("tabletcommand-location:location");
|
|
11
|
+
async function decodeCADVehicleStatusToLocation(item, department, atDate) {
|
|
12
|
+
let latitude = 0;
|
|
13
|
+
let longitude = 0;
|
|
14
|
+
if (lodash_1.default.isString(item.latitude) && lodash_1.default.isFinite(parseFloat(item.latitude))) {
|
|
15
|
+
latitude = parseFloat(item.latitude);
|
|
16
|
+
}
|
|
17
|
+
if (lodash_1.default.isString(item.longitude) && lodash_1.default.isFinite(parseFloat(item.longitude))) {
|
|
18
|
+
longitude = parseFloat(item.longitude);
|
|
19
|
+
}
|
|
20
|
+
if (!lodash_1.default.isString(item.radioName)) {
|
|
21
|
+
item.radioName = "";
|
|
22
|
+
}
|
|
23
|
+
if (!lodash_1.default.isString(item.vehicleId)) {
|
|
24
|
+
item.vehicleId = "";
|
|
25
|
+
}
|
|
26
|
+
const now = atDate.valueOf() / 1000.0;
|
|
27
|
+
// Don't save provided AVL time if it's more than 30s in the future
|
|
28
|
+
const futureTimeLimit = now + 30;
|
|
29
|
+
// If present, replace the modified unix date with the one provided by the CAD
|
|
30
|
+
let movedAtUnix = now;
|
|
31
|
+
if (lodash_1.default.isString(item.avlTime) && lodash_1.default.trim(item.avlTime) !== "") {
|
|
32
|
+
const checkISODate = (new Date(item.avlTime).valueOf()) / 1000.0;
|
|
33
|
+
const cadUnixTime = lodash_1.default.isNaN(checkISODate) && lodash_1.default.isString(item.avlTime) ? parseFloat(item.avlTime) : checkISODate;
|
|
34
|
+
if (lodash_1.default.isFinite(cadUnixTime) && cadUnixTime <= futureTimeLimit) {
|
|
35
|
+
movedAtUnix = cadUnixTime;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const userId = `${item.radioName}-${item.vehicleId}`; // Fake user id radioName - vehicleId
|
|
39
|
+
let sharingEnabled = false;
|
|
40
|
+
let opAreaName = "";
|
|
41
|
+
let opAreaCode = "";
|
|
42
|
+
let deptState = "";
|
|
43
|
+
let locationStaleMinutes = 31 * 24 * 60; // 31d
|
|
44
|
+
if (lodash_1.default.isObject(department) && lodash_1.default.isObject(department.shareAVL)) {
|
|
45
|
+
sharingEnabled = department.shareAVL.enabled && department.accountType === "production";
|
|
46
|
+
opAreaName = department.shareAVL.opAreaName || "";
|
|
47
|
+
opAreaCode = department.shareAVL.opAreaCode || "";
|
|
48
|
+
}
|
|
49
|
+
if (lodash_1.default.isObject(department)) {
|
|
50
|
+
if (lodash_1.default.isObject(department.addressDetails) && lodash_1.default.isString(department.addressDetails.state)) {
|
|
51
|
+
deptState = department.addressDetails.state || "";
|
|
52
|
+
}
|
|
53
|
+
if (lodash_1.default.isNumber(department.locationStaleMinutes) && lodash_1.default.isFinite(department.locationStaleMinutes) && department.locationStaleMinutes > 0) {
|
|
54
|
+
locationStaleMinutes = department.locationStaleMinutes;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
const deleteAfterDate = new Date(atDate.valueOf() + 1000 * 60 * locationStaleMinutes).toISOString();
|
|
58
|
+
const cadAVL = {
|
|
59
|
+
device_type: "cad",
|
|
60
|
+
locationGeoJSON: {
|
|
61
|
+
type: "Point",
|
|
62
|
+
coordinates: [longitude, latitude]
|
|
63
|
+
},
|
|
64
|
+
deleteAfterDate,
|
|
65
|
+
modified: atDate.toISOString(),
|
|
66
|
+
movedAt: new Date(movedAtUnix * 1000).toISOString(),
|
|
67
|
+
active: true,
|
|
68
|
+
username: item.radioName,
|
|
69
|
+
userId,
|
|
70
|
+
departmentId: department._id,
|
|
71
|
+
session: userId,
|
|
72
|
+
version: 2,
|
|
73
|
+
shared: sharingEnabled,
|
|
74
|
+
opAreaName,
|
|
75
|
+
opAreaCode,
|
|
76
|
+
state: deptState
|
|
77
|
+
};
|
|
78
|
+
const hasCoordinate = Math.abs(latitude) > 0.01 || Math.abs(longitude) > 0.01;
|
|
79
|
+
const validCoordinate = Math.abs(latitude) < 90 && Math.abs(longitude) < 180;
|
|
80
|
+
const hasVehicle = lodash_1.default.isString(item.vehicleId) && lodash_1.default.trim(item.vehicleId).length > 0;
|
|
81
|
+
const hasRadioName = lodash_1.default.isString(item.radioName) && lodash_1.default.trim(item.radioName).length > 0;
|
|
82
|
+
const isValid = hasCoordinate && validCoordinate && (hasVehicle || hasRadioName);
|
|
83
|
+
return {
|
|
84
|
+
cadAVL,
|
|
85
|
+
isValid,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
async function processVehicle(departmentExceptions, item, department, atDate) {
|
|
89
|
+
// need function to validate the item (As concerns vehicleId and radioName)
|
|
90
|
+
const isBidirectionalException = departmentExceptions.indexOf(department._id) !== -1;
|
|
91
|
+
// Determine if vehicle is active or not
|
|
92
|
+
const cadItem = await store.getVehicle(item, department._id);
|
|
93
|
+
if (!lodash_1.default.isObject(cadItem) &&
|
|
94
|
+
department.cadOneWayVehiclesEnabled &&
|
|
95
|
+
(department.cadBidirectionalEnabled !== true || isBidirectionalException)) {
|
|
96
|
+
const vehicleItem = {
|
|
97
|
+
departmentId: department._id,
|
|
98
|
+
modifiedDate: atDate.valueOf() / 1000.0,
|
|
99
|
+
modified: atDate.toISOString(),
|
|
100
|
+
radioName: item.radioName,
|
|
101
|
+
vehicleId: item.vehicleId,
|
|
102
|
+
};
|
|
103
|
+
await store.updateVehicle(vehicleItem, department._id);
|
|
104
|
+
}
|
|
105
|
+
return cadItem;
|
|
106
|
+
}
|
|
107
|
+
async function processItems(department, items, atDate) {
|
|
108
|
+
for (const item of items) {
|
|
109
|
+
const decoded = await decodeCADVehicleStatusToLocation(item, department, atDate);
|
|
110
|
+
debug(`processCADVehicleLocation item: ${JSON.stringify(item)} d:${JSON.stringify(department)} at: ${atDate.toISOString()}.`);
|
|
111
|
+
if (!decoded.isValid) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
let active = true;
|
|
115
|
+
const cadBidirectionalExceptions = [
|
|
116
|
+
"627d718b8d6145748b30282b" // HMT (2 way comments, 1 way vehicles)
|
|
117
|
+
];
|
|
118
|
+
const cadItem = await processVehicle(cadBidirectionalExceptions, item, department, atDate);
|
|
119
|
+
if (lodash_1.default.isObject(cadItem) && lodash_1.default.isBoolean(cadItem.mapHidden)) {
|
|
120
|
+
active = !cadItem.mapHidden;
|
|
121
|
+
}
|
|
122
|
+
decoded.cadAVL.active = active;
|
|
123
|
+
return await store.updateLocation(decoded.cadAVL, atDate);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return {
|
|
127
|
+
processVehicle,
|
|
128
|
+
processItems,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
exports.location = location;
|
|
132
|
+
exports.default = location;
|
|
133
|
+
//# sourceMappingURL=location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location.js","sourceRoot":"","sources":["../src/location.ts"],"names":[],"mappings":"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"}
|
package/build/store.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
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.store = void 0;
|
|
7
|
+
const debug_1 = __importDefault(require("debug"));
|
|
8
|
+
const lodash_1 = __importDefault(require("lodash"));
|
|
9
|
+
function store(departmentModel, locationModel, cadVehicleModel) {
|
|
10
|
+
const debug = (0, debug_1.default)("tabletcommand-location:location:store");
|
|
11
|
+
async function getVehicle(item, departmentId) {
|
|
12
|
+
const query = {
|
|
13
|
+
vehicleId: item.vehicleId,
|
|
14
|
+
departmentId,
|
|
15
|
+
};
|
|
16
|
+
return cadVehicleModel.findOne(query).lean();
|
|
17
|
+
}
|
|
18
|
+
async function updateVehicle(item, departmentId) {
|
|
19
|
+
const query = {
|
|
20
|
+
departmentId,
|
|
21
|
+
vehicleId: item.vehicleId,
|
|
22
|
+
};
|
|
23
|
+
const options = {
|
|
24
|
+
upsert: true,
|
|
25
|
+
setDefaultsOnInsert: true,
|
|
26
|
+
new: true
|
|
27
|
+
};
|
|
28
|
+
return await cadVehicleModel.findOneAndUpdate(query, item, options);
|
|
29
|
+
}
|
|
30
|
+
async function updateLocation(item, atDate) {
|
|
31
|
+
const modelItem = new locationModel(item);
|
|
32
|
+
const query = {
|
|
33
|
+
device_type: modelItem.device_type,
|
|
34
|
+
departmentId: modelItem.departmentId,
|
|
35
|
+
username: modelItem.username
|
|
36
|
+
};
|
|
37
|
+
debug(`Location.findOne: ${JSON.stringify(query)}`);
|
|
38
|
+
const dbItem = await locationModel.findOne(query).lean().exec();
|
|
39
|
+
const cloneItem = Object.assign({}, dbItem);
|
|
40
|
+
let updatedItem = propagateLocation(modelItem, dbItem);
|
|
41
|
+
debug(`Location.save: ${JSON.stringify(updatedItem)}`);
|
|
42
|
+
if (cloneItem._id) {
|
|
43
|
+
const locationDelta = generateLocationDelta(cloneItem, updatedItem, atDate);
|
|
44
|
+
updatedItem = locationDelta;
|
|
45
|
+
debug(`Location.delta: ${JSON.stringify(locationDelta)}`);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// if new location record - Attempt to reconcile agency name and code to resources
|
|
49
|
+
// this is going to be resolved by the bin/cron-cleanup-minute cron
|
|
50
|
+
}
|
|
51
|
+
await locationModel.updateOne(query, {
|
|
52
|
+
$set: updatedItem,
|
|
53
|
+
}, {
|
|
54
|
+
upsert: true,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
function propagateLocation(modelItem, dbItem) {
|
|
58
|
+
if (!lodash_1.default.isObject(dbItem)) {
|
|
59
|
+
return modelItem;
|
|
60
|
+
}
|
|
61
|
+
// We keep the same value for _id, uuid, departmentId
|
|
62
|
+
dbItem.active = modelItem.active;
|
|
63
|
+
dbItem.altitude = modelItem.altitude;
|
|
64
|
+
dbItem.device_type = modelItem.device_type;
|
|
65
|
+
dbItem.heading = modelItem.heading;
|
|
66
|
+
dbItem.modified = modelItem.modified;
|
|
67
|
+
dbItem.movedAt = modelItem.movedAt;
|
|
68
|
+
dbItem.session = modelItem.session;
|
|
69
|
+
dbItem.speed = modelItem.speed;
|
|
70
|
+
dbItem.userId = modelItem.userId;
|
|
71
|
+
dbItem.username = modelItem.username;
|
|
72
|
+
dbItem.version = modelItem.version;
|
|
73
|
+
dbItem.locationGeoJSON = modelItem.locationGeoJSON;
|
|
74
|
+
// Propagate sharedAVL items
|
|
75
|
+
dbItem.opAreaCode = modelItem.opAreaCode;
|
|
76
|
+
dbItem.opAreaName = modelItem.opAreaName;
|
|
77
|
+
dbItem.shared = modelItem.shared;
|
|
78
|
+
dbItem.state = modelItem.state;
|
|
79
|
+
return dbItem;
|
|
80
|
+
}
|
|
81
|
+
function generateLocationDelta(locationRecord, updateObject, atDate) {
|
|
82
|
+
if (!lodash_1.default.isObject(locationRecord)) {
|
|
83
|
+
return updateObject;
|
|
84
|
+
}
|
|
85
|
+
const locationDelta = {};
|
|
86
|
+
for (const [key, value] of Object.entries(updateObject)) {
|
|
87
|
+
if (JSON.stringify(value) !== JSON.stringify(locationRecord[key])) {
|
|
88
|
+
locationDelta[key] = value;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const updatedKeys = Object.keys(locationDelta);
|
|
92
|
+
const propsKeys = [
|
|
93
|
+
"active",
|
|
94
|
+
"agencyCode",
|
|
95
|
+
"agencyName",
|
|
96
|
+
"device_type",
|
|
97
|
+
"opAreaCode",
|
|
98
|
+
"opAreaName",
|
|
99
|
+
"shared",
|
|
100
|
+
"state",
|
|
101
|
+
"username",
|
|
102
|
+
];
|
|
103
|
+
if (lodash_1.default.intersection(updatedKeys, propsKeys).length > 0) {
|
|
104
|
+
locationDelta.propsChangedAt = atDate.toISOString();
|
|
105
|
+
}
|
|
106
|
+
return locationDelta;
|
|
107
|
+
}
|
|
108
|
+
return {
|
|
109
|
+
getVehicle,
|
|
110
|
+
updateVehicle,
|
|
111
|
+
updateLocation,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
exports.store = store;
|
|
115
|
+
exports.default = store;
|
|
116
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
26
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
27
|
+
};
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
const chai_1 = __importDefault(require("chai"));
|
|
30
|
+
require("mocha");
|
|
31
|
+
const modelsModule = __importStar(require("tabletcommand-backend-models"));
|
|
32
|
+
const store_1 = __importDefault(require("../store"));
|
|
33
|
+
const mock_1 = __importDefault(require("./mock"));
|
|
34
|
+
const location_1 = __importDefault(require("../location"));
|
|
35
|
+
const assert = chai_1.default.assert;
|
|
36
|
+
let location;
|
|
37
|
+
let store;
|
|
38
|
+
const mock = (0, mock_1.default)(modelsModule);
|
|
39
|
+
const mockDepartment = mock.department;
|
|
40
|
+
const mockAgency = mock.agency;
|
|
41
|
+
let models;
|
|
42
|
+
describe("location", () => {
|
|
43
|
+
before(async () => {
|
|
44
|
+
await mock.before();
|
|
45
|
+
});
|
|
46
|
+
beforeEach(async () => {
|
|
47
|
+
await mock.beforeEach();
|
|
48
|
+
models = mock.getModels();
|
|
49
|
+
store = (0, store_1.default)(models.Department, models.Location, models.CADVehicle);
|
|
50
|
+
location = (0, location_1.default)(store);
|
|
51
|
+
});
|
|
52
|
+
afterEach(async () => {
|
|
53
|
+
await mock.afterEach();
|
|
54
|
+
});
|
|
55
|
+
after(async () => {
|
|
56
|
+
await mock.after();
|
|
57
|
+
});
|
|
58
|
+
context("Process Locations Items", () => {
|
|
59
|
+
it("Will save locations and add CAD Vehicle records: ", async () => {
|
|
60
|
+
const atDate = new Date();
|
|
61
|
+
const department = mockDepartment;
|
|
62
|
+
const items = [{
|
|
63
|
+
Interface: "Fake Interface",
|
|
64
|
+
vehicleId: "BEEDOO1",
|
|
65
|
+
radioName: "BEEDOO1",
|
|
66
|
+
statusCode: "RED",
|
|
67
|
+
latitude: "34.35264",
|
|
68
|
+
longitude: "-119.0669",
|
|
69
|
+
heading: "",
|
|
70
|
+
speed: "0",
|
|
71
|
+
locationCurrent: "1st\\MAIN",
|
|
72
|
+
locationDestination: "Gru's House",
|
|
73
|
+
avlTime: "1602563494"
|
|
74
|
+
}];
|
|
75
|
+
const formatted = await location.processItems(department, items, atDate);
|
|
76
|
+
const locationRecord = await models.Location.findOne({});
|
|
77
|
+
assert.equal(locationRecord.userId, "BEEDOO1-BEEDOO1");
|
|
78
|
+
assert.equal(locationRecord.departmentId, "5195426cc4e016a988000969");
|
|
79
|
+
assert.equal(locationRecord.username, "BEEDOO1");
|
|
80
|
+
const vehicle = await models.CADVehicle.findOne({});
|
|
81
|
+
assert.equal(vehicle.vehicleId, "BEEDOO1");
|
|
82
|
+
assert.equal(vehicle.radioName, "BEEDOO1");
|
|
83
|
+
assert.equal(vehicle.mapHidden, false);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=location.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/test/location.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
require("mocha");
|
|
4
|
+
const mongodb_1 = require("mongodb");
|
|
5
|
+
function default_1(modelsModule) {
|
|
6
|
+
const departmentId = "5195426cc4e016a988000969";
|
|
7
|
+
const agencyId = "5f07b93bfb41951409d58493";
|
|
8
|
+
const apiKey = "secretApiKey1990";
|
|
9
|
+
const d = {
|
|
10
|
+
_id: departmentId,
|
|
11
|
+
department: "Test Department",
|
|
12
|
+
signupDomains: [],
|
|
13
|
+
signupKey: "abcd",
|
|
14
|
+
incidentTypes: [],
|
|
15
|
+
rtsChannelPrefix: "rtsChannelPrefix123",
|
|
16
|
+
cadGetLocationEnabled: true,
|
|
17
|
+
rtsEnabled: true,
|
|
18
|
+
pushEnabled: true,
|
|
19
|
+
cadBidirectionalEnabled: false,
|
|
20
|
+
cadOneWayVehiclesEnabled: true,
|
|
21
|
+
cadEmailUsername: "",
|
|
22
|
+
apikey: apiKey,
|
|
23
|
+
active: true,
|
|
24
|
+
modified_unix_date: 1492743603.514,
|
|
25
|
+
state: "CO",
|
|
26
|
+
city: "Denver",
|
|
27
|
+
fdid: "06905",
|
|
28
|
+
uuid: "e4c5873c-1684-47a9-ad2d-81ded6e7ac15",
|
|
29
|
+
modified_date: "2017-04-21T03:00:03.514",
|
|
30
|
+
addressDetails: {
|
|
31
|
+
address: "123 Delta Way",
|
|
32
|
+
city: "Delta Junction",
|
|
33
|
+
state: "CA",
|
|
34
|
+
country: "US",
|
|
35
|
+
zipCode: "99999"
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const agency = {
|
|
39
|
+
_id: new mongodb_1.ObjectId(agencyId),
|
|
40
|
+
active: true,
|
|
41
|
+
code: "OTHER",
|
|
42
|
+
departmentId: new mongodb_1.ObjectId(departmentId),
|
|
43
|
+
name: "Other",
|
|
44
|
+
personnelApiKey: "123",
|
|
45
|
+
crossStaffing: [
|
|
46
|
+
{
|
|
47
|
+
alwaysCrossStaff: true,
|
|
48
|
+
crossStaffedUnits: ["Z1"],
|
|
49
|
+
radioName: "D22"
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
alwaysCrossStaff: false,
|
|
53
|
+
crossStaffedUnits: ["M1"],
|
|
54
|
+
radioName: "K12"
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
alwaysCrossStaff: true,
|
|
58
|
+
crossStaffedUnits: ["A1", "A2"],
|
|
59
|
+
radioName: "Z12"
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
alwaysCrossStaff: false,
|
|
63
|
+
crossStaffedUnits: ["A1", "A2", "D22"],
|
|
64
|
+
radioName: "Z99"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
};
|
|
68
|
+
async function clearTestData(mods) {
|
|
69
|
+
const query = {};
|
|
70
|
+
await mods.Agency.deleteMany(query);
|
|
71
|
+
await mods.Department.deleteMany(query);
|
|
72
|
+
await mods.Location.deleteMany(query);
|
|
73
|
+
await mods.CADVehicle.deleteMany(query);
|
|
74
|
+
}
|
|
75
|
+
async function prepareTestData(mods) {
|
|
76
|
+
const testDepartment = new mods.Department(d);
|
|
77
|
+
await testDepartment.save();
|
|
78
|
+
const testItem = new models.Agency(agency);
|
|
79
|
+
await testItem.save();
|
|
80
|
+
}
|
|
81
|
+
let models;
|
|
82
|
+
let connection;
|
|
83
|
+
async function afterEach() {
|
|
84
|
+
if (!shouldRun()) {
|
|
85
|
+
process.exit(1);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
async function after() {
|
|
89
|
+
await getConnection().connection.close();
|
|
90
|
+
}
|
|
91
|
+
async function before() {
|
|
92
|
+
if (!shouldRun()) {
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const { models: lModels, connection: lConnection } = await modelsModule.connect(process.env.NODE_MONGO_URL || "");
|
|
96
|
+
models = lModels;
|
|
97
|
+
connection = lConnection;
|
|
98
|
+
return models;
|
|
99
|
+
}
|
|
100
|
+
async function beforeEach() {
|
|
101
|
+
if (!shouldRun()) {
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
await clearTestData(models);
|
|
105
|
+
await prepareTestData(models);
|
|
106
|
+
}
|
|
107
|
+
function shouldRun() {
|
|
108
|
+
const mongoUrl = process.env.NODE_MONGO_URL || "";
|
|
109
|
+
if (!/massive-test/i.exec(mongoUrl)) {
|
|
110
|
+
console.log(`Not a test database: ${mongoUrl}? Expecting database: massive-test.`);
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
function getModels() {
|
|
116
|
+
return models;
|
|
117
|
+
}
|
|
118
|
+
function getConnection() {
|
|
119
|
+
return connection;
|
|
120
|
+
}
|
|
121
|
+
return {
|
|
122
|
+
department: d,
|
|
123
|
+
agency,
|
|
124
|
+
clearTestData,
|
|
125
|
+
prepareTestData,
|
|
126
|
+
before,
|
|
127
|
+
beforeEach,
|
|
128
|
+
after,
|
|
129
|
+
afterEach,
|
|
130
|
+
getModels,
|
|
131
|
+
getConnection,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
exports.default = default_1;
|
|
135
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../src/test/mock.ts"],"names":[],"mappings":"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"}
|
package/build/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;AAeC,CAAC"}
|