diff --git a/engine/aliases.go b/engine/aliases.go index fbcb61f93..a9fb00c65 100644 --- a/engine/aliases.go +++ b/engine/aliases.go @@ -195,28 +195,39 @@ func (am *AliasHandler) SetAlias(al Alias, reply *string) error { } func (am *AliasHandler) UpdateAlias(al Alias, reply *string) error { - // get previous value - oldAlias := &Alias{} - if err := am.GetAlias(al, oldAlias); err != nil { - *reply = err.Error() - return err - } am.mu.Lock() defer am.mu.Unlock() - for _, oldValue := range oldAlias.Values { + // get previous value + oldAlias, err := am.accountingDb.GetAlias(al.GetId(), false) + if err != nil { + return err + } + for _, value := range al.Values { found := false - for _, value := range al.Values { - if oldValue.Equals(value) { + if value.DestinationId == "" { + value.DestinationId = utils.ANY + } + for _, oldValue := range oldAlias.Values { + if oldValue.DestinationId == value.DestinationId { + for target, origAliasMap := range value.Pairs { + for orig, alias := range origAliasMap { + if oldValue.Pairs[target] == nil { + oldValue.Pairs[target] = make(map[string]string) + } + oldValue.Pairs[target][orig] = alias + } + } + oldValue.Weight = value.Weight found = true break } } if !found { - al.Values = append(al.Values, oldValue) + oldAlias.Values = append(oldAlias.Values, value) } } - if err := am.accountingDb.SetAlias(&al); err != nil { + if err := am.accountingDb.SetAlias(oldAlias); err != nil { *reply = err.Error() return err } //add to cache diff --git a/engine/aliases_test.go b/engine/aliases_test.go index 67d89dd9a..a95e40b1e 100644 --- a/engine/aliases_test.go +++ b/engine/aliases_test.go @@ -45,6 +45,122 @@ func TestAliasesGetMatchingAlias(t *testing.T) { } } +func TestAliasesSetters(t *testing.T) { + var out string + if err := aliasService.SetAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + Values: AliasValues{&AliasValue{ + DestinationId: utils.ANY, + Pairs: AliasPairs{"Account": map[string]string{"1234": "1235"}}, + Weight: 10, + }}, + }, &out); err != nil || out != utils.OK { + t.Error("Error setting alias: ", err, out) + } + r := &Alias{} + if err := aliasService.GetAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + }, r); err != nil || len(r.Values) != 1 || len(r.Values[0].Pairs) != 1 { + t.Errorf("Error getting alias: %+v", r) + } + + if err := aliasService.UpdateAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + Values: AliasValues{&AliasValue{ + DestinationId: utils.ANY, + Pairs: AliasPairs{"Subject": map[string]string{"1234": "1235"}}, + Weight: 10, + }}, + }, &out); err != nil || out != utils.OK { + t.Error("Error updateing alias: ", err, out) + } + if err := aliasService.GetAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + }, r); err != nil || + len(r.Values) != 1 || + len(r.Values[0].Pairs) != 2 || + r.Values[0].Pairs["Subject"]["1234"] != "1235" || + r.Values[0].Pairs["Account"]["1234"] != "1235" { + t.Errorf("Error getting alias: %+v", r.Values[0]) + } + if err := aliasService.UpdateAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + Values: AliasValues{&AliasValue{ + DestinationId: utils.ANY, + Pairs: AliasPairs{"Subject": map[string]string{"1111": "2222"}}, + Weight: 10, + }}, + }, &out); err != nil || out != utils.OK { + t.Error("Error updateing alias: ", err, out) + } + if err := aliasService.GetAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + }, r); err != nil || len(r.Values) != 1 || len(r.Values[0].Pairs) != 2 || r.Values[0].Pairs["Subject"]["1111"] != "2222" { + t.Errorf("Error getting alias: %+v", r.Values[0].Pairs["Subject"]) + } + if err := aliasService.UpdateAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + Values: AliasValues{&AliasValue{ + DestinationId: "NAT", + Pairs: AliasPairs{"Subject": map[string]string{"3333": "4444"}}, + Weight: 10, + }}, + }, &out); err != nil || out != utils.OK { + t.Error("Error updateing alias: ", err, out) + } + if err := aliasService.GetAlias(Alias{ + Direction: "*out", + Tenant: "cgrates.org", + Category: "call", + Account: "set", + Subject: "set", + Context: "*rating", + }, r); err != nil || + len(r.Values) != 2 || + len(r.Values[1].Pairs) != 1 || + r.Values[1].Pairs["Subject"]["3333"] != "4444" || + len(r.Values[0].Pairs) != 2 || + r.Values[0].Pairs["Subject"]["1111"] != "2222" || + r.Values[0].Pairs["Subject"]["1234"] != "1235" { + t.Errorf("Error getting alias: %+v", r.Values[0]) + } +} + func TestAliasesLoadAlias(t *testing.T) { var response string cd := &CallDescriptor{