From ac4dc82594e89055c11a4ce65073e6daf0204b12 Mon Sep 17 00:00:00 2001 From: Jan-Henrik Bruhn Date: Tue, 7 Apr 2026 22:50:30 +0200 Subject: [PATCH] feat: json directory --- modules/voip/default.nix | 4 +- modules/voip/provisioning/directory-json.nix | 50 ++++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 modules/voip/provisioning/directory-json.nix diff --git a/modules/voip/default.nix b/modules/voip/default.nix index 70ab2f2..d63e13d 100644 --- a/modules/voip/default.nix +++ b/modules/voip/default.nix @@ -12,7 +12,8 @@ let greetingDirs = import ./asterisk/greetings.nix { inherit lib pkgs cfg; }; confFiles = import ./asterisk/default.nix { inherit lib cfg models allPhones intercomEntries mohDirs greetingDirs; }; - directory = import ./provisioning/directory.nix { inherit lib pkgs cfg allPhones intercomEntries; }; + directory = import ./provisioning/directory.nix { inherit lib pkgs cfg allPhones intercomEntries; }; + directoryJson = import ./provisioning/directory-json.nix { inherit lib pkgs cfg models allPhones; }; provisioningRoot = import ./provisioning/default.nix { inherit lib pkgs cfg models allPhones; }; diagram = import ./dashboard.nix { inherit lib pkgs cfg models allPhones intercomEntries; }; @@ -87,6 +88,7 @@ in { "= /directory.xml" = { alias = "${directory.menuFile}"; extraConfig = "default_type text/xml;"; }; "= /directory-list.xml" = { alias = "${directory.listFile}"; extraConfig = "default_type text/xml;"; }; "= /intercom.xml" = { alias = "${directory.intercomFile}"; extraConfig = "default_type text/xml;"; }; + "= /contacts.json" = { alias = "${directoryJson}"; extraConfig = ''default_type application/json; add_header Access-Control-Allow-Origin "*";''; }; "/" = { root = "${diagram.webRoot}"; extraConfig = lib.optionalString (!hasRuntimeSecrets) "index index.html;"; diff --git a/modules/voip/provisioning/directory-json.nix b/modules/voip/provisioning/directory-json.nix new file mode 100644 index 0000000..6b899bd --- /dev/null +++ b/modules/voip/provisioning/directory-json.nix @@ -0,0 +1,50 @@ +{ lib, pkgs, cfg, models, allPhones }: + +let + # Does any provisioned phone on this extension support intercom? + extensionHasIntercom = ext: + lib.any (phone: phone.extension == ext && models.${phone.model}.hasIntercom) + (lib.attrValues allPhones); + + personContacts = lib.mapAttrsToList (_key: person: + lib.filterAttrs (_: v: v != null) { + displayName = person.displayName; + extension = person.extension; + intercomExtension = + if cfg.intercomPrefix != null && extensionHasIntercom person.extension + then "${cfg.intercomPrefix}${person.extension}" + else null; + mailboxCheckExtension = + if person.mailbox then "*97" else null; + } + ) cfg.persons; + + sharedPhoneContacts = lib.mapAttrsToList (_key: phone: + lib.filterAttrs (_: v: v != null) { + displayName = phone.displayName; + extension = phone.extension; + intercomExtension = + if cfg.intercomPrefix != null && models.${phone.model}.hasIntercom + then "${cfg.intercomPrefix}${phone.extension}" + else null; + } + ) cfg.sharedPhones; + + specialExtensions = lib.mapAttrsToList (ext: extCfg: { + displayName = extCfg.displayName; + extension = ext; + mode = extCfg.mode; + }) cfg.extensions; + + directory = { + version = 1; + contacts = personContacts ++ sharedPhoneContacts; + specialExtensions = specialExtensions; + } // lib.optionalAttrs (cfg.sharedMailbox != null) { + sharedMailbox = { + inherit (cfg.sharedMailbox) displayName checkExtension; + }; + }; + +in + pkgs.writeText "contacts.json" (builtins.toJSON directory)