tabletcommand-backend-models 7.4.110 → 7.4.112

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 (48) hide show
  1. package/build/constants.js +6 -1
  2. package/build/constants.js.map +1 -1
  3. package/build/index.js +3 -1
  4. package/build/index.js.map +1 -1
  5. package/build/models/department.js +78 -3
  6. package/build/models/department.js.map +1 -1
  7. package/build/models/drone-connection.js +101 -0
  8. package/build/models/drone-connection.js.map +1 -0
  9. package/build/models/user.js +4 -0
  10. package/build/models/user.js.map +1 -1
  11. package/build/test/department.js +5 -0
  12. package/build/test/department.js.map +1 -1
  13. package/build/test/drone-connection.js +152 -0
  14. package/build/test/drone-connection.js.map +1 -0
  15. package/build/test/user.js +10 -0
  16. package/build/test/user.js.map +1 -1
  17. package/build/types/drone-connection.js +3 -0
  18. package/build/types/drone-connection.js.map +1 -0
  19. package/cspell.json +1 -0
  20. package/definitions/constants.d.ts +4 -0
  21. package/definitions/constants.d.ts.map +1 -1
  22. package/definitions/index.d.ts +9 -2
  23. package/definitions/index.d.ts.map +1 -1
  24. package/definitions/models/department.d.ts +15 -10
  25. package/definitions/models/department.d.ts.map +1 -1
  26. package/definitions/models/drone-connection.d.ts +22 -0
  27. package/definitions/models/drone-connection.d.ts.map +1 -0
  28. package/definitions/models/user.d.ts.map +1 -1
  29. package/definitions/test/drone-connection.d.ts +2 -0
  30. package/definitions/test/drone-connection.d.ts.map +1 -0
  31. package/definitions/types/department.d.ts +15 -0
  32. package/definitions/types/department.d.ts.map +1 -1
  33. package/definitions/types/drone-connection.d.ts +19 -0
  34. package/definitions/types/drone-connection.d.ts.map +1 -0
  35. package/definitions/types/user.d.ts +1 -0
  36. package/definitions/types/user.d.ts.map +1 -1
  37. package/package.json +1 -1
  38. package/src/constants.ts +5 -0
  39. package/src/index.ts +8 -0
  40. package/src/models/department.ts +85 -3
  41. package/src/models/drone-connection.ts +121 -0
  42. package/src/models/user.ts +4 -0
  43. package/src/test/department.ts +6 -0
  44. package/src/test/drone-connection.ts +164 -0
  45. package/src/test/user.ts +11 -0
  46. package/src/types/department.ts +17 -0
  47. package/src/types/drone-connection.ts +21 -0
  48. package/src/types/user.ts +1 -0
@@ -0,0 +1,19 @@
1
+ import { Types } from "mongoose";
2
+ import { DroneProvider } from "../constants";
3
+ import { EncryptedDataType } from "./common";
4
+ export interface DroneConnectionOptionsType {
5
+ drones: "all" | "listed";
6
+ serials: string[];
7
+ }
8
+ export interface DroneConnectionType {
9
+ _id: Types.ObjectId;
10
+ departmentId: Types.ObjectId;
11
+ provider: DroneProvider;
12
+ active: boolean;
13
+ label: string;
14
+ authToken: EncryptedDataType;
15
+ authSecret: EncryptedDataType;
16
+ options?: DroneConnectionOptionsType;
17
+ modified: Date;
18
+ }
19
+ //# sourceMappingURL=drone-connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drone-connection.d.ts","sourceRoot":"","sources":["../../src/types/drone-connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAE7C,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAElC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC;IACpB,YAAY,EAAE,KAAK,CAAC,QAAQ,CAAC;IAC7B,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,iBAAiB,CAAC;IAC7B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,CAAC,EAAE,0BAA0B,CAAC;IACrC,QAAQ,EAAE,IAAI,CAAC;CAChB"}
@@ -128,6 +128,7 @@ export interface UserType {
128
128
  shareWith3rdPartiesEnabled: boolean;
129
129
  socketIO: PubNubTokenSchemaType;
130
130
  stealthStatus: string;
131
+ visibleSources: string[];
131
132
  superuser: boolean;
132
133
  superUserReadOnly: boolean;
133
134
  syncLoggingExpireDate: Date;
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/types/user.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../src/types/user.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tabletcommand-backend-models",
3
- "version": "7.4.110",
3
+ "version": "7.4.112",
4
4
  "description": "Tablet Command Backend Models",
5
5
  "scripts": {
6
6
  "lint": "eslint src",
package/src/constants.ts CHANGED
@@ -10,6 +10,7 @@ export enum LocationSource {
10
10
  MotorolaConverged = "MotorolaConverged",
11
11
  OneStep = "OneStep",
12
12
  Samsara = "Samsara",
13
+ Skydio = "Skydio",
13
14
  Skymira = "Skymira",
14
15
  SKYTRAC = "SKYTRAC",
15
16
  Somewear = "Somewear",
@@ -22,6 +23,10 @@ export enum LocationSource {
22
23
  VehicleModem = "VehicleModem"
23
24
  }
24
25
 
26
+ export enum DroneProvider {
27
+ Skydio = "skydio"
28
+ }
29
+
25
30
  export enum LocationKindType {
26
31
  FixedWing = "fixed-wing",
27
32
  Helicopter = "helicopter",
package/src/index.ts CHANGED
@@ -6,6 +6,7 @@ export {
6
6
  AccountCallerType,
7
7
  AccountIndustry,
8
8
  DepartmentReportOdometer,
9
+ DroneProvider,
9
10
  FireMapperLayers,
10
11
  IncidentFilterKind,
11
12
  LocationKindType,
@@ -52,6 +53,7 @@ async function wireModels(mongoose: MongooseModule) {
52
53
  AudioStreamAuthentication: await getModel(import("./models/audio-stream-authentication")),
53
54
  Department: await getModel(import("./models/department")),
54
55
  DeviceMapping: await getModel(import("./models/device-mapping")),
56
+ DroneConnection: await getModel(import("./models/drone-connection")),
55
57
  Esri: await getModel(import("./models/esri")),
56
58
  GSTMapping: await getModel(import("./models/gst-mapping")),
57
59
  GlobalSettings: await getModel(import("./models/global-settings")),
@@ -120,6 +122,7 @@ export { CSVImport, CSVImportModel } from "./models/csv-import";
120
122
  export { AudioStreamAuthentication, AudioStreamAuthenticationModel } from "./models/audio-stream-authentication";
121
123
  export { Department, DepartmentModel } from "./models/department";
122
124
  export { DeviceMapping, DeviceMappingModel } from "./models/device-mapping";
125
+ export { DroneConnection, DroneConnectionModel } from "./models/drone-connection";
123
126
  export { Esri, EsriModel } from "./models/esri";
124
127
  export { GSTMapping, GSTMappingModel } from "./models/gst-mapping";
125
128
  export { GlobalSettings, GlobalSettingsModel } from "./models/global-settings";
@@ -166,11 +169,16 @@ export * from "./checklist-item-event-message";
166
169
 
167
170
  // Export types
168
171
  export type {
172
+ DronesConfigurationType,
169
173
  ForwardingConnectionType,
170
174
  ForwardingConfigType,
171
175
  ForwardFieldsType,
172
176
  IntegrationType,
173
177
  } from "./types/department";
178
+ export type {
179
+ DroneConnectionOptionsType,
180
+ DroneConnectionType,
181
+ } from "./types/drone-connection";
174
182
  export type {
175
183
  CADInterfaceMetaDataType,
176
184
  } from "./types/cad-interface-meta-data";
@@ -57,6 +57,7 @@ import {
57
57
  ManagedIncidentModeItem,
58
58
  ManagedIncidentPriority,
59
59
  ManagedIncidentPriorityItem,
60
+ GMRConfigType,
60
61
  Mark43ConfigType,
61
62
  Mark43ProcessCommentConfigType,
62
63
  Mark43ProcessConfigType,
@@ -78,6 +79,7 @@ import {
78
79
  UnitStatusCodesConfigType,
79
80
  OneStepConfigurationType,
80
81
  DroneSenseConfigurationType,
82
+ DronesConfigurationType,
81
83
  USFTConfigurationType,
82
84
  VehicleStatusWebhookConfigType,
83
85
  VehicleStatusWebhookConnectionType,
@@ -88,7 +90,7 @@ import {
88
90
  export interface Department extends DepartmentType, Record<string, unknown> {
89
91
  }
90
92
 
91
- export const Mark43StatusConfigDefault = {
93
+ export const Mark43StatusConfigDefault: UnitStatusCodesConfigType = {
92
94
  TimeDispatched: ["D"],
93
95
  TimeEnroute: ["EN"],
94
96
  TimeStaged: ["ST"],
@@ -98,6 +100,16 @@ export const Mark43StatusConfigDefault = {
98
100
  TimeArrived: ["ATS", "A"],
99
101
  };
100
102
 
103
+ export const GMRStatusConfigDefault: UnitStatusCodesConfigType = {
104
+ TimeDispatched: ["SentToVehicle"],
105
+ TimeEnroute: ["EnRouteToPickup"],
106
+ TimeStaged: [],
107
+ TimeCleared: ["Finished"],
108
+ TimeAtHospital: [],
109
+ TimeTransporting: [],
110
+ TimeArrived: ["ArrivedToPickup"],
111
+ };
112
+
101
113
  export const IntterraFieldsDefault = [
102
114
  {
103
115
  key: "IncidentNumber",
@@ -280,6 +292,16 @@ export const Mark43ConfigDefault = {
280
292
  enabled: false,
281
293
  };
282
294
 
295
+ export const GMRConfigDefault = {
296
+ baseUrl: "",
297
+ authToken: "",
298
+ apiToken: "",
299
+ enabled: false,
300
+ webhookSecret: "",
301
+ agencyId: "",
302
+ radioNamePrefixesToStrip: [],
303
+ };
304
+
283
305
  export const WebhookConfigDefault = {
284
306
  enabled: false,
285
307
  bulkProcessingEnabled: false,
@@ -526,6 +548,10 @@ export const DroneSenseConfigurationDefault = {
526
548
  apiKey: "",
527
549
  };
528
550
 
551
+ export const DronesConfigurationDefault = {
552
+ enabled: false,
553
+ };
554
+
529
555
  export const OrientationMarkerColorDefault: ColorSchemaType = {
530
556
  background: "#FC2125",
531
557
  text: "#FFFFFF",
@@ -568,7 +594,7 @@ export default async function DepartmentModule(mongoose: MongooseModule) {
568
594
  const WebhookConfig = WebhookSchema(mongoose);
569
595
  const WSFeedConfig = WSFeedSchema(mongoose);
570
596
 
571
- const Mark43StatusConfig = new Schema<UnitStatusCodesConfigType>({
597
+ const UnitStatusCodesConfig = new Schema<UnitStatusCodesConfigType>({
572
598
  TimeDispatched: {
573
599
  type: [String],
574
600
  default: []
@@ -693,7 +719,7 @@ export default async function DepartmentModule(mongoose: MongooseModule) {
693
719
  default: false,
694
720
  },
695
721
  unitStatusCodes: {
696
- type: Mark43StatusConfig,
722
+ type: UnitStatusCodesConfig,
697
723
  default: Mark43StatusConfigDefault,
698
724
  },
699
725
  process: {
@@ -704,6 +730,44 @@ export default async function DepartmentModule(mongoose: MongooseModule) {
704
730
  id: false,
705
731
  });
706
732
 
733
+ const GMRConfig = new Schema<GMRConfigType>({
734
+ baseUrl: {
735
+ type: String,
736
+ default: "",
737
+ },
738
+ authToken: {
739
+ type: String,
740
+ default: "",
741
+ },
742
+ apiToken: {
743
+ type: String,
744
+ default: "",
745
+ },
746
+ enabled: {
747
+ type: Boolean,
748
+ default: false,
749
+ },
750
+ unitStatusCodes: {
751
+ type: UnitStatusCodesConfig,
752
+ default: GMRStatusConfigDefault,
753
+ },
754
+ webhookSecret: {
755
+ type: String,
756
+ default: "",
757
+ },
758
+ agencyId: {
759
+ type: String,
760
+ default: "",
761
+ },
762
+ radioNamePrefixesToStrip: {
763
+ type: [String],
764
+ default: [],
765
+ },
766
+ }, {
767
+ _id: false,
768
+ id: false,
769
+ });
770
+
707
771
  const IntterraFields = new Schema<IntterraFieldsType>({
708
772
  key: {
709
773
  type: String,
@@ -1470,6 +1534,16 @@ export default async function DepartmentModule(mongoose: MongooseModule) {
1470
1534
  id: false,
1471
1535
  });
1472
1536
 
1537
+ const DronesConfiguration = new Schema<DronesConfigurationType>({
1538
+ enabled: {
1539
+ type: Boolean,
1540
+ default: false,
1541
+ },
1542
+ }, {
1543
+ _id: false,
1544
+ id: false,
1545
+ });
1546
+
1473
1547
  const FireMapperConfiguration = new Schema<FireMapperConfigurationType>({
1474
1548
  enabled: {
1475
1549
  type: Boolean,
@@ -2351,10 +2425,18 @@ export default async function DepartmentModule(mongoose: MongooseModule) {
2351
2425
  type: DroneSenseConfiguration,
2352
2426
  default: DroneSenseConfigurationDefault,
2353
2427
  },
2428
+ drones: {
2429
+ type: DronesConfiguration,
2430
+ default: DronesConfigurationDefault,
2431
+ },
2354
2432
  mark43: {
2355
2433
  type: Mark43Config,
2356
2434
  default: Mark43ConfigDefault
2357
2435
  },
2436
+ gmr: {
2437
+ type: GMRConfig,
2438
+ default: GMRConfigDefault
2439
+ },
2358
2440
  webhook: {
2359
2441
  type: WebhookConfig,
2360
2442
  default: WebhookConfigDefault,
@@ -0,0 +1,121 @@
1
+ import { Model } from "mongoose";
2
+
3
+ import { DroneProvider } from "../constants";
4
+ import {
5
+ currentDate,
6
+ MongooseModule,
7
+ } from "../helpers";
8
+ import { EncryptedDataType } from "../types/common";
9
+ import {
10
+ DroneConnectionOptionsType,
11
+ DroneConnectionType,
12
+ } from "../types/drone-connection";
13
+
14
+ export interface DroneConnection extends DroneConnectionType, Record<string, unknown> {
15
+ }
16
+
17
+ const EncryptedDataDefault: EncryptedDataType = {
18
+ iv: "",
19
+ encryptedData: "",
20
+ };
21
+
22
+ export function DroneConnectionSchema(mongoose: MongooseModule) {
23
+ const { Schema } = mongoose;
24
+
25
+ const EncryptedData = new Schema<EncryptedDataType>({
26
+ iv: {
27
+ type: String,
28
+ default: "",
29
+ },
30
+ encryptedData: {
31
+ type: String,
32
+ default: "",
33
+ },
34
+ }, {
35
+ _id: false,
36
+ id: false,
37
+ });
38
+
39
+ const DroneConnectionOptions = new Schema<DroneConnectionOptionsType>({
40
+ drones: {
41
+ type: String,
42
+ enum: ["all", "listed"],
43
+ default: "all",
44
+ },
45
+ serials: {
46
+ type: [String],
47
+ default: [],
48
+ },
49
+ }, {
50
+ _id: false,
51
+ id: false,
52
+ });
53
+
54
+ const modelSchema = new Schema<DroneConnectionType>({
55
+ departmentId: {
56
+ type: Schema.Types.ObjectId,
57
+ ref: "Department",
58
+ required: true,
59
+ },
60
+ provider: {
61
+ type: String,
62
+ enum: Object.values(DroneProvider),
63
+ required: true,
64
+ },
65
+ active: {
66
+ type: Boolean,
67
+ default: false,
68
+ },
69
+ label: {
70
+ type: String,
71
+ default: "",
72
+ },
73
+ authToken: {
74
+ type: EncryptedData,
75
+ default: EncryptedDataDefault,
76
+ },
77
+ authSecret: {
78
+ type: EncryptedData,
79
+ default: EncryptedDataDefault,
80
+ },
81
+ options: {
82
+ type: DroneConnectionOptions,
83
+ required: false,
84
+ },
85
+ modified: {
86
+ type: Date,
87
+ default: currentDate,
88
+ },
89
+ }, {
90
+ autoIndex: false,
91
+ timestamps: {
92
+ createdAt: false,
93
+ updatedAt: "modified",
94
+ },
95
+ });
96
+
97
+ modelSchema.index({
98
+ departmentId: 1,
99
+ }, {
100
+ name: "departmentId_1",
101
+ });
102
+
103
+ modelSchema.index({
104
+ departmentId: 1,
105
+ provider: 1,
106
+ label: 1,
107
+ }, {
108
+ name: "departmentId_1_provider_1_label_1_unique",
109
+ unique: true,
110
+ });
111
+
112
+ return modelSchema;
113
+ }
114
+
115
+ export default async function DroneConnectionModule(mongoose: MongooseModule) {
116
+ const modelSchema = DroneConnectionSchema(mongoose);
117
+ return mongoose.model<DroneConnection>("DroneConnection", modelSchema, "massive_drone_connection", { overwriteModels: true });
118
+ }
119
+
120
+ export interface DroneConnectionModel extends Model<DroneConnection> {
121
+ }
@@ -295,6 +295,10 @@ export function UserSchema(mongoose: MongooseModule) {
295
295
  type: String,
296
296
  default: "prohibited",
297
297
  },
298
+ visibleSources: {
299
+ type: [String],
300
+ default: [],
301
+ },
298
302
 
299
303
  canCreateShareIncidentCode: {
300
304
  type: Boolean,
@@ -139,6 +139,12 @@ describe("Department", function () {
139
139
  assert.isFalse(sut.watchDuty.visible);
140
140
  });
141
141
 
142
+ it("defaults drones to disabled", async function () {
143
+ const item = new models.Department(testItem);
144
+ const sut = await item.save();
145
+ assert.isFalse(sut.drones.enabled);
146
+ });
147
+
142
148
  it("saves samsara.tagIds and defaults it to an empty array", async function () {
143
149
  const item = new models.Department({
144
150
  ...testItem,
@@ -0,0 +1,164 @@
1
+ import { assert } from "chai";
2
+ import { Types } from "mongoose";
3
+ import { describe, it, beforeEach, afterEach } from "node:test";
4
+ import * as m from "../index";
5
+ import * as config from "./config";
6
+
7
+ describe("DroneConnection", function() {
8
+ let models: m.BackendModels, mongoose: m.MongooseModule;
9
+ let departmentId: Types.ObjectId;
10
+
11
+ beforeEach(async function() {
12
+ const c = await m.connect(config.url);
13
+ models = c.models;
14
+ mongoose = c.mongoose;
15
+ departmentId = new mongoose.Types.ObjectId();
16
+ await models.DroneConnection.syncIndexes();
17
+ });
18
+ afterEach(async function() {
19
+ await models.DroneConnection.deleteMany({});
20
+ await mongoose.disconnect();
21
+ });
22
+
23
+ it("is saved and reads back every field", async function() {
24
+ const sut = await new models.DroneConnection({
25
+ departmentId,
26
+ provider: "skydio",
27
+ active: true,
28
+ label: "Skydio HQ",
29
+ authToken: { iv: "iv-token", encryptedData: "enc-token" },
30
+ authSecret: { iv: "iv-secret", encryptedData: "enc-secret" },
31
+ options: {
32
+ drones: "listed",
33
+ serials: ["SN-1", "SN-2"],
34
+ },
35
+ }).save();
36
+
37
+ assert.isNotNull(sut._id);
38
+ assert.equal(sut.departmentId.toString(), departmentId.toString());
39
+ assert.equal(sut.provider, "skydio");
40
+ assert.isTrue(sut.active);
41
+ assert.equal(sut.label, "Skydio HQ");
42
+ assert.equal(sut.authToken.iv, "iv-token");
43
+ assert.equal(sut.authToken.encryptedData, "enc-token");
44
+ assert.equal(sut.authSecret.iv, "iv-secret");
45
+ assert.equal(sut.authSecret.encryptedData, "enc-secret");
46
+ assert.equal(sut.options?.drones, "listed");
47
+ assert.deepEqual(sut.options?.serials, ["SN-1", "SN-2"]);
48
+ assert.instanceOf(sut.modified, Date);
49
+ });
50
+
51
+ it("leaves options undefined when none are given", async function() {
52
+ const sut = await new models.DroneConnection({
53
+ departmentId,
54
+ provider: "skydio",
55
+ label: "No options",
56
+ authToken: { iv: "iv", encryptedData: "t" },
57
+ authSecret: { iv: "iv", encryptedData: "s" },
58
+ }).save();
59
+
60
+ assert.isUndefined(sut.options);
61
+ });
62
+
63
+ it("rejects an unknown provider", async function() {
64
+ let thrownError: unknown = null;
65
+ try {
66
+ await new models.DroneConnection({
67
+ departmentId,
68
+ provider: "bogus",
69
+ label: "Bad provider",
70
+ }).save();
71
+ } catch (e) {
72
+ thrownError = e;
73
+ }
74
+
75
+ assert.isNotNull(thrownError, "expected an unknown provider to be rejected");
76
+ assert.include(String((thrownError as Error).message), "provider");
77
+ });
78
+
79
+ it("rejects an unknown options.drones value", async function() {
80
+ let thrownError: unknown = null;
81
+ try {
82
+ await new models.DroneConnection({
83
+ departmentId,
84
+ provider: "skydio",
85
+ label: "Bad options",
86
+ options: {
87
+ drones: "list",
88
+ serials: [],
89
+ },
90
+ }).save();
91
+ } catch (e) {
92
+ thrownError = e;
93
+ }
94
+
95
+ assert.isNotNull(thrownError, "expected an unknown options.drones value to be rejected");
96
+ assert.include(String((thrownError as Error).message), "options.drones");
97
+ });
98
+
99
+ it("stores no timestamp field outside the schema", async function() {
100
+ await new models.DroneConnection({
101
+ departmentId,
102
+ provider: "skydio",
103
+ label: "Raw read",
104
+ }).save();
105
+
106
+ const raw = await models.DroneConnection.collection.findOne({ departmentId });
107
+ assert.isNotNull(raw);
108
+ assert.notProperty(raw, "createdAt");
109
+ assert.notProperty(raw, "updatedAt");
110
+ assert.property(raw, "modified");
111
+ });
112
+
113
+ it("advances modified on findOneAndUpdate", async function() {
114
+ const staleDate = new Date("2020-01-02T03:04:05.000Z");
115
+ await new models.DroneConnection({
116
+ departmentId,
117
+ provider: "skydio",
118
+ label: "Stale",
119
+ }).save();
120
+ await models.DroneConnection.collection.updateOne({
121
+ departmentId,
122
+ }, {
123
+ $set: {
124
+ modified: staleDate,
125
+ },
126
+ });
127
+
128
+ const updated = await models.DroneConnection.findOneAndUpdate({
129
+ departmentId,
130
+ }, {
131
+ $set: {
132
+ active: true,
133
+ },
134
+ }, {
135
+ new: true,
136
+ });
137
+
138
+ assert.isNotNull(updated);
139
+ assert.isTrue(updated!.modified > staleDate, "expected modified to advance");
140
+ });
141
+
142
+ it("enforces a unique (departmentId, provider, label) index", async function() {
143
+ await new models.DroneConnection({
144
+ departmentId,
145
+ provider: "skydio",
146
+ label: "Skydio HQ",
147
+ }).save();
148
+
149
+ let thrownError: unknown = null;
150
+ try {
151
+ await new models.DroneConnection({
152
+ departmentId,
153
+ provider: "skydio",
154
+ label: "Skydio HQ",
155
+ }).save();
156
+ } catch (e) {
157
+ thrownError = e;
158
+ }
159
+
160
+ assert.isNotNull(thrownError, "expected a duplicate (departmentId, label) to be rejected");
161
+ assert.equal((thrownError as { code?: number }).code, 11000);
162
+ assert.include(String((thrownError as Error).message), "E11000");
163
+ });
164
+ });
package/src/test/user.ts CHANGED
@@ -51,4 +51,15 @@ describe("User", function () {
51
51
  assert.equal(item.restrictedCommentsEnabled, true);
52
52
  assert.isTrue(sut.canBlockIncidents);
53
53
  });
54
+
55
+ it("saves and retrieves visibleSources", async function () {
56
+ const item = new models.User({
57
+ ...testItem,
58
+ stealthStatus: m.UserStealthStatus.Hidden,
59
+ visibleSources: [m.LocationSource.VehicleModem, m.LocationSource.TCIOS],
60
+ });
61
+ const sut = await item.save();
62
+ assert.equal(sut.stealthStatus, "hidden");
63
+ assert.deepEqual(sut.visibleSources, [m.LocationSource.VehicleModem, m.LocationSource.TCIOS]);
64
+ });
54
65
  });
@@ -155,6 +155,17 @@ export interface Mark43ConfigType {
155
155
  process: Mark43ProcessConfigType
156
156
  }
157
157
 
158
+ export interface GMRConfigType {
159
+ baseUrl: string,
160
+ authToken: string,
161
+ apiToken: string,
162
+ enabled: boolean,
163
+ unitStatusCodes: UnitStatusCodesConfigType,
164
+ webhookSecret: string,
165
+ agencyId: string,
166
+ radioNamePrefixesToStrip: string[],
167
+ }
168
+
158
169
  export interface IntterraFieldsType {
159
170
  key: string,
160
171
  value: string,
@@ -348,6 +359,10 @@ export interface DroneSenseConfigurationType {
348
359
  apiKey: string,
349
360
  }
350
361
 
362
+ export interface DronesConfigurationType {
363
+ enabled: boolean,
364
+ }
365
+
351
366
  export interface FireMapperConfigurationType {
352
367
  enabled: boolean,
353
368
  auth: FireMapperAuthV2Type,
@@ -672,6 +687,7 @@ export interface DepartmentType {
672
687
  managedIncidentMode: ManagedIncidentMode,
673
688
  managedIncidentPriority: ManagedIncidentPriority,
674
689
  mark43: Mark43ConfigType,
690
+ gmr: GMRConfigType,
675
691
  minPasswordLength: number,
676
692
  modified_unix_date: number,
677
693
  modified: Date,
@@ -695,6 +711,7 @@ export interface DepartmentType {
695
711
  usft: USFTConfigurationType,
696
712
  onestep: OneStepConfigurationType, // cspell:disable-line
697
713
  dronesense: DroneSenseConfigurationType,
714
+ drones: DronesConfigurationType,
698
715
  selfAssignmentEnabled: boolean,
699
716
  shareAVL: AccountConfigurationShareAVL,
700
717
  shareIncident: AccountConfigurationShareIncident,
@@ -0,0 +1,21 @@
1
+ import { Types } from "mongoose";
2
+ import { DroneProvider } from "../constants";
3
+ import { EncryptedDataType } from "./common";
4
+
5
+ export interface DroneConnectionOptionsType {
6
+ drones: "all" | "listed",
7
+ serials: string[],
8
+ }
9
+
10
+ export interface DroneConnectionType {
11
+ // The stable id the video gateway diffs on.
12
+ _id: Types.ObjectId,
13
+ departmentId: Types.ObjectId,
14
+ provider: DroneProvider,
15
+ active: boolean,
16
+ label: string,
17
+ authToken: EncryptedDataType, // Skydio token id
18
+ authSecret: EncryptedDataType, // Skydio token secret
19
+ options?: DroneConnectionOptionsType, // omitted means every drone on the account
20
+ modified: Date,
21
+ }
package/src/types/user.ts CHANGED
@@ -139,6 +139,7 @@ export interface UserType {
139
139
  shareWith3rdPartiesEnabled: boolean,
140
140
  socketIO: PubNubTokenSchemaType,
141
141
  stealthStatus: string, // UserStealthStatus
142
+ visibleSources: string[],
142
143
  superuser: boolean,
143
144
  superUserReadOnly: boolean
144
145
  syncLoggingExpireDate: Date,