pulsewatch-server 1.0.60 → 1.0.62
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.
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulse-config.d.ts","sourceRoot":"","sources":["../../src/routes/pulse-config.ts"],"names":[],"mappings":"AAGA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,
|
|
1
|
+
{"version":3,"file":"pulse-config.d.ts","sourceRoot":"","sources":["../../src/routes/pulse-config.ts"],"names":[],"mappings":"AAGA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,EAAE,EAAE,GAAG,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,8CAsQrE"}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import { Router } from
|
|
2
|
-
import { eq } from
|
|
1
|
+
import { Router } from "express";
|
|
2
|
+
import { eq } from "drizzle-orm";
|
|
3
3
|
export function createPulseConfigRoutes(deps) {
|
|
4
4
|
const router = Router();
|
|
5
5
|
const { db, schema } = deps;
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const table = schema.pulseNotificationConfig;
|
|
7
|
+
// --------------------------------------------------
|
|
8
|
+
// GET CONFIG
|
|
9
|
+
// --------------------------------------------------
|
|
10
|
+
router.get("/config", async (_req, res) => {
|
|
8
11
|
try {
|
|
9
|
-
const configs = await db.select().from(
|
|
12
|
+
const configs = await db.select().from(table).limit(1);
|
|
10
13
|
if (configs.length === 0) {
|
|
11
|
-
// Return default config if none exists
|
|
12
14
|
return res.json({
|
|
13
15
|
id: null,
|
|
14
16
|
is_enabled: true,
|
|
@@ -19,164 +21,202 @@ export function createPulseConfigRoutes(deps) {
|
|
|
19
21
|
updated_at: null,
|
|
20
22
|
});
|
|
21
23
|
}
|
|
22
|
-
|
|
24
|
+
const c = configs[0];
|
|
25
|
+
// Convert to API snake_case
|
|
26
|
+
return res.json({
|
|
27
|
+
id: c.id,
|
|
28
|
+
is_enabled: c.isEnabled,
|
|
29
|
+
consecutive_down_threshold: c.consecutiveDownThreshold,
|
|
30
|
+
consecutive_up_threshold: c.consecutiveUpThreshold,
|
|
31
|
+
to_emails: c.toEmails,
|
|
32
|
+
created_at: c.createdAt,
|
|
33
|
+
updated_at: c.updatedAt,
|
|
34
|
+
});
|
|
23
35
|
}
|
|
24
36
|
catch (error) {
|
|
25
|
-
console.error(
|
|
26
|
-
res.status(500).json({ error:
|
|
37
|
+
console.error("Error fetching Pulse config:", error);
|
|
38
|
+
res.status(500).json({ error: "Failed to fetch configuration" });
|
|
27
39
|
}
|
|
28
40
|
});
|
|
29
|
-
//
|
|
30
|
-
|
|
41
|
+
// --------------------------------------------------
|
|
42
|
+
// UPSERT CONFIG
|
|
43
|
+
// --------------------------------------------------
|
|
44
|
+
router.put("/config", async (req, res) => {
|
|
31
45
|
try {
|
|
32
|
-
const { is_enabled, consecutive_down_threshold, consecutive_up_threshold } = req.body;
|
|
33
|
-
// Validation
|
|
34
|
-
if (consecutive_down_threshold !== undefined
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
46
|
+
const { is_enabled, consecutive_down_threshold, consecutive_up_threshold, to_emails, } = req.body;
|
|
47
|
+
// ---------- Validation ----------
|
|
48
|
+
if (consecutive_down_threshold !== undefined &&
|
|
49
|
+
(typeof consecutive_down_threshold !== "number" ||
|
|
50
|
+
consecutive_down_threshold < 1 ||
|
|
51
|
+
consecutive_down_threshold > 100)) {
|
|
52
|
+
return res.status(400).json({
|
|
53
|
+
error: "consecutive_down_threshold must be between 1 and 100",
|
|
54
|
+
});
|
|
38
55
|
}
|
|
39
|
-
if (consecutive_up_threshold !== undefined
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
56
|
+
if (consecutive_up_threshold !== undefined &&
|
|
57
|
+
(typeof consecutive_up_threshold !== "number" ||
|
|
58
|
+
consecutive_up_threshold < 1 ||
|
|
59
|
+
consecutive_up_threshold > 100)) {
|
|
60
|
+
return res.status(400).json({
|
|
61
|
+
error: "consecutive_up_threshold must be between 1 and 100",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
if (to_emails !== undefined && !Array.isArray(to_emails)) {
|
|
65
|
+
return res.status(400).json({
|
|
66
|
+
error: "to_emails must be an array",
|
|
67
|
+
});
|
|
43
68
|
}
|
|
44
|
-
//
|
|
45
|
-
const
|
|
69
|
+
// ---------- Build update (camelCase for Drizzle) ----------
|
|
70
|
+
const updateData = {
|
|
71
|
+
...(is_enabled !== undefined && { isEnabled: is_enabled }),
|
|
72
|
+
...(consecutive_down_threshold !== undefined && {
|
|
73
|
+
consecutiveDownThreshold: consecutive_down_threshold,
|
|
74
|
+
}),
|
|
75
|
+
...(consecutive_up_threshold !== undefined && {
|
|
76
|
+
consecutiveUpThreshold: consecutive_up_threshold,
|
|
77
|
+
}),
|
|
78
|
+
...(to_emails !== undefined && { toEmails: to_emails }),
|
|
79
|
+
};
|
|
80
|
+
// Always update timestamp if something changes
|
|
81
|
+
if (Object.keys(updateData).length > 0) {
|
|
82
|
+
updateData.updatedAt = new Date();
|
|
83
|
+
}
|
|
84
|
+
// ---------- Get existing ----------
|
|
85
|
+
const existing = await db.select().from(table).limit(1);
|
|
46
86
|
let result;
|
|
47
|
-
if
|
|
48
|
-
|
|
87
|
+
// ---------- INSERT if not exists ----------
|
|
88
|
+
if (existing.length === 0) {
|
|
49
89
|
const insertData = {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
90
|
+
isEnabled: is_enabled ?? true,
|
|
91
|
+
consecutiveDownThreshold: consecutive_down_threshold ?? 3,
|
|
92
|
+
consecutiveUpThreshold: consecutive_up_threshold ?? 3,
|
|
93
|
+
toEmails: to_emails ?? [],
|
|
94
|
+
createdAt: new Date(),
|
|
95
|
+
updatedAt: new Date(),
|
|
55
96
|
};
|
|
56
|
-
result = await db.insert(
|
|
97
|
+
result = await db.insert(table).values(insertData).returning();
|
|
57
98
|
}
|
|
58
99
|
else {
|
|
59
|
-
// Update existing config - only include fields that are being updated
|
|
60
|
-
const updateData = {};
|
|
61
|
-
if (is_enabled !== undefined)
|
|
62
|
-
updateData.is_enabled = is_enabled;
|
|
63
|
-
if (consecutive_down_threshold !== undefined)
|
|
64
|
-
updateData.consecutive_down_threshold = consecutive_down_threshold;
|
|
65
|
-
if (consecutive_up_threshold !== undefined)
|
|
66
|
-
updateData.consecutive_up_threshold = consecutive_up_threshold;
|
|
67
|
-
// Check if there are any actual changes besides updated_at
|
|
68
100
|
if (Object.keys(updateData).length === 0) {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
message: 'No changes to update',
|
|
72
|
-
data: existingConfigs[0],
|
|
101
|
+
return res.status(400).json({
|
|
102
|
+
message: "No fields to update",
|
|
73
103
|
});
|
|
74
104
|
}
|
|
75
|
-
// Add updated_at timestamp
|
|
76
|
-
updateData.updated_at = new Date();
|
|
77
105
|
result = await db
|
|
78
|
-
.update(
|
|
106
|
+
.update(table)
|
|
79
107
|
.set(updateData)
|
|
80
|
-
.where(eq(
|
|
108
|
+
.where(eq(table.id, existing[0].id))
|
|
81
109
|
.returning();
|
|
82
110
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
111
|
+
const c = result[0];
|
|
112
|
+
return res.json({
|
|
113
|
+
message: "Configuration updated successfully",
|
|
114
|
+
data: {
|
|
115
|
+
id: c.id,
|
|
116
|
+
is_enabled: c.isEnabled,
|
|
117
|
+
consecutive_down_threshold: c.consecutiveDownThreshold,
|
|
118
|
+
consecutive_up_threshold: c.consecutiveUpThreshold,
|
|
119
|
+
to_emails: c.toEmails,
|
|
120
|
+
created_at: c.createdAt,
|
|
121
|
+
updated_at: c.updatedAt,
|
|
122
|
+
},
|
|
86
123
|
});
|
|
87
124
|
}
|
|
88
125
|
catch (error) {
|
|
89
|
-
console.error(
|
|
90
|
-
res.status(500).json({ error:
|
|
126
|
+
console.error("Error updating Pulse config:", error);
|
|
127
|
+
res.status(500).json({ error: "Failed to update configuration" });
|
|
91
128
|
}
|
|
92
129
|
});
|
|
93
|
-
//
|
|
94
|
-
|
|
130
|
+
// --------------------------------------------------
|
|
131
|
+
// ADD EMAIL
|
|
132
|
+
// --------------------------------------------------
|
|
133
|
+
router.post("/config/emails", async (req, res) => {
|
|
95
134
|
try {
|
|
96
135
|
const { email } = req.body;
|
|
97
136
|
if (!email) {
|
|
98
|
-
return res.status(400).json({ error:
|
|
137
|
+
return res.status(400).json({ error: "Email is required" });
|
|
99
138
|
}
|
|
100
|
-
// Validate email format
|
|
101
139
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
102
140
|
if (!emailRegex.test(email)) {
|
|
103
|
-
return res.status(400).json({ error:
|
|
141
|
+
return res.status(400).json({ error: "Invalid email format" });
|
|
104
142
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
if (
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
});
|
|
143
|
+
const existing = await db.select().from(table).limit(1);
|
|
144
|
+
let config;
|
|
145
|
+
if (existing.length === 0) {
|
|
146
|
+
const inserted = await db
|
|
147
|
+
.insert(table)
|
|
148
|
+
.values({
|
|
149
|
+
isEnabled: true,
|
|
150
|
+
consecutiveDownThreshold: 3,
|
|
151
|
+
consecutiveUpThreshold: 3,
|
|
152
|
+
toEmails: [email],
|
|
153
|
+
createdAt: new Date(),
|
|
154
|
+
updatedAt: new Date(),
|
|
155
|
+
})
|
|
156
|
+
.returning();
|
|
157
|
+
config = inserted[0];
|
|
121
158
|
}
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
159
|
+
else {
|
|
160
|
+
const current = existing[0];
|
|
161
|
+
const emails = current.toEmails || [];
|
|
162
|
+
if (emails.includes(email)) {
|
|
163
|
+
return res.status(400).json({ error: "Email already exists" });
|
|
164
|
+
}
|
|
165
|
+
const updated = await db
|
|
166
|
+
.update(table)
|
|
167
|
+
.set({
|
|
168
|
+
toEmails: [...emails, email],
|
|
169
|
+
updatedAt: new Date(),
|
|
170
|
+
})
|
|
171
|
+
.where(eq(table.id, current.id))
|
|
172
|
+
.returning();
|
|
173
|
+
config = updated[0];
|
|
126
174
|
}
|
|
127
|
-
const updatedEmails = [...currentEmails, email];
|
|
128
|
-
const result = await db
|
|
129
|
-
.update(schema.pulseNotificationConfig)
|
|
130
|
-
.set({
|
|
131
|
-
to_emails: updatedEmails,
|
|
132
|
-
updated_at: new Date(),
|
|
133
|
-
})
|
|
134
|
-
.where(eq(schema.pulseNotificationConfig.id, currentConfig.id))
|
|
135
|
-
.returning();
|
|
136
175
|
res.json({
|
|
137
|
-
message:
|
|
138
|
-
data:
|
|
176
|
+
message: "Email added successfully",
|
|
177
|
+
data: config,
|
|
139
178
|
});
|
|
140
179
|
}
|
|
141
180
|
catch (error) {
|
|
142
|
-
console.error(
|
|
143
|
-
res.status(500).json({ error:
|
|
181
|
+
console.error("Error adding email:", error);
|
|
182
|
+
res.status(500).json({ error: "Failed to add email" });
|
|
144
183
|
}
|
|
145
184
|
});
|
|
146
|
-
//
|
|
147
|
-
|
|
185
|
+
// --------------------------------------------------
|
|
186
|
+
// REMOVE EMAIL
|
|
187
|
+
// --------------------------------------------------
|
|
188
|
+
router.delete("/config/emails/:email", async (req, res) => {
|
|
148
189
|
try {
|
|
149
190
|
const { email } = req.params;
|
|
150
191
|
if (!email) {
|
|
151
|
-
return res.status(400).json({ error:
|
|
192
|
+
return res.status(400).json({ error: "Email is required" });
|
|
152
193
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
return res.status(404).json({ error: 'Configuration not found' });
|
|
194
|
+
const existing = await db.select().from(table).limit(1);
|
|
195
|
+
if (existing.length === 0) {
|
|
196
|
+
return res.status(404).json({ error: "Configuration not found" });
|
|
157
197
|
}
|
|
158
|
-
const
|
|
159
|
-
const
|
|
160
|
-
if (!
|
|
161
|
-
return res.status(404).json({ error:
|
|
198
|
+
const current = existing[0];
|
|
199
|
+
const emails = current.toEmails || [];
|
|
200
|
+
if (!emails.includes(email)) {
|
|
201
|
+
return res.status(404).json({ error: "Email not found in configuration" });
|
|
162
202
|
}
|
|
163
|
-
const updatedEmails =
|
|
203
|
+
const updatedEmails = emails.filter((e) => e !== email);
|
|
164
204
|
const result = await db
|
|
165
|
-
.update(
|
|
205
|
+
.update(table)
|
|
166
206
|
.set({
|
|
167
|
-
|
|
168
|
-
|
|
207
|
+
toEmails: updatedEmails,
|
|
208
|
+
updatedAt: new Date(),
|
|
169
209
|
})
|
|
170
|
-
.where(eq(
|
|
210
|
+
.where(eq(table.id, current.id))
|
|
171
211
|
.returning();
|
|
172
212
|
res.json({
|
|
173
|
-
message:
|
|
213
|
+
message: "Email removed successfully",
|
|
174
214
|
data: result[0],
|
|
175
215
|
});
|
|
176
216
|
}
|
|
177
217
|
catch (error) {
|
|
178
|
-
console.error(
|
|
179
|
-
res.status(500).json({ error:
|
|
218
|
+
console.error("Error removing email:", error);
|
|
219
|
+
res.status(500).json({ error: "Failed to remove email" });
|
|
180
220
|
}
|
|
181
221
|
});
|
|
182
222
|
return router;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pulse-config.js","sourceRoot":"","sources":["../../src/routes/pulse-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,uBAAuB,CAAC,IAA8B;IAClE,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAE5B,
|
|
1
|
+
{"version":3,"file":"pulse-config.js","sourceRoot":"","sources":["../../src/routes/pulse-config.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pulsewatch-server",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.62",
|
|
4
4
|
"description": "Complete uptime monitoring server - Drop-in Express backend with monitoring engine, database, REST API, and real-time updates. No authentication required.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -87,4 +87,4 @@
|
|
|
87
87
|
"engines": {
|
|
88
88
|
"node": ">=20.0.0"
|
|
89
89
|
}
|
|
90
|
-
}
|
|
90
|
+
}
|