From caff99d071811265e39102eb5839a097e8aa187e Mon Sep 17 00:00:00 2001 From: Dan Bruce Date: Wed, 28 Oct 2026 01:02:20 -0400 Subject: [PATCH 1/2] Respect day and backup_night flags in sups.json - Only a literal `true` enables a flag, so "false" strings no longer count - With no night sup scheduled, fill the backup group from backup_night supervisors instead of sending "undefined" - Fall back to backup_night supervisors when the night sup ID isn't in sups.json rather than leaving the main group empty - Collapse the three number-list builders into one helper - Document the flags in the README Co-Authored-By: Claude Opus 5.5 --- README.md | 11 ++++++++ server.js | 84 ++++++++++++++++++++----------------------------------- 2 files changed, 42 insertions(+), 53 deletions(-) diff --git a/README.md b/README.md index 72ce78e..56ece2f 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,17 @@ Next, you need to set up the environment variables. This can be done right in th Most of the above variables need to be set with values configured on or obtained from other servers (e.g. FreePBX, the scheduling server, etc.). Unless you make modifications to this application, `DS_URL`, in particular, must be configured to provide the user ID of a nighttime duty supervisor. Further, the application is currently written to query that URL with `?token=TOKENHERE` where `TOKENHERE` is set in `DS_URL_TOKEN`. +### Supervisor file + +`sups.json` (see `sups.json.example`) lists every supervisor's `id`, `external_phone_numbers`, and `internal_extensions`, plus two flags: + +| Flag | Effect | +| -------------- | -------------------------------------------------------------------------------------------------------------------------- | +| `day` | Rung by both the main and backup ring groups during the day | +| `backup_night` | Rung by the backup ring group at night, and by the main ring group too if no night supervisor is scheduled or found here | + +Only a literal `true` turns a flag on. A missing flag, `false`, or a string like `"true"` all count as off. + With all that set, you should be able to start the app using something like `docker compose up -d dialert`. This may vary depending on your configuration. ## Credits diff --git a/server.js b/server.js index 215988f..f31ab78 100644 --- a/server.js +++ b/server.js @@ -55,59 +55,35 @@ const getSups = async () => { return JSON.parse(sups); }; -const generateDsNumberList = async (nightSup) => { - const { supervisors: sups } = await getSups(); - let dsNumberList = ""; - for (const sup of sups) { - if (sup.id == nightSup) { - for (num of sup.external_phone_numbers) { - dsNumberList += `${num}#-`; - } - for (num of sup.internal_extensions) { - dsNumberList += `${num}-`; - } - } - } - dsNumberList = dsNumberList.slice(0, -1); - return dsNumberList; -}; +//a sup's numbers, formatted for a FreePBX ring group extension list +const formatNumbers = (sup) => [ + ...(sup.external_phone_numbers || []).map((num) => `${num}#`), + ...(sup.internal_extensions || []), +]; -const generateBackupDsNumberList = async () => { +const generateNumberList = async (include) => { const { supervisors: sups } = await getSups(); - let backupDsNumberList = ""; - for (const sup of sups) { - if (sup.backup_night) { - for (num of sup.external_phone_numbers) { - backupDsNumberList += `${num}#-`; - } - for (num of sup.internal_extensions) { - backupDsNumberList += `${num}-`; - } - } - } - backupDsNumberList = backupDsNumberList.slice(0, -1); - return backupDsNumberList; + return sups + .filter(include) + .flatMap(formatNumbers) + .join("-"); }; -const generateDayDsNumberList = async () => { - const { supervisors: sups } = await getSups(); - let dayDsNumberList = ""; - for (const sup of sups) { - if (sup.day) { - for (num of sup.external_phone_numbers) { - dayDsNumberList += `${num}#-`; - } - for (num of sup.internal_extensions) { - dayDsNumberList += `${num}-`; - } - } - } - dayDsNumberList = dayDsNumberList.slice(0, -1); - return dayDsNumberList; -}; +const generateDsNumberList = (nightSup) => + generateNumberList((sup) => sup.id == nightSup); + +//only an explicit `true` in sups.json opts a supervisor in +const generateBackupDsNumberList = () => + generateNumberList((sup) => sup.backup_night === true); + +const generateDayDsNumberList = () => + generateNumberList((sup) => sup.day === true); const handleDay = async () => { const dsNumberList = await generateDayDsNumberList(); + if (!dsNumberList) { + console.log('No supervisors have "day": true in sups.json'); + } let accessToken; try { accessToken = await client.getToken(tokenParams, { json: true }); @@ -178,13 +154,15 @@ const handleDay = async () => { }; const handleNight = async (nightSup) => { - let dsNumberList; - let backupDsNumberList; - if (nightSup <= 0) { - dsNumberList = await generateBackupDsNumberList(); - } else { - dsNumberList = await generateDsNumberList(nightSup); - backupDsNumberList = await generateBackupDsNumberList(); + const backupDsNumberList = await generateBackupDsNumberList(); + let dsNumberList = nightSup > 0 ? await generateDsNumberList(nightSup) : ""; + if (!dsNumberList) { + //no night sup scheduled, or they aren't in sups.json: + //the backup_night sups take the main group too + console.log( + `No numbers for night sup "${nightSup}"; using backup_night supervisors` + ); + dsNumberList = backupDsNumberList; } let accessToken; try { From 763dc66dbbae327e7721e6beaba9413beb76ea44 Mon Sep 17 00:00:00 2001 From: Dan Bruce Date: Wed, 28 Oct 2026 01:02:46 -0400 Subject: [PATCH 2/2] 1.0.1 Co-Authored-By: Claude Opus 5.5 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 066f672..a5abffb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "dialert", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dialert", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "dependencies": { "axios": "^1.1.3", diff --git a/package.json b/package.json index fe28773..66d2d81 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ }, "name": "dialert", "description": "**DiALERT** checks a schedule and changes a PBX ring group accordingly. It was created for @rpiambulance for use by their duty supervisors.", - "version": "1.0.0", + "version": "1.0.1", "main": "server.js", "repository": { "type": "git",