dt-common-device 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/TROUBLESHOOTING.md +184 -0
  2. package/dist/config/config.d.ts +9 -2
  3. package/dist/config/config.js +97 -14
  4. package/dist/constants/Event.d.ts +75 -0
  5. package/dist/constants/Event.js +78 -0
  6. package/dist/db/db.d.ts +1 -0
  7. package/dist/db/db.js +18 -2
  8. package/dist/device/local/entities/AlertBuilder.d.ts +87 -0
  9. package/dist/device/local/entities/AlertBuilder.example.d.ts +11 -0
  10. package/dist/device/local/entities/AlertBuilder.example.js +117 -0
  11. package/dist/device/local/entities/AlertBuilder.js +179 -0
  12. package/dist/device/local/entities/IssueBuilder.d.ts +109 -0
  13. package/dist/device/local/entities/IssueBuilder.example.d.ts +16 -0
  14. package/dist/device/local/entities/IssueBuilder.example.js +196 -0
  15. package/dist/device/local/entities/IssueBuilder.js +237 -0
  16. package/dist/device/local/entities/index.d.ts +2 -0
  17. package/dist/device/local/entities/index.js +7 -0
  18. package/dist/device/local/interfaces/IDevice.d.ts +10 -9
  19. package/dist/device/local/interfaces/IDevice.js +7 -0
  20. package/dist/device/local/models/Alert.model.d.ts +28 -0
  21. package/dist/device/local/models/Alert.model.js +222 -0
  22. package/dist/device/local/models/Issue.model.d.ts +28 -0
  23. package/dist/device/local/models/Issue.model.js +260 -0
  24. package/dist/device/local/repository/Alert.repository.d.ts +106 -0
  25. package/dist/device/local/repository/Alert.repository.js +374 -0
  26. package/dist/device/local/repository/Device.repository.d.ts +10 -2
  27. package/dist/device/local/repository/Device.repository.js +153 -30
  28. package/dist/device/local/repository/Hub.repository.d.ts +1 -1
  29. package/dist/device/local/repository/Hub.repository.js +60 -18
  30. package/dist/device/local/repository/Issue.repository.d.ts +113 -0
  31. package/dist/device/local/repository/Issue.repository.js +401 -0
  32. package/dist/device/local/repository/Schedule.repository.d.ts +1 -1
  33. package/dist/device/local/repository/Schedule.repository.js +14 -18
  34. package/dist/device/local/services/Alert.service.d.ts +135 -5
  35. package/dist/device/local/services/Alert.service.js +471 -7
  36. package/dist/device/local/services/AlertService.example.d.ts +55 -0
  37. package/dist/device/local/services/AlertService.example.js +148 -0
  38. package/dist/device/local/services/Device.service.d.ts +8 -5
  39. package/dist/device/local/services/Device.service.js +58 -40
  40. package/dist/device/local/services/Issue.service.d.ts +168 -0
  41. package/dist/device/local/services/Issue.service.js +642 -0
  42. package/dist/device/local/services/IssueService.example.d.ts +68 -0
  43. package/dist/device/local/services/IssueService.example.js +177 -0
  44. package/dist/device/local/services/index.d.ts +7 -5
  45. package/dist/device/local/services/index.js +21 -11
  46. package/dist/events/BaseEventHandler.d.ts +43 -0
  47. package/dist/events/BaseEventHandler.js +111 -0
  48. package/dist/events/BaseEventTransformer.d.ts +26 -0
  49. package/dist/events/BaseEventTransformer.js +72 -0
  50. package/dist/events/DeviceEventHandler.d.ts +15 -0
  51. package/dist/events/DeviceEventHandler.js +152 -0
  52. package/dist/events/DeviceEventTransformerFactory.d.ts +27 -0
  53. package/dist/events/DeviceEventTransformerFactory.js +116 -0
  54. package/dist/events/EventHandler.d.ts +11 -0
  55. package/dist/events/EventHandler.js +106 -0
  56. package/dist/events/EventHandlerOrchestrator.d.ts +35 -0
  57. package/dist/events/EventHandlerOrchestrator.js +141 -0
  58. package/dist/events/EventProcessingService.d.ts +43 -0
  59. package/dist/events/EventProcessingService.js +243 -0
  60. package/dist/events/InternalEventSubscription.d.ts +44 -0
  61. package/dist/events/InternalEventSubscription.js +152 -0
  62. package/dist/events/index.d.ts +9 -0
  63. package/dist/events/index.js +21 -0
  64. package/dist/events/interfaces/DeviceEvent.d.ts +48 -0
  65. package/dist/events/interfaces/DeviceEvent.js +2 -0
  66. package/dist/events/interfaces/IEventHandler.d.ts +23 -0
  67. package/dist/events/interfaces/IEventHandler.js +2 -0
  68. package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
  69. package/dist/events/interfaces/IEventTransformer.js +2 -0
  70. package/dist/events/interfaces/IInternalEvent.d.ts +42 -0
  71. package/dist/events/interfaces/IInternalEvent.js +2 -0
  72. package/dist/events/interfaces/index.d.ts +4 -0
  73. package/dist/events/interfaces/index.js +20 -0
  74. package/dist/index.d.ts +6 -2
  75. package/dist/index.js +9 -2
  76. package/dist/types/alert.types.d.ts +57 -0
  77. package/dist/types/alert.types.js +22 -0
  78. package/dist/types/config.types.d.ts +15 -4
  79. package/dist/types/index.d.ts +2 -0
  80. package/dist/types/index.js +2 -0
  81. package/dist/types/issue.types.d.ts +90 -0
  82. package/dist/types/issue.types.js +40 -0
  83. package/dist/utils/http-utils.d.ts +13 -0
  84. package/dist/utils/http-utils.js +117 -0
  85. package/package.json +2 -1
  86. package/src/config/config.ts +117 -14
  87. package/src/{device/local/events/Events.ts → constants/Event.ts} +34 -13
  88. package/src/db/db.ts +14 -5
  89. package/src/device/local/entities/AlertBuilder.example.ts +126 -0
  90. package/src/device/local/entities/AlertBuilder.ts +202 -0
  91. package/src/device/local/entities/IssueBuilder.example.ts +210 -0
  92. package/src/device/local/entities/IssueBuilder.ts +263 -0
  93. package/src/device/local/entities/README.md +173 -0
  94. package/src/device/local/entities/index.ts +2 -0
  95. package/src/device/local/interfaces/IDevice.ts +11 -9
  96. package/src/device/local/models/Alert.model.md +319 -0
  97. package/src/device/local/models/Alert.model.ts +283 -0
  98. package/src/device/local/models/Issue.model.md +386 -0
  99. package/src/device/local/models/Issue.model.ts +350 -0
  100. package/src/device/local/models/README.md +312 -0
  101. package/src/device/local/repository/Alert.repository.ts +465 -0
  102. package/src/device/local/repository/Device.repository.ts +241 -32
  103. package/src/device/local/repository/Hub.repository.ts +74 -18
  104. package/src/device/local/repository/Issue.repository.ts +517 -0
  105. package/src/device/local/repository/Schedule.repository.ts +28 -22
  106. package/src/device/local/services/Alert.service.ts +617 -5
  107. package/src/device/local/services/AlertService.example.ts +229 -0
  108. package/src/device/local/services/Device.service.ts +70 -50
  109. package/src/device/local/services/Issue.service.ts +872 -0
  110. package/src/device/local/services/IssueService.example.ts +307 -0
  111. package/src/device/local/services/index.ts +7 -5
  112. package/src/events/BaseEventHandler.ts +145 -0
  113. package/src/events/BaseEventTransformer.ts +97 -0
  114. package/src/events/DeviceEventHandler.ts +211 -0
  115. package/src/events/DeviceEventTransformerFactory.ts +77 -0
  116. package/src/{device/local/events → events}/EventHandler.ts +19 -15
  117. package/src/events/EventHandlerOrchestrator.ts +119 -0
  118. package/src/events/EventProcessingService.ts +248 -0
  119. package/src/events/InternalEventSubscription.ts +219 -0
  120. package/src/events/index.ts +9 -0
  121. package/src/events/interfaces/DeviceEvent.ts +56 -0
  122. package/src/events/interfaces/IEventHandler.ts +28 -0
  123. package/src/events/interfaces/IEventTransformer.ts +8 -0
  124. package/src/events/interfaces/IInternalEvent.ts +47 -0
  125. package/src/events/interfaces/index.ts +4 -0
  126. package/src/index.ts +9 -2
  127. package/src/types/alert.types.ts +64 -0
  128. package/src/types/config.types.ts +17 -4
  129. package/src/types/index.ts +2 -0
  130. package/src/types/issue.types.ts +98 -0
  131. package/src/utils/http-utils.ts +143 -0
  132. package/src/device/local/events/index.ts +0 -2
@@ -0,0 +1,229 @@
1
+ import { AlertService } from "./Alert.service";
2
+ import { AlertBuilder } from "../entities/AlertBuilder";
3
+ import { AlertCategory, AlertSeverity, EntityType } from "../../../types/alert.types";
4
+
5
+ /**
6
+ * Example usage of the updated AlertService with AlertBuilder integration
7
+ * This file demonstrates various ways to use the AlertService with the new AlertBuilder
8
+ */
9
+
10
+ export class AlertServiceExample {
11
+ constructor(private readonly alertService: AlertService) {}
12
+
13
+ /**
14
+ * Example 1: Using the updated createAlert method with AlertBuilder
15
+ */
16
+ async createAlertWithBuilder() {
17
+ const alertBuilder = new AlertBuilder()
18
+ .setCategory(AlertCategory.OPERATIONS)
19
+ .setPropertyId("prop123")
20
+ .setTitle("Device Offline")
21
+ .setDescription("Device has been offline for more than 5 minutes")
22
+ .setEntityId("device456")
23
+ .setEntityType(EntityType.DEVICE)
24
+ .setSeverity(AlertSeverity.HIGH)
25
+ .setCreatedBy("user789");
26
+
27
+ // Pass the AlertBuilder directly to createAlert
28
+ const alert = await this.alertService.createAlert(alertBuilder);
29
+ return alert;
30
+ }
31
+
32
+ /**
33
+ * Example 2: Using convenience methods for specific alert types
34
+ */
35
+ async createSpecificAlerts() {
36
+ // Create a readiness alert
37
+ const readinessAlert = await this.alertService.raiseReadinessAlert(
38
+ "prop123",
39
+ "System Maintenance Required",
40
+ "System maintenance is scheduled for tonight",
41
+ "system456",
42
+ EntityType.PROPERTY,
43
+ "admin"
44
+ );
45
+
46
+ // Create an operations alert
47
+ const operationsAlert = await this.alertService.raiseOperationsAlert(
48
+ "prop123",
49
+ "Device Temperature High",
50
+ "Device temperature exceeds normal operating range",
51
+ "device789",
52
+ EntityType.DEVICE,
53
+ "monitor"
54
+ );
55
+
56
+ // Create a security alert
57
+ const securityAlert = await this.alertService.raiseSecurityAlert(
58
+ "prop123",
59
+ "Unauthorized Access Attempt",
60
+ "Multiple failed login attempts detected",
61
+ "user123",
62
+ EntityType.USER,
63
+ "security-system"
64
+ );
65
+
66
+ // Create an energy alert
67
+ const energyAlert = await this.alertService.raiseEnergyAlert(
68
+ "prop123",
69
+ "High Energy Consumption",
70
+ "Energy usage is 20% above normal levels",
71
+ "zone456",
72
+ EntityType.COLLECTION,
73
+ "energy-monitor"
74
+ );
75
+
76
+ return { readinessAlert, operationsAlert, securityAlert, energyAlert };
77
+ }
78
+
79
+ /**
80
+ * Example 3: Using device-specific alert methods
81
+ */
82
+ async createDeviceAlerts() {
83
+ // Create a device alert with default category and severity
84
+ const deviceAlert1 = await this.alertService.raiseDeviceAlert(
85
+ "device123",
86
+ "prop456",
87
+ "Device Battery Low",
88
+ "Device battery level is below 20%",
89
+ undefined, // Use default category
90
+ undefined, // Use default severity
91
+ "system"
92
+ );
93
+
94
+ // Create a device alert with custom category and severity
95
+ const deviceAlert2 = await this.alertService.raiseDeviceAlert(
96
+ "device789",
97
+ "prop456",
98
+ "Device Firmware Update Available",
99
+ "New firmware version is available for installation",
100
+ AlertCategory.READINESS,
101
+ AlertSeverity.MEDIUM,
102
+ "firmware-manager"
103
+ );
104
+
105
+ return { deviceAlert1, deviceAlert2 };
106
+ }
107
+
108
+ /**
109
+ * Example 4: Using hub-specific alert methods
110
+ */
111
+ async createHubAlerts() {
112
+ // Create a hub alert with default settings
113
+ const hubAlert1 = await this.alertService.raiseHubAlert(
114
+ "hub123",
115
+ "prop456",
116
+ "Hub Connection Lost",
117
+ "Hub has lost connection to the network",
118
+ undefined, // Use default category
119
+ undefined, // Use default severity
120
+ "network-monitor"
121
+ );
122
+
123
+ // Create a hub alert with custom settings
124
+ const hubAlert2 = await this.alertService.raiseHubAlert(
125
+ "hub789",
126
+ "prop456",
127
+ "Hub Maintenance Required",
128
+ "Hub requires scheduled maintenance",
129
+ AlertCategory.READINESS,
130
+ AlertSeverity.LOW,
131
+ "maintenance-system"
132
+ );
133
+
134
+ return { hubAlert1, hubAlert2 };
135
+ }
136
+
137
+ /**
138
+ * Example 5: Using static factory methods with AlertBuilder
139
+ */
140
+ async createAlertsWithStaticMethods() {
141
+ // Create a device alert using static factory method
142
+ const deviceAlert = AlertBuilder.createDeviceAlert("device123", "prop456")
143
+ .setCategory(AlertCategory.OPERATIONS)
144
+ .setTitle("Device Offline")
145
+ .setDescription("Device has been offline for more than 5 minutes")
146
+ .setSeverity(AlertSeverity.HIGH)
147
+ .setCreatedBy("monitor");
148
+
149
+ const alert1 = await this.alertService.createAlert(deviceAlert);
150
+
151
+ // Create a hub alert using static factory method
152
+ const hubAlert = AlertBuilder.createHubAlert("hub789", "prop202")
153
+ .setCategory(AlertCategory.SECURITY)
154
+ .setTitle("Hub Security Breach")
155
+ .setDescription("Unauthorized access attempt detected on hub")
156
+ .setSeverity(AlertSeverity.CRITICAL)
157
+ .setCreatedBy("security-system");
158
+
159
+ const alert2 = await this.alertService.createAlert(hubAlert);
160
+
161
+ return { alert1, alert2 };
162
+ }
163
+
164
+ /**
165
+ * Example 6: Creating multiple alerts efficiently
166
+ */
167
+ async createMultipleAlerts() {
168
+ const alerts = [];
169
+
170
+ // Create multiple device alerts efficiently
171
+ const deviceIds = ["device1", "device2", "device3"];
172
+ const propertyId = "prop123";
173
+
174
+ for (const deviceId of deviceIds) {
175
+ const alertBuilder = AlertBuilder.createDeviceAlert(deviceId, propertyId)
176
+ .setCategory(AlertCategory.OPERATIONS)
177
+ .setTitle(`Device ${deviceId} Status`)
178
+ .setDescription(`Status check for device ${deviceId}`)
179
+ .setSeverity(AlertSeverity.MEDIUM)
180
+ .setCreatedBy("batch-processor");
181
+
182
+ const alert = await this.alertService.createAlert(alertBuilder);
183
+ alerts.push(alert);
184
+ }
185
+
186
+ return alerts;
187
+ }
188
+
189
+ /**
190
+ * Example 7: Creating alerts with snooze functionality
191
+ */
192
+ async createSnoozedAlert() {
193
+ const snoozeUntil = new Date();
194
+ snoozeUntil.setHours(snoozeUntil.getHours() + 2); // Snooze for 2 hours
195
+
196
+ const alertBuilder = new AlertBuilder()
197
+ .setCategory(AlertCategory.OTHER)
198
+ .setPropertyId("prop303")
199
+ .setTitle("Scheduled Maintenance")
200
+ .setDescription("System maintenance scheduled for tonight")
201
+ .setEntityType(EntityType.PROPERTY)
202
+ .setSeverity(AlertSeverity.INFO)
203
+ .setCreatedBy("admin")
204
+ .setSnoozeUntil(snoozeUntil);
205
+
206
+ const alert = await this.alertService.createAlert(alertBuilder);
207
+ return alert;
208
+ }
209
+
210
+ /**
211
+ * Example 8: Backward compatibility - still works with CreateAlertData
212
+ */
213
+ async createAlertWithLegacyData() {
214
+ const alertData = {
215
+ category: AlertCategory.OPERATIONS,
216
+ propertyId: "prop123",
217
+ title: "Legacy Alert",
218
+ description: "This alert was created using the old CreateAlertData format",
219
+ entityId: "device456",
220
+ entityType: EntityType.DEVICE,
221
+ severity: AlertSeverity.MEDIUM,
222
+ createdBy: "legacy-system"
223
+ };
224
+
225
+ // This still works with the updated createAlert method
226
+ const alert = await this.alertService.createAlert(alertData);
227
+ return alert;
228
+ }
229
+ }
@@ -1,20 +1,14 @@
1
- import { checkAwsEnv, ensureAuditInitialized } from "../../../config/config";
2
- import { IDevice } from "../interfaces";
3
- import { EventHandler } from "../events/EventHandler";
1
+ import { IDevice, INewStatus } from "../interfaces";
2
+ import { EventHandler } from "../../../events/EventHandler";
4
3
  import { isEqual } from "lodash";
5
- import { AlertService } from "./Alert.service";
6
4
  import { DeviceRepository } from "../repository/Device.repository";
7
5
  import Container from "typedi";
8
6
 
9
7
  export class LocalDeviceService {
10
8
  private readonly eventHandler: EventHandler;
11
- private readonly alertService: AlertService;
12
9
  private readonly deviceRepository: DeviceRepository;
13
10
  constructor() {
14
- checkAwsEnv();
15
- ensureAuditInitialized();
16
11
  this.eventHandler = new EventHandler();
17
- this.alertService = new AlertService();
18
12
  this.deviceRepository = Container.get(DeviceRepository);
19
13
  }
20
14
 
@@ -105,6 +99,7 @@ export class LocalDeviceService {
105
99
  (key) => !isEqual(oldState[key], newState[key])
106
100
  );
107
101
  if (changedKeys.length > 0) {
102
+ await this.deviceRepository.setState(deviceId, newState);
108
103
  return await this.eventHandler.onStateChange(deviceId, newState);
109
104
  }
110
105
  }
@@ -116,31 +111,27 @@ export class LocalDeviceService {
116
111
  return await this.deviceRepository.getStatus(deviceId);
117
112
  }
118
113
 
119
- //TODO: Define type of newStatus
120
- async setStatus(deviceId: string, newStatus: any) {
114
+ async setStatus(deviceId: string, newStatus: INewStatus) {
121
115
  if (!deviceId || !newStatus) {
122
116
  throw new Error("Device ID and new status are required");
123
117
  }
124
- // If old status and new status are different
118
+
125
119
  const oldStatus = await this.getStatus(deviceId);
126
- const changedKeys = Object.keys(newStatus).filter(
127
- (key) => !isEqual(oldStatus?.data?.[key], newStatus?.[key])
128
- );
129
- if (changedKeys.length > 0) {
130
- return await this.eventHandler.onStatusChange(deviceId, newStatus);
120
+ const isStatusChanged = !isEqual(oldStatus, newStatus);
121
+
122
+ if (isStatusChanged) {
123
+ await this.deviceRepository.setStatus(deviceId, newStatus);
124
+ await this.eventHandler.onStatusChange(deviceId, newStatus);
131
125
  }
132
- // If both old and new status are offline, check the time difference between the last offline status and current time
133
- if (
134
- oldStatus?.data?.online === false &&
135
- oldStatus?.data?.lastUpdated &&
136
- newStatus?.online === false
137
- ) {
138
- const lastOfflineTime = new Date(oldStatus?.data?.lastUpdated).getTime();
139
- const currentTime = Date.now();
140
- const timeDifference = currentTime - lastOfflineTime;
141
- // Compare it with the baseline profile time of the device. If the difference is higher, then raise an operational alert
142
- if (timeDifference > 1000 * 60 * 60 * 24) {
143
- return await this.alertService.raiseOperationsAlert();
126
+
127
+ const isBothOffline =
128
+ oldStatus?.online === false && newStatus?.online === false;
129
+ if (isBothOffline && oldStatus?.lastUpdated) {
130
+ const timeDifference =
131
+ Date.now() - new Date(oldStatus.lastUpdated).getTime();
132
+ if (timeDifference > 86400000) {
133
+ //return await this.alertService.raiseOperationsAlert();
134
+ return;
144
135
  }
145
136
  }
146
137
  }
@@ -152,33 +143,31 @@ export class LocalDeviceService {
152
143
  return await this.deviceRepository.getBatteryLevel(deviceId);
153
144
  }
154
145
 
155
- //TODO: Define payload type of newBatteryLevel
156
- async setBatteryLevel(deviceId: string, newBatteryLevel: any) {
157
- if (!deviceId || !newBatteryLevel) {
158
- throw new Error("Device ID and new battery level are required");
159
- }
160
- // If old battery level and new battery level are different
146
+ async setBatteryLevel(deviceId: string, batteryLevel: number) {
147
+ // Fetch the old battery level state
161
148
  const oldBatteryLevel = await this.getBatteryLevel(deviceId);
162
- const changedKeys = Object.keys(newBatteryLevel).filter(
163
- (key) => !isEqual(oldBatteryLevel?.data?.[key], newBatteryLevel?.[key])
164
- );
165
- if (changedKeys.length > 0) {
166
- return await this.eventHandler.onBatteryLevelChange(
167
- deviceId,
168
- newBatteryLevel
169
- );
149
+
150
+ const isDifferent = !isEqual(oldBatteryLevel?.value, batteryLevel);
151
+
152
+ if (isDifferent) {
153
+ await this.deviceRepository.setBatteryLevel(deviceId, batteryLevel);
154
+ await this.eventHandler.onBatteryLevelChange(deviceId, batteryLevel);
170
155
  }
171
- // If current battery level is less than 20% and lsat updated time is more than 8 hours, raise an energy alert
156
+
157
+ // Check if battery is low and not updated for 8 hours
172
158
  if (
173
- newBatteryLevel?.value < 20 &&
174
- oldBatteryLevel?.data?.value < 20 &&
175
- new Date(oldBatteryLevel?.data?.lastUpdated).getTime() <
176
- Date.now() - 1000 * 60 * 60 * 8
159
+ batteryLevel < 20 &&
160
+ oldBatteryLevel?.value < 20 &&
161
+ oldBatteryLevel?.lastUpdated &&
162
+ new Date(oldBatteryLevel.lastUpdated).getTime() <
163
+ Date.now() - 1000 * 60 * 60 * 8 // 8 hours in ms
177
164
  ) {
178
- //TODO: Raise an energy alert
179
- await this.alertService.raiseEnergyAlert();
165
+ // TODO: Raise an energy alert
166
+ // await this.alertService.raiseEnergyAlert();
167
+ return;
180
168
  }
181
169
  }
170
+
182
171
  async getMetaData(deviceId: string) {
183
172
  if (!deviceId) {
184
173
  throw new Error("Device ID is required");
@@ -189,7 +178,8 @@ export class LocalDeviceService {
189
178
  if (!deviceId || !metaData) {
190
179
  throw new Error("Device ID and meta data are required");
191
180
  }
192
- return await this.eventHandler.onDeviceMetaChange(deviceId, metaData);
181
+ await this.eventHandler.onDeviceMetaChange(deviceId, metaData);
182
+ return await this.deviceRepository.setMetaData(deviceId, metaData);
193
183
  }
194
184
 
195
185
  async getDevicesByZone(zoneId: string) {
@@ -205,4 +195,34 @@ export class LocalDeviceService {
205
195
  }
206
196
  return await this.deviceRepository.getDevicesByAccessGroup(accessGroupId);
207
197
  }
198
+
199
+ async querySelect(query: any, fields: string[]) {
200
+ if (!query || Object.keys(query).length === 0) {
201
+ throw new Error("Query is required");
202
+ }
203
+ return await this.deviceRepository.querySelect(query, fields);
204
+ }
205
+
206
+ async queryCount(query: any): Promise<number> {
207
+ if (!query || Object.keys(query).length === 0) {
208
+ throw new Error("Query is required");
209
+ }
210
+ const count = await this.deviceRepository.queryCount(query);
211
+ return count;
212
+ }
213
+
214
+ async deleteDevices(query: any) {
215
+ if (!query || Object.keys(query).length === 0) {
216
+ throw new Error("Query is required");
217
+ }
218
+ return await this.deviceRepository.deleteDevices(query);
219
+ }
220
+
221
+ async queryDevices(query: any) {
222
+ if (!query || Object.keys(query).length === 0) {
223
+ throw new Error("Query is required");
224
+ }
225
+ const count = await this.deviceRepository.queryDevices(query);
226
+ return count;
227
+ }
208
228
  }