From 640143483ea64e449c7cf11f8820cfce6583b2ce Mon Sep 17 00:00:00 2001 From: Donat Zenichev Date: Wed, 2 Sep 2026 16:17:47 +0200 Subject: [PATCH] MT#65662 Support domain/profile/subscriber level inheritance (group load) For grouped loading of preferences, add support of the levels: - domain - profile - subscriber This allows to be consistent with the existing caller/callee preferences loading (of the subscriber level) which takes other levels of inheritance into account. Change-Id: Ic3be3d21ff3eb67b6ce9dc4ef79a3b9df446a2ba --- ngcp/dp.lua | 9 +++++++++ ngcp/ngcp.lua | 50 ++++++++++++++++++++++++++++++++++++++++++-------- ngcp/pprof.lua | 11 +++++++++++ 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/ngcp/dp.lua b/ngcp/dp.lua index 1f833b8..50f85cb 100644 --- a/ngcp/dp.lua +++ b/ngcp/dp.lua @@ -27,6 +27,15 @@ NGCPDomainPrefs.__class__ = 'NGCPDomainPrefs' NGCPDomainPrefs.group = "dom_prefs" NGCPDomainPrefs.db_table = "dom_preferences" NGCPDomainPrefs.query = "SELECT * FROM %s WHERE domain ='%s'" +NGCPDomainPrefs.group_query = [[ +SELECT prefs.* + FROM %s AS prefs + JOIN provisioning.voip_preferences AS vp + ON vp.attribute = prefs.attribute + JOIN provisioning.voip_preference_groups AS vpg + ON vpg.id = vp.voip_preference_groups_id + WHERE prefs.domain = '%s' AND vpg.id = %s +]] -- luacheck: globals KSR function NGCPDomainPrefs:new(config) local instance = NGCPDomainPrefs:create() diff --git a/ngcp/ngcp.lua b/ngcp/ngcp.lua index 2bdb459..aafaa8c 100644 --- a/ngcp/ngcp.lua +++ b/ngcp/ngcp.lua @@ -127,10 +127,27 @@ function NGCP:caller_usr_load(uuid, domain) return unique_keys end -function NGCP:caller_load_group(uuid, group_name) - local keys = self.prefs.usr:caller_load_group(uuid, group_name) - self.prefs.real:caller_usr_load_group(keys) - return keys +function NGCP:caller_usr_load_group(uuid, domain, group_name) + if not group_name then + group_name = domain + domain = nil + end + local group_id = self.prefs.usr:get_pref_group_id(group_name) + if not group_id then + return {} + end + + local keys = { + domain = self.prefs.dom:load_group("caller", domain, group_id), + prof = self.prefs.prof:load_group("caller", uuid, group_id), + user = self.prefs.usr:load_group("caller", uuid, group_id), + } + local unique_keys = utable.deepcopy(keys.domain) + utable.merge(unique_keys, keys.prof) + utable.merge(unique_keys, keys.user) + + self.prefs.real:caller_usr_load_group(unique_keys) + return unique_keys end function NGCP:callee_usr_load(uuid, domain) @@ -149,10 +166,27 @@ function NGCP:callee_usr_load(uuid, domain) return unique_keys end -function NGCP:callee_load_group(uuid, group_name) - local keys = self.prefs.usr:callee_load_group(uuid, group_name) - self.prefs.real:callee_usr_load_group(keys) - return keys +function NGCP:callee_usr_load_group(uuid, domain, group_name) + if not group_name then + group_name = domain + domain = nil + end + local group_id = self.prefs.usr:get_pref_group_id(group_name) + if not group_id then + return {} + end + + local keys = { + domain = self.prefs.dom:load_group("callee", domain, group_id), + prof = self.prefs.prof:load_group("callee", uuid, group_id), + user = self.prefs.usr:load_group("callee", uuid, group_id), + } + local unique_keys = utable.deepcopy(keys.domain) + utable.merge(unique_keys, keys.prof) + utable.merge(unique_keys, keys.user) + + self.prefs.real:callee_usr_load_group(unique_keys) + return unique_keys end function NGCP:log_pref(level, vtype) diff --git a/ngcp/pprof.lua b/ngcp/pprof.lua index 7296921..083d7da 100644 --- a/ngcp/pprof.lua +++ b/ngcp/pprof.lua @@ -28,6 +28,17 @@ NGCPProfilePrefs.db_table = "prof_preferences" NGCPProfilePrefs.query = "SELECT prefs.* FROM provisioning.voip_subscribers ".. "as usr LEFT JOIN %s AS prefs ON usr.profile_id = prefs.uuid ".. "WHERE usr.uuid = '%s'" +NGCPProfilePrefs.group_query = [[ +SELECT prefs.* + FROM provisioning.voip_subscribers AS usr + LEFT JOIN %s AS prefs + ON usr.profile_id = prefs.uuid + JOIN provisioning.voip_preferences AS vp + ON vp.attribute = prefs.attribute + JOIN provisioning.voip_preference_groups AS vpg + ON vpg.id = vp.voip_preference_groups_id + WHERE usr.uuid = '%s' AND vpg.id = %s +]] -- luacheck: globals KSR function NGCPProfilePrefs:new(config) local instance = NGCPProfilePrefs:create()