dt-common-device 1.3.0 → 2.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.
Files changed (156) 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/cloud/entities/CloudDevice.d.ts +1 -0
  9. package/dist/device/cloud/entities/CloudDevice.js +3 -0
  10. package/dist/device/local/entities/AlertBuilder.d.ts +87 -0
  11. package/dist/device/local/entities/AlertBuilder.example.d.ts +11 -0
  12. package/dist/device/local/entities/AlertBuilder.example.js +117 -0
  13. package/dist/device/local/entities/AlertBuilder.js +179 -0
  14. package/dist/device/local/entities/IssueBuilder.d.ts +109 -0
  15. package/dist/device/local/entities/IssueBuilder.example.d.ts +16 -0
  16. package/dist/device/local/entities/IssueBuilder.example.js +196 -0
  17. package/dist/device/local/entities/IssueBuilder.js +237 -0
  18. package/dist/device/local/entities/index.d.ts +2 -0
  19. package/dist/device/local/entities/index.js +7 -0
  20. package/dist/device/local/events/EventHandler.js +6 -6
  21. package/dist/device/local/events/Events.d.ts +33 -12
  22. package/dist/device/local/events/Events.js +33 -12
  23. package/dist/device/local/interfaces/IDevice.d.ts +10 -9
  24. package/dist/device/local/interfaces/IDevice.js +7 -0
  25. package/dist/device/local/models/Alert.model.d.ts +28 -0
  26. package/dist/device/local/models/Alert.model.js +222 -0
  27. package/dist/device/local/models/Issue.model.d.ts +28 -0
  28. package/dist/device/local/models/Issue.model.js +260 -0
  29. package/dist/device/local/repository/Alert.repository.d.ts +106 -0
  30. package/dist/device/local/repository/Alert.repository.js +374 -0
  31. package/dist/device/local/repository/Device.repository.d.ts +11 -2
  32. package/dist/device/local/repository/Device.repository.js +163 -30
  33. package/dist/device/local/repository/Hub.repository.d.ts +1 -1
  34. package/dist/device/local/repository/Hub.repository.js +60 -18
  35. package/dist/device/local/repository/Issue.repository.d.ts +113 -0
  36. package/dist/device/local/repository/Issue.repository.js +401 -0
  37. package/dist/device/local/repository/Schedule.repository.d.ts +1 -1
  38. package/dist/device/local/repository/Schedule.repository.js +14 -18
  39. package/dist/device/local/services/Alert.service.d.ts +135 -5
  40. package/dist/device/local/services/Alert.service.js +471 -7
  41. package/dist/device/local/services/AlertService.example.d.ts +55 -0
  42. package/dist/device/local/services/AlertService.example.js +148 -0
  43. package/dist/device/local/services/Device.service.d.ts +9 -6
  44. package/dist/device/local/services/Device.service.js +61 -41
  45. package/dist/device/local/services/Issue.service.d.ts +168 -0
  46. package/dist/device/local/services/Issue.service.js +642 -0
  47. package/dist/device/local/services/IssueService.example.d.ts +68 -0
  48. package/dist/device/local/services/IssueService.example.js +177 -0
  49. package/dist/device/local/services/index.d.ts +7 -5
  50. package/dist/device/local/services/index.js +21 -11
  51. package/dist/events/BaseEventHandler.d.ts +43 -0
  52. package/dist/events/BaseEventHandler.js +111 -0
  53. package/dist/events/BaseEventTransformer.d.ts +26 -0
  54. package/dist/events/BaseEventTransformer.js +72 -0
  55. package/dist/events/DeviceEventHandler.d.ts +15 -0
  56. package/dist/events/DeviceEventHandler.js +152 -0
  57. package/dist/events/DeviceEventTransformerFactory.d.ts +27 -0
  58. package/dist/events/DeviceEventTransformerFactory.js +116 -0
  59. package/dist/events/EventHandler.d.ts +11 -0
  60. package/dist/events/EventHandler.js +111 -0
  61. package/dist/events/EventHandlerOrchestrator.d.ts +35 -0
  62. package/dist/events/EventHandlerOrchestrator.js +141 -0
  63. package/dist/events/EventProcessingService.d.ts +43 -0
  64. package/dist/events/EventProcessingService.js +243 -0
  65. package/dist/events/InternalEventSubscription.d.ts +44 -0
  66. package/dist/events/InternalEventSubscription.js +152 -0
  67. package/dist/events/index.d.ts +9 -0
  68. package/dist/events/index.js +21 -0
  69. package/dist/events/interfaces/DeviceEvent.d.ts +48 -0
  70. package/dist/events/interfaces/IEventHandler.d.ts +23 -0
  71. package/dist/{device/cloud/interface.js → events/interfaces/IEventHandler.js} +0 -1
  72. package/dist/events/interfaces/IEventTransformer.d.ts +7 -0
  73. package/dist/{device/cloud/interfaces/IDeviceConnectionService.js → events/interfaces/IEventTransformer.js} +0 -1
  74. package/dist/events/interfaces/IInternalEvent.d.ts +42 -0
  75. package/dist/events/interfaces/IInternalEvent.js +2 -0
  76. package/dist/events/interfaces/index.d.ts +4 -0
  77. package/dist/{device → events/interfaces}/index.js +4 -4
  78. package/dist/index.d.ts +6 -2
  79. package/dist/index.js +9 -2
  80. package/dist/types/alert.types.d.ts +57 -0
  81. package/dist/types/alert.types.js +22 -0
  82. package/dist/types/config.types.d.ts +15 -4
  83. package/dist/types/index.d.ts +2 -0
  84. package/dist/types/index.js +2 -0
  85. package/dist/types/issue.types.d.ts +90 -0
  86. package/dist/types/issue.types.js +40 -0
  87. package/dist/utils/http-utils.d.ts +13 -0
  88. package/dist/utils/http-utils.js +117 -0
  89. package/package.json +2 -1
  90. package/src/config/config.ts +117 -14
  91. package/src/{device/local/events/Events.ts → constants/Event.ts} +34 -13
  92. package/src/db/db.ts +14 -5
  93. package/src/device/cloud/entities/CloudDevice.ts +4 -0
  94. package/src/device/local/entities/AlertBuilder.example.ts +126 -0
  95. package/src/device/local/entities/AlertBuilder.ts +202 -0
  96. package/src/device/local/entities/IssueBuilder.example.ts +210 -0
  97. package/src/device/local/entities/IssueBuilder.ts +263 -0
  98. package/src/device/local/entities/README.md +173 -0
  99. package/src/device/local/entities/index.ts +2 -0
  100. package/src/device/local/interfaces/IDevice.ts +11 -9
  101. package/src/device/local/models/Alert.model.md +319 -0
  102. package/src/device/local/models/Alert.model.ts +283 -0
  103. package/src/device/local/models/Issue.model.md +386 -0
  104. package/src/device/local/models/Issue.model.ts +350 -0
  105. package/src/device/local/models/README.md +312 -0
  106. package/src/device/local/repository/Alert.repository.ts +465 -0
  107. package/src/device/local/repository/Device.repository.ts +251 -30
  108. package/src/device/local/repository/Hub.repository.ts +74 -18
  109. package/src/device/local/repository/Issue.repository.ts +517 -0
  110. package/src/device/local/repository/Schedule.repository.ts +28 -22
  111. package/src/device/local/services/Alert.service.ts +617 -5
  112. package/src/device/local/services/AlertService.example.ts +229 -0
  113. package/src/device/local/services/Device.service.ts +74 -52
  114. package/src/device/local/services/Issue.service.ts +872 -0
  115. package/src/device/local/services/IssueService.example.ts +307 -0
  116. package/src/device/local/services/index.ts +7 -5
  117. package/src/events/BaseEventHandler.ts +145 -0
  118. package/src/events/BaseEventTransformer.ts +97 -0
  119. package/src/events/DeviceEventHandler.ts +211 -0
  120. package/src/events/DeviceEventTransformerFactory.ts +77 -0
  121. package/src/{device/local/events → events}/EventHandler.ts +24 -19
  122. package/src/events/EventHandlerOrchestrator.ts +119 -0
  123. package/src/events/EventProcessingService.ts +248 -0
  124. package/src/events/InternalEventSubscription.ts +219 -0
  125. package/src/events/index.ts +9 -0
  126. package/src/events/interfaces/DeviceEvent.ts +56 -0
  127. package/src/events/interfaces/IEventHandler.ts +28 -0
  128. package/src/events/interfaces/IEventTransformer.ts +8 -0
  129. package/src/events/interfaces/IInternalEvent.ts +47 -0
  130. package/src/events/interfaces/index.ts +4 -0
  131. package/src/index.ts +9 -2
  132. package/src/types/alert.types.ts +64 -0
  133. package/src/types/config.types.ts +17 -4
  134. package/src/types/index.ts +2 -0
  135. package/src/types/issue.types.ts +98 -0
  136. package/src/utils/http-utils.ts +143 -0
  137. package/dist/device/cloud/interface.d.ts +0 -101
  138. package/dist/device/cloud/interfaces/IDeviceConnectionService.d.ts +0 -7
  139. package/dist/device/cloud/interfaces/IDevicesService.d.ts +0 -9
  140. package/dist/device/cloud/services/Device.service.d.ts +0 -39
  141. package/dist/device/cloud/services/Device.service.js +0 -9
  142. package/dist/device/cloud/services/DeviceCloudService.d.ts +0 -42
  143. package/dist/device/cloud/services/DeviceCloudService.js +0 -59
  144. package/dist/device/cloud/services/DeviceHub.service.d.ts +0 -3
  145. package/dist/device/cloud/services/DeviceHub.service.js +0 -6
  146. package/dist/device/cloud/services/Hub.service.d.ts +0 -25
  147. package/dist/device/cloud/services/Hub.service.js +0 -9
  148. package/dist/device/cloud/services/SmartThingsDeviceService.d.ts +0 -38
  149. package/dist/device/cloud/services/SmartThingsDeviceService.js +0 -52
  150. package/dist/device/index.d.ts +0 -4
  151. package/dist/device/local/interface.d.ts +0 -0
  152. package/dist/device/local/interface.js +0 -1
  153. package/dist/device/local/services/DeviceHub.service.d.ts +0 -11
  154. package/dist/device/local/services/DeviceHub.service.js +0 -40
  155. package/src/device/local/events/index.ts +0 -2
  156. /package/dist/{device/cloud/interfaces/IDevicesService.js → events/interfaces/DeviceEvent.js} +0 -0
package/src/db/db.ts CHANGED
@@ -1,11 +1,10 @@
1
1
  import { Pool } from "pg";
2
- import { getPostgresDbUri } from "../config/config";
3
-
4
- const URI = getPostgresDbUri();
5
-
6
- let pool: Pool | null = null;
2
+ import { getMongoUri, getPostgresDbUri } from "../config/config";
3
+ import mongoose from "mongoose";
7
4
 
8
5
  export function getPostgresClient() {
6
+ const URI = getPostgresDbUri();
7
+ let pool: Pool | null = null;
9
8
  if (!pool) {
10
9
  pool = new Pool({
11
10
  connectionString: URI,
@@ -13,3 +12,13 @@ export function getPostgresClient() {
13
12
  }
14
13
  return pool;
15
14
  }
15
+
16
+ export const connectDatabase = async (): Promise<void> => {
17
+ try {
18
+ const URI = getMongoUri();
19
+ await mongoose.connect(URI);
20
+ console.log(`Connected to MongoDB at ${URI.split("/").at(-1)}`);
21
+ } catch (error: any) {
22
+ console.error("Error connecting to MongoDB:", error);
23
+ }
24
+ };
@@ -33,4 +33,8 @@ export abstract class CloudDevice implements ICloudDevice {
33
33
  async getStatus(connectionId: string, deviceId: string): Promise<string> {
34
34
  throw new Error("Method not implemented in Super Class.");
35
35
  }
36
+
37
+ async toLocalDevice(): Promise<IDevice> {
38
+ return {} as IDevice;
39
+ }
36
40
  }
@@ -0,0 +1,126 @@
1
+ import { AlertBuilder } from "./AlertBuilder";
2
+ import { AlertCategory, AlertSeverity, EntityType } from "../../../types/alert.types";
3
+
4
+ /**
5
+ * Example usage of AlertBuilder
6
+ * This file demonstrates various ways to use the AlertBuilder pattern
7
+ */
8
+
9
+ // Example 1: Basic alert creation
10
+ export function createBasicAlert() {
11
+ const alertData = new AlertBuilder()
12
+ .setCategory(AlertCategory.OPERATIONS)
13
+ .setPropertyId("prop123")
14
+ .setTitle("Device Offline")
15
+ .setDescription("Device has been offline for more than 5 minutes")
16
+ .setEntityId("device456")
17
+ .setEntityType(EntityType.DEVICE)
18
+ .setSeverity(AlertSeverity.HIGH)
19
+ .setCreatedBy("user789")
20
+ .build();
21
+
22
+ return alertData;
23
+ }
24
+
25
+ // Example 2: Using static factory methods
26
+ export function createDeviceAlert() {
27
+ const alertData = AlertBuilder.createDeviceAlert("device123", "prop456")
28
+ .setCategory(AlertCategory.READINESS)
29
+ .setTitle("Device Maintenance Required")
30
+ .setDescription("Device firmware update is available")
31
+ .setSeverity(AlertSeverity.MEDIUM)
32
+ .setCreatedBy("system")
33
+ .build();
34
+
35
+ return alertData;
36
+ }
37
+
38
+ // Example 3: Using predefined alert types
39
+ export function createSecurityAlert() {
40
+ const alertData = AlertBuilder.createSecurityAlert()
41
+ .setPropertyId("prop789")
42
+ .setTitle("Unauthorized Access Attempt")
43
+ .setDescription("Multiple failed login attempts detected")
44
+ .setEntityId("user123")
45
+ .setEntityType(EntityType.USER)
46
+ .setCreatedBy("security-system")
47
+ .build();
48
+
49
+ return alertData;
50
+ }
51
+
52
+ // Example 4: Creating energy alert
53
+ export function createEnergyAlert() {
54
+ const alertData = AlertBuilder.createEnergyAlert()
55
+ .setPropertyId("prop101")
56
+ .setTitle("High Energy Consumption")
57
+ .setDescription("Energy usage is 20% above normal levels")
58
+ .setEntityId("zone456")
59
+ .setEntityType(EntityType.COLLECTION)
60
+ .setCreatedBy("energy-monitor")
61
+ .build();
62
+
63
+ return alertData;
64
+ }
65
+
66
+ // Example 5: Creating hub alert
67
+ export function createHubAlert() {
68
+ const alertData = AlertBuilder.createHubAlert("hub789", "prop202")
69
+ .setCategory(AlertCategory.OPERATIONS)
70
+ .setTitle("Hub Connection Lost")
71
+ .setDescription("Hub has lost connection to the network")
72
+ .setSeverity(AlertSeverity.CRITICAL)
73
+ .setCreatedBy("network-monitor")
74
+ .build();
75
+
76
+ return alertData;
77
+ }
78
+
79
+ // Example 6: Alert with snooze
80
+ export function createSnoozedAlert() {
81
+ const snoozeUntil = new Date();
82
+ snoozeUntil.setHours(snoozeUntil.getHours() + 2); // Snooze for 2 hours
83
+
84
+ const alertData = new AlertBuilder()
85
+ .setCategory(AlertCategory.OTHER)
86
+ .setPropertyId("prop303")
87
+ .setTitle("Scheduled Maintenance")
88
+ .setDescription("System maintenance scheduled for tonight")
89
+ .setEntityType(EntityType.PROPERTY)
90
+ .setSeverity(AlertSeverity.INFO)
91
+ .setCreatedBy("admin")
92
+ .setSnoozeUntil(snoozeUntil)
93
+ .build();
94
+
95
+ return alertData;
96
+ }
97
+
98
+ // Example 7: Reusing builder instance
99
+ export function createMultipleAlerts() {
100
+ const builder = new AlertBuilder()
101
+ .setPropertyId("prop404")
102
+ .setCreatedBy("system");
103
+
104
+ const alert1 = builder
105
+ .setCategory(AlertCategory.OPERATIONS)
106
+ .setTitle("Device Temperature High")
107
+ .setDescription("Device temperature exceeds normal operating range")
108
+ .setEntityId("device789")
109
+ .setEntityType(EntityType.DEVICE)
110
+ .setSeverity(AlertSeverity.HIGH)
111
+ .build();
112
+
113
+ const alert2 = builder
114
+ .reset()
115
+ .setPropertyId("prop404")
116
+ .setCategory(AlertCategory.ENERGY)
117
+ .setTitle("Low Battery Warning")
118
+ .setDescription("Device battery level is below 20%")
119
+ .setEntityId("device789")
120
+ .setEntityType(EntityType.DEVICE)
121
+ .setSeverity(AlertSeverity.MEDIUM)
122
+ .setCreatedBy("system")
123
+ .build();
124
+
125
+ return [alert1, alert2];
126
+ }
@@ -0,0 +1,202 @@
1
+ import {
2
+ CreateAlertData,
3
+ AlertCategory,
4
+ AlertSeverity,
5
+ EntityType,
6
+ } from "../../../types/alert.types";
7
+
8
+ /**
9
+ * AlertBuilder - A builder pattern implementation for constructing CreateAlertData objects
10
+ *
11
+ * This builder provides a fluent interface for creating alert data with proper validation
12
+ * and default values. It follows the Builder pattern which is a standard design pattern
13
+ * in TypeScript for constructing complex objects.
14
+ *
15
+ * Usage example:
16
+ * const alertData = new AlertBuilder()
17
+ * .setCategory(AlertCategory.OPERATIONS)
18
+ * .setPropertyId("prop123")
19
+ * .setTitle("Device Offline")
20
+ * .setDescription("Device has been offline for more than 5 minutes")
21
+ * .setEntityId("device456")
22
+ * .setEntityType(EntityType.DEVICE)
23
+ * .setSeverity(AlertSeverity.HIGH)
24
+ * .setCreatedBy("user789")
25
+ * .build();
26
+ */
27
+ export class AlertBuilder {
28
+ private data: Partial<CreateAlertData> = {};
29
+
30
+ /**
31
+ * Sets the alert category
32
+ */
33
+ setCategory(category: AlertCategory): AlertBuilder {
34
+ this.data.category = category;
35
+ return this;
36
+ }
37
+
38
+ /**
39
+ * Sets the property ID
40
+ */
41
+ setPropertyId(propertyId: string): AlertBuilder {
42
+ if (!propertyId || propertyId.trim() === "") {
43
+ throw new Error("Property ID is required and cannot be empty");
44
+ }
45
+ this.data.propertyId = propertyId;
46
+ return this;
47
+ }
48
+
49
+ /**
50
+ * Sets the alert title
51
+ */
52
+ setTitle(title: string): AlertBuilder {
53
+ if (!title || title.trim() === "") {
54
+ throw new Error("Title is required and cannot be empty");
55
+ }
56
+ this.data.title = title.trim();
57
+ return this;
58
+ }
59
+
60
+ /**
61
+ * Sets the alert description
62
+ */
63
+ setDescription(description: string): AlertBuilder {
64
+ if (!description || description.trim() === "") {
65
+ throw new Error("Description is required and cannot be empty");
66
+ }
67
+ this.data.description = description.trim();
68
+ return this;
69
+ }
70
+
71
+ /**
72
+ * Sets the entity ID (optional)
73
+ */
74
+ setEntityId(entityId?: string): AlertBuilder {
75
+ if (entityId !== undefined) {
76
+ this.data.entityId = entityId.trim() || undefined;
77
+ }
78
+ return this;
79
+ }
80
+
81
+ /**
82
+ * Sets the entity type
83
+ */
84
+ setEntityType(entityType: EntityType): AlertBuilder {
85
+ this.data.entityType = entityType;
86
+ return this;
87
+ }
88
+
89
+ /**
90
+ * Sets the alert severity (optional, defaults to MEDIUM)
91
+ */
92
+ setSeverity(severity?: AlertSeverity): AlertBuilder {
93
+ if (severity !== undefined) {
94
+ this.data.severity = severity;
95
+ }
96
+ return this;
97
+ }
98
+
99
+ /**
100
+ * Sets the user who created the alert (optional)
101
+ */
102
+ setCreatedBy(createdBy?: string): AlertBuilder {
103
+ if (createdBy !== undefined) {
104
+ this.data.createdBy = createdBy.trim() || undefined;
105
+ }
106
+ return this;
107
+ }
108
+
109
+ /**
110
+ * Sets the snooze until date (optional)
111
+ */
112
+ setSnoozeUntil(snoozeUntil?: Date): AlertBuilder {
113
+ if (snoozeUntil !== undefined) {
114
+ this.data.snoozeUntil = snoozeUntil;
115
+ }
116
+ return this;
117
+ }
118
+
119
+ /**
120
+ * Validates that all required fields are present
121
+ */
122
+ private validate(): void {
123
+ const requiredFields = ["category", "propertyId", "title", "description", "entityType"];
124
+ const missingFields = requiredFields.filter(field => !this.data[field as keyof CreateAlertData]);
125
+
126
+ if (missingFields.length > 0) {
127
+ throw new Error(`Missing required fields: ${missingFields.join(", ")}`);
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Builds and returns the CreateAlertData object
133
+ * @throws Error if required fields are missing
134
+ */
135
+ build(): CreateAlertData {
136
+ this.validate();
137
+
138
+ // Set default severity if not provided
139
+ if (!this.data.severity) {
140
+ this.data.severity = AlertSeverity.MEDIUM;
141
+ }
142
+
143
+ return this.data as CreateAlertData;
144
+ }
145
+
146
+ /**
147
+ * Resets the builder to its initial state
148
+ */
149
+ reset(): AlertBuilder {
150
+ this.data = {};
151
+ return this;
152
+ }
153
+
154
+ /**
155
+ * Creates a new builder instance with predefined values for common alert types
156
+ */
157
+ static createReadinessAlert(): AlertBuilder {
158
+ return new AlertBuilder()
159
+ .setCategory(AlertCategory.READINESS)
160
+ .setSeverity(AlertSeverity.MEDIUM);
161
+ }
162
+
163
+ static createOperationsAlert(): AlertBuilder {
164
+ return new AlertBuilder()
165
+ .setCategory(AlertCategory.OPERATIONS)
166
+ .setSeverity(AlertSeverity.HIGH);
167
+ }
168
+
169
+ static createSecurityAlert(): AlertBuilder {
170
+ return new AlertBuilder()
171
+ .setCategory(AlertCategory.SECURITY)
172
+ .setSeverity(AlertSeverity.CRITICAL);
173
+ }
174
+
175
+ static createEnergyAlert(): AlertBuilder {
176
+ return new AlertBuilder()
177
+ .setCategory(AlertCategory.ENERGY)
178
+ .setSeverity(AlertSeverity.LOW);
179
+ }
180
+
181
+ /**
182
+ * Creates a device-specific alert builder
183
+ */
184
+ static createDeviceAlert(deviceId: string, propertyId: string): AlertBuilder {
185
+ return new AlertBuilder()
186
+ .setEntityType(EntityType.DEVICE)
187
+ .setEntityId(deviceId)
188
+ .setPropertyId(propertyId);
189
+ }
190
+
191
+ /**
192
+ * Creates a hub-specific alert builder
193
+ */
194
+ static createHubAlert(hubId: string, propertyId: string): AlertBuilder {
195
+ return new AlertBuilder()
196
+ .setEntityType(EntityType.HUB)
197
+ .setEntityId(hubId)
198
+ .setPropertyId(propertyId);
199
+ }
200
+
201
+
202
+ }
@@ -0,0 +1,210 @@
1
+ import { IssueBuilder } from "./IssueBuilder";
2
+ import { IssuesCategory, IssuePriority, EntityType } from "../../../types/issue.types";
3
+
4
+ /**
5
+ * Example usage of IssueBuilder
6
+ * This file demonstrates various ways to use the IssueBuilder pattern
7
+ */
8
+
9
+ // Example 1: Basic issue creation
10
+ export function createBasicIssue() {
11
+ const issueData = new IssueBuilder()
12
+ .setCategory(IssuesCategory.OPERATIONS)
13
+ .setPropertyId("prop123")
14
+ .setTitle("Device Maintenance Required")
15
+ .setDescription("Device requires scheduled maintenance")
16
+ .setEntityId("device456")
17
+ .setEntityType(EntityType.DEVICE)
18
+ .setPriority(IssuePriority.HIGH)
19
+ .setAssignedTo("tech789")
20
+ .setCreatedBy("user123")
21
+ .setDueDate(new Date("2024-01-15"))
22
+ .build();
23
+
24
+ return issueData;
25
+ }
26
+
27
+ // Example 2: Using static factory methods
28
+ export function createDeviceIssue() {
29
+ const issueData = IssueBuilder.createDeviceIssue("device123", "prop456")
30
+ .setCategory(IssuesCategory.READINESS)
31
+ .setTitle("Device Firmware Update")
32
+ .setDescription("Device firmware update is available")
33
+ .setPriority(IssuePriority.MEDIUM)
34
+ .setAssignedTo("admin")
35
+ .setCreatedBy("system")
36
+ .setDueDate(new Date("2024-01-20"))
37
+ .build();
38
+
39
+ return issueData;
40
+ }
41
+
42
+ // Example 3: Using predefined issue types
43
+ export function createSecurityIssue() {
44
+ const issueData = IssueBuilder.createSecurityIssue()
45
+ .setPropertyId("prop789")
46
+ .setTitle("Security Breach Detected")
47
+ .setDescription("Unauthorized access attempt detected")
48
+ .setEntityId("user123")
49
+ .setEntityType(EntityType.USER)
50
+ .setAssignedTo("security-team")
51
+ .setCreatedBy("security-system")
52
+ .setDueDate(new Date("2024-01-10"))
53
+ .build();
54
+
55
+ return issueData;
56
+ }
57
+
58
+ // Example 4: Creating energy issue
59
+ export function createEnergyIssue() {
60
+ const issueData = IssueBuilder.createEnergyIssue()
61
+ .setPropertyId("prop101")
62
+ .setTitle("High Energy Consumption")
63
+ .setDescription("Energy usage is 20% above normal levels")
64
+ .setEntityId("zone456")
65
+ .setEntityType(EntityType.COLLECTION)
66
+ .setAssignedTo("energy-manager")
67
+ .setCreatedBy("energy-monitor")
68
+ .setDueDate(new Date("2024-01-25"))
69
+ .build();
70
+
71
+ return issueData;
72
+ }
73
+
74
+ // Example 5: Creating hub issue
75
+ export function createHubIssue() {
76
+ const issueData = IssueBuilder.createHubIssue("hub789", "prop202")
77
+ .setCategory(IssuesCategory.OPERATIONS)
78
+ .setTitle("Hub Connection Lost")
79
+ .setDescription("Hub has lost connection to the network")
80
+ .setPriority(IssuePriority.CRITICAL)
81
+ .setAssignedTo("network-admin")
82
+ .setCreatedBy("network-monitor")
83
+ .setDueDate(new Date("2024-01-05"))
84
+ .build();
85
+
86
+ return issueData;
87
+ }
88
+
89
+ // Example 6: Creating user-specific issue
90
+ export function createUserIssue() {
91
+ const issueData = IssueBuilder.createUserIssue("user456", "prop303")
92
+ .setCategory(IssuesCategory.SECURITY)
93
+ .setTitle("User Access Review Required")
94
+ .setDescription("User access permissions need review")
95
+ .setPriority(IssuePriority.MEDIUM)
96
+ .setAssignedTo("hr-admin")
97
+ .setCreatedBy("access-control")
98
+ .setDueDate(new Date("2024-01-30"))
99
+ .build();
100
+
101
+ return issueData;
102
+ }
103
+
104
+ // Example 7: Creating property-specific issue
105
+ export function createPropertyIssue() {
106
+ const issueData = IssueBuilder.createPropertyIssue("prop404")
107
+ .setCategory(IssuesCategory.READINESS)
108
+ .setTitle("Property Maintenance Schedule")
109
+ .setDescription("Annual property maintenance is due")
110
+ .setPriority(IssuePriority.LOW)
111
+ .setAssignedTo("property-manager")
112
+ .setCreatedBy("maintenance-system")
113
+ .setDueDate(new Date("2024-02-15"))
114
+ .build();
115
+
116
+ return issueData;
117
+ }
118
+
119
+ // Example 8: Creating maintenance issue
120
+ export function createMaintenanceIssue() {
121
+ const issueData = IssueBuilder.createMaintenanceIssue("prop505", "device789", EntityType.DEVICE)
122
+ .setTitle("Scheduled Device Maintenance")
123
+ .setDescription("Regular maintenance is scheduled for this device")
124
+ .setAssignedTo("technician")
125
+ .setCreatedBy("maintenance-scheduler")
126
+ .setDueDate(new Date("2024-01-12"))
127
+ .build();
128
+
129
+ return issueData;
130
+ }
131
+
132
+ // Example 9: Creating urgent issue
133
+ export function createUrgentIssue() {
134
+ const issueData = IssueBuilder.createUrgentIssue("prop606", "hub123", EntityType.HUB)
135
+ .setTitle("Critical Hub Failure")
136
+ .setDescription("Hub is experiencing critical failures")
137
+ .setAssignedTo("emergency-tech")
138
+ .setCreatedBy("monitoring-system")
139
+ .setDueDate(new Date("2024-01-03"))
140
+ .build();
141
+
142
+ return issueData;
143
+ }
144
+
145
+ // Example 10: Reusing builder instance
146
+ export function createMultipleIssues() {
147
+ const builder = new IssueBuilder()
148
+ .setPropertyId("prop707")
149
+ .setCreatedBy("batch-processor");
150
+
151
+ const issue1 = builder
152
+ .setCategory(IssuesCategory.OPERATIONS)
153
+ .setTitle("Device Temperature High")
154
+ .setDescription("Device temperature exceeds normal operating range")
155
+ .setEntityId("device789")
156
+ .setEntityType(EntityType.DEVICE)
157
+ .setPriority(IssuePriority.HIGH)
158
+ .setAssignedTo("tech-support")
159
+ .build();
160
+
161
+ const issue2 = builder
162
+ .reset()
163
+ .setPropertyId("prop707")
164
+ .setCategory(IssuesCategory.ENERGY)
165
+ .setTitle("Low Battery Warning")
166
+ .setDescription("Device battery level is below 20%")
167
+ .setEntityId("device789")
168
+ .setEntityType(EntityType.DEVICE)
169
+ .setPriority(IssuePriority.MEDIUM)
170
+ .setAssignedTo("maintenance-team")
171
+ .setCreatedBy("batch-processor")
172
+ .build();
173
+
174
+ return [issue1, issue2];
175
+ }
176
+
177
+ // Example 11: Creating issue with due date calculation
178
+ export function createIssueWithDueDate() {
179
+ const dueDate = new Date();
180
+ dueDate.setDate(dueDate.getDate() + 7); // Due in 7 days
181
+
182
+ const issueData = new IssueBuilder()
183
+ .setCategory(IssuesCategory.READINESS)
184
+ .setPropertyId("prop808")
185
+ .setTitle("System Update Required")
186
+ .setDescription("System requires critical security update")
187
+ .setEntityType(EntityType.PROPERTY)
188
+ .setPriority(IssuePriority.HIGH)
189
+ .setAssignedTo("system-admin")
190
+ .setCreatedBy("update-manager")
191
+ .setDueDate(dueDate)
192
+ .build();
193
+
194
+ return issueData;
195
+ }
196
+
197
+ // Example 12: Creating issue without assignment
198
+ export function createUnassignedIssue() {
199
+ const issueData = new IssueBuilder()
200
+ .setCategory(IssuesCategory.OTHER)
201
+ .setPropertyId("prop909")
202
+ .setTitle("General Inquiry")
203
+ .setDescription("General inquiry about system functionality")
204
+ .setEntityType(EntityType.PROPERTY)
205
+ .setPriority(IssuePriority.LOW)
206
+ .setCreatedBy("user-inquiry")
207
+ .build();
208
+
209
+ return issueData;
210
+ }